@lmnr-ai/lmnr 0.8.21 → 0.8.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"decorators-BDFgXfgI.mjs","names":["logger","logger","logger","contextApi","logger","logger","SDK_VERSION","logger","context","contextApi","logger","logger","SDK_VERSION","laminarObserve","SDK_VERSION","laminarObserve","observe","logger","SDK_VERSION","logger","SDK_VERSION","laminarObserve","observe","SDK_VERSION","SDK_VERSION","logger","logger","logger","SDK_VERSION","SDK_VERSION","logger","StagehandV3Instrumentation","logger","ExporterHttp","ExporterGrpc","SDK_VERSION","logger","SDK_VERSION","logger"],"sources":["../src/opentelemetry-lib/tracing/compat.ts","../src/opentelemetry-lib/instrumentation/aisdk/utils.ts","../src/opentelemetry-lib/tracing/stream-utils.ts","../../types/dist/index.mjs","../src/opentelemetry-lib/tracing/span.ts","../src/opentelemetry-lib/tracing/context.ts","../src/opentelemetry-lib/instrumentation/claude-agent-sdk/proxy.ts","../src/opentelemetry-lib/instrumentation/claude-agent-sdk/index.ts","../src/laminar.ts","../src/browser/recorder.ts","../src/browser/utils.ts","../src/browser/playwright.ts","../src/browser/stagehand/shared-llm-wrapper.ts","../src/browser/stagehand/v2.ts","../src/browser/puppeteer.ts","../src/browser/stagehand/v3/constants.ts","../src/browser/stagehand/v3/cdp-helpers.ts","../src/browser/stagehand/v3/event-handlers.ts","../src/browser/stagehand/v3/instrumentation.ts","../src/opentelemetry-lib/instrumentation/google-genai/utils.ts","../src/opentelemetry-lib/instrumentation/google-genai/index.ts","../src/opentelemetry-lib/instrumentation/kernel.ts","../src/opentelemetry-lib/instrumentation/openai-agents/helpers.ts","../src/opentelemetry-lib/instrumentation/openai-agents/messages.ts","../src/opentelemetry-lib/instrumentation/openai-agents/span-data.ts","../src/opentelemetry-lib/instrumentation/openai-agents/processor.ts","../src/opentelemetry-lib/instrumentation/openai-agents/index.ts","../src/opentelemetry-lib/instrumentation/opencode.ts","../src/opentelemetry-lib/tracing/instrumentations.ts","../src/version.ts","../src/opentelemetry-lib/tracing/exporter.ts","../src/opentelemetry-lib/tracing/processor.ts","../src/opentelemetry-lib/tracing/tracer.ts","../src/opentelemetry-lib/tracing/utils.ts","../src/opentelemetry-lib/tracing/index.ts","../src/opentelemetry-lib/configuration/index.ts","../src/opentelemetry-lib/tracing/decorators.ts","../src/decorators.ts"],"sourcesContent":["// Forward-compatibility with OTel v2 / v0.200 SDKs\nimport { SpanContext } from \"@opentelemetry/api\";\nimport { ReadableSpan, Span as SdkSpan } from \"@opentelemetry/sdk-trace-base\";\n\nimport { initializeLogger } from \"../../utils\";\n\nconst logger = initializeLogger();\n\n// Type definitions that cover both OTel SDK v1 and v2\n// In v1: spans have parentSpanId and instrumentationLibrary\n// In v2: spans have parentSpanContext and instrumentationScope\nexport type OTelSpanCompat = SdkSpan &\n ReadableSpan & {\n parentSpanId?: string;\n parentSpanContext?: SpanContext;\n instrumentationLibrary?: any;\n instrumentationScope?: any;\n };\n\ntype OTelReadableSpanCompat = ReadableSpan & {\n parentSpanId?: string;\n parentSpanContext?: SpanContext;\n instrumentationLibrary?: any;\n instrumentationScope?: any;\n};\n\n// In-place edits on span object for compatibility between OTel v1 and v2 SDKs\nexport const makeSpanOtelV2Compatible = (\n span: OTelSpanCompat | OTelReadableSpanCompat,\n) => {\n const spanAny = span as any;\n if (spanAny.instrumentationScope && !spanAny.instrumentationLibrary) {\n // Making the spans from V2 compatible with V1\n Object.assign(span, {\n instrumentationLibrary: spanAny.instrumentationScope,\n });\n } else if (spanAny.instrumentationLibrary && !spanAny.instrumentationScope) {\n // Making the spans from V1 compatible with V2\n Object.assign(span, {\n instrumentationScope: spanAny.instrumentationLibrary,\n });\n }\n\n // Handle parent span compatibility between SDK v1 and v2\n // SDK v1 uses parentSpanId (string), SDK v2 uses parentSpanContext (SpanContext)\n if (spanAny.parentSpanContext && !spanAny.parentSpanId) {\n // SDK v2 -> SDK v1: Extract spanId from parentSpanContext\n Object.defineProperty(span, \"parentSpanId\", {\n value: spanAny.parentSpanContext.spanId,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n } else if (spanAny.parentSpanId && !spanAny.parentSpanContext) {\n // SDK v1 -> SDK v2: Create a proper SpanContext object\n // We need to get the traceId from the span's own spanContext\n const spanContext = span.spanContext();\n Object.defineProperty(span, \"parentSpanContext\", {\n value: {\n traceId: spanContext.traceId,\n spanId: spanAny.parentSpanId,\n traceFlags: spanContext.traceFlags,\n traceState: spanContext.traceState,\n isRemote: spanContext.isRemote,\n },\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n};\n\nexport const getParentSpanId = (\n span: OTelSpanCompat | OTelReadableSpanCompat,\n): string | undefined => {\n const spanAny = span as any;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return spanAny.parentSpanContext?.spanId ?? spanAny.parentSpanId;\n};\n\n/**\n * Creates a Resource object compatible with both OTel v1 and v2.\n *\n * In v1, Resource is a class constructor: new Resource(attributes)\n * In v2, Resource class is not exported; use resourceFromAttributes(attributes) instead\n *\n * This function automatically detects which version is available and uses the appropriate API.\n */\nexport const createResource = (attributes: Record<string, string>): any => {\n // type IResource from `@opentelemetry/resources`\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const resources = require(\"@opentelemetry/resources\");\n\n // v2 uses resourceFromAttributes (0.200+ SDK, 2.x API)\n if (resources.resourceFromAttributes) {\n return resources.resourceFromAttributes(attributes);\n }\n\n // v1 uses Resource constructor (0.57.x SDK, 1.x API)\n if (resources.Resource) {\n return new resources.Resource(attributes);\n }\n\n throw new Error(\"Unable to create Resource: neither v1 nor v2 API found\");\n } catch {\n logger.debug(\n \"Laminar failed to @opentelemetry/resources, continuing without it\",\n );\n return undefined;\n }\n};\n","import { type LanguageModelV3Message, type LanguageModelV3Prompt } from \"@ai-sdk/provider\";\nimport { type LanguageModelV2Message, type LanguageModelV2Prompt } from \"@ai-sdk/provider-v2\";\nimport { type DataContent } from \"ai\";\n\n// Mirrors https://github.com/vercel/ai/blob/main/packages/ai/src/telemetry/stringify-for-telemetry.ts\n// This function is initially implemented by us, and is not exported from the ai sdk.\n// We copy it here for our own use.\nexport const stringifyPromptForTelemetry =\n (prompt: LanguageModelV2Prompt | LanguageModelV3Prompt): string =>\n JSON.stringify(\n prompt.map((message: LanguageModelV2Message | LanguageModelV3Message) => ({\n ...message,\n content:\n typeof message.content === 'string'\n ? message.content\n : message.content.map(part =>\n part.type === 'file'\n ? {\n ...part,\n data:\n part.data instanceof Uint8Array\n ? convertDataContentToBase64String(part.data)\n : part.data,\n }\n : part,\n ),\n })),\n );\n\n// https://github.com/vercel/ai/blob/main/packages/ai/src/prompt/data-content.ts\n/**\nConverts data content to a base64-encoded string.\n\n@param content - Data content to convert.\n@returns Base64-encoded string.\n*/\nconst convertDataContentToBase64String = (content: DataContent): string => {\n if (typeof content === 'string') {\n return content;\n }\n\n if (content instanceof ArrayBuffer) {\n return convertUint8ArrayToBase64(new Uint8Array(content));\n }\n\n return convertUint8ArrayToBase64(content);\n};\n\n// https://github.com/vercel/ai/blob/main/packages/provider-utils/src/uint8-utils.ts\nexport function convertUint8ArrayToBase64(array: Uint8Array): string {\n let latin1string = '';\n\n // Note: regular for loop to support older JavaScript versions that\n // do not support for..of on Uint8Array\n for (let i = 0; i < array.length; i++) {\n latin1string += String.fromCodePoint(array[i]);\n }\n\n return btoa(latin1string);\n}\n\n/**\n * Information about a detected stream\n */\nexport type StreamInfo =\n | { type: 'aisdk-result'; result: any }\n | { type: 'readable-stream'; stream: ReadableStream<unknown> }\n | { type: 'async-iterable'; iterable: AsyncIterable<unknown> }\n | { type: 'response'; response: Response }\n | { type: null };\n\n/**\n * This function checks if an object is stream or stream-like, and returns information\n * about the stream type and how to handle it.\n * @param response - The result of a function, either an AI SDK result, a raw stream, or any other\n * response.\n * @returns - StreamInfo object describing the stream type, or { type: null } if not a stream.\n */\nexport const getStream = (response: unknown): StreamInfo => {\n if (!response || typeof response !== 'object') {\n return { type: null };\n }\n\n // Check for AI SDK StreamTextResult (has textStream or fullStream property)\n if ('textStream' in response || 'fullStream' in response) {\n return { type: 'aisdk-result', result: response };\n }\n\n // Check for Response object (from createUIMessageStreamResponse, createTextStreamResponse, etc.)\n if (response instanceof Response) {\n return { type: 'response', response };\n }\n\n // Check for ReadableStream\n if (response instanceof ReadableStream) {\n return { type: 'readable-stream', stream: response };\n }\n\n // Check for AsyncIterable (but not ReadableStream, which also implements AsyncIterable)\n if (Symbol.asyncIterator in response && !(response instanceof ReadableStream)) {\n return { type: 'async-iterable', iterable: response as AsyncIterable<unknown> };\n }\n\n return { type: null };\n};\n\n/**\n * Consumes an AI SDK StreamTextResult and returns structured output\n * @param result - The AI SDK StreamTextResult object\n * @returns Promise that resolves to structured output with all relevant fields\n */\nexport const consumeAISDKResult = async (result: any): Promise<any> => {\n const output: any = {};\n const errors: any[] = [];\n\n // Helper to safely await a promise property\n const safeAwait = async (key: string, promise: PromiseLike<any>) => {\n try {\n output[key] = await promise;\n } catch (error) {\n errors.push({ field: key, error: error instanceof Error ? error.message : String(error) });\n }\n };\n\n // Collect all the promise properties in parallel\n const promises: Promise<void>[] = [];\n\n if ('text' in result) promises.push(safeAwait('text', result.text));\n if ('toolCalls' in result) promises.push(safeAwait('toolCalls', result.toolCalls));\n if ('reasoning' in result) promises.push(safeAwait('reasoning', result.reasoning));\n if ('finishReason' in result) promises.push(safeAwait('finishReason', result.finishReason));\n if ('usage' in result) promises.push(safeAwait('usage', result.usage));\n if ('files' in result) promises.push(safeAwait('files', result.files));\n if ('sources' in result) promises.push(safeAwait('sources', result.sources));\n\n await Promise.all(promises);\n\n if (errors.length > 0) {\n output._errors = errors;\n }\n\n return output;\n};\n\n/**\n * Consumes a ReadableStream while teeing it to pass through to the caller\n * @param stream - The ReadableStream to consume\n * @returns Object with the teed stream for the caller and a promise for the collected data\n */\nexport const consumeAndTeeReadableStream = <T>(\n stream: ReadableStream<T>,\n): { stream: ReadableStream<T>; dataPromise: Promise<{ chunks: T[]; error?: any }> } => {\n const [stream1, stream2] = stream.tee();\n\n const dataPromise = (async () => {\n const chunks: T[] = [];\n let error: any = undefined;\n\n try {\n const reader = stream2.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n } catch (err) {\n error = err;\n }\n\n return { chunks, error };\n })();\n\n return { stream: stream1, dataPromise };\n};\n\n/**\n * Consumes an AsyncIterable while yielding items to the caller\n * @param iterable - The AsyncIterable to consume\n * @returns Object with a wrapped iterable for the caller and a promise for the collected data\n */\nexport const consumeAndTeeAsyncIterable = <T>(\n iterable: AsyncIterable<T>,\n): { iterable: AsyncIterable<T>; dataPromise: Promise<{ chunks: T[]; error?: any }> } => {\n const chunks: T[] = [];\n let error: any = undefined;\n let resolveData!: (value: { chunks: T[]; error?: any }) => void;\n const dataPromise = new Promise<{ chunks: T[]; error?: any }>((resolve) => {\n resolveData = resolve;\n });\n\n const wrappedIterable = (async function* () {\n try {\n for await (const item of iterable) {\n chunks.push(item);\n yield item;\n }\n } catch (err) {\n error = err;\n throw err;\n } finally {\n resolveData({ chunks, error });\n }\n })();\n\n return { iterable: wrappedIterable, dataPromise };\n};\n\n/**\n * Consumes a Response object's body stream\n * @param response - The Response object to consume\n * @returns Promise that resolves to the consumed data\n */\nexport const consumeResponse = async (response: Response):\nPromise<{ chunks: any[]; error?: any }> => {\n const chunks: any[] = [];\n let error: any = undefined;\n\n if (!response.body) {\n return { chunks };\n }\n\n try {\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(decoder.decode(value, { stream: true }));\n }\n } finally {\n reader.releaseLock();\n }\n } catch (err) {\n error = err;\n }\n\n return { chunks, error };\n};\n","import type { Span } from \"@opentelemetry/api\";\n\nimport { initializeLogger } from \"../../utils\";\nimport {\n consumeAISDKResult,\n consumeAndTeeAsyncIterable,\n consumeAndTeeReadableStream,\n consumeResponse,\n getStream,\n} from \"../instrumentation/aisdk/utils\";\nimport { shouldSendTraces } from \".\";\nimport {\n SPAN_OUTPUT,\n} from \"./attributes\";\n\nconst logger = initializeLogger();\n\n// Track pending stream processing promises\nconst pendingStreamProcessing = new Set<Promise<void>>();\n\n/**\n * Wait for all pending stream processing to complete with a timeout\n * @param timeoutMs - Maximum time to wait in milliseconds (default: 5000)\n */\nexport const waitForPendingStreams = async (timeoutMs: number = 5000): Promise<void> => {\n if (pendingStreamProcessing.size === 0) {\n return;\n }\n logger.debug(`Waiting for ${pendingStreamProcessing.size} pending stream(s)`);\n\n const initialCount = pendingStreamProcessing.size;\n const pendingPromises = Array.from(pendingStreamProcessing);\n\n let timedOut = false;\n const timeoutPromise = new Promise<void>((resolve) => {\n setTimeout(() => {\n timedOut = true;\n resolve();\n }, timeoutMs);\n });\n\n await Promise.race([\n Promise.allSettled(pendingPromises),\n timeoutPromise,\n ]);\n\n if (timedOut && pendingStreamProcessing.size > 0) {\n logger.warn(\n `Timeout waiting for ${pendingStreamProcessing.size} pending stream(s) ` +\n `after ${timeoutMs}ms (started with ${initialCount})`,\n );\n }\n};\n\n/**\n * Consumes a stream result to ensure background processing completes.\n * This is useful in debugger mode where there's no caller to consume the stream.\n * @param result - The result that might be a stream\n * @returns The same result, or accumulated data if it was a stream\n */\nexport const consumeStreamResult = async (result: unknown): Promise<unknown> => {\n const streamInfo = getStream(result);\n\n if (streamInfo.type === null) {\n // Not a stream, return as-is\n logger.debug(\"Result is not a stream, returning as-is\");\n return result;\n }\n\n logger.debug(\"Result is a stream, consuming...\");\n\n if (streamInfo.type === 'aisdk-result') {\n // For AI SDK results, just await the text property to trigger consumption\n // The background task will handle collecting all data\n try {\n if ('text' in streamInfo.result) {\n await streamInfo.result.text;\n }\n } catch (error) {\n logger.warn(\"Error consuming AI SDK result stream: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n return result;\n }\n\n if (streamInfo.type === 'readable-stream') {\n // Consume the ReadableStream\n const chunks: unknown[] = [];\n try {\n const reader = streamInfo.stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n } catch (error) {\n logger.warn(\"Error consuming ReadableStream: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n return { type: 'stream', chunks };\n }\n\n if (streamInfo.type === 'async-iterable') {\n // Consume the AsyncIterable\n const chunks: unknown[] = [];\n try {\n for await (const chunk of streamInfo.iterable) {\n chunks.push(chunk);\n }\n } catch (error) {\n logger.warn(\"Error consuming AsyncIterable: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n return { type: 'async-iterable', chunks };\n }\n\n if (streamInfo.type === 'response') {\n // Consume the Response body\n try {\n const { chunks, error } = await consumeResponse(streamInfo.response);\n if (error) {\n logger.warn(\"Error consuming Response: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n return { type: 'response', chunks };\n } catch (error) {\n logger.warn(\"Error consuming Response: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n return result;\n }\n }\n\n return result;\n};\n\n/**\n * Track a background promise and ensure cleanup\n */\nconst trackStreamProcessing = (task: () => Promise<void>): void => {\n const processingPromise = task().finally(() => {\n pendingStreamProcessing.delete(processingPromise);\n });\n\n pendingStreamProcessing.add(processingPromise);\n};\n\n/**\n * Handles streaming results by consuming the stream in the background\n * while passing through the original result to the caller\n */\nexport const handleStreamResult = <T>(\n originalResult: T,\n streamInfo: ReturnType<typeof getStream>,\n span: Span,\n ignoreOutput: boolean | undefined,\n serialize: (payload: unknown) => string,\n): T | ReadableStream<unknown> | AsyncIterable<unknown> | Response => {\n logger.debug(`Handling stream result of type: ${streamInfo.type}`);\n\n if (streamInfo.type === 'aisdk-result') {\n // For AI SDK results, consume the promise properties in the background\n trackStreamProcessing(async () => {\n logger.debug('Starting background processing for AI SDK result');\n\n let partialOutput: any = {};\n try {\n partialOutput = await consumeAISDKResult(streamInfo.result);\n\n if (shouldSendTraces() && !ignoreOutput) {\n try {\n span.setAttribute(SPAN_OUTPUT, serialize(partialOutput));\n } catch (error) {\n logger.warn(\"Failed to serialize AI SDK stream output: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n } catch (error) {\n // Record partial output if we have any\n if (Object.keys(partialOutput).length > 0 && shouldSendTraces() && !ignoreOutput) {\n try {\n span.setAttribute(SPAN_OUTPUT, serialize(partialOutput));\n } catch (serError) {\n logger.warn(\"Failed to serialize partial AI SDK output: \" +\n `${serError instanceof Error ? serError.message : String(serError)}`);\n }\n }\n span.recordException(error as Error);\n } finally {\n logger.debug('Ending span for AI SDK result');\n span.end();\n }\n });\n\n return originalResult;\n }\n\n if (streamInfo.type === 'readable-stream') {\n logger.debug('Setting up background processing for ReadableStream');\n const { stream, dataPromise } = consumeAndTeeReadableStream(streamInfo.stream);\n\n // Consume in background\n trackStreamProcessing(async () => {\n try {\n const { chunks, error } = await dataPromise;\n\n if (shouldSendTraces() && !ignoreOutput) {\n try {\n const output = { type: 'stream', chunks };\n span.setAttribute(SPAN_OUTPUT, serialize(output));\n } catch (serError) {\n logger.warn(\"Failed to serialize stream output: \" +\n `${serError instanceof Error ? serError.message : String(serError)}`);\n }\n }\n\n if (error) {\n span.recordException(error as Error);\n }\n } finally {\n logger.debug('Ending span for ReadableStream');\n span.end();\n }\n });\n\n return stream;\n }\n\n if (streamInfo.type === 'async-iterable') {\n logger.debug('Setting up background processing for AsyncIterable');\n const { iterable, dataPromise } = consumeAndTeeAsyncIterable(streamInfo.iterable);\n\n // Consume in background\n trackStreamProcessing(async () => {\n try {\n const { chunks, error } = await dataPromise;\n\n if (shouldSendTraces() && !ignoreOutput) {\n try {\n const output = { type: 'async-iterable', chunks };\n span.setAttribute(SPAN_OUTPUT, serialize(output));\n } catch (serError) {\n logger.warn(\"Failed to serialize async iterable output: \" +\n `${serError instanceof Error ? serError.message : String(serError)}`);\n }\n }\n\n if (error) {\n span.recordException(error as Error);\n }\n } finally {\n logger.debug('Ending span for AsyncIterable');\n span.end();\n }\n });\n\n return iterable;\n }\n\n if (streamInfo.type === 'response') {\n logger.debug('Setting up background processing for Response');\n // For Response objects, extract the body stream and tee it\n const originalResponse = streamInfo.response;\n\n if (!originalResponse.body) {\n // No body, just return as-is and end span\n span.end();\n return originalResult;\n }\n\n const [stream1, stream2] = originalResponse.body.tee();\n\n // Create a new Response with the teed stream for the caller\n const newResponse = new Response(stream1, {\n status: originalResponse.status,\n statusText: originalResponse.statusText,\n headers: originalResponse.headers,\n });\n\n // Consume the other stream in background\n trackStreamProcessing(async () => {\n try {\n // Create a temporary Response to use consumeResponse helper\n const tempResponse = new Response(stream2);\n const { chunks, error } = await consumeResponse(tempResponse);\n\n if (shouldSendTraces() && !ignoreOutput) {\n try {\n const output = { type: 'response', chunks };\n span.setAttribute(SPAN_OUTPUT, serialize(output));\n } catch (serError) {\n logger.warn(\"Failed to serialize response output: \" +\n `${serError instanceof Error ? serError.message : String(serError)}`);\n }\n }\n\n if (error) {\n span.recordException(error as Error);\n }\n } catch (err) {\n span.recordException(err as Error);\n } finally {\n logger.debug('Ending span for Response');\n span.end();\n }\n });\n\n return newResponse;\n }\n\n // Should never reach here, but just in case\n logger.warn('Stream type not handled, ending span immediately');\n span.end();\n return originalResult;\n};\n","//#region src/tracing.ts\n/**\n* Tracing levels to conditionally disable tracing.\n*\n* OFF - No tracing is sent.\n* META_ONLY - Only metadata is sent (e.g. tokens, costs, etc.).\n* ALL - All data is sent.\n*/\nlet TracingLevel = /* @__PURE__ */ function(TracingLevel) {\n\tTracingLevel[\"OFF\"] = \"off\";\n\tTracingLevel[\"META_ONLY\"] = \"meta_only\";\n\tTracingLevel[\"ALL\"] = \"all\";\n\treturn TracingLevel;\n}({});\n//#endregion\n//#region src/worker-protocol.ts\n/**\n* Message prefix for protocol messages in stdout\n*/\nconst WORKER_MESSAGE_PREFIX = \"__LMNR_WORKER__:\";\n//#endregion\nexport { TracingLevel, WORKER_MESSAGE_PREFIX };\n\n//# sourceMappingURL=index.mjs.map","\nimport { LaminarSpanContext, TraceType, TracingLevel } from \"@lmnr-ai/types\";\nimport {\n Attributes,\n AttributeValue,\n type Context,\n Exception,\n HrTime,\n Link,\n type Span,\n SpanContext,\n SpanKind,\n SpanStatus,\n TimeInput,\n} from \"@opentelemetry/api\";\nimport { type InstrumentationScope } from \"@opentelemetry/core\";\nimport { ReadableSpan, type Span as SdkSpan, TimedEvent } from \"@opentelemetry/sdk-trace-base\";\n\nimport {\n initializeLogger,\n metadataToAttributes,\n otelSpanIdToUUID,\n otelTraceIdToUUID,\n StringUUID,\n} from \"../../utils\";\nimport {\n ASSOCIATION_PROPERTIES,\n ROLLOUT_SESSION_ID,\n SESSION_ID,\n SPAN_IDS_PATH,\n SPAN_INPUT,\n SPAN_OUTPUT,\n SPAN_PATH,\n TRACE_TYPE,\n USER_ID,\n} from \"./attributes\";\nimport { getParentSpanId, makeSpanOtelV2Compatible } from \"./compat\";\nimport { LaminarContextManager } from \"./context\";\n\nconst logger = initializeLogger();\n\n// We decided to implement raw otel Span interface and have _span: SdkSpan because SdkSpan\n// discourages use of its constructor directly in favour of Tracer.startSpan()\n// We are using constructor directly because we're implementing Tracer interface as well.\nexport class LaminarSpan implements Span, ReadableSpan {\n private _span: SdkSpan;\n // Whether the span is started by Laminar.startActiveSpan()\n private _activated: boolean;\n // When set, the span was pushed onto the process-global context stack via\n // `Laminar.startActiveSpan({ global: true })`. We remember the exact Context\n // reference so `end()` can pop the matching entry, even if spans end out of\n // order.\n private _globalActiveContext?: Context;\n\n constructor(span: Span, activated?: boolean) {\n if (span instanceof LaminarSpan) {\n this._activated = span.isActivated;\n this._span = span._span;\n } else {\n this._activated = activated ?? false;\n\n // This line assumes that the span passed here is an SdkSpan. Reason:\n // When using default OpenTelemetry Node SDK, i.e. NodeTracerProvider.getTracer().startSpan(),\n // the span returned is an SdkSpan. SDK span implements ReadableSpan, so attributes\n // can be accessed. Span, i.e. OpenTelemetry API Span, does not require that, so custom\n // SDK implementations may not implement certain ReadableSpan methods, in particular\n // `attributes` that we need to access.\n this._span = span as SdkSpan;\n }\n\n this.name = (this._span as unknown as SdkSpan).name;\n this.kind = (this._span as unknown as SdkSpan).kind;\n this.startTime = (this._span as unknown as SdkSpan).startTime;\n this.endTime = (this._span as unknown as SdkSpan).endTime;\n this.status = (this._span as unknown as SdkSpan).status;\n this.attributes = (this._span as unknown as SdkSpan).attributes;\n this.links = (this._span as unknown as SdkSpan).links;\n this.events = (this._span as unknown as SdkSpan).events;\n this.duration = (this._span as unknown as SdkSpan).duration;\n this.ended = (this._span as unknown as SdkSpan).ended;\n this.resource = (this._span as unknown as SdkSpan).resource;\n this.instrumentationLibrary = (this._span as any).instrumentationLibrary;\n this.droppedAttributesCount = (this._span as unknown as SdkSpan).droppedAttributesCount;\n this.droppedEventsCount = (this._span as unknown as SdkSpan).droppedEventsCount;\n this.droppedLinksCount = (this._span as unknown as SdkSpan).droppedLinksCount;\n this.makeOtelV2Compatible();\n LaminarContextManager.addActiveSpan(this.spanContext().spanId);\n }\n\n name: string;\n kind: SpanKind;\n parentSpanId?: string | undefined;\n startTime: HrTime;\n endTime: HrTime;\n status: SpanStatus;\n attributes: Attributes;\n links: Link[];\n events: TimedEvent[];\n duration: HrTime;\n ended: boolean;\n resource: any; // type IResource from `@opentelemetry/resources`\n instrumentationLibrary: any; // type InstrumentationLibrary from `@opentelemetry/core`\n droppedAttributesCount: number;\n droppedEventsCount: number;\n droppedLinksCount: number;\n\n public spanContext(): SpanContext {\n return this._span.spanContext();\n }\n\n public setAttribute(key: string, value: AttributeValue): this {\n this._span.setAttribute(key, value);\n return this;\n }\n\n public setAttributes(attributes: Attributes): this {\n this._span.setAttributes(attributes);\n return this;\n }\n\n public addEvent(\n name: string,\n attributesOrStartTime?: Attributes | TimeInput,\n startTime?: TimeInput,\n ): this {\n this._span.addEvent(name, attributesOrStartTime, startTime);\n return this;\n }\n\n public addLink(link: Link): this {\n this._span.addLink(link);\n return this;\n }\n\n public addLinks(links: Link[]): this {\n this._span.addLinks(links);\n return this;\n }\n\n public setStatus(status: SpanStatus): this {\n this._span.setStatus(status);\n return this;\n }\n\n public updateName(name: string): this {\n this._span.updateName(name);\n return this;\n }\n\n public end(endTime?: TimeInput): void {\n if (!this._span.isRecording()) {\n // This will log a warning and do nothing.\n return this._span.end(endTime);\n }\n\n // Remove from global registry on end\n LaminarContextManager.removeActiveSpan(this.spanContext().spanId);\n\n if (this._activated) {\n LaminarContextManager.popContext();\n }\n if (this._globalActiveContext !== undefined) {\n LaminarContextManager.popGlobalContext(this._globalActiveContext);\n this._globalActiveContext = undefined;\n }\n return this._span.end(endTime);\n }\n\n public setGlobalActiveContext(context: Context): void {\n this._globalActiveContext = context;\n }\n\n public set activated(activated: boolean) {\n this._activated = activated;\n }\n\n public isRecording(): boolean {\n return this._span.isRecording();\n }\n\n public recordException(exception: Exception, time?: TimeInput): void {\n return this._span.recordException(exception, time);\n }\n\n // ================================\n // Laminar specific methods\n // ================================\n\n public setTraceSessionId(sessionId: string): void {\n this._span.setAttribute(SESSION_ID, sessionId);\n }\n\n public setTraceUserId(userId: string): void {\n this._span.setAttribute(USER_ID, userId);\n }\n\n public setTraceRolloutSessionId(rolloutSessionId: string): void {\n this._span.setAttribute(\"lmnr.rollout.session_id\", rolloutSessionId);\n }\n\n public setTraceMetadata(metadata: Record<string, any>): void {\n this._span.setAttributes(metadataToAttributes(metadata));\n }\n\n public setInput(input: any): void {\n const finalInput = typeof input === 'string' ? input : JSON.stringify(input);\n this._span.setAttribute(SPAN_INPUT, finalInput);\n }\n\n public setOutput(output: any): void {\n const finalOutput = typeof output === 'string' ? output : JSON.stringify(output);\n this._span.setAttribute(SPAN_OUTPUT, finalOutput);\n }\n\n public setTags(tags: string[]): void {\n this._span.setAttribute(`${ASSOCIATION_PROPERTIES}.tags`, Array.from(new Set(tags)));\n }\n\n public addTags(tags: string[]): void {\n const currentTags = this.tags;\n this.setTags(Array.from(new Set([...currentTags, ...tags])));\n }\n\n public getLaminarSpanContext(): LaminarSpanContext {\n let spanPath: string[] = [];\n let spanIdsPath: StringUUID[] = [];\n let userId;\n let sessionId;\n let rolloutSessionId;\n let traceType;\n let tracingLevel = TracingLevel.ALL;\n const metadata: Record<string, AttributeValue> = {};\n\n if (this._span.attributes) {\n spanPath = this._span.attributes[SPAN_PATH] as string[];\n spanIdsPath = this._span.attributes[SPAN_IDS_PATH] as StringUUID[];\n userId = this._span.attributes[USER_ID] as string;\n sessionId = this._span.attributes[SESSION_ID] as string;\n rolloutSessionId = this._span.attributes[ROLLOUT_SESSION_ID] as string;\n traceType = this._span.attributes[TRACE_TYPE] as TraceType;\n tracingLevel = this._span.attributes[\n `${ASSOCIATION_PROPERTIES}.tracing_level`\n ] as TracingLevel ?? TracingLevel.ALL;\n for (const [key, rawValue] of Object.entries(this._span.attributes)) {\n if (key.startsWith(`${ASSOCIATION_PROPERTIES}.metadata.`)) {\n let value = rawValue!;\n try {\n value = JSON.parse(value as string);\n } catch {\n // Ignore\n }\n metadata[key.replace(`${ASSOCIATION_PROPERTIES}.metadata.`, '')] = value;\n }\n }\n } else {\n logger.warn(\n \"Attributes object is not available. Most likely the span is not a LaminarSpan \" +\n \"and not an OpenTelemetry default SDK Span. Span path and ids path will be empty.\",\n );\n }\n\n return {\n spanId: otelSpanIdToUUID(this._span.spanContext().spanId) as StringUUID,\n traceId: otelTraceIdToUUID(this._span.spanContext().traceId),\n isRemote: this._span.spanContext().isRemote ?? false,\n spanPath,\n spanIdsPath,\n userId,\n sessionId,\n rolloutSessionId,\n metadata,\n traceType,\n tracingLevel,\n };\n }\n\n public spanId(\n format: 'otel' | 'uuid' = 'otel',\n ): string {\n const spanId = this._span.spanContext().spanId;\n if (format === 'otel') {\n return spanId;\n }\n return otelSpanIdToUUID(spanId);\n }\n\n public traceId(\n format: 'otel' | 'uuid' = 'otel',\n ): string {\n const traceId = this._span.spanContext().traceId;\n if (format === 'otel') {\n return traceId;\n }\n return otelTraceIdToUUID(traceId);\n }\n\n public get tags(): string[] {\n if (!this._span.attributes) {\n logger.warn(\n \"[LaminarSpan.tags] WARNING. Current span does not have attributes object. \" +\n \"Possibly, the span was created with a custom OTel SDK. Returning an empty list. \" +\n \"Help: OpenTelemetry API does not guarantee reading attributes from a span, but OTel \" +\n \"SDK allows it by default. Laminar SDK allows to read attributes too.\",\n );\n return [];\n }\n return this._span.attributes[`${ASSOCIATION_PROPERTIES}.tags`] as string[] ?? [];\n }\n\n public get laminarAssociationProperties(): {\n metadata?: Record<string, any>;\n userId?: string;\n sessionId?: string;\n rolloutSessionId?: string;\n traceType?: TraceType;\n tracingLevel?: TracingLevel;\n } {\n if (!this._span.attributes) {\n logger.warn(\n \"[LaminarSpan.laminarAssociationProperties] WARNING. Current span does not have \" +\n \"attributes object. Possibly, the span was created with a custom OTel SDK. Returning an \" +\n \"empty object. Help: OpenTelemetry API does not guarantee reading attributes from a \" +\n \"span, but OTel SDK allows it by default. Laminar SDK allows to read attributes too.\",\n );\n return {};\n }\n try {\n const properties: Record<string, any> = {};\n const metadata: Record<string, any> = {};\n for (const [key, rawValue] of Object.entries(this._span.attributes)) {\n if (!key.startsWith(`${ASSOCIATION_PROPERTIES}.`)) {\n continue;\n }\n let value = rawValue!;\n if (key.startsWith(`${ASSOCIATION_PROPERTIES}.metadata.`)) {\n const metaKey = key.replace(`${ASSOCIATION_PROPERTIES}.metadata.`, '');\n try {\n value = JSON.parse(value as string);\n } catch {\n // Ignore\n }\n metadata[metaKey] = value;\n }\n }\n properties.tracingLevel = this._span.attributes[\n `${ASSOCIATION_PROPERTIES}.tracing_level`\n ] as TracingLevel ?? TracingLevel.ALL;\n properties.userId = this._span.attributes[USER_ID] as string ?? undefined;\n properties.sessionId = this._span.attributes[SESSION_ID] as string ?? undefined;\n properties.rolloutSessionId = this._span.attributes[ROLLOUT_SESSION_ID] as string\n ?? undefined;\n properties.traceType = this._span.attributes[TRACE_TYPE] as TraceType ?? undefined;\n return {\n metadata,\n ...properties,\n };\n } catch {\n return {};\n }\n }\n\n // ================================\n // OTel V2 compatibility\n // ================================\n\n public makeOtelV2Compatible(): void {\n makeSpanOtelV2Compatible(this._span);\n }\n\n public get instrumentationScope(): InstrumentationScope {\n return (this._span as any).instrumentationLibrary as unknown as InstrumentationScope;\n }\n\n public get parentSpanContext(): SpanContext | undefined {\n const parentSpanId = getParentSpanId(this._span);\n if (!parentSpanId) {\n return undefined;\n }\n return {\n spanId: parentSpanId,\n traceId: this.spanContext().traceId,\n // TODO: somehow get the traceFlags from the parent span\n traceFlags: this.spanContext().traceFlags,\n };\n }\n\n public getParentSpanId(): string | undefined {\n return getParentSpanId(this._span as unknown as SdkSpan);\n }\n\n public get isActivated(): boolean {\n return this._activated;\n }\n}\n","import { TraceType, TracingLevel } from \"@lmnr-ai/types\";\nimport {\n Context, context as contextApi,\n createContextKey, ROOT_CONTEXT, trace } from \"@opentelemetry/api\";\nimport { AsyncLocalStorage } from \"async_hooks\";\n\nimport { LaminarSpan } from \"./span\";\n\nexport const CONTEXT_SPAN_PATH_KEY = createContextKey(\"span_path\");\nexport const ASSOCIATION_PROPERTIES_KEY = createContextKey(\n \"association_properties\",\n);\nexport const CONTEXT_GLOBAL_METADATA_KEY = createContextKey(\n \"global_metadata\",\n);\n\nexport class LaminarContextManager {\n private static _asyncLocalStorage = new AsyncLocalStorage<Context[]>();\n private static _globalMetadata: Record<string, any> = {};\n private static _inheritGlobalContext: boolean = false;\n // Static registry for cross-async span management\n // We're keeping track of spans have started (and running) here for the cases when span\n // is started in one async context and ended in another\n // We use this registry to ignore the context of spans that were already ended in\n // another async context.\n // LaminarSpan adds and removes itself to and from this registry in start()\n // and end() methods respectively.\n private static _activeSpans: Set<string> = new Set();\n // Process-global stack of contexts marked globally active via\n // `Laminar.startActiveSpan({ global: true })`. Unlike the AsyncLocalStorage\n // stack, this one is visible from any async task in the process. We use it\n // as the fallback parent when the ALS stack is empty. Spans push onto this\n // stack when started globally and pop in `LaminarSpan.end()`.\n private static _globalActiveContexts: Context[] = [];\n\n private constructor() {\n throw new Error(\"LaminarContextManager is a static class and cannot be instantiated\");\n }\n\n private static isValidContext(context: Context): boolean {\n const span = trace.getSpan(context);\n if (!span) {\n return true;\n }\n if (!span.isRecording() && span.spanContext().isRemote) {\n return true;\n }\n if (!(span instanceof LaminarSpan)) {\n return true;\n }\n if (!span.isActivated) {\n return true;\n }\n try {\n return this._activeSpans.has(span.spanContext().spanId);\n } catch {\n return true;\n }\n }\n\n private static findLatestValidContext(contexts: Context[]): Context | undefined {\n // Walk through contexts from most recent to oldest and return the most\n // recent one that is still valid (has a live activated span, or has no\n // span at all).\n for (let i = contexts.length - 1; i >= 0; i--) {\n if (this.isValidContext(contexts[i])) {\n return contexts[i];\n }\n }\n return undefined;\n }\n\n public static getContext(): Context {\n // Prefer the per-async context stack so local control flow wins over any\n // globally-registered span. Fall back to the global stack so spans started\n // via `startActiveSpan({ global: true })` act as parents for descendants\n // that run in unrelated async tasks.\n const asyncContext = this.findLatestValidContext(this.getContextStack());\n if (asyncContext !== undefined) {\n return asyncContext;\n }\n const globalContext = this.findLatestValidContext(this._globalActiveContexts);\n if (globalContext !== undefined) {\n return globalContext;\n }\n return ROOT_CONTEXT;\n }\n\n public static pushContext(context: Context) {\n const contexts = this.getContextStack();\n const newContexts = [...contexts, context];\n this._asyncLocalStorage.enterWith(newContexts);\n }\n\n public static popContext() {\n const contexts = this.getContextStack();\n if (contexts.length > 0) {\n // Remove the last context and filter out any contexts with inactive spans\n const newContexts = contexts.slice(0, -1).filter(context => {\n const span = trace.getSpan(context);\n\n if (!span) {\n // No span in this context, it's valid\n return true;\n }\n\n // Check if the span in this context has been ended\n try {\n return this._activeSpans.has(span.spanContext().spanId);\n } catch {\n // If we can't check the span, assume it's valid\n return true;\n }\n });\n\n this._asyncLocalStorage.enterWith(newContexts);\n }\n }\n\n public static pushGlobalContext(context: Context) {\n this._globalActiveContexts.push(context);\n }\n\n // Remove a specific context reference from the ALS stack. Unlike\n // `popContext`, this does not assume LIFO order — it locates the most\n // recent entry `=== context` and splices it out. Used by callers (e.g. the\n // OpenAI Agents processor) that activate spans so nested instrumentation\n // inherits them, but whose spans can end in arbitrary order with respect to\n // other activated spans on the same async frame.\n public static removeContext(context: Context) {\n const contexts = this.getContextStack();\n if (contexts.length === 0) {\n return;\n }\n for (let i = contexts.length - 1; i >= 0; i--) {\n if (contexts[i] === context) {\n const newContexts = contexts.slice(0, i).concat(contexts.slice(i + 1));\n this._asyncLocalStorage.enterWith(newContexts);\n return;\n }\n }\n }\n\n public static popGlobalContext(context?: Context) {\n if (context !== undefined) {\n // Remove the specific context entry (most recent occurrence) to keep\n // the stack consistent when spans end out of order across async tasks.\n for (let i = this._globalActiveContexts.length - 1; i >= 0; i--) {\n if (this._globalActiveContexts[i] === context) {\n this._globalActiveContexts.splice(i, 1);\n return;\n }\n }\n return;\n }\n if (this._globalActiveContexts.length > 0) {\n this._globalActiveContexts.pop();\n }\n }\n\n public static clearContexts() {\n this._asyncLocalStorage.enterWith([]);\n this._globalActiveContexts = [];\n }\n\n public static clearActiveSpans() {\n this._activeSpans.clear();\n }\n\n public static getContextStack(): Context[] {\n return this._asyncLocalStorage.getStore()\n || (this._inheritGlobalContext ? [contextApi.active()] : []);\n }\n\n /**\n * Run a function with an isolated context stack.\n * This ensures that parallel executions don't interfere with each other.\n */\n public static runWithIsolatedContext<T>(initialStack: Context[], fn: () => T): T {\n return this._asyncLocalStorage.run(initialStack, fn);\n }\n\n public static addActiveSpan(spanId: string): void {\n this._activeSpans.add(spanId);\n }\n\n public static removeActiveSpan(spanId: string): void {\n this._activeSpans.delete(spanId);\n }\n\n public static setAssociationProperties(span: LaminarSpan, context: Context): Context {\n const properties = span.laminarAssociationProperties;\n\n return this.setRawAssociationProperties(properties, context);\n }\n\n public static setRawAssociationProperties(\n properties: Record<string, any>,\n context: Context,\n ): Context {\n let entityContext = context;\n const userId = properties.userId;\n const sessionId = properties.sessionId;\n const rolloutSessionId = properties.rolloutSessionId;\n const traceType = properties.traceType;\n const metadata = properties.metadata;\n const tracingLevel = properties.tracingLevel;\n entityContext = entityContext.setValue(ASSOCIATION_PROPERTIES_KEY, {\n userId,\n sessionId,\n traceType,\n metadata,\n tracingLevel,\n rolloutSessionId,\n });\n return entityContext;\n }\n\n public static setGlobalMetadata(globalMetadata: Record<string, any>) {\n this._globalMetadata = globalMetadata;\n }\n\n public static getGlobalMetadata(): Record<string, any> {\n return this._globalMetadata;\n }\n\n public static getAssociationProperties(): {\n userId?: string;\n sessionId?: string;\n rolloutSessionId?: string;\n traceType?: TraceType;\n tracingLevel?: TracingLevel;\n metadata?: Record<string, any>;\n } {\n const entityContext = this.getContext();\n return entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {};\n }\n\n public static set inheritGlobalContext(inheritGlobalContext: boolean) {\n this._inheritGlobalContext = inheritGlobalContext;\n }\n}\n","import { trace } from \"@opentelemetry/api\";\nimport type { ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\nimport * as fs from \"fs\";\nimport * as net from \"net\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nimport { Laminar } from \"../../../laminar\";\nimport { initializeLogger } from \"../../../utils\";\nimport { SPAN_IDS_PATH, SPAN_PATH } from \"../../tracing/attributes\";\nimport { LaminarContextManager } from \"../../tracing/context\";\n\nconst logger = initializeLogger();\n\nconst DEFAULT_ANTHROPIC_BASE_URL = \"https://api.anthropic.com\";\nconst DEFAULT_CC_PROXY_PORT = 45667;\nconst CC_PROXY_PORT_ATTEMPTS = 50;\n\n// Foundry configuration constants\nconst FOUNDRY_BASE_URL_ENV = \"ANTHROPIC_FOUNDRY_BASE_URL\";\nconst FOUNDRY_RESOURCE_ENV = \"ANTHROPIC_FOUNDRY_RESOURCE\";\nconst FOUNDRY_USE_ENV = \"CLAUDE_CODE_USE_FOUNDRY\";\n\n// Bedrock configuration constants\nconst BEDROCK_BASE_URL_ENV = \"ANTHROPIC_BEDROCK_BASE_URL\";\nconst BEDROCK_USE_ENV = \"CLAUDE_CODE_USE_BEDROCK\";\nconst BEDROCK_AWS_REGION_ENV = \"AWS_REGION\";\n\n// Vertex AI configuration constants\nconst VERTEX_BASE_URL_ENV = \"ANTHROPIC_VERTEX_BASE_URL\";\nconst VERTEX_USE_ENV = \"CLAUDE_CODE_USE_VERTEX\";\n\n// Track all active proxy instances for cleanup\nconst activeProxyServers = new Set<any>(); // Set<ProxyServer>\nlet globalShutdownRegistered = false;\n\n/**\n * Check if environment variable value is truthy (equals '1')\n */\nconst isTruthyEnv = (value: string | undefined): boolean => value === \"1\";\n\n/**\n * Read region for a given profile from ~/.aws/config.\n */\nconst getRegionFromAwsConfig = (profile: string): string | null => {\n const configPath = path.join(os.homedir(), \".aws\", \"config\");\n let content: string;\n try {\n content = fs.readFileSync(configPath, \"utf-8\");\n } catch {\n return null;\n }\n\n const profileHeader =\n profile === \"default\" ? \"default\" : `profile ${profile}`;\n const escapedHeader = profileHeader.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regex = new RegExp(\n `\\\\[${escapedHeader}\\\\][^\\\\[]*?^\\\\s*region\\\\s*=\\\\s*([^\\\\s\\\\n]+)`,\n \"ms\",\n );\n const match = content.match(regex);\n return match ? match[1] : null;\n};\n\n/**\n * Resolve target URL from environment dictionary with process.env fallback.\n *\n * This is the single source of truth for determining the target URL for the proxy.\n *\n * Resolution order (highest to lowest priority):\n * 1. HTTPS_PROXY - if set, use as target (our proxy will forward to it)\n * 2. HTTP_PROXY - if set, use as target (our proxy will forward to it)\n * 3. Third-party provider URLs (e.g., Foundry, Bedrock):\n * - If CLAUDE_CODE_USE_FOUNDRY is truthy:\n * - Use ANTHROPIC_FOUNDRY_BASE_URL, or\n * - Construct from ANTHROPIC_FOUNDRY_RESOURCE\n * - If CLAUDE_CODE_USE_BEDROCK is truthy:\n * - Use ANTHROPIC_BEDROCK_BASE_URL, or\n * - Construct from AWS_REGION env var, or\n * - Construct by reading region from ~/.aws/config via AWS_PROFILE\n * - If CLAUDE_CODE_USE_VERTEX is truthy:\n * - Use ANTHROPIC_VERTEX_BASE_URL, or\n * - Construct from CLOUD_ML_REGION and ANTHROPIC_VERTEX_PROJECT_ID\n * 4. ANTHROPIC_BASE_URL - standard Anthropic API base URL\n * 5. Fall back to default (https://api.anthropic.com)\n *\n * For each environment variable, checks envDict first, then process.env as fallback.\n *\n * @param envDict - Dictionary of environment variables (e.g., from options.env)\n * @param fallback - Fallback URL if no other source found (default: DEFAULT_ANTHROPIC_BASE_URL)\n * @returns Resolved target URL, or null if provider is misconfigured\n */\nexport const resolveTargetUrlFromEnv = (\n envDict: Record<string, string | undefined>,\n fallback: string = DEFAULT_ANTHROPIC_BASE_URL,\n): string | null => {\n // Helper to get value from envDict first, then process.env\n const getEnvValue = (key: string): string | undefined =>\n envDict[key] || process.env[key];\n\n // 1. Check for HTTPS_PROXY (highest priority)\n const httpsProxy = getEnvValue(\"HTTPS_PROXY\");\n if (httpsProxy) {\n return httpsProxy.replace(/\\/$/, \"\");\n }\n\n // 2. Check for HTTP_PROXY\n const httpProxy = getEnvValue(\"HTTP_PROXY\");\n if (httpProxy) {\n return httpProxy.replace(/\\/$/, \"\");\n }\n\n // 3. Check for third-party providers (Foundry)\n const foundryEnabled = isTruthyEnv(getEnvValue(FOUNDRY_USE_ENV));\n if (foundryEnabled) {\n // Try to get Foundry base URL first\n const foundryBaseUrl = getEnvValue(FOUNDRY_BASE_URL_ENV);\n if (foundryBaseUrl) {\n return foundryBaseUrl.replace(/\\/$/, \"\");\n }\n\n // Try to construct from resource\n const foundryResource = getEnvValue(FOUNDRY_RESOURCE_ENV);\n if (foundryResource) {\n return `https://${foundryResource}.services.ai.azure.com/anthropic`;\n }\n\n // Foundry is enabled but misconfigured\n logger.error(\n `${FOUNDRY_USE_ENV} is set but neither ${FOUNDRY_BASE_URL_ENV} ` +\n `nor ${FOUNDRY_RESOURCE_ENV} is configured. ` +\n `Microsoft Foundry requires one of these values.`,\n );\n return null;\n }\n\n // 3b. Check for Bedrock\n const bedrockEnabled = isTruthyEnv(getEnvValue(BEDROCK_USE_ENV));\n if (bedrockEnabled) {\n const bedrockBaseUrl = getEnvValue(BEDROCK_BASE_URL_ENV);\n if (bedrockBaseUrl) {\n return bedrockBaseUrl.replace(/\\/$/, \"\");\n }\n\n let region = getEnvValue(BEDROCK_AWS_REGION_ENV);\n if (!region) {\n const awsProfile = getEnvValue(\"AWS_PROFILE\") || \"default\";\n region = getRegionFromAwsConfig(awsProfile) ?? undefined;\n }\n\n if (region) {\n return `https://bedrock-runtime.${region}.amazonaws.com`;\n }\n\n logger.error(\n `${BEDROCK_USE_ENV} is set but could not determine AWS region. ` +\n `Set ${BEDROCK_AWS_REGION_ENV} or configure a region ` +\n \"in ~/.aws/config for the active profile.\",\n );\n return null;\n }\n\n // 3c. Check for Vertex AI\n const vertexEnabled = isTruthyEnv(getEnvValue(VERTEX_USE_ENV));\n if (vertexEnabled) {\n // unlike for Foundry or Bedrock, we don't parse the project or region config, because\n // they affect the URL path, not the base URL, so CC can handle this part internally\n const vertexBaseUrl = getEnvValue(VERTEX_BASE_URL_ENV);\n if (vertexBaseUrl) {\n return vertexBaseUrl.replace(/\\/$/, \"\");\n }\n return `https://aiplatform.googleapis.com/v1`;\n }\n\n // 4. Check for ANTHROPIC_BASE_URL\n const anthropicBaseUrl = getEnvValue(\"ANTHROPIC_BASE_URL\");\n if (anthropicBaseUrl) {\n return anthropicBaseUrl.replace(/\\/$/, \"\");\n }\n\n // 5. Use fallback\n return fallback;\n};\n\n/**\n * Get environment variables to remove from subprocess after resolving target URL.\n * These are variables that should not be passed to the subprocess because they\n * would interfere with our proxy setup.\n *\n * @param envDict - Dictionary of environment variables\n * @returns Array of environment variable keys to remove\n */\nexport const getEnvVarsToRemove = (\n envDict: Record<string, string | undefined>,\n): string[] => {\n const toRemove: string[] = [\"HTTPS_PROXY\", \"HTTP_PROXY\"];\n\n // Helper to get value from envDict first, then process.env\n const getEnvValue = (key: string): string | undefined =>\n envDict[key] || process.env[key];\n\n // Remove FOUNDRY_RESOURCE if Foundry is enabled\n // (it's mutually exclusive with ANTHROPIC_BASE_URL which we'll set)\n const foundryEnabled = isTruthyEnv(getEnvValue(FOUNDRY_USE_ENV));\n if (foundryEnabled) {\n toRemove.push(FOUNDRY_RESOURCE_ENV);\n }\n\n return toRemove;\n};\n\n/**\n * Find an available port starting from the given port\n */\nconst findAvailablePort = (\n startPort: number,\n attempts: number,\n): Promise<number | null> =>\n new Promise((resolve) => {\n let currentAttempt = 0;\n\n const tryPort = (port: number) => {\n const server = net.createServer();\n\n server.once(\"error\", () => {\n server.close();\n currentAttempt++;\n if (currentAttempt < attempts) {\n tryPort(startPort + currentAttempt);\n } else {\n resolve(null);\n }\n });\n\n server.once(\"listening\", () => {\n server.close(() => {\n resolve(port);\n });\n });\n\n server.listen(port, \"127.0.0.1\");\n };\n\n tryPort(startPort);\n });\n\n/**\n * Wait for a port to be available\n */\nconst waitForPort = (\n port: number,\n timeoutMs: number = 5000,\n): Promise<boolean> =>\n new Promise((resolve) => {\n const deadline = Date.now() + timeoutMs;\n\n const checkPort = () => {\n if (Date.now() >= deadline) {\n resolve(false);\n return;\n }\n\n const socket = new net.Socket();\n\n socket.setTimeout(200);\n\n socket.once(\"connect\", () => {\n socket.destroy();\n resolve(true);\n });\n\n socket.once(\"timeout\", () => {\n socket.destroy();\n setTimeout(checkPort, 100);\n });\n\n socket.once(\"error\", () => {\n socket.destroy();\n setTimeout(checkPort, 100);\n });\n\n socket.connect(port, \"127.0.0.1\");\n };\n\n checkPort();\n });\n\n/**\n * Register global cleanup on process exit for all active proxies\n */\nconst registerGlobalProxyShutdown = () => {\n if (!globalShutdownRegistered) {\n process.on(\"exit\", () => {\n logger.debug('process.on(\"exit\") called - stopping all active proxies');\n for (const proxyServer of activeProxyServers) {\n try {\n proxyServer.stopServer();\n } catch (e) {\n logger.debug(\n `Failed to stop proxy: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n }\n activeProxyServers.clear();\n });\n globalShutdownRegistered = true;\n }\n};\n\n/**\n * Interface for a proxy instance with its metadata\n */\nexport interface ProxyInstance {\n server: any; // ProxyServer\n baseUrl: string;\n port: number;\n targetUrl: string;\n}\n\n/**\n * Create and start a new claude-code proxy server instance\n * Each call creates an independent proxy on a unique port\n */\nexport const createProxyInstance = async ({\n env,\n}: {\n env: Record<string, string | undefined>;\n}): Promise<ProxyInstance | null> => {\n try {\n const port = await findAvailablePort(\n DEFAULT_CC_PROXY_PORT,\n CC_PROXY_PORT_ATTEMPTS,\n );\n if (port === null) {\n logger.warn(\"Unable to allocate port for cc-proxy.\");\n return null;\n }\n\n // Resolve target URL using the priority order\n const targetUrl = resolveTargetUrlFromEnv(env);\n if (!targetUrl) {\n logger.warn(\n \"Unable to resolve target URL for cc-proxy (provider misconfigured).\",\n );\n return null;\n }\n\n logger.debug(\n `Creating proxy instance on port ${port} targeting: ${targetUrl}`,\n );\n\n try {\n // Dynamically import ProxyServer class\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { ProxyServer } = require(\"@lmnr-ai/claude-code-proxy\");\n\n const proxyServer = new ProxyServer(port);\n proxyServer.runServer(targetUrl);\n\n const isReady = await waitForPort(port);\n if (!isReady) {\n logger.warn(`cc-proxy failed to start on port ${port}`);\n proxyServer.stopServer();\n return null;\n }\n\n const proxyBaseUrl = `http://127.0.0.1:${port}`;\n\n // Track this proxy for cleanup\n activeProxyServers.add(proxyServer);\n registerGlobalProxyShutdown();\n\n logger.info(`Started claude proxy server on: ${proxyBaseUrl}`);\n\n return {\n server: proxyServer,\n baseUrl: proxyBaseUrl,\n port,\n targetUrl,\n };\n } catch (e) {\n logger.warn(\n `Unable to start cc-proxy: ${e instanceof Error ? e.message : String(e)}`,\n );\n return null;\n }\n } catch (e) {\n logger.warn(\n `Failed to create proxy instance: ${e instanceof Error ? e.message : String(e)}`,\n );\n return null;\n }\n};\n\n/**\n * Stop a specific proxy instance\n */\nexport const stopProxyInstance = (instance: ProxyInstance | null): void => {\n if (!instance) {\n return;\n }\n\n try {\n logger.debug(`Stopping proxy instance on port ${instance.port}`);\n instance.server.stopServer();\n activeProxyServers.delete(instance.server);\n } catch (e) {\n logger.debug(\n `Failed to stop proxy instance: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n};\n\n/**\n * Force stop all active proxy servers\n * Used during shutdown to ensure cleanup\n */\nexport const forceReleaseProxy = (): void => {\n logger.debug(\n `Force stopping all ${activeProxyServers.size} active proxy servers`,\n );\n for (const proxyServer of activeProxyServers) {\n try {\n proxyServer.stopServer();\n } catch (e) {\n logger.debug(\n `Failed to stop proxy: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n }\n activeProxyServers.clear();\n};\n\n/**\n * Get the current span context payload for proxy\n */\nconst getSpanContextPayload = (): {\n trace_id: string;\n span_id: string;\n project_api_key: string;\n span_ids_path: string[];\n span_path: string[];\n laminar_url: string;\n} | null => {\n const currentSpan = trace.getSpan(LaminarContextManager.getContext());\n if (\n !currentSpan ||\n (!currentSpan.spanContext().isRemote && !currentSpan.isRecording())\n ) {\n return null;\n }\n\n const spanContext = currentSpan.spanContext();\n if (!spanContext || !spanContext.traceId) {\n return null;\n }\n\n let spanIdsPath: string[] = [];\n let spanPath: string[] = [];\n\n // Try to extract span path attributes from readable span\n try {\n const readableSpan = currentSpan as unknown as ReadableSpan;\n if (readableSpan.attributes) {\n const idsPath = readableSpan.attributes[SPAN_IDS_PATH];\n const path = readableSpan.attributes[SPAN_PATH];\n\n if (Array.isArray(idsPath)) {\n spanIdsPath = idsPath as string[];\n }\n if (Array.isArray(path)) {\n spanPath = path as string[];\n }\n }\n } catch {\n // If we can't access attributes, continue with empty arrays\n }\n\n const projectApiKey = Laminar.getProjectApiKey();\n const laminarUrl = Laminar.getHttpUrl();\n\n return {\n trace_id: spanContext.traceId,\n span_id: spanContext.spanId,\n project_api_key: projectApiKey || \"\",\n span_ids_path: spanIdsPath,\n span_path: spanPath,\n laminar_url: laminarUrl || \"https://api.lmnr.ai\",\n };\n};\n\n/**\n * Set the trace context for a specific proxy instance\n */\nexport const setTraceToProxyInstance = async (\n instance: ProxyInstance | null,\n): Promise<void> => {\n if (!instance) {\n return;\n }\n\n const payload = getSpanContextPayload();\n if (!payload) {\n return;\n }\n\n try {\n await instance.server.setCurrentTrace({\n traceId: payload.trace_id,\n spanId: payload.span_id,\n projectApiKey: payload.project_api_key,\n spanIdsPath: payload.span_ids_path,\n spanPath: payload.span_path,\n laminarUrl: payload.laminar_url,\n });\n logger.debug(`Set trace context to proxy on port ${instance.port}`);\n } catch (e: any) {\n logger.debug(\n `Unable to set trace context to proxy on port ${instance.port}: ` +\n (e instanceof Error ? e.message : String(e)),\n );\n }\n};\n","import { diag } from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\n\nimport { version as SDK_VERSION } from \"../../../../package.json\";\nimport { Laminar } from \"../../../laminar\";\nimport { initializeLogger } from \"../../../utils\";\nimport { SPAN_INPUT, SPAN_OUTPUT } from \"../../tracing/attributes\";\nimport {\n createProxyInstance,\n forceReleaseProxy,\n getEnvVarsToRemove,\n type ProxyInstance,\n resolveTargetUrlFromEnv,\n setTraceToProxyInstance,\n stopProxyInstance,\n} from \"./proxy\";\n\n// Re-export forceReleaseProxy for cleanup in Laminar.shutdown()\nexport { forceReleaseProxy };\n\nconst logger = initializeLogger();\n\n/**\n * Create an instrumented version of the claude-agent-sdk query function.\n * This can be used when importing the query function before Laminar initialization.\n *\n * @param originalQuery - The original query function from claude-agent-sdk\n * @returns The instrumented query function\n */\nexport function instrumentClaudeAgentQuery(\n originalQuery: any, // typeof ClaudeAgentSDK.query\n): any {\n // typeof ClaudeAgentSDK.Query\n return (params: {\n prompt: string | AsyncIterable<any>; // AsyncIterable<ClaudeAgentSDK.SDKUserMessage>\n options?: any; // ClaudeAgentSDK.Options\n }) => {\n const laminarActive =\n Laminar.initialized() || !!process.env.LMNR_PROJECT_API_KEY;\n\n if (!laminarActive) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return originalQuery(params);\n }\n\n const span = Laminar.startSpan({\n name: \"query\",\n spanType: \"DEFAULT\",\n });\n\n span.setAttribute(\n SPAN_INPUT,\n JSON.stringify({\n prompt: typeof params.prompt === \"string\" ? params.prompt : \"<stream>\",\n }),\n );\n\n const generator = async function* () {\n const collected: any[] = []; // ClaudeAgentSDK.SDKMessage[]\n let proxyInstance: ProxyInstance | null = null;\n\n try {\n // Merge environment variables: process.env + params.options.env\n // params.options.env takes precedence\n const mergedEnv = {\n ...process.env,\n ...(params.options?.env ?? {}),\n };\n\n // Resolve target URL before creating proxy\n const targetUrl = resolveTargetUrlFromEnv(mergedEnv);\n\n // Create a dedicated proxy instance for this request\n proxyInstance = await createProxyInstance({\n env: mergedEnv,\n });\n\n // Configure the request to use the proxy\n if (proxyInstance && targetUrl) {\n logger.debug(`Using proxy on port ${proxyInstance.port}`);\n\n // Set trace context for this specific proxy instance\n await Laminar.withSpan(span, async () => {\n logger.debug(\"Setting trace to proxy instance...\");\n await setTraceToProxyInstance(proxyInstance);\n });\n\n // Get environment variables that should be removed\n const varsToRemove = getEnvVarsToRemove(mergedEnv);\n\n // Update environment for subprocess\n if (!params.options) {\n params.options = {};\n }\n if (!params.options.env) {\n params.options.env = {};\n }\n\n // Start with merged env and update for proxy\n params.options.env = { ...mergedEnv };\n\n // Set proxy URL\n params.options.env.ANTHROPIC_BASE_URL = proxyInstance.baseUrl;\n\n // Store original target URL so proxy knows where to forward\n params.options.env.ANTHROPIC_ORIGINAL_BASE_URL = targetUrl;\n\n // Remove proxy-related variables that would interfere\n for (const varName of varsToRemove) {\n delete params.options.env[varName];\n }\n\n // If Foundry is enabled, update Foundry-specific env vars\n const foundryEnabled =\n params.options.env.CLAUDE_CODE_USE_FOUNDRY === \"1\";\n if (foundryEnabled) {\n params.options.env.ANTHROPIC_FOUNDRY_BASE_URL =\n proxyInstance.baseUrl;\n }\n\n // If Bedrock is enabled, update Bedrock-specific env vars\n const bedrockEnabled =\n params.options.env.CLAUDE_CODE_USE_BEDROCK === \"1\";\n if (bedrockEnabled) {\n params.options.env.ANTHROPIC_BEDROCK_BASE_URL =\n proxyInstance.baseUrl;\n }\n\n // If Vertex AI is enabled, update Vertex-specific env vars\n const vertexEnabled =\n params.options.env.CLAUDE_CODE_USE_VERTEX === \"1\";\n if (vertexEnabled) {\n params.options.env.ANTHROPIC_VERTEX_BASE_URL =\n proxyInstance.baseUrl;\n }\n } else {\n logger.debug(\n \"No claude proxy server available. Proceeding without proxy.\",\n );\n }\n\n // Call original and wrap the generator\n const originalGenerator = originalQuery(params);\n\n // Yield items and collect\n for await (const message of originalGenerator) {\n collected.push(message);\n yield message;\n }\n } catch (error) {\n Laminar.withSpan(span, () => {\n span.recordException(error as Error);\n });\n throw error;\n } finally {\n // Stop this proxy instance\n stopProxyInstance(proxyInstance);\n span.setAttribute(SPAN_OUTPUT, JSON.stringify(collected));\n span.end();\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return generator() as any; // ClaudeAgentSDK.Query\n };\n}\n\n/* eslint-disable\n @typescript-eslint/no-unsafe-function-type\n*/\nexport class ClaudeAgentSDKInstrumentation extends InstrumentationBase {\n constructor() {\n super(\"@lmnr/claude-agent-instrumentation\", SDK_VERSION, {\n enabled: true,\n });\n }\n\n protected init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(\n \"@anthropic-ai/claude-agent-sdk\",\n [\">=0.1.0\"],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return module;\n }\n\n // { query?: typeof ClaudeAgentSDK.query }\n public manuallyInstrument(claudeAgentModule: { query?: any }) {\n // Only instrument the query function if provided\n if (\n claudeAgentModule.query &&\n typeof claudeAgentModule.query === \"function\"\n ) {\n this._wrap(claudeAgentModule, \"query\", this.patchQuery());\n } else {\n logger.debug(\n \"query function not found in claudeAgentSDK module, skipping instrumentation\",\n );\n }\n }\n\n private patchQuery(): any {\n // casts to ClaudeAgentSDK.query\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return (original: Function) => instrumentClaudeAgentQuery(original as any);\n }\n\n private patch(moduleExports: any): any {\n // typeof ClaudeAgentSDK\n diag.debug(\"Patching @anthropic-ai/claude-agent-sdk\");\n\n // Wrap the query function for automatic instrumentation\n if (moduleExports.query && typeof moduleExports.query === \"function\") {\n this._wrap(moduleExports, \"query\", this.patchQuery());\n }\n\n return moduleExports;\n }\n\n private unpatch(moduleExports: any): void {\n // typeof ClaudeAgentSDK\n diag.debug(\"Unpatching @anthropic-ai/claude-agent-sdk\");\n\n // Unwrap the query function\n this._unwrap(moduleExports, \"query\");\n }\n}\n/* eslint-enable\n @typescript-eslint/no-unsafe-function-type\n*/\n","import {\n type LaminarSpanContext,\n type SessionRecordingOptions,\n type SpanType,\n type TraceType,\n TracingLevel,\n} from '@lmnr-ai/types';\nimport {\n AttributeValue,\n Context,\n context as contextApi,\n isSpanContextValid,\n type Span,\n TimeInput,\n trace,\n} from '@opentelemetry/api';\nimport { SpanProcessor } from '@opentelemetry/sdk-trace-base';\n\nimport { InitializeOptions, initializeTracing, LaminarSpanProcessor } from './opentelemetry-lib';\nimport { _resetConfiguration } from './opentelemetry-lib/configuration';\nimport {\n forceReleaseProxy as forceReleaseClaudeProxy,\n instrumentClaudeAgentQuery,\n} from './opentelemetry-lib/instrumentation/claude-agent-sdk';\nimport {\n forceFlush,\n getSpanProcessor,\n getTracer,\n patchModules,\n} from './opentelemetry-lib/tracing';\nimport {\n ASSOCIATION_PROPERTIES,\n LaminarAttributes,\n PARENT_SPAN_IDS_PATH,\n PARENT_SPAN_PATH,\n SESSION_ID,\n SPAN_TYPE,\n TRACE_TYPE,\n USER_ID,\n} from './opentelemetry-lib/tracing/attributes';\nimport { LaminarContextManager } from './opentelemetry-lib/tracing/context';\nimport { LaminarSpan } from './opentelemetry-lib/tracing/span';\nimport {\n deserializeLaminarSpanContext,\n initializeLogger,\n loadEnv,\n metadataToAttributes,\n type StringUUID,\n tryToOtelSpanContext,\n validateTracingConfig,\n} from './utils';\n\nloadEnv();\n\nconst logger = initializeLogger();\n\ninterface LaminarInitializeProps {\n projectApiKey?: string;\n baseUrl?: string;\n baseHttpUrl?: string;\n httpPort?: number;\n grpcPort?: number;\n instrumentModules?: InitializeOptions[\"instrumentModules\"];\n disableBatch?: boolean;\n traceExportTimeoutMillis?: number;\n logLevel?: \"debug\" | \"info\" | \"warn\" | \"error\";\n maxExportBatchSize?: number;\n forceHttp?: boolean;\n sessionRecordingOptions?: SessionRecordingOptions;\n metadata?: Record<string, any>;\n inheritGlobalContext?: boolean;\n spanProcessor?: SpanProcessor;\n}\n\ntype LaminarAttributesProp = Record<\n typeof LaminarAttributes[keyof typeof LaminarAttributes],\n AttributeValue\n>;\n\nexport class Laminar {\n private static baseHttpUrl: string;\n private static projectApiKey: string;\n private static isInitialized: boolean = false;\n private static globalMetadata: Record<string, any> = {};\n /**\n * Initialize Laminar context across the application.\n * This method must be called before using any other Laminar methods or decorators.\n *\n * @param {LaminarInitializeProps} props - Configuration object.\n * @param {string} props.projectApiKey - Laminar project api key. You can generate one by going\n * to the projects settings page on the Laminar dashboard.\n * If not specified, it will try to read from the LMNR_PROJECT_API_KEY environment variable.\n * @param {string} props.baseUrl - Laminar API url. Do not include the port, use\n * `httpPort` and `grpcPort` instead.\n * If not specified, defaults to https://api.lmnr.ai.\n * @param {string} props.baseHttpUrl - Laminar API http url. If not specified, defaults to\n * baseUrl. Only use this if you want to proxy HTTP requests through a different host.\n * @param {number} props.httpPort - Laminar API http port.\n * If not specified, defaults to 443.\n * @param {number} props.grpcPort - Laminar API grpc port.\n * If not specified, defaults to 8443.\n * @param {InitializeOptions[\"instrumentModules\"]} props.instrumentModules - Record\n * of modules to instrument.\n * If not specified, all auto-instrumentable modules will be instrumented, which include\n * LLM calls (OpenAI, Anthropic, etc), Langchain, VectorDB calls (Pinecone, Qdrant, etc).\n * Pass an empty object {} to disable any kind of automatic instrumentation.\n * If you only want to auto-instrument specific modules, then pass them in the object.\n * @param {boolean} props.disableBatch - Whether to disable batching of spans. Useful for debug\n * environments. If true, spans will be sent immediately using {@link SimpleSpanProcessor}\n * instead of {@link BatchSpanProcessor}.\n * @param {number} props.traceExportTimeoutMillis - Timeout for trace export.\n * Defaults to 30_000 (30 seconds),\n * which is over the default OTLP exporter timeout of 10_000 (10 seconds).\n * @param {string} props.logLevel - OTel log level. Defaults to \"error\".\n * @param {number} props.maxExportBatchSize - Maximum number of spans to export in a single batch.\n * Ignored when `disableBatch` is true.\n * @param {boolean} props.forceHttp - Whether to force HTTP export. Not recommended.\n * @param {SessionRecordingOptions} props.sessionRecordingOptions - Options for browser\n * session recording.\n * Currently supports 'maskInputOptions' to control whether input fields are masked during\n * recording. Defaults to undefined (uses default masking behavior).\n * @param {Record<string, any>} props.metadata - Global metadata to associate with all spans.\n * This metadata will be associated with all spans, and merged with any metadata passed to\n * each span. Must be JSON serializable.\n * @param {boolean} props.inheritGlobalContext - Whether to inherit the global OpenTelemetry\n * context. Defaults to false. This is useful if your library is instrumented with OpenTelemetry\n * and you want Laminar spans to be children of the existing spans.\n * @param {SpanProcessor} props.spanProcessor - The span processor to use. If passed, some of\n * the other options will be ignored.\n *\n * @example\n * import { Laminar } from '@lmnr-ai/lmnr';\n * import { OpenAI } from 'openai';\n * import * as ChainsModule from \"langchain/chains\";\n *\n * // Initialize Laminar while auto-instrumenting Langchain and OpenAI modules.\n * Laminar.initialize({\n * projectApiKey: \"<LMNR_PROJECT_API_KEY>\",\n * instrumentModules: {\n * langchain: {\n * chainsModule: ChainsModule\n * },\n * openAI: OpenAI\n * }\n * });\n *\n * @throws {Error} - If project API key is not set\n */\n public static initialize({\n projectApiKey,\n baseUrl,\n baseHttpUrl,\n httpPort,\n grpcPort,\n instrumentModules,\n disableBatch,\n traceExportTimeoutMillis,\n logLevel,\n maxExportBatchSize,\n forceHttp,\n sessionRecordingOptions,\n metadata,\n inheritGlobalContext,\n spanProcessor,\n }: LaminarInitializeProps = {}) {\n if (this.isInitialized) {\n logger.warn(\"Laminar has already been initialized. Skipping initialization.\");\n return;\n }\n const key = projectApiKey ?? process?.env?.LMNR_PROJECT_API_KEY;\n\n // Validate that either API key or OTEL configuration is present\n validateTracingConfig(key);\n\n this.projectApiKey = key ?? '';\n let url = baseUrl ?? process?.env?.LMNR_BASE_URL;\n\n // Only set default URL if we have an API key (traditional Laminar setup)\n if (key && !url) {\n url = 'https://api.lmnr.ai';\n }\n\n const httpUrl = baseHttpUrl ?? url;\n let port: number | undefined = httpPort;\n\n if (httpUrl) {\n if (!port) {\n const m = httpUrl.match(/:\\d{1,5}$/g);\n port = m\n ? parseInt(m[0].slice(1))\n : 443;\n }\n const httpUrlWithoutSlash = httpUrl.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '');\n this.baseHttpUrl = `${httpUrlWithoutSlash}:${port}`;\n } else {\n this.baseHttpUrl = '';\n }\n\n this.globalMetadata = metadata ?? {};\n LaminarContextManager.setGlobalMetadata(this.globalMetadata);\n if (inheritGlobalContext) {\n LaminarContextManager.inheritGlobalContext = true;\n }\n if (spanProcessor && !(spanProcessor instanceof LaminarSpanProcessor)) {\n logger.warn(\n \"Span processor is not a LaminarSpanProcessor. Some functionality may be impaired.\",\n );\n }\n this.isInitialized = true;\n\n const urlWithoutSlash = url?.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '');\n const httpUrlWithoutSlash = httpUrl?.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '');\n\n initializeTracing({\n baseUrl: urlWithoutSlash,\n baseHttpUrl: httpUrlWithoutSlash,\n apiKey: key,\n port: grpcPort,\n forceHttp,\n httpPort,\n silenceInitializationMessage: true,\n instrumentModules,\n logLevel: logLevel ?? \"error\",\n disableBatch,\n maxExportBatchSize,\n traceExportTimeoutMillis,\n sessionRecordingOptions,\n spanProcessor,\n });\n\n this._initializeContextFromEnv();\n }\n\n /**\n * Initialize Laminar context from the LMNR_SPAN_CONTEXT environment variable.\n * This allows continuing traces across process boundaries.\n * @private\n */\n private static _initializeContextFromEnv(): void {\n const envContext = process?.env?.LMNR_SPAN_CONTEXT;\n if (!envContext) {\n return;\n }\n\n try {\n const laminarContext = deserializeLaminarSpanContext(envContext);\n\n // Convert to OpenTelemetry span context\n const otelSpanContext = tryToOtelSpanContext(laminarContext);\n // If we've parsed the context from the environment variable, it's remote\n otelSpanContext.isRemote = true;\n\n // Set parent path info in the span processor\n const processor = getSpanProcessor();\n if (processor\n && processor instanceof LaminarSpanProcessor\n && laminarContext.spanPath\n && laminarContext.spanIdsPath\n ) {\n processor.setParentPathInfo(\n otelSpanContext.spanId,\n laminarContext.spanPath,\n laminarContext.spanIdsPath,\n );\n }\n\n // Create a non-recording span and push the context\n const baseContext = trace.setSpan(\n LaminarContextManager.getContext(),\n trace.wrapSpanContext(otelSpanContext),\n );\n const ctx = LaminarContextManager.setRawAssociationProperties(laminarContext, baseContext);\n LaminarContextManager.pushContext(ctx);\n\n logger.debug(\"Initialized Laminar parent context from LMNR_SPAN_CONTEXT.\");\n } catch (e) {\n logger.warn(\n \"LMNR_SPAN_CONTEXT is set but could not be used: \" +\n (e instanceof Error ? e.message : String(e)),\n );\n }\n }\n\n /**\n * Patch modules manually. Use this in setups where {@link Laminar.initialize()}\n * and in particular its `instrumentModules` option is not working, e.g. in\n * Next.js place Laminar initialize in `instrumentation.ts`, and then patch\n * the modules in server components or API routes.\n *\n * Make sure to call this after {@link Laminar.initialize()}.\n *\n * @param {InitializeOptions[\"instrumentModules\"]} modules - Record of modules to instrument.\n */\n public static patch(modules: InitializeOptions[\"instrumentModules\"]) {\n if (!this.isInitialized) {\n logger.warn(\"Laminar must be initialized before patching modules. Skipping patch.\");\n return;\n }\n if (!modules || Object.keys(modules).length === 0) {\n throw new Error(\"Pass at least one module to patch\");\n }\n patchModules(modules);\n }\n\n /**\n * Check if Laminar has been initialized. Utility to make sure other methods\n * are called after initialization.\n */\n public static initialized(): boolean {\n return this.isInitialized;\n }\n\n /**\n * Associates an event with the current span. If the event is created outside\n * of a span context, a new span is created and the event is associated with it.\n *\n * @param {object} options\n * @param {string} options.name - The name of the event.\n * @param {Record<string, AttributeValue>} options.attributes - The attributes of the event.\n * Values must be of a supported type.\n * @param {TimeInput} options.timestamp - The timestamp of the event. If not specified, relies on\n * the underlying OpenTelemetry implementation.\n * If specified as an integer, it must be epoch nanoseconds.\n * @param {string} options.sessionId - The session ID to associate with the event.\n * If not specified, the session ID of the current trace is used.\n * @param {string} options.userId - The user ID to associate with the event. If not specified,\n * the user ID of the current trace is used.\n */\n public static event({\n name,\n attributes,\n timestamp,\n sessionId,\n userId,\n }: {\n name: string,\n attributes?: Record<string, AttributeValue>,\n timestamp?: TimeInput,\n sessionId?: string,\n userId?: string,\n }) {\n if (!Laminar.initialized()) {\n return;\n }\n\n const allAttributes = {\n ...(attributes ?? {}),\n ...(sessionId ? { \"lmnr.event.session_id\": sessionId } : {}),\n ...(userId ? { \"lmnr.event.user_id\": userId } : {}),\n } as Record<string, AttributeValue>;\n\n const currentSpan = Laminar.getCurrentSpan();\n\n if (currentSpan === undefined) {\n const newSpan = Laminar.startSpan({ name });\n newSpan?.addEvent(name, allAttributes, timestamp);\n newSpan?.end();\n return;\n }\n\n currentSpan.addEvent(name, allAttributes, timestamp);\n }\n\n public static getCurrentSpan(\n context?: Context,\n ): LaminarSpan | undefined {\n const currentSpan = trace.getSpan(context ?? LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n if (currentSpan === undefined || !isSpanContextValid(currentSpan.spanContext())) {\n return undefined;\n }\n if (currentSpan instanceof LaminarSpan) {\n return currentSpan;\n }\n return new LaminarSpan(currentSpan);\n }\n\n /**\n * Set attributes for the current span. Useful for manual\n * instrumentation.\n * @param {LaminarAttributesProp} attributes - The attributes to set for the current span.\n *\n * @example\n * import { Laminar as L, observe } from '@lmnr-ai/laminar';\n * await observe({ name: 'mySpanName', spanType: 'LLM' }, async (msg: string) => {\n * const response = await myCustomCallToOpenAI(msg);\n * L.setSpanAttributes({\n * [LaminarAttributes.PROVIDER]: 'openai',\n * [LaminarAttributes.REQUEST_MODEL]: \"requested_model\",\n * [LaminarAttributes.RESPONSE_MODEL]: response.model,\n * [LaminarAttributes.INPUT_TOKEN_COUNT]: response.usage.prompt_tokens,\n * [LaminarAttributes.OUTPUT_TOKEN_COUNT]: response.usage.completion_tokens,\n * })\n * }, userMessage);\n */\n public static setSpanAttributes(\n attributes: LaminarAttributesProp,\n ) {\n const currentSpan = Laminar.getCurrentSpan();\n if (currentSpan) {\n for (const [key, value] of Object.entries(attributes)) {\n currentSpan.setAttribute(key, value);\n }\n }\n }\n\n /**\n * Set the output of the current span. Useful for manual instrumentation.\n * @param output - Output of the span. Will be sent as an attribute, so must\n * be serializable to JSON.\n */\n public static setSpanOutput(output: any) {\n if (output == null) {\n return;\n }\n const currentSpan = Laminar.getCurrentSpan();\n if (currentSpan) {\n (currentSpan).setOutput(output);\n }\n }\n\n public static setTraceMetadata(metadata: Record<string, any>) {\n const currentSpan = Laminar.getCurrentSpan();\n if (currentSpan) {\n (currentSpan).setTraceMetadata(metadata);\n }\n }\n\n public static setTraceSessionId(sessionId: string) {\n const currentSpan = Laminar.getCurrentSpan();\n if (currentSpan) {\n (currentSpan).setTraceSessionId(sessionId);\n }\n }\n\n public static setTraceUserId(userId: string) {\n const currentSpan = Laminar.getCurrentSpan();\n if (currentSpan) {\n (currentSpan).setTraceUserId(userId);\n }\n }\n\n public static setSpanTags(tags: string[]) {\n const currentSpan = Laminar.getCurrentSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n (currentSpan).setTags(tags);\n }\n }\n\n public static addSpanTags(tags: string[]) {\n const currentSpan = Laminar.getCurrentSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n (currentSpan).addTags(tags);\n }\n }\n\n /**\n * Start a new span, but don't set it as active. Useful for\n * manual instrumentation. If span type is 'LLM', you should report usage\n * manually. See {@link setSpanAttributes} for more information.\n *\n * @param {Object} options\n * @param {string} options.name - name of the span\n * @param {any} options.input - input to the span. Will be sent as an attribute, so must\n * be JSON serializable\n * @param {string} options.spanType - type of the span. Defaults to 'DEFAULT'\n * @param {Context} options.context - raw OpenTelemetry context to bind the span to.\n * @param {string | LaminarSpanContext} options.parentSpanContext - parent span context\n * to bind the span to.\n * @param {string[]} options.tags - tags to associate with the span.\n * @param {string} options.userId - user ID to associate with the span.\n * @param {string} options.sessionId - session ID to associate with the span.\n * @param {Record<string, any>} options.metadata - metadata to associate with the span.\n * @returns The started span.\n *\n * @example\n * import { Laminar, observe } from '@lmnr-ai/lmnr';\n * const foo = async (span: Span) => {\n * await Laminar.withSpan(span, async () => {\n * await observe({ name: 'foo' }, async () => {\n * // Your code here\n * })\n * })\n * };\n * const bar = async (span: Span) => {\n * await Laminar.withSpan(span, async () => {\n * await openai_client.chat.completions.create();\n * })\n * };\n *\n * const parentSpan = Laminar.startSpan({name: \"outer\"});\n * foo(parentSpan);\n * await bar(parentSpan);\n * // IMPORTANT: Don't forget to end the span!\n * parentSpan.end();\n *\n * // Results in:\n * // | outer\n * // | | foo\n * // | | | ...\n * // | | openai.chat\n */\n public static startSpan({\n name,\n input,\n spanType,\n context,\n parentSpanContext,\n tags,\n userId,\n sessionId,\n metadata,\n startTime,\n }: {\n name: string,\n input?: any,\n spanType?: SpanType,\n context?: Context,\n parentSpanContext?: string | LaminarSpanContext,\n tags?: string[],\n userId?: string,\n sessionId?: string,\n metadata?: Record<string, any>,\n startTime?: TimeInput,\n }): Span {\n return this._startSpan({\n name,\n input,\n spanType,\n context,\n parentSpanContext,\n tags,\n userId,\n sessionId,\n metadata,\n activated: false,\n startTime,\n });\n }\n\n /**\n * Start a new span, and set it as active. It is the caller's responsibility\n * to end the span. It is important to end the span, to avoid context mixing up.\n * We suggest ending the span in a finally block.\n * This is useful for manual instrumentation.\n * If span type is 'LLM', you should report usage manually.\n * See {@link setSpanAttributes} for more information.\n *\n * @param {Object} options\n * @param {string} options.name - name of the span\n * @param {any} options.input - input to the span. Will be sent as an attribute, so must\n * be JSON serializable\n * @param {string} options.spanType - type of the span. Defaults to 'DEFAULT'\n * @param {Context} options.context - raw OpenTelemetry context to bind the span to.\n * @param {string | LaminarSpanContext} options.parentSpanContext - parent span context\n * to bind the span to.\n * @param {string[]} options.tags - tags to associate with the span.\n * @param {string} options.userId - user ID to associate with the span.\n * @param {string} options.sessionId - session ID to associate with the span.\n * @param {Record<string, any>} options.metadata - metadata to associate with the span.\n * @param {boolean} options.global - when true, the span is registered on a\n * process-global context stack so that any subsequent `startSpan` /\n * `startActiveSpan` call (including from unrelated async tasks) uses it as\n * the parent. Use this for spans that span multiple disconnected async\n * callbacks — e.g. the root span of an OpenAI Agents trace, where child\n * spans are created from independent `TracingProcessor` callbacks that do\n * not share an async context. Defaults to false; the span still activates\n * within the current async context as usual.\n * @returns The started span.\n *\n * @example\n * import { Laminar, observe } from '@lmnr-ai/lmnr';\n * const foo = async () => {\n * await observe({ name: 'foo' }, async () => {\n * // Your code here\n * })\n * };\n * const bar = async (span: Span) => {\n * await observe({ name: 'bar' }, async () => {\n * await openai_client.chat.completions.create();\n * })\n * };\n *\n * try {\n * const parentSpan = Laminar.startActiveSpan({name: \"outer\"});\n * foo();\n * await bar();\n * } finally {\n * parentSpan.end();\n * }\n *\n * // Results in:\n * // | outer\n * // | | foo\n * // | | | ...\n * // | | bar\n * // | | | openai.chat\n */\n public static startActiveSpan({\n name,\n input,\n spanType,\n context,\n parentSpanContext,\n tags,\n userId,\n sessionId,\n metadata,\n startTime,\n global,\n }: {\n name: string,\n input?: any,\n spanType?: SpanType,\n context?: Context,\n parentSpanContext?: string | LaminarSpanContext,\n tags?: string[],\n userId?: string,\n sessionId?: string,\n metadata?: Record<string, any>,\n startTime?: TimeInput,\n global?: boolean,\n }): Span {\n return this._startSpan({\n name,\n input,\n spanType,\n context,\n parentSpanContext,\n tags,\n userId,\n sessionId,\n metadata,\n activated: true,\n startTime,\n global,\n });\n }\n\n private static _startSpan({\n name,\n input,\n spanType,\n context,\n parentSpanContext,\n tags,\n userId,\n sessionId,\n metadata,\n activated,\n startTime,\n global,\n }: {\n name: string,\n input?: any,\n spanType?: SpanType,\n context?: Context,\n parentSpanContext?: string | LaminarSpanContext,\n tags?: string[],\n userId?: string,\n sessionId?: string,\n metadata?: Record<string, any>,\n activated?: boolean,\n startTime?: TimeInput,\n global?: boolean,\n }): Span {\n let entityContext = context ?? LaminarContextManager.getContext();\n\n // Extract parent path information before converting to OpenTelemetry span context\n let parentPath: string[] | undefined;\n let parentIdsPath: string[] | undefined;\n let parentMetadata: Record<string, any> | undefined;\n let parentTraceType: TraceType | undefined;\n let parentTracingLevel: TracingLevel | undefined;\n let parentUserId: string | undefined;\n let parentSessionId: string | undefined;\n\n if (parentSpanContext) {\n try {\n const laminarContext = typeof parentSpanContext === 'string'\n ? deserializeLaminarSpanContext(parentSpanContext)\n : parentSpanContext;\n\n parentPath = laminarContext.spanPath;\n parentIdsPath = laminarContext.spanIdsPath;\n parentMetadata = laminarContext.metadata;\n parentTraceType = laminarContext.traceType;\n parentTracingLevel = laminarContext.tracingLevel;\n parentUserId = laminarContext.userId;\n parentSessionId = laminarContext.sessionId;\n\n const spanContext = tryToOtelSpanContext(laminarContext);\n entityContext = trace.setSpan(entityContext, trace.wrapSpanContext(spanContext));\n } catch (e) {\n logger.warn(\"Failed to parse parent span context: \" +\n (e instanceof Error ? e.message : String(e)),\n );\n }\n }\n const tagProperties = tags\n ? { [`${ASSOCIATION_PROPERTIES}.tags`]: Array.from(new Set(tags)) }\n : {};\n const ctxAssociationProperties = LaminarContextManager.getAssociationProperties();\n const userIdValue = userId\n ?? parentUserId\n ?? ctxAssociationProperties.userId;\n const sessionIdValue = sessionId\n ?? parentSessionId\n ?? ctxAssociationProperties.sessionId;\n const traceTypeValue = parentTraceType\n ?? ((spanType as string) === 'EVALUATION' ? 'EVALUATION' : undefined)\n ?? ctxAssociationProperties.traceType;\n const tracingLevelValue = parentTracingLevel\n ?? ctxAssociationProperties.tracingLevel;\n const ctxMetadata = ctxAssociationProperties.metadata;\n\n const userIdProperties = userIdValue ? { [USER_ID]: userIdValue } : {};\n const sessionIdProperties = sessionIdValue ? { [SESSION_ID]: sessionIdValue } : {};\n const traceTypeProperties = traceTypeValue ? { [TRACE_TYPE]: traceTypeValue } : {};\n const tracingLevelProperties = tracingLevelValue\n ? { [`${ASSOCIATION_PROPERTIES}.tracing_level`]: tracingLevelValue }\n : {};\n\n const mergedMetadata = {\n ...this.globalMetadata,\n ...ctxMetadata,\n ...parentMetadata,\n ...metadata,\n };\n\n const metadataProperties = metadataToAttributes(mergedMetadata);\n const attributes = {\n [SPAN_TYPE]: spanType ?? 'DEFAULT',\n ...tagProperties,\n ...userIdProperties,\n ...sessionIdProperties,\n ...metadataProperties,\n ...traceTypeProperties,\n ...tracingLevelProperties,\n ...(parentPath ? { [PARENT_SPAN_PATH]: parentPath } : {}),\n ...(parentIdsPath ? { [PARENT_SPAN_IDS_PATH]: parentIdsPath } : {}),\n };\n\n const span = new LaminarSpan(\n getTracer().startSpan(name, { attributes, startTime }, entityContext),\n );\n span.activated = activated ?? false;\n\n if (input) {\n span.setInput(input);\n }\n if (activated) {\n entityContext = LaminarContextManager.setAssociationProperties(\n span,\n entityContext,\n );\n entityContext = trace.setSpan(entityContext, span);\n LaminarContextManager.pushContext(entityContext);\n if (global) {\n LaminarContextManager.pushGlobalContext(entityContext);\n span.setGlobalActiveContext(entityContext);\n }\n }\n return span;\n }\n\n /**\n * A utility wrapper around OpenTelemetry's `context.with()`. Useful for\n * passing spans around in manual instrumentation:\n *\n * @param {Span} span - Parent span to bind the execution to.\n * @param {Function} fn - Function to execute within the span context.\n * @param {boolean} endOnExit - Whether to end the span after the function has\n * executed. Defaults to `false`. If `false`, you MUST manually call\n * `span.end()` at the end of the execution, so that spans are not lost.\n * @returns The result of the function execution.\n *\n * See {@link startSpan} docs for a usage example\n */\n public static withSpan<T>(span: Span, fn: () => T, endOnExit?: boolean): T {\n const ctx = LaminarContextManager.getContext();\n const laminarSpan = new LaminarSpan(span);\n const ctxWithAssociationProperties = LaminarContextManager.setAssociationProperties(\n laminarSpan,\n ctx,\n );\n const context = trace.setSpan(ctxWithAssociationProperties, span);\n return contextApi.with(context, () => LaminarContextManager.runWithIsolatedContext(\n [context],\n () => {\n try {\n const result = fn();\n if (result instanceof Promise) {\n return result.catch((err) => {\n span.recordException(err as Error);\n throw err;\n }).finally(() => {\n if (endOnExit !== undefined && endOnExit) {\n span.end();\n }\n }) as T;\n }\n if (endOnExit !== undefined && endOnExit) {\n span.end();\n }\n return result;\n }\n catch (error) {\n span.recordException(error as Error);\n if (endOnExit !== undefined && endOnExit) {\n span.end();\n }\n throw error;\n }\n },\n ));\n }\n\n public static serializeLaminarSpanContext(span?: Span): string | null {\n const laminarSpanContext = this.getLaminarSpanContext(span);\n if (laminarSpanContext === null) {\n return null;\n }\n return JSON.stringify(laminarSpanContext);\n };\n\n public static getLaminarSpanContext(span?: Span): LaminarSpanContext | null {\n let currentSpan = span ?? Laminar.getCurrentSpan();\n if (currentSpan === undefined || !isSpanContextValid(currentSpan.spanContext())) {\n return null;\n }\n if (!(currentSpan instanceof LaminarSpan)) {\n currentSpan = new LaminarSpan(currentSpan);\n }\n return (currentSpan as LaminarSpan).getLaminarSpanContext();\n }\n\n /**\n * Get the trace id of the current span. Returns null if there is no active span.\n * @returns {StringUUID | null} The trace id of the current span.\n */\n public static getTraceId(): StringUUID | null {\n return this.getLaminarSpanContext()?.traceId ?? null;\n }\n\n public static async flush() {\n if (this.isInitialized) {\n logger.debug(\"Flushing spans\");\n await forceFlush();\n }\n }\n\n public static async shutdown() {\n if (this.isInitialized) {\n logger.debug(\"Shutting down Laminar\");\n await forceFlush();\n // Unlike Python where asynchronous nature of `BatchSpanProcessor.forceFlush()`\n // forces us to actually use `SpanProcessor.shutdown()` and make any\n // further interactions with OTEL API impossible, here we call\n // SpanProcessor.forceFlush() (and safely await it). Thus, users can\n // call `shutdown()` and then `initialize()` again. This is why we\n // reset the keys, contexts, and configuration here.\n this.isInitialized = false;\n _resetConfiguration();\n LaminarContextManager.clearContexts();\n LaminarContextManager.clearActiveSpans();\n\n // Force release the claude-code proxy if it was started (ignores ref count)\n forceReleaseClaudeProxy();\n }\n }\n\n public static getHttpUrl(): string {\n return this.baseHttpUrl;\n }\n\n public static getProjectApiKey(): string {\n return this.projectApiKey;\n }\n\n /**\n * Instrument the claude-agent-sdk query function.\n * Use this when you need to import the query function before calling Laminar.initialize().\n *\n * @param originalQuery - The original query function from @anthropic-ai/claude-agent-sdk\n * @returns The instrumented query function\n *\n * @example\n * ```typescript\n * import { query as originalQuery } from \"@anthropic-ai/claude-agent-sdk\";\n * import { Laminar } from \"@lmnr-ai/lmnr\";\n *\n * Laminar.initialize({ projectApiKey: \"...\" });\n *\n * const query = Laminar.instrumentClaudeAgentQuery(originalQuery);\n *\n * // Now use the instrumented query function\n * const result = query({ prompt: \"Hello!\" });\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n public static wrapClaudeAgentQuery<T extends Function>(originalQuery: T): T {\n return instrumentClaudeAgentQuery(originalQuery as any) as unknown as T;\n }\n}\n","// If you want to update the content, make the following changes to minified source\n// 0. Make sure your editor is not formatting the file on save.\n// 1. Replace every \\ with \\\\ (important: this must come first)\n// 2. Replace every ` with a \\`\n// 3. Replace every ${ with a \\${\nexport const RECORDER = `(function (g, f) {\n if (\"object\" == typeof exports && \"object\" == typeof module) {\n module.exports = f();\n } else if (\"function\" == typeof define && define.amd) {\n define(\"lmnrRrweb\", [], f);\n } else if (\"object\" == typeof exports) {\n exports[\"lmnrRrweb\"] = f();\n } else {\n g[\"lmnrRrweb\"] = f();\n }\n }(this, () => {\nvar exports = {};\nvar module = { exports };\n\"use strict\";var Fo=Object.defineProperty,Uo=Object.defineProperties;var Bo=Object.getOwnPropertyDescriptors;var ft=Object.getOwnPropertySymbols;var zs=Object.prototype.hasOwnProperty,Ws=Object.prototype.propertyIsEnumerable;var Bs=(s,e,t)=>e in s?Fo(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t,x=(s,e)=>{for(var t in e||(e={}))zs.call(e,t)&&Bs(s,t,e[t]);if(ft)for(var t of ft(e))Ws.call(e,t)&&Bs(s,t,e[t]);return s},ee=(s,e)=>Uo(s,Bo(e));var xe=(s,e)=>{var t={};for(var r in s)zs.call(s,r)&&e.indexOf(r)<0&&(t[r]=s[r]);if(s!=null&&ft)for(var r of ft(s))e.indexOf(r)<0&&Ws.call(s,r)&&(t[r]=s[r]);return t};Object.defineProperty(exports,Symbol.toStringTag,{value:\"Module\"});var zo=Object.defineProperty,Wo=(s,e,t)=>e in s?zo(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t,w=(s,e,t)=>Wo(s,typeof e!=\"symbol\"?e+\"\":e,t),Gs,Go=Object.defineProperty,Vo=(s,e,t)=>e in s?Go(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t,Vs=(s,e,t)=>Vo(s,typeof e!=\"symbol\"?e+\"\":e,t),j=(s=>(s[s.Document=0]=\"Document\",s[s.DocumentType=1]=\"DocumentType\",s[s.Element=2]=\"Element\",s[s.Text=3]=\"Text\",s[s.CDATA=4]=\"CDATA\",s[s.Comment=5]=\"Comment\",s))(j||{});const js={Node:[\"childNodes\",\"parentNode\",\"parentElement\",\"textContent\"],ShadowRoot:[\"host\",\"styleSheets\"],Element:[\"shadowRoot\",\"querySelector\",\"querySelectorAll\"],MutationObserver:[]},Hs={Node:[\"contains\",\"getRootNode\"],ShadowRoot:[\"getSelection\"],Element:[],MutationObserver:[\"constructor\"]},pt={},jo=()=>!!globalThis.Zone;function cs(s){if(pt[s])return pt[s];const e=globalThis[s],t=e.prototype,r=s in js?js[s]:void 0,i=!!(r&&r.every(l=>{var a,u;return!!((u=(a=Object.getOwnPropertyDescriptor(t,l))==null?void 0:a.get)!=null&&u.toString().includes(\"[native code]\"))})),n=s in Hs?Hs[s]:void 0,o=!!(n&&n.every(l=>{var a;return typeof t[l]==\"function\"&&((a=t[l])==null?void 0:a.toString().includes(\"[native code]\"))}));if(i&&o&&!jo())return pt[s]=e.prototype,e.prototype;try{const l=document.createElement(\"iframe\");document.body.appendChild(l);const a=l.contentWindow;if(!a)return e.prototype;const u=a[s].prototype;return document.body.removeChild(l),u?pt[s]=u:t}catch(l){return t}}const mr={};function me(s,e,t){var r;const i=\\`\\${s}.\\${String(t)}\\`;if(mr[i])return mr[i].call(e);const n=cs(s),o=(r=Object.getOwnPropertyDescriptor(n,t))==null?void 0:r.get;return o?(mr[i]=o,o.call(e)):e[t]}const gr={};function Wi(s,e,t){const r=\\`\\${s}.\\${String(t)}\\`;if(gr[r])return gr[r].bind(e);const n=cs(s)[t];return typeof n!=\"function\"?e[t]:(gr[r]=n,n.bind(e))}function Ho(s){return me(\"Node\",s,\"childNodes\")}function Yo(s){return me(\"Node\",s,\"parentNode\")}function Zo(s){return me(\"Node\",s,\"parentElement\")}function Jo(s){return me(\"Node\",s,\"textContent\")}function Xo(s,e){return Wi(\"Node\",s,\"contains\")(e)}function Ko(s){return Wi(\"Node\",s,\"getRootNode\")()}function Qo(s){return!s||!(\"host\"in s)?null:me(\"ShadowRoot\",s,\"host\")}function qo(s){return s.styleSheets}function ea(s){return!s||!(\"shadowRoot\"in s)?null:me(\"Element\",s,\"shadowRoot\")}function ta(s,e){return me(\"Element\",s,\"querySelector\")(e)}function ra(s,e){return me(\"Element\",s,\"querySelectorAll\")(e)}function sa(){return cs(\"MutationObserver\").constructor}const Z={childNodes:Ho,parentNode:Yo,parentElement:Zo,textContent:Jo,contains:Xo,getRootNode:Ko,host:Qo,styleSheets:qo,shadowRoot:ea,querySelector:ta,querySelectorAll:ra,mutationObserver:sa};function Gi(s){return s.nodeType===s.ELEMENT_NODE}function je(s){const e=s&&\"host\"in s&&\"mode\"in s&&Z.host(s)||null;return!!(e&&\"shadowRoot\"in e&&Z.shadowRoot(e)===s)}function He(s){return Object.prototype.toString.call(s)===\"[object ShadowRoot]\"}function ia(s){return s.includes(\" background-clip: text;\")&&!s.includes(\" -webkit-background-clip: text;\")&&(s=s.replace(/\\\\sbackground-clip:\\\\s*text;/g,\" -webkit-background-clip: text; background-clip: text;\")),s}function na(s){const{cssText:e}=s;if(e.split('\"').length<3)return e;const t=[\"@import\",\\`url(\\${JSON.stringify(s.href)})\\`];return s.layerName===\"\"?t.push(\"layer\"):s.layerName&&t.push(\\`layer(\\${s.layerName})\\`),s.supportsText&&t.push(\\`supports(\\${s.supportsText})\\`),s.media.length&&t.push(s.media.mediaText),t.join(\" \")+\";\"}function $r(s){try{const e=s.rules||s.cssRules;if(!e)return null;let t=s.href;!t&&s.ownerNode&&s.ownerNode.ownerDocument&&(t=s.ownerNode.ownerDocument.location.href);const r=Array.from(e,i=>Vi(i,t)).join(\"\");return ia(r)}catch(e){return null}}function Vi(s,e){if(aa(s)){let t;try{t=$r(s.styleSheet)||na(s)}catch(r){t=s.cssText}return s.styleSheet.href?Wt(t,s.styleSheet.href):t}else{let t=s.cssText;return la(s)&&s.selectorText.includes(\":\")&&(t=oa(t)),e?Wt(t,e):t}}function oa(s){const e=/(\\\\[(?:[\\\\w-]+)[^\\\\\\\\])(:(?:[\\\\w-]+)\\\\])/gm;return s.replace(e,\"$1\\\\\\\\$2\")}function aa(s){return\"styleSheet\"in s}function la(s){return\"selectorText\"in s}class ji{constructor(){Vs(this,\"idNodeMap\",new Map),Vs(this,\"nodeMetaMap\",new WeakMap)}getId(e){var t;if(!e)return-1;const r=(t=this.getMeta(e))==null?void 0:t.id;return r!=null?r:-1}getNode(e){return this.idNodeMap.get(e)||null}getIds(){return Array.from(this.idNodeMap.keys())}getMeta(e){return this.nodeMetaMap.get(e)||null}removeNodeFromMap(e){const t=this.getId(e);this.idNodeMap.delete(t),e.childNodes&&e.childNodes.forEach(r=>this.removeNodeFromMap(r))}has(e){return this.idNodeMap.has(e)}hasNode(e){return this.nodeMetaMap.has(e)}add(e,t){const r=t.id;this.idNodeMap.set(r,e),this.nodeMetaMap.set(e,t)}replace(e,t){const r=this.getNode(e);if(r){const i=this.nodeMetaMap.get(r);i&&this.nodeMetaMap.set(t,i)}this.idNodeMap.set(e,t)}reset(){this.idNodeMap=new Map,this.nodeMetaMap=new WeakMap}}function ua(){return new ji}function hs({element:s,maskInputOptions:e,tagName:t,type:r,value:i,maskInputFn:n}){let o=i||\"\";const l=r&&Ce(r);return(e[t.toLowerCase()]||l&&e[l])&&(n?o=n(o,s):o=\"*\".repeat(o.length)),o}function Ce(s){return s.toLowerCase()}const Ys=\"__rrweb_original__\";function ca(s){const e=s.getContext(\"2d\");if(!e)return!0;const t=50;for(let r=0;r<s.width;r+=t)for(let i=0;i<s.height;i+=t){const n=e.getImageData,o=Ys in n?n[Ys]:n;if(new Uint32Array(o.call(e,r,i,Math.min(t,s.width-r),Math.min(t,s.height-i)).data.buffer).some(a=>a!==0))return!1}return!0}function fs(s){const e=s.type;return s.hasAttribute(\"data-rr-is-password\")?\"password\":e?Ce(e):null}function Hi(s,e){var n;let t;try{t=new URL(s,e!=null?e:window.location.href)}catch(o){return null}const r=/\\\\.([0-9a-z]+)(?:$)/i,i=t.pathname.match(r);return(n=i==null?void 0:i[1])!=null?n:null}function ha(s){let e=\"\";return s.indexOf(\"//\")>-1?e=s.split(\"/\").slice(0,3).join(\"/\"):e=s.split(\"/\")[0],e=e.split(\"?\")[0],e}const fa=/url\\\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\\\)/gm,pa=/^(?:[a-z+]+:)?\\\\/\\\\//i,da=/^www\\\\..*/i,ma=/^(data:)([^,]*),(.*)/i;function Wt(s,e){return(s||\"\").replace(fa,(t,r,i,n,o,l)=>{const a=i||o||l,u=r||n||\"\";if(!a)return t;if(pa.test(a)||da.test(a))return\\`url(\\${u}\\${a}\\${u})\\`;if(ma.test(a))return\\`url(\\${u}\\${a}\\${u})\\`;if(a[0]===\"/\")return\\`url(\\${u}\\${ha(e)+a}\\${u})\\`;const c=e.split(\"/\"),h=a.split(\"/\");c.pop();for(const d of h)d!==\".\"&&(d===\"..\"?c.pop():c.push(d));return\\`url(\\${u}\\${c.join(\"/\")}\\${u})\\`})}function yr(s){return s.replace(/(\\\\/\\\\*[^*]*\\\\*\\\\/)|[\\\\s;]/g,\"\")}function ga(s,e){const t=Array.from(e.childNodes),r=[];if(t.length>1&&s&&typeof s==\"string\"){const i=yr(s);for(let n=1;n<t.length;n++)if(t[n].textContent&&typeof t[n].textContent==\"string\"){const o=yr(t[n].textContent);for(let l=3;l<o.length;l++){const a=o.substring(0,l);if(i.split(a).length===2){const u=i.indexOf(a);for(let c=u;c<s.length;c++)if(yr(s.substring(0,c)).length===u){r.push(s.substring(0,c)),s=s.substring(c);break}break}}}}return r.push(s),r}function ya(s,e){return ga(s,e).join(\"/* rr_split */\")}let wa=1;const Sa=new RegExp(\"[^a-z0-9-_:]\"),Ze=-2;function Yi(){return wa++}function ba(s){if(s instanceof HTMLFormElement)return\"form\";const e=Ce(s.tagName);return Sa.test(e)?\"div\":e}let Oe,Zs;const Ca=/^[^ \\\\t\\\\n\\\\r\\\\u000c]+/,va=/^[, \\\\t\\\\n\\\\r\\\\u000c]+/;function Ia(s,e){if(e.trim()===\"\")return e;let t=0;function r(n){let o;const l=n.exec(e.substring(t));return l?(o=l[0],t+=o.length,o):\"\"}const i=[];for(;r(va),!(t>=e.length);){let n=r(Ca);if(n.slice(-1)===\",\")n=Me(s,n.substring(0,n.length-1)),i.push(n);else{let o=\"\";n=Me(s,n);let l=!1;for(;;){const a=e.charAt(t);if(a===\"\"){i.push((n+o).trim());break}else if(l)a===\")\"&&(l=!1);else if(a===\",\"){t+=1,i.push((n+o).trim());break}else a===\"(\"&&(l=!0);o+=a,t+=1}}}return i.join(\", \")}const Js=new WeakMap;function Me(s,e){return!e||e.trim()===\"\"?e:ps(s,e)}function xa(s){return!!(s.tagName===\"svg\"||s.ownerSVGElement)}function ps(s,e){let t=Js.get(s);if(t||(t=s.createElement(\"a\"),Js.set(s,t)),!e)e=\"\";else if(e.startsWith(\"blob:\")||e.startsWith(\"data:\"))return e;return t.setAttribute(\"href\",e),t.href}function Zi(s,e,t,r){return r&&(t===\"src\"||t===\"href\"&&!(e===\"use\"&&r[0]===\"#\")||t===\"xlink:href\"&&r[0]!==\"#\"||t===\"background\"&&(e===\"table\"||e===\"td\"||e===\"th\")?Me(s,r):t===\"srcset\"?Ia(s,r):t===\"style\"?Wt(r,ps(s)):e===\"object\"&&t===\"data\"?Me(s,r):r)}function Ji(s,e,t){return(s===\"video\"||s===\"audio\")&&e===\"autoplay\"}function Oa(s,e,t){try{if(typeof e==\"string\"){if(s.classList.contains(e))return!0}else for(let r=s.classList.length;r--;){const i=s.classList[r];if(e.test(i))return!0}if(t)return s.matches(t)}catch(r){}return!1}function Gt(s,e,t){if(!s)return!1;if(s.nodeType!==s.ELEMENT_NODE)return t?Gt(Z.parentNode(s),e,t):!1;for(let r=s.classList.length;r--;){const i=s.classList[r];if(e.test(i))return!0}return t?Gt(Z.parentNode(s),e,t):!1}function Xi(s,e,t,r){let i;if(Gi(s)){if(i=s,!Z.childNodes(i).length)return!1}else{if(Z.parentElement(s)===null)return!1;i=Z.parentElement(s)}try{if(typeof e==\"string\"){if(r){if(i.closest(\\`.\\${e}\\`))return!0}else if(i.classList.contains(e))return!0}else if(Gt(i,e,r))return!0;if(t){if(r){if(i.closest(t))return!0}else if(i.matches(t))return!0}}catch(n){}return!1}function Ra(s,e,t){const r=s.contentWindow;if(!r)return;let i=!1,n;try{n=r.document.readyState}catch(l){return}if(n!==\"complete\"){const l=setTimeout(()=>{i||(e(),i=!0)},t);s.addEventListener(\"load\",()=>{clearTimeout(l),i=!0,e()});return}const o=\"about:blank\";if(r.location.href!==o||s.src===o||s.src===\"\")return setTimeout(e,0),s.addEventListener(\"load\",e);s.addEventListener(\"load\",e)}function Aa(s,e,t){let r=!1,i;try{i=s.sheet}catch(o){return}if(i)return;const n=setTimeout(()=>{r||(e(),r=!0)},t);s.addEventListener(\"load\",()=>{clearTimeout(n),r=!0,e()})}function Ma(s,e){const{doc:t,mirror:r,blockClass:i,blockSelector:n,needsMask:o,inlineStylesheet:l,maskInputOptions:a={},maskTextFn:u,maskInputFn:c,dataURLOptions:h={},inlineImages:d,recordCanvas:m,keepIframeSrcFn:g,newlyAddedElement:p=!1,cssCaptured:f=!1}=e,S=Ea(t,r);switch(s.nodeType){case s.DOCUMENT_NODE:return s.compatMode!==\"CSS1Compat\"?{type:j.Document,childNodes:[],compatMode:s.compatMode}:{type:j.Document,childNodes:[]};case s.DOCUMENT_TYPE_NODE:return{type:j.DocumentType,name:s.name,publicId:s.publicId,systemId:s.systemId,rootId:S};case s.ELEMENT_NODE:return Na(s,{doc:t,blockClass:i,blockSelector:n,inlineStylesheet:l,maskInputOptions:a,maskInputFn:c,dataURLOptions:h,inlineImages:d,recordCanvas:m,keepIframeSrcFn:g,newlyAddedElement:p,rootId:S});case s.TEXT_NODE:return $a(s,{doc:t,needsMask:o,maskTextFn:u,rootId:S,cssCaptured:f});case s.CDATA_SECTION_NODE:return{type:j.CDATA,textContent:\"\",rootId:S};case s.COMMENT_NODE:return{type:j.Comment,textContent:Z.textContent(s)||\"\",rootId:S};default:return!1}}function Ea(s,e){if(!e.hasNode(s))return;const t=e.getId(s);return t===1?void 0:t}function $a(s,e){const{needsMask:t,maskTextFn:r,rootId:i,cssCaptured:n}=e,o=Z.parentNode(s),l=o&&o.tagName;let a=\"\";const u=l===\"STYLE\"?!0:void 0,c=l===\"SCRIPT\"?!0:void 0;return c?a=\"SCRIPT_PLACEHOLDER\":n||(a=Z.textContent(s),u&&a&&(a=Wt(a,ps(e.doc)))),!u&&!c&&a&&t&&(a=r?r(a,Z.parentElement(s)):a.replace(/[\\\\S]/g,\"*\")),{type:j.Text,textContent:a||\"\",rootId:i}}function Na(s,e){const{doc:t,blockClass:r,blockSelector:i,inlineStylesheet:n,maskInputOptions:o={},maskInputFn:l,dataURLOptions:a={},inlineImages:u,recordCanvas:c,keepIframeSrcFn:h,newlyAddedElement:d=!1,rootId:m}=e,g=Oa(s,r,i),p=ba(s);let f={};const S=s.attributes.length;for(let y=0;y<S;y++){const C=s.attributes[y];Ji(p,C.name,C.value)||(f[C.name]=Zi(t,p,Ce(C.name),C.value))}if(p===\"link\"&&n){const y=Array.from(t.styleSheets).find(N=>N.href===s.href);let C=null;y&&(C=$r(y)),C&&(delete f.rel,delete f.href,f._cssText=C)}if(p===\"style\"&&s.sheet){let y=$r(s.sheet);y&&(s.childNodes.length>1&&(y=ya(y,s)),f._cssText=y)}if(p===\"input\"||p===\"textarea\"||p===\"select\"){const y=s.value,C=s.checked;f.type!==\"radio\"&&f.type!==\"checkbox\"&&f.type!==\"submit\"&&f.type!==\"button\"&&y?f.value=hs({element:s,type:fs(s),tagName:p,value:y,maskInputOptions:o,maskInputFn:l}):C&&(f.checked=C)}if(p===\"option\"&&(s.selected&&!o.select?f.selected=!0:delete f.selected),p===\"dialog\"&&s.open&&(f.rr_open_mode=s.matches(\"dialog:modal\")?\"modal\":\"non-modal\"),p===\"canvas\"&&c){if(s.__context===\"2d\")ca(s)||(f.rr_dataURL=s.toDataURL(a.type,a.quality));else if(!(\"__context\"in s)){const y=s.toDataURL(a.type,a.quality),C=t.createElement(\"canvas\");C.width=s.width,C.height=s.height;const N=C.toDataURL(a.type,a.quality);y!==N&&(f.rr_dataURL=y)}}if(p===\"img\"&&u){Oe||(Oe=t.createElement(\"canvas\"),Zs=Oe.getContext(\"2d\"));const y=s,C=y.currentSrc||y.getAttribute(\"src\")||\"<unknown-src>\",N=y.crossOrigin,D=()=>{y.removeEventListener(\"load\",D);try{Oe.width=y.naturalWidth,Oe.height=y.naturalHeight,Zs.drawImage(y,0,0),f.rr_dataURL=Oe.toDataURL(a.type,a.quality)}catch(H){if(y.crossOrigin!==\"anonymous\"){y.crossOrigin=\"anonymous\",y.complete&&y.naturalWidth!==0?D():y.addEventListener(\"load\",D);return}else console.warn(\\`Cannot inline img src=\\${C}! Error: \\${H}\\`)}y.crossOrigin===\"anonymous\"&&(N?f.crossOrigin=N:y.removeAttribute(\"crossorigin\"))};y.complete&&y.naturalWidth!==0?D():y.addEventListener(\"load\",D)}if(p===\"audio\"||p===\"video\"){const y=f;y.rr_mediaState=s.paused?\"paused\":\"played\",y.rr_mediaCurrentTime=s.currentTime,y.rr_mediaPlaybackRate=s.playbackRate,y.rr_mediaMuted=s.muted,y.rr_mediaLoop=s.loop,y.rr_mediaVolume=s.volume}if(d||(s.scrollLeft&&(f.rr_scrollLeft=s.scrollLeft),s.scrollTop&&(f.rr_scrollTop=s.scrollTop)),g){const{width:y,height:C}=s.getBoundingClientRect();f={class:f.class,rr_width:\\`\\${y}px\\`,rr_height:\\`\\${C}px\\`}}p===\"iframe\"&&!h(f.src)&&(s.contentDocument||(f.rr_src=f.src),delete f.src);let b;try{customElements.get(p)&&(b=!0)}catch(y){}return{type:j.Element,tagName:p,attributes:f,childNodes:[],isSVG:xa(s)||void 0,needBlock:g,rootId:m,isCustom:b}}function P(s){return s==null?\"\":s.toLowerCase()}function ka(s,e){if(e.comment&&s.type===j.Comment)return!0;if(s.type===j.Element){if(e.script&&(s.tagName===\"script\"||s.tagName===\"link\"&&(s.attributes.rel===\"preload\"||s.attributes.rel===\"modulepreload\")&&s.attributes.as===\"script\"||s.tagName===\"link\"&&s.attributes.rel===\"prefetch\"&&typeof s.attributes.href==\"string\"&&Hi(s.attributes.href)===\"js\"))return!0;if(e.headFavicon&&(s.tagName===\"link\"&&s.attributes.rel===\"shortcut icon\"||s.tagName===\"meta\"&&(P(s.attributes.name).match(/^msapplication-tile(image|color)$/)||P(s.attributes.name)===\"application-name\"||P(s.attributes.rel)===\"icon\"||P(s.attributes.rel)===\"apple-touch-icon\"||P(s.attributes.rel)===\"shortcut icon\")))return!0;if(s.tagName===\"meta\"){if(e.headMetaDescKeywords&&P(s.attributes.name).match(/^description|keywords$/))return!0;if(e.headMetaSocial&&(P(s.attributes.property).match(/^(og|twitter|fb):/)||P(s.attributes.name).match(/^(og|twitter):/)||P(s.attributes.name)===\"pinterest\"))return!0;if(e.headMetaRobots&&(P(s.attributes.name)===\"robots\"||P(s.attributes.name)===\"googlebot\"||P(s.attributes.name)===\"bingbot\"))return!0;if(e.headMetaHttpEquiv&&s.attributes[\"http-equiv\"]!==void 0)return!0;if(e.headMetaAuthorship&&(P(s.attributes.name)===\"author\"||P(s.attributes.name)===\"generator\"||P(s.attributes.name)===\"framework\"||P(s.attributes.name)===\"publisher\"||P(s.attributes.name)===\"progid\"||P(s.attributes.property).match(/^article:/)||P(s.attributes.property).match(/^product:/)))return!0;if(e.headMetaVerification&&(P(s.attributes.name)===\"google-site-verification\"||P(s.attributes.name)===\"yandex-verification\"||P(s.attributes.name)===\"csrf-token\"||P(s.attributes.name)===\"p:domain_verify\"||P(s.attributes.name)===\"verify-v1\"||P(s.attributes.name)===\"verification\"||P(s.attributes.name)===\"shopify-checkout-api-token\"))return!0}}return!1}function Ee(s,e){const{doc:t,mirror:r,blockClass:i,blockSelector:n,maskTextClass:o,maskTextSelector:l,skipChild:a=!1,inlineStylesheet:u=!0,maskInputOptions:c={},maskTextFn:h,maskInputFn:d,slimDOMOptions:m,dataURLOptions:g={},inlineImages:p=!1,recordCanvas:f=!1,onSerialize:S,onIframeLoad:b,iframeLoadTimeout:y=5e3,onStylesheetLoad:C,stylesheetLoadTimeout:N=5e3,keepIframeSrcFn:D=()=>!1,newlyAddedElement:H=!1,cssCaptured:_=!1}=e;let{needsMask:G}=e,{preserveWhiteSpace:Y=!0}=e;G||(G=Xi(s,o,l,G===void 0));const Q=Ma(s,{doc:t,mirror:r,blockClass:i,blockSelector:n,needsMask:G,inlineStylesheet:u,maskInputOptions:c,maskTextFn:h,maskInputFn:d,dataURLOptions:g,inlineImages:p,recordCanvas:f,keepIframeSrcFn:D,newlyAddedElement:H,cssCaptured:_});if(!Q)return console.warn(s,\"not serialized\"),null;let oe;r.hasNode(s)?oe=r.getId(s):ka(Q,m)||!Y&&Q.type===j.Text&&!Q.textContent.replace(/^\\\\s+|\\\\s+$/gm,\"\").length?oe=Ze:oe=Yi();const A=Object.assign(Q,{id:oe});if(r.add(s,A),oe===Ze)return null;S&&S(s);let Ue=!a;if(A.type===j.Element){Ue=Ue&&!A.needBlock,delete A.needBlock;const V=Z.shadowRoot(s);V&&He(V)&&(A.isShadowHost=!0)}if((A.type===j.Document||A.type===j.Element)&&Ue){m.headWhitespace&&A.type===j.Element&&A.tagName===\"head\"&&(Y=!1);const V={doc:t,mirror:r,blockClass:i,blockSelector:n,needsMask:G,maskTextClass:o,maskTextSelector:l,skipChild:a,inlineStylesheet:u,maskInputOptions:c,maskTextFn:h,maskInputFn:d,slimDOMOptions:m,dataURLOptions:g,inlineImages:p,recordCanvas:f,preserveWhiteSpace:Y,onSerialize:S,onIframeLoad:b,iframeLoadTimeout:y,onStylesheetLoad:C,stylesheetLoadTimeout:N,keepIframeSrcFn:D,cssCaptured:!1};if(!(A.type===j.Element&&A.tagName===\"textarea\"&&A.attributes.value!==void 0)){A.type===j.Element&&A.attributes._cssText!==void 0&&typeof A.attributes._cssText==\"string\"&&(V.cssCaptured=!0);for(const ye of Array.from(Z.childNodes(s))){const ae=Ee(ye,V);ae&&A.childNodes.push(ae)}}let q=null;if(Gi(s)&&(q=Z.shadowRoot(s)))for(const ye of Array.from(Z.childNodes(q))){const ae=Ee(ye,V);ae&&(He(q)&&(ae.isShadow=!0),A.childNodes.push(ae))}}const Be=Z.parentNode(s);return Be&&je(Be)&&He(Be)&&(A.isShadow=!0),A.type===j.Element&&A.tagName===\"iframe\"&&Ra(s,()=>{const V=s.contentDocument;if(V&&b){const q=Ee(V,{doc:V,mirror:r,blockClass:i,blockSelector:n,needsMask:G,maskTextClass:o,maskTextSelector:l,skipChild:!1,inlineStylesheet:u,maskInputOptions:c,maskTextFn:h,maskInputFn:d,slimDOMOptions:m,dataURLOptions:g,inlineImages:p,recordCanvas:f,preserveWhiteSpace:Y,onSerialize:S,onIframeLoad:b,iframeLoadTimeout:y,onStylesheetLoad:C,stylesheetLoadTimeout:N,keepIframeSrcFn:D});q&&b(s,q)}},y),A.type===j.Element&&A.tagName===\"link\"&&typeof A.attributes.rel==\"string\"&&(A.attributes.rel===\"stylesheet\"||A.attributes.rel===\"preload\"&&typeof A.attributes.href==\"string\"&&Hi(A.attributes.href)===\"css\")&&Aa(s,()=>{if(C){const V=Ee(s,{doc:t,mirror:r,blockClass:i,blockSelector:n,needsMask:G,maskTextClass:o,maskTextSelector:l,skipChild:!1,inlineStylesheet:u,maskInputOptions:c,maskTextFn:h,maskInputFn:d,slimDOMOptions:m,dataURLOptions:g,inlineImages:p,recordCanvas:f,preserveWhiteSpace:Y,onSerialize:S,onIframeLoad:b,iframeLoadTimeout:y,onStylesheetLoad:C,stylesheetLoadTimeout:N,keepIframeSrcFn:D});V&&C(s,V)}},N),A}function Pa(s,e){const{mirror:t=new ji,blockClass:r=\"rr-block\",blockSelector:i=null,maskTextClass:n=\"rr-mask\",maskTextSelector:o=null,inlineStylesheet:l=!0,inlineImages:a=!1,recordCanvas:u=!1,maskAllInputs:c=!1,maskTextFn:h,maskInputFn:d,slimDOM:m=!1,dataURLOptions:g,preserveWhiteSpace:p,onSerialize:f,onIframeLoad:S,iframeLoadTimeout:b,onStylesheetLoad:y,stylesheetLoadTimeout:C,keepIframeSrcFn:N=()=>!1}=e||{};return Ee(s,{doc:s,mirror:t,blockClass:r,blockSelector:i,maskTextClass:n,maskTextSelector:o,skipChild:!1,inlineStylesheet:l,maskInputOptions:c===!0?{color:!0,date:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0,textarea:!0,select:!0,password:!0}:c===!1?{password:!0}:c,maskTextFn:h,maskInputFn:d,slimDOMOptions:m===!0||m===\"all\"?{script:!0,comment:!0,headFavicon:!0,headWhitespace:!0,headMetaDescKeywords:m===\"all\",headMetaSocial:!0,headMetaRobots:!0,headMetaHttpEquiv:!0,headMetaAuthorship:!0,headMetaVerification:!0}:m===!1?{}:m,dataURLOptions:g,inlineImages:a,recordCanvas:u,preserveWhiteSpace:p,onSerialize:f,onIframeLoad:S,iframeLoadTimeout:b,onStylesheetLoad:y,stylesheetLoadTimeout:C,keepIframeSrcFn:N,newlyAddedElement:!1})}function Da(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,\"default\")?s.default:s}function La(s){if(s.__esModule)return s;var e=s.default;if(typeof e==\"function\"){var t=function r(){return this instanceof r?Reflect.construct(e,arguments,this.constructor):e.apply(this,arguments)};t.prototype=e.prototype}else t={};return Object.defineProperty(t,\"__esModule\",{value:!0}),Object.keys(s).forEach(function(r){var i=Object.getOwnPropertyDescriptor(s,r);Object.defineProperty(t,r,i.get?i:{enumerable:!0,get:function(){return s[r]}})}),t}var ds={exports:{}},L=String,Ki=function(){return{isColorSupported:!1,reset:L,bold:L,dim:L,italic:L,underline:L,inverse:L,hidden:L,strikethrough:L,black:L,red:L,green:L,yellow:L,blue:L,magenta:L,cyan:L,white:L,gray:L,bgBlack:L,bgRed:L,bgGreen:L,bgYellow:L,bgBlue:L,bgMagenta:L,bgCyan:L,bgWhite:L}};ds.exports=Ki();ds.exports.createColors=Ki;var Ta=ds.exports;const _a={},Fa=Object.freeze(Object.defineProperty({__proto__:null,default:_a},Symbol.toStringTag,{value:\"Module\"})),ie=La(Fa);let Xs=Ta,Ks=ie,Nr=class Qi extends Error{constructor(e,t,r,i,n,o){super(e),this.name=\"CssSyntaxError\",this.reason=e,n&&(this.file=n),i&&(this.source=i),o&&(this.plugin=o),typeof t!=\"undefined\"&&typeof r!=\"undefined\"&&(typeof t==\"number\"?(this.line=t,this.column=r):(this.line=t.line,this.column=t.column,this.endLine=r.line,this.endColumn=r.column)),this.setMessage(),Error.captureStackTrace&&Error.captureStackTrace(this,Qi)}setMessage(){this.message=this.plugin?this.plugin+\": \":\"\",this.message+=this.file?this.file:\"<css input>\",typeof this.line!=\"undefined\"&&(this.message+=\":\"+this.line+\":\"+this.column),this.message+=\": \"+this.reason}showSourceCode(e){if(!this.source)return\"\";let t=this.source;e==null&&(e=Xs.isColorSupported),Ks&&e&&(t=Ks(t));let r=t.split(/\\\\r?\\\\n/),i=Math.max(this.line-3,0),n=Math.min(this.line+2,r.length),o=String(n).length,l,a;if(e){let{bold:u,gray:c,red:h}=Xs.createColors(!0);l=d=>u(h(d)),a=d=>c(d)}else l=a=u=>u;return r.slice(i,n).map((u,c)=>{let h=i+1+c,d=\" \"+(\" \"+h).slice(-o)+\" | \";if(h===this.line){let m=a(d.replace(/\\\\d/g,\" \"))+u.slice(0,this.column-1).replace(/[^\\\\t]/g,\" \");return l(\">\")+a(d)+u+\\`\n \\`+m+l(\"^\")}return\" \"+a(d)+u}).join(\\`\n\\`)}toString(){let e=this.showSourceCode();return e&&(e=\\`\n\n\\`+e+\\`\n\\`),this.name+\": \"+this.message+e}};var ms=Nr;Nr.default=Nr;var it={};it.isClean=Symbol(\"isClean\");it.my=Symbol(\"my\");const Qs={after:\\`\n\\`,beforeClose:\\`\n\\`,beforeComment:\\`\n\\`,beforeDecl:\\`\n\\`,beforeOpen:\" \",beforeRule:\\`\n\\`,colon:\": \",commentLeft:\" \",commentRight:\" \",emptyBody:\"\",indent:\" \",semicolon:!1};function Ua(s){return s[0].toUpperCase()+s.slice(1)}let kr=class{constructor(e){this.builder=e}atrule(e,t){let r=\"@\"+e.name,i=e.params?this.rawValue(e,\"params\"):\"\";if(typeof e.raws.afterName!=\"undefined\"?r+=e.raws.afterName:i&&(r+=\" \"),e.nodes)this.block(e,r+i);else{let n=(e.raws.between||\"\")+(t?\";\":\"\");this.builder(r+i+n,e)}}beforeAfter(e,t){let r;e.type===\"decl\"?r=this.raw(e,null,\"beforeDecl\"):e.type===\"comment\"?r=this.raw(e,null,\"beforeComment\"):t===\"before\"?r=this.raw(e,null,\"beforeRule\"):r=this.raw(e,null,\"beforeClose\");let i=e.parent,n=0;for(;i&&i.type!==\"root\";)n+=1,i=i.parent;if(r.includes(\\`\n\\`)){let o=this.raw(e,null,\"indent\");if(o.length)for(let l=0;l<n;l++)r+=o}return r}block(e,t){let r=this.raw(e,\"between\",\"beforeOpen\");this.builder(t+r+\"{\",e,\"start\");let i;e.nodes&&e.nodes.length?(this.body(e),i=this.raw(e,\"after\")):i=this.raw(e,\"after\",\"emptyBody\"),i&&this.builder(i),this.builder(\"}\",e,\"end\")}body(e){let t=e.nodes.length-1;for(;t>0&&e.nodes[t].type===\"comment\";)t-=1;let r=this.raw(e,\"semicolon\");for(let i=0;i<e.nodes.length;i++){let n=e.nodes[i],o=this.raw(n,\"before\");o&&this.builder(o),this.stringify(n,t!==i||r)}}comment(e){let t=this.raw(e,\"left\",\"commentLeft\"),r=this.raw(e,\"right\",\"commentRight\");this.builder(\"/*\"+t+e.text+r+\"*/\",e)}decl(e,t){let r=this.raw(e,\"between\",\"colon\"),i=e.prop+r+this.rawValue(e,\"value\");e.important&&(i+=e.raws.important||\" !important\"),t&&(i+=\";\"),this.builder(i,e)}document(e){this.body(e)}raw(e,t,r){let i;if(r||(r=t),t&&(i=e.raws[t],typeof i!=\"undefined\"))return i;let n=e.parent;if(r===\"before\"&&(!n||n.type===\"root\"&&n.first===e||n&&n.type===\"document\"))return\"\";if(!n)return Qs[r];let o=e.root();if(o.rawCache||(o.rawCache={}),typeof o.rawCache[r]!=\"undefined\")return o.rawCache[r];if(r===\"before\"||r===\"after\")return this.beforeAfter(e,r);{let l=\"raw\"+Ua(r);this[l]?i=this[l](o,e):o.walk(a=>{if(i=a.raws[t],typeof i!=\"undefined\")return!1})}return typeof i==\"undefined\"&&(i=Qs[r]),o.rawCache[r]=i,i}rawBeforeClose(e){let t;return e.walk(r=>{if(r.nodes&&r.nodes.length>0&&typeof r.raws.after!=\"undefined\")return t=r.raws.after,t.includes(\\`\n\\`)&&(t=t.replace(/[^\\\\n]+$/,\"\")),!1}),t&&(t=t.replace(/\\\\S/g,\"\")),t}rawBeforeComment(e,t){let r;return e.walkComments(i=>{if(typeof i.raws.before!=\"undefined\")return r=i.raws.before,r.includes(\\`\n\\`)&&(r=r.replace(/[^\\\\n]+$/,\"\")),!1}),typeof r==\"undefined\"?r=this.raw(t,null,\"beforeDecl\"):r&&(r=r.replace(/\\\\S/g,\"\")),r}rawBeforeDecl(e,t){let r;return e.walkDecls(i=>{if(typeof i.raws.before!=\"undefined\")return r=i.raws.before,r.includes(\\`\n\\`)&&(r=r.replace(/[^\\\\n]+$/,\"\")),!1}),typeof r==\"undefined\"?r=this.raw(t,null,\"beforeRule\"):r&&(r=r.replace(/\\\\S/g,\"\")),r}rawBeforeOpen(e){let t;return e.walk(r=>{if(r.type!==\"decl\"&&(t=r.raws.between,typeof t!=\"undefined\"))return!1}),t}rawBeforeRule(e){let t;return e.walk(r=>{if(r.nodes&&(r.parent!==e||e.first!==r)&&typeof r.raws.before!=\"undefined\")return t=r.raws.before,t.includes(\\`\n\\`)&&(t=t.replace(/[^\\\\n]+$/,\"\")),!1}),t&&(t=t.replace(/\\\\S/g,\"\")),t}rawColon(e){let t;return e.walkDecls(r=>{if(typeof r.raws.between!=\"undefined\")return t=r.raws.between.replace(/[^\\\\s:]/g,\"\"),!1}),t}rawEmptyBody(e){let t;return e.walk(r=>{if(r.nodes&&r.nodes.length===0&&(t=r.raws.after,typeof t!=\"undefined\"))return!1}),t}rawIndent(e){if(e.raws.indent)return e.raws.indent;let t;return e.walk(r=>{let i=r.parent;if(i&&i!==e&&i.parent&&i.parent===e&&typeof r.raws.before!=\"undefined\"){let n=r.raws.before.split(\\`\n\\`);return t=n[n.length-1],t=t.replace(/\\\\S/g,\"\"),!1}}),t}rawSemicolon(e){let t;return e.walk(r=>{if(r.nodes&&r.nodes.length&&r.last.type===\"decl\"&&(t=r.raws.semicolon,typeof t!=\"undefined\"))return!1}),t}rawValue(e,t){let r=e[t],i=e.raws[t];return i&&i.value===r?i.raw:r}root(e){this.body(e),e.raws.after&&this.builder(e.raws.after)}rule(e){this.block(e,this.rawValue(e,\"selector\")),e.raws.ownSemicolon&&this.builder(e.raws.ownSemicolon,e,\"end\")}stringify(e,t){if(!this[e.type])throw new Error(\"Unknown AST node type \"+e.type+\". Maybe you need to change PostCSS stringifier.\");this[e.type](e,t)}};var qi=kr;kr.default=kr;let Ba=qi;function Pr(s,e){new Ba(e).stringify(s)}var tr=Pr;Pr.default=Pr;let{isClean:dt,my:za}=it,Wa=ms,Ga=qi,Va=tr;function Dr(s,e){let t=new s.constructor;for(let r in s){if(!Object.prototype.hasOwnProperty.call(s,r)||r===\"proxyCache\")continue;let i=s[r],n=typeof i;r===\"parent\"&&n===\"object\"?e&&(t[r]=e):r===\"source\"?t[r]=i:Array.isArray(i)?t[r]=i.map(o=>Dr(o,t)):(n===\"object\"&&i!==null&&(i=Dr(i)),t[r]=i)}return t}let Lr=class{constructor(e={}){this.raws={},this[dt]=!1,this[za]=!0;for(let t in e)if(t===\"nodes\"){this.nodes=[];for(let r of e[t])typeof r.clone==\"function\"?this.append(r.clone()):this.append(r)}else this[t]=e[t]}addToError(e){if(e.postcssNode=this,e.stack&&this.source&&/\\\\n\\\\s{4}at /.test(e.stack)){let t=this.source;e.stack=e.stack.replace(/\\\\n\\\\s{4}at /,\\`$&\\${t.input.from}:\\${t.start.line}:\\${t.start.column}$&\\`)}return e}after(e){return this.parent.insertAfter(this,e),this}assign(e={}){for(let t in e)this[t]=e[t];return this}before(e){return this.parent.insertBefore(this,e),this}cleanRaws(e){delete this.raws.before,delete this.raws.after,e||delete this.raws.between}clone(e={}){let t=Dr(this);for(let r in e)t[r]=e[r];return t}cloneAfter(e={}){let t=this.clone(e);return this.parent.insertAfter(this,t),t}cloneBefore(e={}){let t=this.clone(e);return this.parent.insertBefore(this,t),t}error(e,t={}){if(this.source){let{end:r,start:i}=this.rangeBy(t);return this.source.input.error(e,{column:i.column,line:i.line},{column:r.column,line:r.line},t)}return new Wa(e)}getProxyProcessor(){return{get(e,t){return t===\"proxyOf\"?e:t===\"root\"?()=>e.root().toProxy():e[t]},set(e,t,r){return e[t]===r||(e[t]=r,(t===\"prop\"||t===\"value\"||t===\"name\"||t===\"params\"||t===\"important\"||t===\"text\")&&e.markDirty()),!0}}}markDirty(){if(this[dt]){this[dt]=!1;let e=this;for(;e=e.parent;)e[dt]=!1}}next(){if(!this.parent)return;let e=this.parent.index(this);return this.parent.nodes[e+1]}positionBy(e,t){let r=this.source.start;if(e.index)r=this.positionInside(e.index,t);else if(e.word){t=this.toString();let i=t.indexOf(e.word);i!==-1&&(r=this.positionInside(i,t))}return r}positionInside(e,t){let r=t||this.toString(),i=this.source.start.column,n=this.source.start.line;for(let o=0;o<e;o++)r[o]===\\`\n\\`?(i=1,n+=1):i+=1;return{column:i,line:n}}prev(){if(!this.parent)return;let e=this.parent.index(this);return this.parent.nodes[e-1]}rangeBy(e){let t={column:this.source.start.column,line:this.source.start.line},r=this.source.end?{column:this.source.end.column+1,line:this.source.end.line}:{column:t.column+1,line:t.line};if(e.word){let i=this.toString(),n=i.indexOf(e.word);n!==-1&&(t=this.positionInside(n,i),r=this.positionInside(n+e.word.length,i))}else e.start?t={column:e.start.column,line:e.start.line}:e.index&&(t=this.positionInside(e.index)),e.end?r={column:e.end.column,line:e.end.line}:typeof e.endIndex==\"number\"?r=this.positionInside(e.endIndex):e.index&&(r=this.positionInside(e.index+1));return(r.line<t.line||r.line===t.line&&r.column<=t.column)&&(r={column:t.column+1,line:t.line}),{end:r,start:t}}raw(e,t){return new Ga().raw(this,e,t)}remove(){return this.parent&&this.parent.removeChild(this),this.parent=void 0,this}replaceWith(...e){if(this.parent){let t=this,r=!1;for(let i of e)i===this?r=!0:r?(this.parent.insertAfter(t,i),t=i):this.parent.insertBefore(t,i);r||this.remove()}return this}root(){let e=this;for(;e.parent&&e.parent.type!==\"document\";)e=e.parent;return e}toJSON(e,t){let r={},i=t==null;t=t||new Map;let n=0;for(let o in this){if(!Object.prototype.hasOwnProperty.call(this,o)||o===\"parent\"||o===\"proxyCache\")continue;let l=this[o];if(Array.isArray(l))r[o]=l.map(a=>typeof a==\"object\"&&a.toJSON?a.toJSON(null,t):a);else if(typeof l==\"object\"&&l.toJSON)r[o]=l.toJSON(null,t);else if(o===\"source\"){let a=t.get(l.input);a==null&&(a=n,t.set(l.input,n),n++),r[o]={end:l.end,inputId:a,start:l.start}}else r[o]=l}return i&&(r.inputs=[...t.keys()].map(o=>o.toJSON())),r}toProxy(){return this.proxyCache||(this.proxyCache=new Proxy(this,this.getProxyProcessor())),this.proxyCache}toString(e=Va){e.stringify&&(e=e.stringify);let t=\"\";return e(this,r=>{t+=r}),t}warn(e,t,r){let i={node:this};for(let n in r)i[n]=r[n];return e.warn(t,i)}get proxyOf(){return this}};var rr=Lr;Lr.default=Lr;let ja=rr,Tr=class extends ja{constructor(e){e&&typeof e.value!=\"undefined\"&&typeof e.value!=\"string\"&&(e=ee(x({},e),{value:String(e.value)})),super(e),this.type=\"decl\"}get variable(){return this.prop.startsWith(\"--\")||this.prop[0]===\"$\"}};var sr=Tr;Tr.default=Tr;let Ha=\"useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict\",Ya=(s,e=21)=>(t=e)=>{let r=\"\",i=t;for(;i--;)r+=s[Math.random()*s.length|0];return r},Za=(s=21)=>{let e=\"\",t=s;for(;t--;)e+=Ha[Math.random()*64|0];return e};var Ja={nanoid:Za,customAlphabet:Ya};let{SourceMapConsumer:qs,SourceMapGenerator:ei}=ie,{existsSync:Xa,readFileSync:Ka}=ie,{dirname:wr,join:Qa}=ie;function qa(s){return Buffer?Buffer.from(s,\"base64\").toString():window.atob(s)}let _r=class{constructor(e,t){if(t.map===!1)return;this.loadAnnotation(e),this.inline=this.startWith(this.annotation,\"data:\");let r=t.map?t.map.prev:void 0,i=this.loadMap(t.from,r);!this.mapFile&&t.from&&(this.mapFile=t.from),this.mapFile&&(this.root=wr(this.mapFile)),i&&(this.text=i)}consumer(){return this.consumerCache||(this.consumerCache=new qs(this.text)),this.consumerCache}decodeInline(e){let t=/^data:application\\\\/json;charset=utf-?8;base64,/,r=/^data:application\\\\/json;base64,/,i=/^data:application\\\\/json;charset=utf-?8,/,n=/^data:application\\\\/json,/;if(i.test(e)||n.test(e))return decodeURIComponent(e.substr(RegExp.lastMatch.length));if(t.test(e)||r.test(e))return qa(e.substr(RegExp.lastMatch.length));let o=e.match(/data:application\\\\/json;([^,]+),/)[1];throw new Error(\"Unsupported source map encoding \"+o)}getAnnotationURL(e){return e.replace(/^\\\\/\\\\*\\\\s*# sourceMappingURL=/,\"\").trim()}isMap(e){return typeof e!=\"object\"?!1:typeof e.mappings==\"string\"||typeof e._mappings==\"string\"||Array.isArray(e.sections)}loadAnnotation(e){let t=e.match(/\\\\/\\\\*\\\\s*# sourceMappingURL=/gm);if(!t)return;let r=e.lastIndexOf(t.pop()),i=e.indexOf(\"*/\",r);r>-1&&i>-1&&(this.annotation=this.getAnnotationURL(e.substring(r,i)))}loadFile(e){if(this.root=wr(e),Xa(e))return this.mapFile=e,Ka(e,\"utf-8\").toString().trim()}loadMap(e,t){if(t===!1)return!1;if(t){if(typeof t==\"string\")return t;if(typeof t==\"function\"){let r=t(e);if(r){let i=this.loadFile(r);if(!i)throw new Error(\"Unable to load previous source map: \"+r.toString());return i}}else{if(t instanceof qs)return ei.fromSourceMap(t).toString();if(t instanceof ei)return t.toString();if(this.isMap(t))return JSON.stringify(t);throw new Error(\"Unsupported previous source map format: \"+t.toString())}}else{if(this.inline)return this.decodeInline(this.annotation);if(this.annotation){let r=this.annotation;return e&&(r=Qa(wr(e),r)),this.loadFile(r)}}}startWith(e,t){return e?e.substr(0,t.length)===t:!1}withContent(){return!!(this.consumer().sourcesContent&&this.consumer().sourcesContent.length>0)}};var en=_r;_r.default=_r;let{SourceMapConsumer:el,SourceMapGenerator:tl}=ie,{fileURLToPath:ti,pathToFileURL:mt}=ie,{isAbsolute:Fr,resolve:Ur}=ie,{nanoid:rl}=Ja,Sr=ie,ri=ms,sl=en,br=Symbol(\"fromOffsetCache\"),il=!!(el&&tl),si=!!(Ur&&Fr),Vt=class{constructor(e,t={}){if(e===null||typeof e==\"undefined\"||typeof e==\"object\"&&!e.toString)throw new Error(\\`PostCSS received \\${e} instead of CSS string\\`);if(this.css=e.toString(),this.css[0]===\"\\\\uFEFF\"||this.css[0]===\"\\\\uFFFE\"?(this.hasBOM=!0,this.css=this.css.slice(1)):this.hasBOM=!1,t.from&&(!si||/^\\\\w+:\\\\/\\\\//.test(t.from)||Fr(t.from)?this.file=t.from:this.file=Ur(t.from)),si&&il){let r=new sl(this.css,t);if(r.text){this.map=r;let i=r.consumer().file;!this.file&&i&&(this.file=this.mapResolve(i))}}this.file||(this.id=\"<input css \"+rl(6)+\">\"),this.map&&(this.map.file=this.from)}error(e,t,r,i={}){let n,o,l;if(t&&typeof t==\"object\"){let u=t,c=r;if(typeof u.offset==\"number\"){let h=this.fromOffset(u.offset);t=h.line,r=h.col}else t=u.line,r=u.column;if(typeof c.offset==\"number\"){let h=this.fromOffset(c.offset);o=h.line,l=h.col}else o=c.line,l=c.column}else if(!r){let u=this.fromOffset(t);t=u.line,r=u.col}let a=this.origin(t,r,o,l);return a?n=new ri(e,a.endLine===void 0?a.line:{column:a.column,line:a.line},a.endLine===void 0?a.column:{column:a.endColumn,line:a.endLine},a.source,a.file,i.plugin):n=new ri(e,o===void 0?t:{column:r,line:t},o===void 0?r:{column:l,line:o},this.css,this.file,i.plugin),n.input={column:r,endColumn:l,endLine:o,line:t,source:this.css},this.file&&(mt&&(n.input.url=mt(this.file).toString()),n.input.file=this.file),n}fromOffset(e){let t,r;if(this[br])r=this[br];else{let n=this.css.split(\\`\n\\`);r=new Array(n.length);let o=0;for(let l=0,a=n.length;l<a;l++)r[l]=o,o+=n[l].length+1;this[br]=r}t=r[r.length-1];let i=0;if(e>=t)i=r.length-1;else{let n=r.length-2,o;for(;i<n;)if(o=i+(n-i>>1),e<r[o])n=o-1;else if(e>=r[o+1])i=o+1;else{i=o;break}}return{col:e-r[i]+1,line:i+1}}mapResolve(e){return/^\\\\w+:\\\\/\\\\//.test(e)?e:Ur(this.map.consumer().sourceRoot||this.map.root||\".\",e)}origin(e,t,r,i){if(!this.map)return!1;let n=this.map.consumer(),o=n.originalPositionFor({column:t,line:e});if(!o.source)return!1;let l;typeof r==\"number\"&&(l=n.originalPositionFor({column:i,line:r}));let a;Fr(o.source)?a=mt(o.source):a=new URL(o.source,this.map.consumer().sourceRoot||mt(this.map.mapFile));let u={column:o.column,endColumn:l&&l.column,endLine:l&&l.line,line:o.line,url:a.toString()};if(a.protocol===\"file:\")if(ti)u.file=ti(a);else throw new Error(\"file: protocol is not available in this PostCSS build\");let c=n.sourceContentFor(o.source);return c&&(u.source=c),u}toJSON(){let e={};for(let t of[\"hasBOM\",\"css\",\"file\",\"id\"])this[t]!=null&&(e[t]=this[t]);return this.map&&(e.map=x({},this.map),e.map.consumerCache&&(e.map.consumerCache=void 0)),e}get from(){return this.file||this.id}};var ir=Vt;Vt.default=Vt;Sr&&Sr.registerInput&&Sr.registerInput(Vt);let{SourceMapConsumer:tn,SourceMapGenerator:Tt}=ie,{dirname:_t,relative:rn,resolve:sn,sep:nn}=ie,{pathToFileURL:ii}=ie,nl=ir,ol=!!(tn&&Tt),al=!!(_t&&sn&&rn&&nn),ll=class{constructor(e,t,r,i){this.stringify=e,this.mapOpts=r.map||{},this.root=t,this.opts=r,this.css=i,this.originalCSS=i,this.usesFileUrls=!this.mapOpts.from&&this.mapOpts.absolute,this.memoizedFileURLs=new Map,this.memoizedPaths=new Map,this.memoizedURLs=new Map}addAnnotation(){let e;this.isInline()?e=\"data:application/json;base64,\"+this.toBase64(this.map.toString()):typeof this.mapOpts.annotation==\"string\"?e=this.mapOpts.annotation:typeof this.mapOpts.annotation==\"function\"?e=this.mapOpts.annotation(this.opts.to,this.root):e=this.outputFile()+\".map\";let t=\\`\n\\`;this.css.includes(\\`\\\\r\n\\`)&&(t=\\`\\\\r\n\\`),this.css+=t+\"/*# sourceMappingURL=\"+e+\" */\"}applyPrevMaps(){for(let e of this.previous()){let t=this.toUrl(this.path(e.file)),r=e.root||_t(e.file),i;this.mapOpts.sourcesContent===!1?(i=new tn(e.text),i.sourcesContent&&(i.sourcesContent=null)):i=e.consumer(),this.map.applySourceMap(i,t,this.toUrl(this.path(r)))}}clearAnnotation(){if(this.mapOpts.annotation!==!1)if(this.root){let e;for(let t=this.root.nodes.length-1;t>=0;t--)e=this.root.nodes[t],e.type===\"comment\"&&e.text.indexOf(\"# sourceMappingURL=\")===0&&this.root.removeChild(t)}else this.css&&(this.css=this.css.replace(/\\\\n*?\\\\/\\\\*#[\\\\S\\\\s]*?\\\\*\\\\/$/gm,\"\"))}generate(){if(this.clearAnnotation(),al&&ol&&this.isMap())return this.generateMap();{let e=\"\";return this.stringify(this.root,t=>{e+=t}),[e]}}generateMap(){if(this.root)this.generateString();else if(this.previous().length===1){let e=this.previous()[0].consumer();e.file=this.outputFile(),this.map=Tt.fromSourceMap(e,{ignoreInvalidMapping:!0})}else this.map=new Tt({file:this.outputFile(),ignoreInvalidMapping:!0}),this.map.addMapping({generated:{column:0,line:1},original:{column:0,line:1},source:this.opts.from?this.toUrl(this.path(this.opts.from)):\"<no source>\"});return this.isSourcesContent()&&this.setSourcesContent(),this.root&&this.previous().length>0&&this.applyPrevMaps(),this.isAnnotation()&&this.addAnnotation(),this.isInline()?[this.css]:[this.css,this.map]}generateString(){this.css=\"\",this.map=new Tt({file:this.outputFile(),ignoreInvalidMapping:!0});let e=1,t=1,r=\"<no source>\",i={generated:{column:0,line:0},original:{column:0,line:0},source:\"\"},n,o;this.stringify(this.root,(l,a,u)=>{if(this.css+=l,a&&u!==\"end\"&&(i.generated.line=e,i.generated.column=t-1,a.source&&a.source.start?(i.source=this.sourcePath(a),i.original.line=a.source.start.line,i.original.column=a.source.start.column-1,this.map.addMapping(i)):(i.source=r,i.original.line=1,i.original.column=0,this.map.addMapping(i))),n=l.match(/\\\\n/g),n?(e+=n.length,o=l.lastIndexOf(\\`\n\\`),t=l.length-o):t+=l.length,a&&u!==\"start\"){let c=a.parent||{raws:{}};(!(a.type===\"decl\"||a.type===\"atrule\"&&!a.nodes)||a!==c.last||c.raws.semicolon)&&(a.source&&a.source.end?(i.source=this.sourcePath(a),i.original.line=a.source.end.line,i.original.column=a.source.end.column-1,i.generated.line=e,i.generated.column=t-2,this.map.addMapping(i)):(i.source=r,i.original.line=1,i.original.column=0,i.generated.line=e,i.generated.column=t-1,this.map.addMapping(i)))}})}isAnnotation(){return this.isInline()?!0:typeof this.mapOpts.annotation!=\"undefined\"?this.mapOpts.annotation:this.previous().length?this.previous().some(e=>e.annotation):!0}isInline(){if(typeof this.mapOpts.inline!=\"undefined\")return this.mapOpts.inline;let e=this.mapOpts.annotation;return typeof e!=\"undefined\"&&e!==!0?!1:this.previous().length?this.previous().some(t=>t.inline):!0}isMap(){return typeof this.opts.map!=\"undefined\"?!!this.opts.map:this.previous().length>0}isSourcesContent(){return typeof this.mapOpts.sourcesContent!=\"undefined\"?this.mapOpts.sourcesContent:this.previous().length?this.previous().some(e=>e.withContent()):!0}outputFile(){return this.opts.to?this.path(this.opts.to):this.opts.from?this.path(this.opts.from):\"to.css\"}path(e){if(this.mapOpts.absolute||e.charCodeAt(0)===60||/^\\\\w+:\\\\/\\\\//.test(e))return e;let t=this.memoizedPaths.get(e);if(t)return t;let r=this.opts.to?_t(this.opts.to):\".\";typeof this.mapOpts.annotation==\"string\"&&(r=_t(sn(r,this.mapOpts.annotation)));let i=rn(r,e);return this.memoizedPaths.set(e,i),i}previous(){if(!this.previousMaps)if(this.previousMaps=[],this.root)this.root.walk(e=>{if(e.source&&e.source.input.map){let t=e.source.input.map;this.previousMaps.includes(t)||this.previousMaps.push(t)}});else{let e=new nl(this.originalCSS,this.opts);e.map&&this.previousMaps.push(e.map)}return this.previousMaps}setSourcesContent(){let e={};if(this.root)this.root.walk(t=>{if(t.source){let r=t.source.input.from;if(r&&!e[r]){e[r]=!0;let i=this.usesFileUrls?this.toFileUrl(r):this.toUrl(this.path(r));this.map.setSourceContent(i,t.source.input.css)}}});else if(this.css){let t=this.opts.from?this.toUrl(this.path(this.opts.from)):\"<no source>\";this.map.setSourceContent(t,this.css)}}sourcePath(e){return this.mapOpts.from?this.toUrl(this.mapOpts.from):this.usesFileUrls?this.toFileUrl(e.source.input.from):this.toUrl(this.path(e.source.input.from))}toBase64(e){return Buffer?Buffer.from(e).toString(\"base64\"):window.btoa(unescape(encodeURIComponent(e)))}toFileUrl(e){let t=this.memoizedFileURLs.get(e);if(t)return t;if(ii){let r=ii(e).toString();return this.memoizedFileURLs.set(e,r),r}else throw new Error(\"\\`map.absolute\\` option is not available in this PostCSS build\")}toUrl(e){let t=this.memoizedURLs.get(e);if(t)return t;nn===\"\\\\\\\\\"&&(e=e.replace(/\\\\\\\\/g,\"/\"));let r=encodeURI(e).replace(/[#?]/g,encodeURIComponent);return this.memoizedURLs.set(e,r),r}};var on=ll;let ul=rr,Br=class extends ul{constructor(e){super(e),this.type=\"comment\"}};var nr=Br;Br.default=Br;let{isClean:an,my:ln}=it,un=sr,cn=nr,cl=rr,hn,gs,ys,fn;function pn(s){return s.map(e=>(e.nodes&&(e.nodes=pn(e.nodes)),delete e.source,e))}function dn(s){if(s[an]=!1,s.proxyOf.nodes)for(let e of s.proxyOf.nodes)dn(e)}let fe=class mn extends cl{append(...e){for(let t of e){let r=this.normalize(t,this.last);for(let i of r)this.proxyOf.nodes.push(i)}return this.markDirty(),this}cleanRaws(e){if(super.cleanRaws(e),this.nodes)for(let t of this.nodes)t.cleanRaws(e)}each(e){if(!this.proxyOf.nodes)return;let t=this.getIterator(),r,i;for(;this.indexes[t]<this.proxyOf.nodes.length&&(r=this.indexes[t],i=e(this.proxyOf.nodes[r],r),i!==!1);)this.indexes[t]+=1;return delete this.indexes[t],i}every(e){return this.nodes.every(e)}getIterator(){this.lastEach||(this.lastEach=0),this.indexes||(this.indexes={}),this.lastEach+=1;let e=this.lastEach;return this.indexes[e]=0,e}getProxyProcessor(){return{get(e,t){return t===\"proxyOf\"?e:e[t]?t===\"each\"||typeof t==\"string\"&&t.startsWith(\"walk\")?(...r)=>e[t](...r.map(i=>typeof i==\"function\"?(n,o)=>i(n.toProxy(),o):i)):t===\"every\"||t===\"some\"?r=>e[t]((i,...n)=>r(i.toProxy(),...n)):t===\"root\"?()=>e.root().toProxy():t===\"nodes\"?e.nodes.map(r=>r.toProxy()):t===\"first\"||t===\"last\"?e[t].toProxy():e[t]:e[t]},set(e,t,r){return e[t]===r||(e[t]=r,(t===\"name\"||t===\"params\"||t===\"selector\")&&e.markDirty()),!0}}}index(e){return typeof e==\"number\"?e:(e.proxyOf&&(e=e.proxyOf),this.proxyOf.nodes.indexOf(e))}insertAfter(e,t){let r=this.index(e),i=this.normalize(t,this.proxyOf.nodes[r]).reverse();r=this.index(e);for(let o of i)this.proxyOf.nodes.splice(r+1,0,o);let n;for(let o in this.indexes)n=this.indexes[o],r<n&&(this.indexes[o]=n+i.length);return this.markDirty(),this}insertBefore(e,t){let r=this.index(e),i=r===0?\"prepend\":!1,n=this.normalize(t,this.proxyOf.nodes[r],i).reverse();r=this.index(e);for(let l of n)this.proxyOf.nodes.splice(r,0,l);let o;for(let l in this.indexes)o=this.indexes[l],r<=o&&(this.indexes[l]=o+n.length);return this.markDirty(),this}normalize(e,t){if(typeof e==\"string\")e=pn(hn(e).nodes);else if(typeof e==\"undefined\")e=[];else if(Array.isArray(e)){e=e.slice(0);for(let i of e)i.parent&&i.parent.removeChild(i,\"ignore\")}else if(e.type===\"root\"&&this.type!==\"document\"){e=e.nodes.slice(0);for(let i of e)i.parent&&i.parent.removeChild(i,\"ignore\")}else if(e.type)e=[e];else if(e.prop){if(typeof e.value==\"undefined\")throw new Error(\"Value field is missed in node creation\");typeof e.value!=\"string\"&&(e.value=String(e.value)),e=[new un(e)]}else if(e.selector)e=[new gs(e)];else if(e.name)e=[new ys(e)];else if(e.text)e=[new cn(e)];else throw new Error(\"Unknown node type in node creation\");return e.map(i=>(i[ln]||mn.rebuild(i),i=i.proxyOf,i.parent&&i.parent.removeChild(i),i[an]&&dn(i),typeof i.raws.before==\"undefined\"&&t&&typeof t.raws.before!=\"undefined\"&&(i.raws.before=t.raws.before.replace(/\\\\S/g,\"\")),i.parent=this.proxyOf,i))}prepend(...e){e=e.reverse();for(let t of e){let r=this.normalize(t,this.first,\"prepend\").reverse();for(let i of r)this.proxyOf.nodes.unshift(i);for(let i in this.indexes)this.indexes[i]=this.indexes[i]+r.length}return this.markDirty(),this}push(e){return e.parent=this,this.proxyOf.nodes.push(e),this}removeAll(){for(let e of this.proxyOf.nodes)e.parent=void 0;return this.proxyOf.nodes=[],this.markDirty(),this}removeChild(e){e=this.index(e),this.proxyOf.nodes[e].parent=void 0,this.proxyOf.nodes.splice(e,1);let t;for(let r in this.indexes)t=this.indexes[r],t>=e&&(this.indexes[r]=t-1);return this.markDirty(),this}replaceValues(e,t,r){return r||(r=t,t={}),this.walkDecls(i=>{t.props&&!t.props.includes(i.prop)||t.fast&&!i.value.includes(t.fast)||(i.value=i.value.replace(e,r))}),this.markDirty(),this}some(e){return this.nodes.some(e)}walk(e){return this.each((t,r)=>{let i;try{i=e(t,r)}catch(n){throw t.addToError(n)}return i!==!1&&t.walk&&(i=t.walk(e)),i})}walkAtRules(e,t){return t?e instanceof RegExp?this.walk((r,i)=>{if(r.type===\"atrule\"&&e.test(r.name))return t(r,i)}):this.walk((r,i)=>{if(r.type===\"atrule\"&&r.name===e)return t(r,i)}):(t=e,this.walk((r,i)=>{if(r.type===\"atrule\")return t(r,i)}))}walkComments(e){return this.walk((t,r)=>{if(t.type===\"comment\")return e(t,r)})}walkDecls(e,t){return t?e instanceof RegExp?this.walk((r,i)=>{if(r.type===\"decl\"&&e.test(r.prop))return t(r,i)}):this.walk((r,i)=>{if(r.type===\"decl\"&&r.prop===e)return t(r,i)}):(t=e,this.walk((r,i)=>{if(r.type===\"decl\")return t(r,i)}))}walkRules(e,t){return t?e instanceof RegExp?this.walk((r,i)=>{if(r.type===\"rule\"&&e.test(r.selector))return t(r,i)}):this.walk((r,i)=>{if(r.type===\"rule\"&&r.selector===e)return t(r,i)}):(t=e,this.walk((r,i)=>{if(r.type===\"rule\")return t(r,i)}))}get first(){if(this.proxyOf.nodes)return this.proxyOf.nodes[0]}get last(){if(this.proxyOf.nodes)return this.proxyOf.nodes[this.proxyOf.nodes.length-1]}};fe.registerParse=s=>{hn=s};fe.registerRule=s=>{gs=s};fe.registerAtRule=s=>{ys=s};fe.registerRoot=s=>{fn=s};var ve=fe;fe.default=fe;fe.rebuild=s=>{s.type===\"atrule\"?Object.setPrototypeOf(s,ys.prototype):s.type===\"rule\"?Object.setPrototypeOf(s,gs.prototype):s.type===\"decl\"?Object.setPrototypeOf(s,un.prototype):s.type===\"comment\"?Object.setPrototypeOf(s,cn.prototype):s.type===\"root\"&&Object.setPrototypeOf(s,fn.prototype),s[ln]=!0,s.nodes&&s.nodes.forEach(e=>{fe.rebuild(e)})};let hl=ve,gn,yn,Je=class extends hl{constructor(e){super(x({type:\"document\"},e)),this.nodes||(this.nodes=[])}toResult(e={}){return new gn(new yn,this,e).stringify()}};Je.registerLazyResult=s=>{gn=s};Je.registerProcessor=s=>{yn=s};var ws=Je;Je.default=Je;let zr=class{constructor(e,t={}){if(this.type=\"warning\",this.text=e,t.node&&t.node.source){let r=t.node.rangeBy(t);this.line=r.start.line,this.column=r.start.column,this.endLine=r.end.line,this.endColumn=r.end.column}for(let r in t)this[r]=t[r]}toString(){return this.node?this.node.error(this.text,{index:this.index,plugin:this.plugin,word:this.word}).message:this.plugin?this.plugin+\": \"+this.text:this.text}};var wn=zr;zr.default=zr;let fl=wn,Wr=class{constructor(e,t,r){this.processor=e,this.messages=[],this.root=t,this.opts=r,this.css=void 0,this.map=void 0}toString(){return this.css}warn(e,t={}){t.plugin||this.lastPlugin&&this.lastPlugin.postcssPlugin&&(t.plugin=this.lastPlugin.postcssPlugin);let r=new fl(e,t);return this.messages.push(r),r}warnings(){return this.messages.filter(e=>e.type===\"warning\")}get content(){return this.css}};var Ss=Wr;Wr.default=Wr;const Cr=39,ni=34,gt=92,oi=47,yt=10,ze=32,wt=12,St=9,bt=13,pl=91,dl=93,ml=40,gl=41,yl=123,wl=125,Sl=59,bl=42,Cl=58,vl=64,Ct=/[\\\\t\\\\n\\\\f\\\\r \"#'()/;[\\\\\\\\\\\\]{}]/g,vt=/[\\\\t\\\\n\\\\f\\\\r !\"#'():;@[\\\\\\\\\\\\]{}]|\\\\/(?=\\\\*)/g,Il=/.[\\\\r\\\\n\"'(/\\\\\\\\]/,ai=/[\\\\da-f]/i;var xl=function(e,t={}){let r=e.css.valueOf(),i=t.ignoreErrors,n,o,l,a,u,c,h,d,m,g,p=r.length,f=0,S=[],b=[];function y(){return f}function C(_){throw e.error(\"Unclosed \"+_,f)}function N(){return b.length===0&&f>=p}function D(_){if(b.length)return b.pop();if(f>=p)return;let G=_?_.ignoreUnclosed:!1;switch(n=r.charCodeAt(f),n){case yt:case ze:case St:case bt:case wt:{o=f;do o+=1,n=r.charCodeAt(o);while(n===ze||n===yt||n===St||n===bt||n===wt);g=[\"space\",r.slice(f,o)],f=o-1;break}case pl:case dl:case yl:case wl:case Cl:case Sl:case gl:{let Y=String.fromCharCode(n);g=[Y,Y,f];break}case ml:{if(d=S.length?S.pop()[1]:\"\",m=r.charCodeAt(f+1),d===\"url\"&&m!==Cr&&m!==ni&&m!==ze&&m!==yt&&m!==St&&m!==wt&&m!==bt){o=f;do{if(c=!1,o=r.indexOf(\")\",o+1),o===-1)if(i||G){o=f;break}else C(\"bracket\");for(h=o;r.charCodeAt(h-1)===gt;)h-=1,c=!c}while(c);g=[\"brackets\",r.slice(f,o+1),f,o],f=o}else o=r.indexOf(\")\",f+1),a=r.slice(f,o+1),o===-1||Il.test(a)?g=[\"(\",\"(\",f]:(g=[\"brackets\",a,f,o],f=o);break}case Cr:case ni:{l=n===Cr?\"'\":'\"',o=f;do{if(c=!1,o=r.indexOf(l,o+1),o===-1)if(i||G){o=f+1;break}else C(\"string\");for(h=o;r.charCodeAt(h-1)===gt;)h-=1,c=!c}while(c);g=[\"string\",r.slice(f,o+1),f,o],f=o;break}case vl:{Ct.lastIndex=f+1,Ct.test(r),Ct.lastIndex===0?o=r.length-1:o=Ct.lastIndex-2,g=[\"at-word\",r.slice(f,o+1),f,o],f=o;break}case gt:{for(o=f,u=!0;r.charCodeAt(o+1)===gt;)o+=1,u=!u;if(n=r.charCodeAt(o+1),u&&n!==oi&&n!==ze&&n!==yt&&n!==St&&n!==bt&&n!==wt&&(o+=1,ai.test(r.charAt(o)))){for(;ai.test(r.charAt(o+1));)o+=1;r.charCodeAt(o+1)===ze&&(o+=1)}g=[\"word\",r.slice(f,o+1),f,o],f=o;break}default:{n===oi&&r.charCodeAt(f+1)===bl?(o=r.indexOf(\"*/\",f+2)+1,o===0&&(i||G?o=r.length:C(\"comment\")),g=[\"comment\",r.slice(f,o+1),f,o],f=o):(vt.lastIndex=f+1,vt.test(r),vt.lastIndex===0?o=r.length-1:o=vt.lastIndex-2,g=[\"word\",r.slice(f,o+1),f,o],S.push(g),f=o);break}}return f++,g}function H(_){b.push(_)}return{back:H,endOfFile:N,nextToken:D,position:y}};let Sn=ve,jt=class extends Sn{constructor(e){super(e),this.type=\"atrule\"}append(...e){return this.proxyOf.nodes||(this.nodes=[]),super.append(...e)}prepend(...e){return this.proxyOf.nodes||(this.nodes=[]),super.prepend(...e)}};var bs=jt;jt.default=jt;Sn.registerAtRule(jt);let bn=ve,Cn,vn,Ne=class extends bn{constructor(e){super(e),this.type=\"root\",this.nodes||(this.nodes=[])}normalize(e,t,r){let i=super.normalize(e);if(t){if(r===\"prepend\")this.nodes.length>1?t.raws.before=this.nodes[1].raws.before:delete t.raws.before;else if(this.first!==t)for(let n of i)n.raws.before=t.raws.before}return i}removeChild(e,t){let r=this.index(e);return!t&&r===0&&this.nodes.length>1&&(this.nodes[1].raws.before=this.nodes[r].raws.before),super.removeChild(e)}toResult(e={}){return new Cn(new vn,this,e).stringify()}};Ne.registerLazyResult=s=>{Cn=s};Ne.registerProcessor=s=>{vn=s};var nt=Ne;Ne.default=Ne;bn.registerRoot(Ne);let Xe={comma(s){return Xe.split(s,[\",\"],!0)},space(s){let e=[\" \",\\`\n\\`,\"\t\"];return Xe.split(s,e)},split(s,e,t){let r=[],i=\"\",n=!1,o=0,l=!1,a=\"\",u=!1;for(let c of s)u?u=!1:c===\"\\\\\\\\\"?u=!0:l?c===a&&(l=!1):c==='\"'||c===\"'\"?(l=!0,a=c):c===\"(\"?o+=1:c===\")\"?o>0&&(o-=1):o===0&&e.includes(c)&&(n=!0),n?(i!==\"\"&&r.push(i.trim()),i=\"\",n=!1):i+=c;return(t||i!==\"\")&&r.push(i.trim()),r}};var In=Xe;Xe.default=Xe;let xn=ve,Ol=In,Ht=class extends xn{constructor(e){super(e),this.type=\"rule\",this.nodes||(this.nodes=[])}get selectors(){return Ol.comma(this.selector)}set selectors(e){let t=this.selector?this.selector.match(/,\\\\s*/):null,r=t?t[0]:\",\"+this.raw(\"between\",\"beforeOpen\");this.selector=e.join(r)}};var Cs=Ht;Ht.default=Ht;xn.registerRule(Ht);let Rl=sr,Al=xl,Ml=nr,El=bs,$l=nt,li=Cs;const ui={empty:!0,space:!0};function Nl(s){for(let e=s.length-1;e>=0;e--){let t=s[e],r=t[3]||t[2];if(r)return r}}let kl=class{constructor(e){this.input=e,this.root=new $l,this.current=this.root,this.spaces=\"\",this.semicolon=!1,this.createTokenizer(),this.root.source={input:e,start:{column:1,line:1,offset:0}}}atrule(e){let t=new El;t.name=e[1].slice(1),t.name===\"\"&&this.unnamedAtrule(t,e),this.init(t,e[2]);let r,i,n,o=!1,l=!1,a=[],u=[];for(;!this.tokenizer.endOfFile();){if(e=this.tokenizer.nextToken(),r=e[0],r===\"(\"||r===\"[\"?u.push(r===\"(\"?\")\":\"]\"):r===\"{\"&&u.length>0?u.push(\"}\"):r===u[u.length-1]&&u.pop(),u.length===0)if(r===\";\"){t.source.end=this.getPosition(e[2]),t.source.end.offset++,this.semicolon=!0;break}else if(r===\"{\"){l=!0;break}else if(r===\"}\"){if(a.length>0){for(n=a.length-1,i=a[n];i&&i[0]===\"space\";)i=a[--n];i&&(t.source.end=this.getPosition(i[3]||i[2]),t.source.end.offset++)}this.end(e);break}else a.push(e);else a.push(e);if(this.tokenizer.endOfFile()){o=!0;break}}t.raws.between=this.spacesAndCommentsFromEnd(a),a.length?(t.raws.afterName=this.spacesAndCommentsFromStart(a),this.raw(t,\"params\",a),o&&(e=a[a.length-1],t.source.end=this.getPosition(e[3]||e[2]),t.source.end.offset++,this.spaces=t.raws.between,t.raws.between=\"\")):(t.raws.afterName=\"\",t.params=\"\"),l&&(t.nodes=[],this.current=t)}checkMissedSemicolon(e){let t=this.colon(e);if(t===!1)return;let r=0,i;for(let n=t-1;n>=0&&(i=e[n],!(i[0]!==\"space\"&&(r+=1,r===2)));n--);throw this.input.error(\"Missed semicolon\",i[0]===\"word\"?i[3]+1:i[2])}colon(e){let t=0,r,i,n;for(let[o,l]of e.entries()){if(r=l,i=r[0],i===\"(\"&&(t+=1),i===\")\"&&(t-=1),t===0&&i===\":\")if(!n)this.doubleColon(r);else{if(n[0]===\"word\"&&n[1]===\"progid\")continue;return o}n=r}return!1}comment(e){let t=new Ml;this.init(t,e[2]),t.source.end=this.getPosition(e[3]||e[2]),t.source.end.offset++;let r=e[1].slice(2,-2);if(/^\\\\s*$/.test(r))t.text=\"\",t.raws.left=r,t.raws.right=\"\";else{let i=r.match(/^(\\\\s*)([^]*\\\\S)(\\\\s*)$/);t.text=i[2],t.raws.left=i[1],t.raws.right=i[3]}}createTokenizer(){this.tokenizer=Al(this.input)}decl(e,t){let r=new Rl;this.init(r,e[0][2]);let i=e[e.length-1];for(i[0]===\";\"&&(this.semicolon=!0,e.pop()),r.source.end=this.getPosition(i[3]||i[2]||Nl(e)),r.source.end.offset++;e[0][0]!==\"word\";)e.length===1&&this.unknownWord(e),r.raws.before+=e.shift()[1];for(r.source.start=this.getPosition(e[0][2]),r.prop=\"\";e.length;){let u=e[0][0];if(u===\":\"||u===\"space\"||u===\"comment\")break;r.prop+=e.shift()[1]}r.raws.between=\"\";let n;for(;e.length;)if(n=e.shift(),n[0]===\":\"){r.raws.between+=n[1];break}else n[0]===\"word\"&&/\\\\w/.test(n[1])&&this.unknownWord([n]),r.raws.between+=n[1];(r.prop[0]===\"_\"||r.prop[0]===\"*\")&&(r.raws.before+=r.prop[0],r.prop=r.prop.slice(1));let o=[],l;for(;e.length&&(l=e[0][0],!(l!==\"space\"&&l!==\"comment\"));)o.push(e.shift());this.precheckMissedSemicolon(e);for(let u=e.length-1;u>=0;u--){if(n=e[u],n[1].toLowerCase()===\"!important\"){r.important=!0;let c=this.stringFrom(e,u);c=this.spacesFromEnd(e)+c,c!==\" !important\"&&(r.raws.important=c);break}else if(n[1].toLowerCase()===\"important\"){let c=e.slice(0),h=\"\";for(let d=u;d>0;d--){let m=c[d][0];if(h.trim().indexOf(\"!\")===0&&m!==\"space\")break;h=c.pop()[1]+h}h.trim().indexOf(\"!\")===0&&(r.important=!0,r.raws.important=h,e=c)}if(n[0]!==\"space\"&&n[0]!==\"comment\")break}e.some(u=>u[0]!==\"space\"&&u[0]!==\"comment\")&&(r.raws.between+=o.map(u=>u[1]).join(\"\"),o=[]),this.raw(r,\"value\",o.concat(e),t),r.value.includes(\":\")&&!t&&this.checkMissedSemicolon(e)}doubleColon(e){throw this.input.error(\"Double colon\",{offset:e[2]},{offset:e[2]+e[1].length})}emptyRule(e){let t=new li;this.init(t,e[2]),t.selector=\"\",t.raws.between=\"\",this.current=t}end(e){this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.semicolon=!1,this.current.raws.after=(this.current.raws.after||\"\")+this.spaces,this.spaces=\"\",this.current.parent?(this.current.source.end=this.getPosition(e[2]),this.current.source.end.offset++,this.current=this.current.parent):this.unexpectedClose(e)}endFile(){this.current.parent&&this.unclosedBlock(),this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.current.raws.after=(this.current.raws.after||\"\")+this.spaces,this.root.source.end=this.getPosition(this.tokenizer.position())}freeSemicolon(e){if(this.spaces+=e[1],this.current.nodes){let t=this.current.nodes[this.current.nodes.length-1];t&&t.type===\"rule\"&&!t.raws.ownSemicolon&&(t.raws.ownSemicolon=this.spaces,this.spaces=\"\")}}getPosition(e){let t=this.input.fromOffset(e);return{column:t.col,line:t.line,offset:e}}init(e,t){this.current.push(e),e.source={input:this.input,start:this.getPosition(t)},e.raws.before=this.spaces,this.spaces=\"\",e.type!==\"comment\"&&(this.semicolon=!1)}other(e){let t=!1,r=null,i=!1,n=null,o=[],l=e[1].startsWith(\"--\"),a=[],u=e;for(;u;){if(r=u[0],a.push(u),r===\"(\"||r===\"[\")n||(n=u),o.push(r===\"(\"?\")\":\"]\");else if(l&&i&&r===\"{\")n||(n=u),o.push(\"}\");else if(o.length===0)if(r===\";\")if(i){this.decl(a,l);return}else break;else if(r===\"{\"){this.rule(a);return}else if(r===\"}\"){this.tokenizer.back(a.pop()),t=!0;break}else r===\":\"&&(i=!0);else r===o[o.length-1]&&(o.pop(),o.length===0&&(n=null));u=this.tokenizer.nextToken()}if(this.tokenizer.endOfFile()&&(t=!0),o.length>0&&this.unclosedBracket(n),t&&i){if(!l)for(;a.length&&(u=a[a.length-1][0],!(u!==\"space\"&&u!==\"comment\"));)this.tokenizer.back(a.pop());this.decl(a,l)}else this.unknownWord(a)}parse(){let e;for(;!this.tokenizer.endOfFile();)switch(e=this.tokenizer.nextToken(),e[0]){case\"space\":this.spaces+=e[1];break;case\";\":this.freeSemicolon(e);break;case\"}\":this.end(e);break;case\"comment\":this.comment(e);break;case\"at-word\":this.atrule(e);break;case\"{\":this.emptyRule(e);break;default:this.other(e);break}this.endFile()}precheckMissedSemicolon(){}raw(e,t,r,i){let n,o,l=r.length,a=\"\",u=!0,c,h;for(let d=0;d<l;d+=1)n=r[d],o=n[0],o===\"space\"&&d===l-1&&!i?u=!1:o===\"comment\"?(h=r[d-1]?r[d-1][0]:\"empty\",c=r[d+1]?r[d+1][0]:\"empty\",!ui[h]&&!ui[c]?a.slice(-1)===\",\"?u=!1:a+=n[1]:u=!1):a+=n[1];if(!u){let d=r.reduce((m,g)=>m+g[1],\"\");e.raws[t]={raw:d,value:a}}e[t]=a}rule(e){e.pop();let t=new li;this.init(t,e[0][2]),t.raws.between=this.spacesAndCommentsFromEnd(e),this.raw(t,\"selector\",e),this.current=t}spacesAndCommentsFromEnd(e){let t,r=\"\";for(;e.length&&(t=e[e.length-1][0],!(t!==\"space\"&&t!==\"comment\"));)r=e.pop()[1]+r;return r}spacesAndCommentsFromStart(e){let t,r=\"\";for(;e.length&&(t=e[0][0],!(t!==\"space\"&&t!==\"comment\"));)r+=e.shift()[1];return r}spacesFromEnd(e){let t,r=\"\";for(;e.length&&(t=e[e.length-1][0],t===\"space\");)r=e.pop()[1]+r;return r}stringFrom(e,t){let r=\"\";for(let i=t;i<e.length;i++)r+=e[i][1];return e.splice(t,e.length-t),r}unclosedBlock(){let e=this.current.source.start;throw this.input.error(\"Unclosed block\",e.line,e.column)}unclosedBracket(e){throw this.input.error(\"Unclosed bracket\",{offset:e[2]},{offset:e[2]+1})}unexpectedClose(e){throw this.input.error(\"Unexpected }\",{offset:e[2]},{offset:e[2]+1})}unknownWord(e){throw this.input.error(\"Unknown word\",{offset:e[0][2]},{offset:e[0][2]+e[0][1].length})}unnamedAtrule(e,t){throw this.input.error(\"At-rule without name\",{offset:t[2]},{offset:t[2]+t[1].length})}};var Pl=kl;let Dl=ve,Ll=Pl,Tl=ir;function Yt(s,e){let t=new Tl(s,e),r=new Ll(t);try{r.parse()}catch(i){throw i}return r.root}var vs=Yt;Yt.default=Yt;Dl.registerParse(Yt);let{isClean:ue,my:_l}=it,Fl=on,Ul=tr,Bl=ve,zl=ws;let ci=Ss,Wl=vs,Gl=nt;const Vl={atrule:\"AtRule\",comment:\"Comment\",decl:\"Declaration\",document:\"Document\",root:\"Root\",rule:\"Rule\"},jl={AtRule:!0,AtRuleExit:!0,Comment:!0,CommentExit:!0,Declaration:!0,DeclarationExit:!0,Document:!0,DocumentExit:!0,Once:!0,OnceExit:!0,postcssPlugin:!0,prepare:!0,Root:!0,RootExit:!0,Rule:!0,RuleExit:!0},Hl={Once:!0,postcssPlugin:!0,prepare:!0},ke=0;function We(s){return typeof s==\"object\"&&typeof s.then==\"function\"}function On(s){let e=!1,t=Vl[s.type];return s.type===\"decl\"?e=s.prop.toLowerCase():s.type===\"atrule\"&&(e=s.name.toLowerCase()),e&&s.append?[t,t+\"-\"+e,ke,t+\"Exit\",t+\"Exit-\"+e]:e?[t,t+\"-\"+e,t+\"Exit\",t+\"Exit-\"+e]:s.append?[t,ke,t+\"Exit\"]:[t,t+\"Exit\"]}function hi(s){let e;return s.type===\"document\"?e=[\"Document\",ke,\"DocumentExit\"]:s.type===\"root\"?e=[\"Root\",ke,\"RootExit\"]:e=On(s),{eventIndex:0,events:e,iterator:0,node:s,visitorIndex:0,visitors:[]}}function Gr(s){return s[ue]=!1,s.nodes&&s.nodes.forEach(e=>Gr(e)),s}let Vr={},Pe=class Rn{constructor(e,t,r){this.stringified=!1,this.processed=!1;let i;if(typeof t==\"object\"&&t!==null&&(t.type===\"root\"||t.type===\"document\"))i=Gr(t);else if(t instanceof Rn||t instanceof ci)i=Gr(t.root),t.map&&(typeof r.map==\"undefined\"&&(r.map={}),r.map.inline||(r.map.inline=!1),r.map.prev=t.map);else{let n=Wl;r.syntax&&(n=r.syntax.parse),r.parser&&(n=r.parser),n.parse&&(n=n.parse);try{i=n(t,r)}catch(o){this.processed=!0,this.error=o}i&&!i[_l]&&Bl.rebuild(i)}this.result=new ci(e,i,r),this.helpers=ee(x({},Vr),{postcss:Vr,result:this.result}),this.plugins=this.processor.plugins.map(n=>typeof n==\"object\"&&n.prepare?x(x({},n),n.prepare(this.result)):n)}async(){return this.error?Promise.reject(this.error):this.processed?Promise.resolve(this.result):(this.processing||(this.processing=this.runAsync()),this.processing)}catch(e){return this.async().catch(e)}finally(e){return this.async().then(e,e)}getAsyncError(){throw new Error(\"Use process(css).then(cb) to work with async plugins\")}handleError(e,t){let r=this.result.lastPlugin;try{t&&t.addToError(e),this.error=e,e.name===\"CssSyntaxError\"&&!e.plugin?(e.plugin=r.postcssPlugin,e.setMessage()):r.postcssVersion}catch(i){console&&console.error&&console.error(i)}return e}prepareVisitors(){this.listeners={};let e=(t,r,i)=>{this.listeners[r]||(this.listeners[r]=[]),this.listeners[r].push([t,i])};for(let t of this.plugins)if(typeof t==\"object\")for(let r in t){if(!jl[r]&&/^[A-Z]/.test(r))throw new Error(\\`Unknown event \\${r} in \\${t.postcssPlugin}. Try to update PostCSS (\\${this.processor.version} now).\\`);if(!Hl[r])if(typeof t[r]==\"object\")for(let i in t[r])i===\"*\"?e(t,r,t[r][i]):e(t,r+\"-\"+i.toLowerCase(),t[r][i]);else typeof t[r]==\"function\"&&e(t,r,t[r])}this.hasListener=Object.keys(this.listeners).length>0}async runAsync(){this.plugin=0;for(let e=0;e<this.plugins.length;e++){let t=this.plugins[e],r=this.runOnRoot(t);if(We(r))try{await r}catch(i){throw this.handleError(i)}}if(this.prepareVisitors(),this.hasListener){let e=this.result.root;for(;!e[ue];){e[ue]=!0;let t=[hi(e)];for(;t.length>0;){let r=this.visitTick(t);if(We(r))try{await r}catch(i){let n=t[t.length-1].node;throw this.handleError(i,n)}}}if(this.listeners.OnceExit)for(let[t,r]of this.listeners.OnceExit){this.result.lastPlugin=t;try{if(e.type===\"document\"){let i=e.nodes.map(n=>r(n,this.helpers));await Promise.all(i)}else await r(e,this.helpers)}catch(i){throw this.handleError(i)}}}return this.processed=!0,this.stringify()}runOnRoot(e){this.result.lastPlugin=e;try{if(typeof e==\"object\"&&e.Once){if(this.result.root.type===\"document\"){let t=this.result.root.nodes.map(r=>e.Once(r,this.helpers));return We(t[0])?Promise.all(t):t}return e.Once(this.result.root,this.helpers)}else if(typeof e==\"function\")return e(this.result.root,this.result)}catch(t){throw this.handleError(t)}}stringify(){if(this.error)throw this.error;if(this.stringified)return this.result;this.stringified=!0,this.sync();let e=this.result.opts,t=Ul;e.syntax&&(t=e.syntax.stringify),e.stringifier&&(t=e.stringifier),t.stringify&&(t=t.stringify);let i=new Fl(t,this.result.root,this.result.opts).generate();return this.result.css=i[0],this.result.map=i[1],this.result}sync(){if(this.error)throw this.error;if(this.processed)return this.result;if(this.processed=!0,this.processing)throw this.getAsyncError();for(let e of this.plugins){let t=this.runOnRoot(e);if(We(t))throw this.getAsyncError()}if(this.prepareVisitors(),this.hasListener){let e=this.result.root;for(;!e[ue];)e[ue]=!0,this.walkSync(e);if(this.listeners.OnceExit)if(e.type===\"document\")for(let t of e.nodes)this.visitSync(this.listeners.OnceExit,t);else this.visitSync(this.listeners.OnceExit,e)}return this.result}then(e,t){return this.async().then(e,t)}toString(){return this.css}visitSync(e,t){for(let[r,i]of e){this.result.lastPlugin=r;let n;try{n=i(t,this.helpers)}catch(o){throw this.handleError(o,t.proxyOf)}if(t.type!==\"root\"&&t.type!==\"document\"&&!t.parent)return!0;if(We(n))throw this.getAsyncError()}}visitTick(e){let t=e[e.length-1],{node:r,visitors:i}=t;if(r.type!==\"root\"&&r.type!==\"document\"&&!r.parent){e.pop();return}if(i.length>0&&t.visitorIndex<i.length){let[o,l]=i[t.visitorIndex];t.visitorIndex+=1,t.visitorIndex===i.length&&(t.visitors=[],t.visitorIndex=0),this.result.lastPlugin=o;try{return l(r.toProxy(),this.helpers)}catch(a){throw this.handleError(a,r)}}if(t.iterator!==0){let o=t.iterator,l;for(;l=r.nodes[r.indexes[o]];)if(r.indexes[o]+=1,!l[ue]){l[ue]=!0,e.push(hi(l));return}t.iterator=0,delete r.indexes[o]}let n=t.events;for(;t.eventIndex<n.length;){let o=n[t.eventIndex];if(t.eventIndex+=1,o===ke){r.nodes&&r.nodes.length&&(r[ue]=!0,t.iterator=r.getIterator());return}else if(this.listeners[o]){t.visitors=this.listeners[o];return}}e.pop()}walkSync(e){e[ue]=!0;let t=On(e);for(let r of t)if(r===ke)e.nodes&&e.each(i=>{i[ue]||this.walkSync(i)});else{let i=this.listeners[r];if(i&&this.visitSync(i,e.toProxy()))return}}warnings(){return this.sync().warnings()}get content(){return this.stringify().content}get css(){return this.stringify().css}get map(){return this.stringify().map}get messages(){return this.sync().messages}get opts(){return this.result.opts}get processor(){return this.result.processor}get root(){return this.sync().root}get[Symbol.toStringTag](){return\"LazyResult\"}};Pe.registerPostcss=s=>{Vr=s};var An=Pe;Pe.default=Pe;Gl.registerLazyResult(Pe);zl.registerLazyResult(Pe);let Yl=on,Zl=tr;let Jl=vs;const Xl=Ss;let jr=class{constructor(e,t,r){t=t.toString(),this.stringified=!1,this._processor=e,this._css=t,this._opts=r,this._map=void 0;let i,n=Zl;this.result=new Xl(this._processor,i,this._opts),this.result.css=t;let o=this;Object.defineProperty(this.result,\"root\",{get(){return o.root}});let l=new Yl(n,i,this._opts,t);if(l.isMap()){let[a,u]=l.generate();a&&(this.result.css=a),u&&(this.result.map=u)}else l.clearAnnotation(),this.result.css=l.css}async(){return this.error?Promise.reject(this.error):Promise.resolve(this.result)}catch(e){return this.async().catch(e)}finally(e){return this.async().then(e,e)}sync(){if(this.error)throw this.error;return this.result}then(e,t){return this.async().then(e,t)}toString(){return this._css}warnings(){return[]}get content(){return this.result.css}get css(){return this.result.css}get map(){return this.result.map}get messages(){return[]}get opts(){return this.result.opts}get processor(){return this.result.processor}get root(){if(this._root)return this._root;let e,t=Jl;try{e=t(this._css,this._opts)}catch(r){this.error=r}if(this.error)throw this.error;return this._root=e,e}get[Symbol.toStringTag](){return\"NoWorkResult\"}};var Kl=jr;jr.default=jr;let Ql=Kl,ql=An,eu=ws,tu=nt,Ke=class{constructor(e=[]){this.version=\"8.4.38\",this.plugins=this.normalize(e)}normalize(e){let t=[];for(let r of e)if(r.postcss===!0?r=r():r.postcss&&(r=r.postcss),typeof r==\"object\"&&Array.isArray(r.plugins))t=t.concat(r.plugins);else if(typeof r==\"object\"&&r.postcssPlugin)t.push(r);else if(typeof r==\"function\")t.push(r);else if(!(typeof r==\"object\"&&(r.parse||r.stringify)))throw new Error(r+\" is not a PostCSS plugin\");return t}process(e,t={}){return!this.plugins.length&&!t.parser&&!t.stringifier&&!t.syntax?new Ql(this,e,t):new ql(this,e,t)}use(e){return this.plugins=this.plugins.concat(this.normalize([e])),this}};var ru=Ke;Ke.default=Ke;tu.registerProcessor(Ke);eu.registerProcessor(Ke);let su=sr,iu=en,nu=nr,ou=bs,au=ir,lu=nt,uu=Cs;function Qe(s,e){if(Array.isArray(s))return s.map(o=>Qe(o));let i=s,{inputs:t}=i,r=xe(i,[\"inputs\"]);if(t){e=[];for(let o of t){let l=ee(x({},o),{__proto__:au.prototype});l.map&&(l.map=ee(x({},l.map),{__proto__:iu.prototype})),e.push(l)}}if(r.nodes&&(r.nodes=s.nodes.map(o=>Qe(o,e))),r.source){let n=r.source,{inputId:o}=n,l=xe(n,[\"inputId\"]);r.source=l,o!=null&&(r.source.input=e[o])}if(r.type===\"root\")return new lu(r);if(r.type===\"decl\")return new su(r);if(r.type===\"rule\")return new uu(r);if(r.type===\"comment\")return new nu(r);if(r.type===\"atrule\")return new ou(r);throw new Error(\"Unknown node type: \"+s.type)}var cu=Qe;Qe.default=Qe;let hu=ms,Mn=sr,fu=An,pu=ve,Is=ru,du=tr,mu=cu,En=ws,gu=wn,$n=nr,Nn=bs,yu=Ss,wu=ir,Su=vs,bu=In,kn=Cs,Pn=nt,Cu=rr;function E(...s){return s.length===1&&Array.isArray(s[0])&&(s=s[0]),new Is(s)}E.plugin=function(e,t){let r=!1;function i(...o){console&&console.warn&&!r&&(r=!0,console.warn(e+\\`: postcss.plugin was deprecated. Migration guide:\nhttps://evilmartians.com/chronicles/postcss-8-plugin-migration\\`),process.env.LANG&&process.env.LANG.startsWith(\"cn\")&&console.warn(e+\\`: \\\\u91CC\\\\u9762 postcss.plugin \\\\u88AB\\\\u5F03\\\\u7528. \\\\u8FC1\\\\u79FB\\\\u6307\\\\u5357:\nhttps://www.w3ctech.com/topic/2226\\`));let l=t(...o);return l.postcssPlugin=e,l.postcssVersion=new Is().version,l}let n;return Object.defineProperty(i,\"postcss\",{get(){return n||(n=i()),n}}),i.process=function(o,l,a){return E([i(a)]).process(o,l)},i};E.stringify=du;E.parse=Su;E.fromJSON=mu;E.list=bu;E.comment=s=>new $n(s);E.atRule=s=>new Nn(s);E.decl=s=>new Mn(s);E.rule=s=>new kn(s);E.root=s=>new Pn(s);E.document=s=>new En(s);E.CssSyntaxError=hu;E.Declaration=Mn;E.Container=pu;E.Processor=Is;E.Document=En;E.Comment=$n;E.Warning=gu;E.AtRule=Nn;E.Result=yu;E.Input=wu;E.Rule=kn;E.Root=Pn;E.Node=Cu;fu.registerPostcss(E);var vu=E;E.default=E;const F=Da(vu);F.stringify;F.fromJSON;F.plugin;F.parse;F.list;F.document;F.comment;F.atRule;F.rule;F.decl;F.root;F.CssSyntaxError;F.Declaration;F.Container;F.Processor;F.Document;F.Comment;F.Warning;F.AtRule;F.Result;F.Input;F.Rule;F.Root;F.Node;var Iu=Object.defineProperty,xu=(s,e,t)=>e in s?Iu(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t,te=(s,e,t)=>xu(s,typeof e!=\"symbol\"?e+\"\":e,t);function Ou(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,\"default\")?s.default:s}function Ru(s){if(s.__esModule)return s;var e=s.default;if(typeof e==\"function\"){var t=function r(){return this instanceof r?Reflect.construct(e,arguments,this.constructor):e.apply(this,arguments)};t.prototype=e.prototype}else t={};return Object.defineProperty(t,\"__esModule\",{value:!0}),Object.keys(s).forEach(function(r){var i=Object.getOwnPropertyDescriptor(s,r);Object.defineProperty(t,r,i.get?i:{enumerable:!0,get:function(){return s[r]}})}),t}var xs={exports:{}},T=String,Dn=function(){return{isColorSupported:!1,reset:T,bold:T,dim:T,italic:T,underline:T,inverse:T,hidden:T,strikethrough:T,black:T,red:T,green:T,yellow:T,blue:T,magenta:T,cyan:T,white:T,gray:T,bgBlack:T,bgRed:T,bgGreen:T,bgYellow:T,bgBlue:T,bgMagenta:T,bgCyan:T,bgWhite:T}};xs.exports=Dn();xs.exports.createColors=Dn;var Au=xs.exports;const Mu={},Eu=Object.freeze(Object.defineProperty({__proto__:null,default:Mu},Symbol.toStringTag,{value:\"Module\"})),ne=Ru(Eu);let fi=Au,pi=ne,Hr=class Ln extends Error{constructor(e,t,r,i,n,o){super(e),this.name=\"CssSyntaxError\",this.reason=e,n&&(this.file=n),i&&(this.source=i),o&&(this.plugin=o),typeof t!=\"undefined\"&&typeof r!=\"undefined\"&&(typeof t==\"number\"?(this.line=t,this.column=r):(this.line=t.line,this.column=t.column,this.endLine=r.line,this.endColumn=r.column)),this.setMessage(),Error.captureStackTrace&&Error.captureStackTrace(this,Ln)}setMessage(){this.message=this.plugin?this.plugin+\": \":\"\",this.message+=this.file?this.file:\"<css input>\",typeof this.line!=\"undefined\"&&(this.message+=\":\"+this.line+\":\"+this.column),this.message+=\": \"+this.reason}showSourceCode(e){if(!this.source)return\"\";let t=this.source;e==null&&(e=fi.isColorSupported),pi&&e&&(t=pi(t));let r=t.split(/\\\\r?\\\\n/),i=Math.max(this.line-3,0),n=Math.min(this.line+2,r.length),o=String(n).length,l,a;if(e){let{bold:u,gray:c,red:h}=fi.createColors(!0);l=d=>u(h(d)),a=d=>c(d)}else l=a=u=>u;return r.slice(i,n).map((u,c)=>{let h=i+1+c,d=\" \"+(\" \"+h).slice(-o)+\" | \";if(h===this.line){let m=a(d.replace(/\\\\d/g,\" \"))+u.slice(0,this.column-1).replace(/[^\\\\t]/g,\" \");return l(\">\")+a(d)+u+\\`\n \\`+m+l(\"^\")}return\" \"+a(d)+u}).join(\\`\n\\`)}toString(){let e=this.showSourceCode();return e&&(e=\\`\n\n\\`+e+\\`\n\\`),this.name+\": \"+this.message+e}};var Os=Hr;Hr.default=Hr;var ot={};ot.isClean=Symbol(\"isClean\");ot.my=Symbol(\"my\");const di={after:\\`\n\\`,beforeClose:\\`\n\\`,beforeComment:\\`\n\\`,beforeDecl:\\`\n\\`,beforeOpen:\" \",beforeRule:\\`\n\\`,colon:\": \",commentLeft:\" \",commentRight:\" \",emptyBody:\"\",indent:\" \",semicolon:!1};function $u(s){return s[0].toUpperCase()+s.slice(1)}let Yr=class{constructor(e){this.builder=e}atrule(e,t){let r=\"@\"+e.name,i=e.params?this.rawValue(e,\"params\"):\"\";if(typeof e.raws.afterName!=\"undefined\"?r+=e.raws.afterName:i&&(r+=\" \"),e.nodes)this.block(e,r+i);else{let n=(e.raws.between||\"\")+(t?\";\":\"\");this.builder(r+i+n,e)}}beforeAfter(e,t){let r;e.type===\"decl\"?r=this.raw(e,null,\"beforeDecl\"):e.type===\"comment\"?r=this.raw(e,null,\"beforeComment\"):t===\"before\"?r=this.raw(e,null,\"beforeRule\"):r=this.raw(e,null,\"beforeClose\");let i=e.parent,n=0;for(;i&&i.type!==\"root\";)n+=1,i=i.parent;if(r.includes(\\`\n\\`)){let o=this.raw(e,null,\"indent\");if(o.length)for(let l=0;l<n;l++)r+=o}return r}block(e,t){let r=this.raw(e,\"between\",\"beforeOpen\");this.builder(t+r+\"{\",e,\"start\");let i;e.nodes&&e.nodes.length?(this.body(e),i=this.raw(e,\"after\")):i=this.raw(e,\"after\",\"emptyBody\"),i&&this.builder(i),this.builder(\"}\",e,\"end\")}body(e){let t=e.nodes.length-1;for(;t>0&&e.nodes[t].type===\"comment\";)t-=1;let r=this.raw(e,\"semicolon\");for(let i=0;i<e.nodes.length;i++){let n=e.nodes[i],o=this.raw(n,\"before\");o&&this.builder(o),this.stringify(n,t!==i||r)}}comment(e){let t=this.raw(e,\"left\",\"commentLeft\"),r=this.raw(e,\"right\",\"commentRight\");this.builder(\"/*\"+t+e.text+r+\"*/\",e)}decl(e,t){let r=this.raw(e,\"between\",\"colon\"),i=e.prop+r+this.rawValue(e,\"value\");e.important&&(i+=e.raws.important||\" !important\"),t&&(i+=\";\"),this.builder(i,e)}document(e){this.body(e)}raw(e,t,r){let i;if(r||(r=t),t&&(i=e.raws[t],typeof i!=\"undefined\"))return i;let n=e.parent;if(r===\"before\"&&(!n||n.type===\"root\"&&n.first===e||n&&n.type===\"document\"))return\"\";if(!n)return di[r];let o=e.root();if(o.rawCache||(o.rawCache={}),typeof o.rawCache[r]!=\"undefined\")return o.rawCache[r];if(r===\"before\"||r===\"after\")return this.beforeAfter(e,r);{let l=\"raw\"+$u(r);this[l]?i=this[l](o,e):o.walk(a=>{if(i=a.raws[t],typeof i!=\"undefined\")return!1})}return typeof i==\"undefined\"&&(i=di[r]),o.rawCache[r]=i,i}rawBeforeClose(e){let t;return e.walk(r=>{if(r.nodes&&r.nodes.length>0&&typeof r.raws.after!=\"undefined\")return t=r.raws.after,t.includes(\\`\n\\`)&&(t=t.replace(/[^\\\\n]+$/,\"\")),!1}),t&&(t=t.replace(/\\\\S/g,\"\")),t}rawBeforeComment(e,t){let r;return e.walkComments(i=>{if(typeof i.raws.before!=\"undefined\")return r=i.raws.before,r.includes(\\`\n\\`)&&(r=r.replace(/[^\\\\n]+$/,\"\")),!1}),typeof r==\"undefined\"?r=this.raw(t,null,\"beforeDecl\"):r&&(r=r.replace(/\\\\S/g,\"\")),r}rawBeforeDecl(e,t){let r;return e.walkDecls(i=>{if(typeof i.raws.before!=\"undefined\")return r=i.raws.before,r.includes(\\`\n\\`)&&(r=r.replace(/[^\\\\n]+$/,\"\")),!1}),typeof r==\"undefined\"?r=this.raw(t,null,\"beforeRule\"):r&&(r=r.replace(/\\\\S/g,\"\")),r}rawBeforeOpen(e){let t;return e.walk(r=>{if(r.type!==\"decl\"&&(t=r.raws.between,typeof t!=\"undefined\"))return!1}),t}rawBeforeRule(e){let t;return e.walk(r=>{if(r.nodes&&(r.parent!==e||e.first!==r)&&typeof r.raws.before!=\"undefined\")return t=r.raws.before,t.includes(\\`\n\\`)&&(t=t.replace(/[^\\\\n]+$/,\"\")),!1}),t&&(t=t.replace(/\\\\S/g,\"\")),t}rawColon(e){let t;return e.walkDecls(r=>{if(typeof r.raws.between!=\"undefined\")return t=r.raws.between.replace(/[^\\\\s:]/g,\"\"),!1}),t}rawEmptyBody(e){let t;return e.walk(r=>{if(r.nodes&&r.nodes.length===0&&(t=r.raws.after,typeof t!=\"undefined\"))return!1}),t}rawIndent(e){if(e.raws.indent)return e.raws.indent;let t;return e.walk(r=>{let i=r.parent;if(i&&i!==e&&i.parent&&i.parent===e&&typeof r.raws.before!=\"undefined\"){let n=r.raws.before.split(\\`\n\\`);return t=n[n.length-1],t=t.replace(/\\\\S/g,\"\"),!1}}),t}rawSemicolon(e){let t;return e.walk(r=>{if(r.nodes&&r.nodes.length&&r.last.type===\"decl\"&&(t=r.raws.semicolon,typeof t!=\"undefined\"))return!1}),t}rawValue(e,t){let r=e[t],i=e.raws[t];return i&&i.value===r?i.raw:r}root(e){this.body(e),e.raws.after&&this.builder(e.raws.after)}rule(e){this.block(e,this.rawValue(e,\"selector\")),e.raws.ownSemicolon&&this.builder(e.raws.ownSemicolon,e,\"end\")}stringify(e,t){if(!this[e.type])throw new Error(\"Unknown AST node type \"+e.type+\". Maybe you need to change PostCSS stringifier.\");this[e.type](e,t)}};var Tn=Yr;Yr.default=Yr;let Nu=Tn;function Zr(s,e){new Nu(e).stringify(s)}var or=Zr;Zr.default=Zr;let{isClean:It,my:ku}=ot,Pu=Os,Du=Tn,Lu=or;function Jr(s,e){let t=new s.constructor;for(let r in s){if(!Object.prototype.hasOwnProperty.call(s,r)||r===\"proxyCache\")continue;let i=s[r],n=typeof i;r===\"parent\"&&n===\"object\"?e&&(t[r]=e):r===\"source\"?t[r]=i:Array.isArray(i)?t[r]=i.map(o=>Jr(o,t)):(n===\"object\"&&i!==null&&(i=Jr(i)),t[r]=i)}return t}let Xr=class{constructor(e={}){this.raws={},this[It]=!1,this[ku]=!0;for(let t in e)if(t===\"nodes\"){this.nodes=[];for(let r of e[t])typeof r.clone==\"function\"?this.append(r.clone()):this.append(r)}else this[t]=e[t]}addToError(e){if(e.postcssNode=this,e.stack&&this.source&&/\\\\n\\\\s{4}at /.test(e.stack)){let t=this.source;e.stack=e.stack.replace(/\\\\n\\\\s{4}at /,\\`$&\\${t.input.from}:\\${t.start.line}:\\${t.start.column}$&\\`)}return e}after(e){return this.parent.insertAfter(this,e),this}assign(e={}){for(let t in e)this[t]=e[t];return this}before(e){return this.parent.insertBefore(this,e),this}cleanRaws(e){delete this.raws.before,delete this.raws.after,e||delete this.raws.between}clone(e={}){let t=Jr(this);for(let r in e)t[r]=e[r];return t}cloneAfter(e={}){let t=this.clone(e);return this.parent.insertAfter(this,t),t}cloneBefore(e={}){let t=this.clone(e);return this.parent.insertBefore(this,t),t}error(e,t={}){if(this.source){let{end:r,start:i}=this.rangeBy(t);return this.source.input.error(e,{column:i.column,line:i.line},{column:r.column,line:r.line},t)}return new Pu(e)}getProxyProcessor(){return{get(e,t){return t===\"proxyOf\"?e:t===\"root\"?()=>e.root().toProxy():e[t]},set(e,t,r){return e[t]===r||(e[t]=r,(t===\"prop\"||t===\"value\"||t===\"name\"||t===\"params\"||t===\"important\"||t===\"text\")&&e.markDirty()),!0}}}markDirty(){if(this[It]){this[It]=!1;let e=this;for(;e=e.parent;)e[It]=!1}}next(){if(!this.parent)return;let e=this.parent.index(this);return this.parent.nodes[e+1]}positionBy(e,t){let r=this.source.start;if(e.index)r=this.positionInside(e.index,t);else if(e.word){t=this.toString();let i=t.indexOf(e.word);i!==-1&&(r=this.positionInside(i,t))}return r}positionInside(e,t){let r=t||this.toString(),i=this.source.start.column,n=this.source.start.line;for(let o=0;o<e;o++)r[o]===\\`\n\\`?(i=1,n+=1):i+=1;return{column:i,line:n}}prev(){if(!this.parent)return;let e=this.parent.index(this);return this.parent.nodes[e-1]}rangeBy(e){let t={column:this.source.start.column,line:this.source.start.line},r=this.source.end?{column:this.source.end.column+1,line:this.source.end.line}:{column:t.column+1,line:t.line};if(e.word){let i=this.toString(),n=i.indexOf(e.word);n!==-1&&(t=this.positionInside(n,i),r=this.positionInside(n+e.word.length,i))}else e.start?t={column:e.start.column,line:e.start.line}:e.index&&(t=this.positionInside(e.index)),e.end?r={column:e.end.column,line:e.end.line}:typeof e.endIndex==\"number\"?r=this.positionInside(e.endIndex):e.index&&(r=this.positionInside(e.index+1));return(r.line<t.line||r.line===t.line&&r.column<=t.column)&&(r={column:t.column+1,line:t.line}),{end:r,start:t}}raw(e,t){return new Du().raw(this,e,t)}remove(){return this.parent&&this.parent.removeChild(this),this.parent=void 0,this}replaceWith(...e){if(this.parent){let t=this,r=!1;for(let i of e)i===this?r=!0:r?(this.parent.insertAfter(t,i),t=i):this.parent.insertBefore(t,i);r||this.remove()}return this}root(){let e=this;for(;e.parent&&e.parent.type!==\"document\";)e=e.parent;return e}toJSON(e,t){let r={},i=t==null;t=t||new Map;let n=0;for(let o in this){if(!Object.prototype.hasOwnProperty.call(this,o)||o===\"parent\"||o===\"proxyCache\")continue;let l=this[o];if(Array.isArray(l))r[o]=l.map(a=>typeof a==\"object\"&&a.toJSON?a.toJSON(null,t):a);else if(typeof l==\"object\"&&l.toJSON)r[o]=l.toJSON(null,t);else if(o===\"source\"){let a=t.get(l.input);a==null&&(a=n,t.set(l.input,n),n++),r[o]={end:l.end,inputId:a,start:l.start}}else r[o]=l}return i&&(r.inputs=[...t.keys()].map(o=>o.toJSON())),r}toProxy(){return this.proxyCache||(this.proxyCache=new Proxy(this,this.getProxyProcessor())),this.proxyCache}toString(e=Lu){e.stringify&&(e=e.stringify);let t=\"\";return e(this,r=>{t+=r}),t}warn(e,t,r){let i={node:this};for(let n in r)i[n]=r[n];return e.warn(t,i)}get proxyOf(){return this}};var ar=Xr;Xr.default=Xr;let Tu=ar,Kr=class extends Tu{constructor(e){e&&typeof e.value!=\"undefined\"&&typeof e.value!=\"string\"&&(e=ee(x({},e),{value:String(e.value)})),super(e),this.type=\"decl\"}get variable(){return this.prop.startsWith(\"--\")||this.prop[0]===\"$\"}};var lr=Kr;Kr.default=Kr;let _u=\"useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict\",Fu=(s,e=21)=>(t=e)=>{let r=\"\",i=t;for(;i--;)r+=s[Math.random()*s.length|0];return r},Uu=(s=21)=>{let e=\"\",t=s;for(;t--;)e+=_u[Math.random()*64|0];return e};var Bu={nanoid:Uu,customAlphabet:Fu};let{SourceMapConsumer:mi,SourceMapGenerator:gi}=ne,{existsSync:zu,readFileSync:Wu}=ne,{dirname:vr,join:Gu}=ne;function Vu(s){return Buffer?Buffer.from(s,\"base64\").toString():window.atob(s)}let Qr=class{constructor(e,t){if(t.map===!1)return;this.loadAnnotation(e),this.inline=this.startWith(this.annotation,\"data:\");let r=t.map?t.map.prev:void 0,i=this.loadMap(t.from,r);!this.mapFile&&t.from&&(this.mapFile=t.from),this.mapFile&&(this.root=vr(this.mapFile)),i&&(this.text=i)}consumer(){return this.consumerCache||(this.consumerCache=new mi(this.text)),this.consumerCache}decodeInline(e){let t=/^data:application\\\\/json;charset=utf-?8;base64,/,r=/^data:application\\\\/json;base64,/,i=/^data:application\\\\/json;charset=utf-?8,/,n=/^data:application\\\\/json,/;if(i.test(e)||n.test(e))return decodeURIComponent(e.substr(RegExp.lastMatch.length));if(t.test(e)||r.test(e))return Vu(e.substr(RegExp.lastMatch.length));let o=e.match(/data:application\\\\/json;([^,]+),/)[1];throw new Error(\"Unsupported source map encoding \"+o)}getAnnotationURL(e){return e.replace(/^\\\\/\\\\*\\\\s*# sourceMappingURL=/,\"\").trim()}isMap(e){return typeof e!=\"object\"?!1:typeof e.mappings==\"string\"||typeof e._mappings==\"string\"||Array.isArray(e.sections)}loadAnnotation(e){let t=e.match(/\\\\/\\\\*\\\\s*# sourceMappingURL=/gm);if(!t)return;let r=e.lastIndexOf(t.pop()),i=e.indexOf(\"*/\",r);r>-1&&i>-1&&(this.annotation=this.getAnnotationURL(e.substring(r,i)))}loadFile(e){if(this.root=vr(e),zu(e))return this.mapFile=e,Wu(e,\"utf-8\").toString().trim()}loadMap(e,t){if(t===!1)return!1;if(t){if(typeof t==\"string\")return t;if(typeof t==\"function\"){let r=t(e);if(r){let i=this.loadFile(r);if(!i)throw new Error(\"Unable to load previous source map: \"+r.toString());return i}}else{if(t instanceof mi)return gi.fromSourceMap(t).toString();if(t instanceof gi)return t.toString();if(this.isMap(t))return JSON.stringify(t);throw new Error(\"Unsupported previous source map format: \"+t.toString())}}else{if(this.inline)return this.decodeInline(this.annotation);if(this.annotation){let r=this.annotation;return e&&(r=Gu(vr(e),r)),this.loadFile(r)}}}startWith(e,t){return e?e.substr(0,t.length)===t:!1}withContent(){return!!(this.consumer().sourcesContent&&this.consumer().sourcesContent.length>0)}};var _n=Qr;Qr.default=Qr;let{SourceMapConsumer:ju,SourceMapGenerator:Hu}=ne,{fileURLToPath:yi,pathToFileURL:xt}=ne,{isAbsolute:qr,resolve:es}=ne,{nanoid:Yu}=Bu,Ir=ne,wi=Os,Zu=_n,xr=Symbol(\"fromOffsetCache\"),Ju=!!(ju&&Hu),Si=!!(es&&qr),Zt=class{constructor(e,t={}){if(e===null||typeof e==\"undefined\"||typeof e==\"object\"&&!e.toString)throw new Error(\\`PostCSS received \\${e} instead of CSS string\\`);if(this.css=e.toString(),this.css[0]===\"\\\\uFEFF\"||this.css[0]===\"\\\\uFFFE\"?(this.hasBOM=!0,this.css=this.css.slice(1)):this.hasBOM=!1,t.from&&(!Si||/^\\\\w+:\\\\/\\\\//.test(t.from)||qr(t.from)?this.file=t.from:this.file=es(t.from)),Si&&Ju){let r=new Zu(this.css,t);if(r.text){this.map=r;let i=r.consumer().file;!this.file&&i&&(this.file=this.mapResolve(i))}}this.file||(this.id=\"<input css \"+Yu(6)+\">\"),this.map&&(this.map.file=this.from)}error(e,t,r,i={}){let n,o,l;if(t&&typeof t==\"object\"){let u=t,c=r;if(typeof u.offset==\"number\"){let h=this.fromOffset(u.offset);t=h.line,r=h.col}else t=u.line,r=u.column;if(typeof c.offset==\"number\"){let h=this.fromOffset(c.offset);o=h.line,l=h.col}else o=c.line,l=c.column}else if(!r){let u=this.fromOffset(t);t=u.line,r=u.col}let a=this.origin(t,r,o,l);return a?n=new wi(e,a.endLine===void 0?a.line:{column:a.column,line:a.line},a.endLine===void 0?a.column:{column:a.endColumn,line:a.endLine},a.source,a.file,i.plugin):n=new wi(e,o===void 0?t:{column:r,line:t},o===void 0?r:{column:l,line:o},this.css,this.file,i.plugin),n.input={column:r,endColumn:l,endLine:o,line:t,source:this.css},this.file&&(xt&&(n.input.url=xt(this.file).toString()),n.input.file=this.file),n}fromOffset(e){let t,r;if(this[xr])r=this[xr];else{let n=this.css.split(\\`\n\\`);r=new Array(n.length);let o=0;for(let l=0,a=n.length;l<a;l++)r[l]=o,o+=n[l].length+1;this[xr]=r}t=r[r.length-1];let i=0;if(e>=t)i=r.length-1;else{let n=r.length-2,o;for(;i<n;)if(o=i+(n-i>>1),e<r[o])n=o-1;else if(e>=r[o+1])i=o+1;else{i=o;break}}return{col:e-r[i]+1,line:i+1}}mapResolve(e){return/^\\\\w+:\\\\/\\\\//.test(e)?e:es(this.map.consumer().sourceRoot||this.map.root||\".\",e)}origin(e,t,r,i){if(!this.map)return!1;let n=this.map.consumer(),o=n.originalPositionFor({column:t,line:e});if(!o.source)return!1;let l;typeof r==\"number\"&&(l=n.originalPositionFor({column:i,line:r}));let a;qr(o.source)?a=xt(o.source):a=new URL(o.source,this.map.consumer().sourceRoot||xt(this.map.mapFile));let u={column:o.column,endColumn:l&&l.column,endLine:l&&l.line,line:o.line,url:a.toString()};if(a.protocol===\"file:\")if(yi)u.file=yi(a);else throw new Error(\"file: protocol is not available in this PostCSS build\");let c=n.sourceContentFor(o.source);return c&&(u.source=c),u}toJSON(){let e={};for(let t of[\"hasBOM\",\"css\",\"file\",\"id\"])this[t]!=null&&(e[t]=this[t]);return this.map&&(e.map=x({},this.map),e.map.consumerCache&&(e.map.consumerCache=void 0)),e}get from(){return this.file||this.id}};var ur=Zt;Zt.default=Zt;Ir&&Ir.registerInput&&Ir.registerInput(Zt);let{SourceMapConsumer:Fn,SourceMapGenerator:Ft}=ne,{dirname:Ut,relative:Un,resolve:Bn,sep:zn}=ne,{pathToFileURL:bi}=ne,Xu=ur,Ku=!!(Fn&&Ft),Qu=!!(Ut&&Bn&&Un&&zn),qu=class{constructor(e,t,r,i){this.stringify=e,this.mapOpts=r.map||{},this.root=t,this.opts=r,this.css=i,this.originalCSS=i,this.usesFileUrls=!this.mapOpts.from&&this.mapOpts.absolute,this.memoizedFileURLs=new Map,this.memoizedPaths=new Map,this.memoizedURLs=new Map}addAnnotation(){let e;this.isInline()?e=\"data:application/json;base64,\"+this.toBase64(this.map.toString()):typeof this.mapOpts.annotation==\"string\"?e=this.mapOpts.annotation:typeof this.mapOpts.annotation==\"function\"?e=this.mapOpts.annotation(this.opts.to,this.root):e=this.outputFile()+\".map\";let t=\\`\n\\`;this.css.includes(\\`\\\\r\n\\`)&&(t=\\`\\\\r\n\\`),this.css+=t+\"/*# sourceMappingURL=\"+e+\" */\"}applyPrevMaps(){for(let e of this.previous()){let t=this.toUrl(this.path(e.file)),r=e.root||Ut(e.file),i;this.mapOpts.sourcesContent===!1?(i=new Fn(e.text),i.sourcesContent&&(i.sourcesContent=null)):i=e.consumer(),this.map.applySourceMap(i,t,this.toUrl(this.path(r)))}}clearAnnotation(){if(this.mapOpts.annotation!==!1)if(this.root){let e;for(let t=this.root.nodes.length-1;t>=0;t--)e=this.root.nodes[t],e.type===\"comment\"&&e.text.indexOf(\"# sourceMappingURL=\")===0&&this.root.removeChild(t)}else this.css&&(this.css=this.css.replace(/\\\\n*?\\\\/\\\\*#[\\\\S\\\\s]*?\\\\*\\\\/$/gm,\"\"))}generate(){if(this.clearAnnotation(),Qu&&Ku&&this.isMap())return this.generateMap();{let e=\"\";return this.stringify(this.root,t=>{e+=t}),[e]}}generateMap(){if(this.root)this.generateString();else if(this.previous().length===1){let e=this.previous()[0].consumer();e.file=this.outputFile(),this.map=Ft.fromSourceMap(e,{ignoreInvalidMapping:!0})}else this.map=new Ft({file:this.outputFile(),ignoreInvalidMapping:!0}),this.map.addMapping({generated:{column:0,line:1},original:{column:0,line:1},source:this.opts.from?this.toUrl(this.path(this.opts.from)):\"<no source>\"});return this.isSourcesContent()&&this.setSourcesContent(),this.root&&this.previous().length>0&&this.applyPrevMaps(),this.isAnnotation()&&this.addAnnotation(),this.isInline()?[this.css]:[this.css,this.map]}generateString(){this.css=\"\",this.map=new Ft({file:this.outputFile(),ignoreInvalidMapping:!0});let e=1,t=1,r=\"<no source>\",i={generated:{column:0,line:0},original:{column:0,line:0},source:\"\"},n,o;this.stringify(this.root,(l,a,u)=>{if(this.css+=l,a&&u!==\"end\"&&(i.generated.line=e,i.generated.column=t-1,a.source&&a.source.start?(i.source=this.sourcePath(a),i.original.line=a.source.start.line,i.original.column=a.source.start.column-1,this.map.addMapping(i)):(i.source=r,i.original.line=1,i.original.column=0,this.map.addMapping(i))),n=l.match(/\\\\n/g),n?(e+=n.length,o=l.lastIndexOf(\\`\n\\`),t=l.length-o):t+=l.length,a&&u!==\"start\"){let c=a.parent||{raws:{}};(!(a.type===\"decl\"||a.type===\"atrule\"&&!a.nodes)||a!==c.last||c.raws.semicolon)&&(a.source&&a.source.end?(i.source=this.sourcePath(a),i.original.line=a.source.end.line,i.original.column=a.source.end.column-1,i.generated.line=e,i.generated.column=t-2,this.map.addMapping(i)):(i.source=r,i.original.line=1,i.original.column=0,i.generated.line=e,i.generated.column=t-1,this.map.addMapping(i)))}})}isAnnotation(){return this.isInline()?!0:typeof this.mapOpts.annotation!=\"undefined\"?this.mapOpts.annotation:this.previous().length?this.previous().some(e=>e.annotation):!0}isInline(){if(typeof this.mapOpts.inline!=\"undefined\")return this.mapOpts.inline;let e=this.mapOpts.annotation;return typeof e!=\"undefined\"&&e!==!0?!1:this.previous().length?this.previous().some(t=>t.inline):!0}isMap(){return typeof this.opts.map!=\"undefined\"?!!this.opts.map:this.previous().length>0}isSourcesContent(){return typeof this.mapOpts.sourcesContent!=\"undefined\"?this.mapOpts.sourcesContent:this.previous().length?this.previous().some(e=>e.withContent()):!0}outputFile(){return this.opts.to?this.path(this.opts.to):this.opts.from?this.path(this.opts.from):\"to.css\"}path(e){if(this.mapOpts.absolute||e.charCodeAt(0)===60||/^\\\\w+:\\\\/\\\\//.test(e))return e;let t=this.memoizedPaths.get(e);if(t)return t;let r=this.opts.to?Ut(this.opts.to):\".\";typeof this.mapOpts.annotation==\"string\"&&(r=Ut(Bn(r,this.mapOpts.annotation)));let i=Un(r,e);return this.memoizedPaths.set(e,i),i}previous(){if(!this.previousMaps)if(this.previousMaps=[],this.root)this.root.walk(e=>{if(e.source&&e.source.input.map){let t=e.source.input.map;this.previousMaps.includes(t)||this.previousMaps.push(t)}});else{let e=new Xu(this.originalCSS,this.opts);e.map&&this.previousMaps.push(e.map)}return this.previousMaps}setSourcesContent(){let e={};if(this.root)this.root.walk(t=>{if(t.source){let r=t.source.input.from;if(r&&!e[r]){e[r]=!0;let i=this.usesFileUrls?this.toFileUrl(r):this.toUrl(this.path(r));this.map.setSourceContent(i,t.source.input.css)}}});else if(this.css){let t=this.opts.from?this.toUrl(this.path(this.opts.from)):\"<no source>\";this.map.setSourceContent(t,this.css)}}sourcePath(e){return this.mapOpts.from?this.toUrl(this.mapOpts.from):this.usesFileUrls?this.toFileUrl(e.source.input.from):this.toUrl(this.path(e.source.input.from))}toBase64(e){return Buffer?Buffer.from(e).toString(\"base64\"):window.btoa(unescape(encodeURIComponent(e)))}toFileUrl(e){let t=this.memoizedFileURLs.get(e);if(t)return t;if(bi){let r=bi(e).toString();return this.memoizedFileURLs.set(e,r),r}else throw new Error(\"\\`map.absolute\\` option is not available in this PostCSS build\")}toUrl(e){let t=this.memoizedURLs.get(e);if(t)return t;zn===\"\\\\\\\\\"&&(e=e.replace(/\\\\\\\\/g,\"/\"));let r=encodeURI(e).replace(/[#?]/g,encodeURIComponent);return this.memoizedURLs.set(e,r),r}};var Wn=qu;let ec=ar,ts=class extends ec{constructor(e){super(e),this.type=\"comment\"}};var cr=ts;ts.default=ts;let{isClean:Gn,my:Vn}=ot,jn=lr,Hn=cr,tc=ar,Yn,Rs,As,Zn;function Jn(s){return s.map(e=>(e.nodes&&(e.nodes=Jn(e.nodes)),delete e.source,e))}function Xn(s){if(s[Gn]=!1,s.proxyOf.nodes)for(let e of s.proxyOf.nodes)Xn(e)}let pe=class Kn extends tc{append(...e){for(let t of e){let r=this.normalize(t,this.last);for(let i of r)this.proxyOf.nodes.push(i)}return this.markDirty(),this}cleanRaws(e){if(super.cleanRaws(e),this.nodes)for(let t of this.nodes)t.cleanRaws(e)}each(e){if(!this.proxyOf.nodes)return;let t=this.getIterator(),r,i;for(;this.indexes[t]<this.proxyOf.nodes.length&&(r=this.indexes[t],i=e(this.proxyOf.nodes[r],r),i!==!1);)this.indexes[t]+=1;return delete this.indexes[t],i}every(e){return this.nodes.every(e)}getIterator(){this.lastEach||(this.lastEach=0),this.indexes||(this.indexes={}),this.lastEach+=1;let e=this.lastEach;return this.indexes[e]=0,e}getProxyProcessor(){return{get(e,t){return t===\"proxyOf\"?e:e[t]?t===\"each\"||typeof t==\"string\"&&t.startsWith(\"walk\")?(...r)=>e[t](...r.map(i=>typeof i==\"function\"?(n,o)=>i(n.toProxy(),o):i)):t===\"every\"||t===\"some\"?r=>e[t]((i,...n)=>r(i.toProxy(),...n)):t===\"root\"?()=>e.root().toProxy():t===\"nodes\"?e.nodes.map(r=>r.toProxy()):t===\"first\"||t===\"last\"?e[t].toProxy():e[t]:e[t]},set(e,t,r){return e[t]===r||(e[t]=r,(t===\"name\"||t===\"params\"||t===\"selector\")&&e.markDirty()),!0}}}index(e){return typeof e==\"number\"?e:(e.proxyOf&&(e=e.proxyOf),this.proxyOf.nodes.indexOf(e))}insertAfter(e,t){let r=this.index(e),i=this.normalize(t,this.proxyOf.nodes[r]).reverse();r=this.index(e);for(let o of i)this.proxyOf.nodes.splice(r+1,0,o);let n;for(let o in this.indexes)n=this.indexes[o],r<n&&(this.indexes[o]=n+i.length);return this.markDirty(),this}insertBefore(e,t){let r=this.index(e),i=r===0?\"prepend\":!1,n=this.normalize(t,this.proxyOf.nodes[r],i).reverse();r=this.index(e);for(let l of n)this.proxyOf.nodes.splice(r,0,l);let o;for(let l in this.indexes)o=this.indexes[l],r<=o&&(this.indexes[l]=o+n.length);return this.markDirty(),this}normalize(e,t){if(typeof e==\"string\")e=Jn(Yn(e).nodes);else if(typeof e==\"undefined\")e=[];else if(Array.isArray(e)){e=e.slice(0);for(let i of e)i.parent&&i.parent.removeChild(i,\"ignore\")}else if(e.type===\"root\"&&this.type!==\"document\"){e=e.nodes.slice(0);for(let i of e)i.parent&&i.parent.removeChild(i,\"ignore\")}else if(e.type)e=[e];else if(e.prop){if(typeof e.value==\"undefined\")throw new Error(\"Value field is missed in node creation\");typeof e.value!=\"string\"&&(e.value=String(e.value)),e=[new jn(e)]}else if(e.selector)e=[new Rs(e)];else if(e.name)e=[new As(e)];else if(e.text)e=[new Hn(e)];else throw new Error(\"Unknown node type in node creation\");return e.map(i=>(i[Vn]||Kn.rebuild(i),i=i.proxyOf,i.parent&&i.parent.removeChild(i),i[Gn]&&Xn(i),typeof i.raws.before==\"undefined\"&&t&&typeof t.raws.before!=\"undefined\"&&(i.raws.before=t.raws.before.replace(/\\\\S/g,\"\")),i.parent=this.proxyOf,i))}prepend(...e){e=e.reverse();for(let t of e){let r=this.normalize(t,this.first,\"prepend\").reverse();for(let i of r)this.proxyOf.nodes.unshift(i);for(let i in this.indexes)this.indexes[i]=this.indexes[i]+r.length}return this.markDirty(),this}push(e){return e.parent=this,this.proxyOf.nodes.push(e),this}removeAll(){for(let e of this.proxyOf.nodes)e.parent=void 0;return this.proxyOf.nodes=[],this.markDirty(),this}removeChild(e){e=this.index(e),this.proxyOf.nodes[e].parent=void 0,this.proxyOf.nodes.splice(e,1);let t;for(let r in this.indexes)t=this.indexes[r],t>=e&&(this.indexes[r]=t-1);return this.markDirty(),this}replaceValues(e,t,r){return r||(r=t,t={}),this.walkDecls(i=>{t.props&&!t.props.includes(i.prop)||t.fast&&!i.value.includes(t.fast)||(i.value=i.value.replace(e,r))}),this.markDirty(),this}some(e){return this.nodes.some(e)}walk(e){return this.each((t,r)=>{let i;try{i=e(t,r)}catch(n){throw t.addToError(n)}return i!==!1&&t.walk&&(i=t.walk(e)),i})}walkAtRules(e,t){return t?e instanceof RegExp?this.walk((r,i)=>{if(r.type===\"atrule\"&&e.test(r.name))return t(r,i)}):this.walk((r,i)=>{if(r.type===\"atrule\"&&r.name===e)return t(r,i)}):(t=e,this.walk((r,i)=>{if(r.type===\"atrule\")return t(r,i)}))}walkComments(e){return this.walk((t,r)=>{if(t.type===\"comment\")return e(t,r)})}walkDecls(e,t){return t?e instanceof RegExp?this.walk((r,i)=>{if(r.type===\"decl\"&&e.test(r.prop))return t(r,i)}):this.walk((r,i)=>{if(r.type===\"decl\"&&r.prop===e)return t(r,i)}):(t=e,this.walk((r,i)=>{if(r.type===\"decl\")return t(r,i)}))}walkRules(e,t){return t?e instanceof RegExp?this.walk((r,i)=>{if(r.type===\"rule\"&&e.test(r.selector))return t(r,i)}):this.walk((r,i)=>{if(r.type===\"rule\"&&r.selector===e)return t(r,i)}):(t=e,this.walk((r,i)=>{if(r.type===\"rule\")return t(r,i)}))}get first(){if(this.proxyOf.nodes)return this.proxyOf.nodes[0]}get last(){if(this.proxyOf.nodes)return this.proxyOf.nodes[this.proxyOf.nodes.length-1]}};pe.registerParse=s=>{Yn=s};pe.registerRule=s=>{Rs=s};pe.registerAtRule=s=>{As=s};pe.registerRoot=s=>{Zn=s};var Ie=pe;pe.default=pe;pe.rebuild=s=>{s.type===\"atrule\"?Object.setPrototypeOf(s,As.prototype):s.type===\"rule\"?Object.setPrototypeOf(s,Rs.prototype):s.type===\"decl\"?Object.setPrototypeOf(s,jn.prototype):s.type===\"comment\"?Object.setPrototypeOf(s,Hn.prototype):s.type===\"root\"&&Object.setPrototypeOf(s,Zn.prototype),s[Vn]=!0,s.nodes&&s.nodes.forEach(e=>{pe.rebuild(e)})};let rc=Ie,Qn,qn,qe=class extends rc{constructor(e){super(x({type:\"document\"},e)),this.nodes||(this.nodes=[])}toResult(e={}){return new Qn(new qn,this,e).stringify()}};qe.registerLazyResult=s=>{Qn=s};qe.registerProcessor=s=>{qn=s};var Ms=qe;qe.default=qe;let rs=class{constructor(e,t={}){if(this.type=\"warning\",this.text=e,t.node&&t.node.source){let r=t.node.rangeBy(t);this.line=r.start.line,this.column=r.start.column,this.endLine=r.end.line,this.endColumn=r.end.column}for(let r in t)this[r]=t[r]}toString(){return this.node?this.node.error(this.text,{index:this.index,plugin:this.plugin,word:this.word}).message:this.plugin?this.plugin+\": \"+this.text:this.text}};var eo=rs;rs.default=rs;let sc=eo,ss=class{constructor(e,t,r){this.processor=e,this.messages=[],this.root=t,this.opts=r,this.css=void 0,this.map=void 0}toString(){return this.css}warn(e,t={}){t.plugin||this.lastPlugin&&this.lastPlugin.postcssPlugin&&(t.plugin=this.lastPlugin.postcssPlugin);let r=new sc(e,t);return this.messages.push(r),r}warnings(){return this.messages.filter(e=>e.type===\"warning\")}get content(){return this.css}};var Es=ss;ss.default=ss;const Or=39,Ci=34,Ot=92,vi=47,Rt=10,Ge=32,At=12,Mt=9,Et=13,ic=91,nc=93,oc=40,ac=41,lc=123,uc=125,cc=59,hc=42,fc=58,pc=64,$t=/[\\\\t\\\\n\\\\f\\\\r \"#'()/;[\\\\\\\\\\\\]{}]/g,Nt=/[\\\\t\\\\n\\\\f\\\\r !\"#'():;@[\\\\\\\\\\\\]{}]|\\\\/(?=\\\\*)/g,dc=/.[\\\\r\\\\n\"'(/\\\\\\\\]/,Ii=/[\\\\da-f]/i;var mc=function(e,t={}){let r=e.css.valueOf(),i=t.ignoreErrors,n,o,l,a,u,c,h,d,m,g,p=r.length,f=0,S=[],b=[];function y(){return f}function C(_){throw e.error(\"Unclosed \"+_,f)}function N(){return b.length===0&&f>=p}function D(_){if(b.length)return b.pop();if(f>=p)return;let G=_?_.ignoreUnclosed:!1;switch(n=r.charCodeAt(f),n){case Rt:case Ge:case Mt:case Et:case At:{o=f;do o+=1,n=r.charCodeAt(o);while(n===Ge||n===Rt||n===Mt||n===Et||n===At);g=[\"space\",r.slice(f,o)],f=o-1;break}case ic:case nc:case lc:case uc:case fc:case cc:case ac:{let Y=String.fromCharCode(n);g=[Y,Y,f];break}case oc:{if(d=S.length?S.pop()[1]:\"\",m=r.charCodeAt(f+1),d===\"url\"&&m!==Or&&m!==Ci&&m!==Ge&&m!==Rt&&m!==Mt&&m!==At&&m!==Et){o=f;do{if(c=!1,o=r.indexOf(\")\",o+1),o===-1)if(i||G){o=f;break}else C(\"bracket\");for(h=o;r.charCodeAt(h-1)===Ot;)h-=1,c=!c}while(c);g=[\"brackets\",r.slice(f,o+1),f,o],f=o}else o=r.indexOf(\")\",f+1),a=r.slice(f,o+1),o===-1||dc.test(a)?g=[\"(\",\"(\",f]:(g=[\"brackets\",a,f,o],f=o);break}case Or:case Ci:{l=n===Or?\"'\":'\"',o=f;do{if(c=!1,o=r.indexOf(l,o+1),o===-1)if(i||G){o=f+1;break}else C(\"string\");for(h=o;r.charCodeAt(h-1)===Ot;)h-=1,c=!c}while(c);g=[\"string\",r.slice(f,o+1),f,o],f=o;break}case pc:{$t.lastIndex=f+1,$t.test(r),$t.lastIndex===0?o=r.length-1:o=$t.lastIndex-2,g=[\"at-word\",r.slice(f,o+1),f,o],f=o;break}case Ot:{for(o=f,u=!0;r.charCodeAt(o+1)===Ot;)o+=1,u=!u;if(n=r.charCodeAt(o+1),u&&n!==vi&&n!==Ge&&n!==Rt&&n!==Mt&&n!==Et&&n!==At&&(o+=1,Ii.test(r.charAt(o)))){for(;Ii.test(r.charAt(o+1));)o+=1;r.charCodeAt(o+1)===Ge&&(o+=1)}g=[\"word\",r.slice(f,o+1),f,o],f=o;break}default:{n===vi&&r.charCodeAt(f+1)===hc?(o=r.indexOf(\"*/\",f+2)+1,o===0&&(i||G?o=r.length:C(\"comment\")),g=[\"comment\",r.slice(f,o+1),f,o],f=o):(Nt.lastIndex=f+1,Nt.test(r),Nt.lastIndex===0?o=r.length-1:o=Nt.lastIndex-2,g=[\"word\",r.slice(f,o+1),f,o],S.push(g),f=o);break}}return f++,g}function H(_){b.push(_)}return{back:H,endOfFile:N,nextToken:D,position:y}};let to=Ie,Jt=class extends to{constructor(e){super(e),this.type=\"atrule\"}append(...e){return this.proxyOf.nodes||(this.nodes=[]),super.append(...e)}prepend(...e){return this.proxyOf.nodes||(this.nodes=[]),super.prepend(...e)}};var $s=Jt;Jt.default=Jt;to.registerAtRule(Jt);let ro=Ie,so,io,De=class extends ro{constructor(e){super(e),this.type=\"root\",this.nodes||(this.nodes=[])}normalize(e,t,r){let i=super.normalize(e);if(t){if(r===\"prepend\")this.nodes.length>1?t.raws.before=this.nodes[1].raws.before:delete t.raws.before;else if(this.first!==t)for(let n of i)n.raws.before=t.raws.before}return i}removeChild(e,t){let r=this.index(e);return!t&&r===0&&this.nodes.length>1&&(this.nodes[1].raws.before=this.nodes[r].raws.before),super.removeChild(e)}toResult(e={}){return new so(new io,this,e).stringify()}};De.registerLazyResult=s=>{so=s};De.registerProcessor=s=>{io=s};var at=De;De.default=De;ro.registerRoot(De);let et={comma(s){return et.split(s,[\",\"],!0)},space(s){let e=[\" \",\\`\n\\`,\"\t\"];return et.split(s,e)},split(s,e,t){let r=[],i=\"\",n=!1,o=0,l=!1,a=\"\",u=!1;for(let c of s)u?u=!1:c===\"\\\\\\\\\"?u=!0:l?c===a&&(l=!1):c==='\"'||c===\"'\"?(l=!0,a=c):c===\"(\"?o+=1:c===\")\"?o>0&&(o-=1):o===0&&e.includes(c)&&(n=!0),n?(i!==\"\"&&r.push(i.trim()),i=\"\",n=!1):i+=c;return(t||i!==\"\")&&r.push(i.trim()),r}};var no=et;et.default=et;let oo=Ie,gc=no,Xt=class extends oo{constructor(e){super(e),this.type=\"rule\",this.nodes||(this.nodes=[])}get selectors(){return gc.comma(this.selector)}set selectors(e){let t=this.selector?this.selector.match(/,\\\\s*/):null,r=t?t[0]:\",\"+this.raw(\"between\",\"beforeOpen\");this.selector=e.join(r)}};var Ns=Xt;Xt.default=Xt;oo.registerRule(Xt);let yc=lr,wc=mc,Sc=cr,bc=$s,Cc=at,xi=Ns;const Oi={empty:!0,space:!0};function vc(s){for(let e=s.length-1;e>=0;e--){let t=s[e],r=t[3]||t[2];if(r)return r}}let Ic=class{constructor(e){this.input=e,this.root=new Cc,this.current=this.root,this.spaces=\"\",this.semicolon=!1,this.createTokenizer(),this.root.source={input:e,start:{column:1,line:1,offset:0}}}atrule(e){let t=new bc;t.name=e[1].slice(1),t.name===\"\"&&this.unnamedAtrule(t,e),this.init(t,e[2]);let r,i,n,o=!1,l=!1,a=[],u=[];for(;!this.tokenizer.endOfFile();){if(e=this.tokenizer.nextToken(),r=e[0],r===\"(\"||r===\"[\"?u.push(r===\"(\"?\")\":\"]\"):r===\"{\"&&u.length>0?u.push(\"}\"):r===u[u.length-1]&&u.pop(),u.length===0)if(r===\";\"){t.source.end=this.getPosition(e[2]),t.source.end.offset++,this.semicolon=!0;break}else if(r===\"{\"){l=!0;break}else if(r===\"}\"){if(a.length>0){for(n=a.length-1,i=a[n];i&&i[0]===\"space\";)i=a[--n];i&&(t.source.end=this.getPosition(i[3]||i[2]),t.source.end.offset++)}this.end(e);break}else a.push(e);else a.push(e);if(this.tokenizer.endOfFile()){o=!0;break}}t.raws.between=this.spacesAndCommentsFromEnd(a),a.length?(t.raws.afterName=this.spacesAndCommentsFromStart(a),this.raw(t,\"params\",a),o&&(e=a[a.length-1],t.source.end=this.getPosition(e[3]||e[2]),t.source.end.offset++,this.spaces=t.raws.between,t.raws.between=\"\")):(t.raws.afterName=\"\",t.params=\"\"),l&&(t.nodes=[],this.current=t)}checkMissedSemicolon(e){let t=this.colon(e);if(t===!1)return;let r=0,i;for(let n=t-1;n>=0&&(i=e[n],!(i[0]!==\"space\"&&(r+=1,r===2)));n--);throw this.input.error(\"Missed semicolon\",i[0]===\"word\"?i[3]+1:i[2])}colon(e){let t=0,r,i,n;for(let[o,l]of e.entries()){if(r=l,i=r[0],i===\"(\"&&(t+=1),i===\")\"&&(t-=1),t===0&&i===\":\")if(!n)this.doubleColon(r);else{if(n[0]===\"word\"&&n[1]===\"progid\")continue;return o}n=r}return!1}comment(e){let t=new Sc;this.init(t,e[2]),t.source.end=this.getPosition(e[3]||e[2]),t.source.end.offset++;let r=e[1].slice(2,-2);if(/^\\\\s*$/.test(r))t.text=\"\",t.raws.left=r,t.raws.right=\"\";else{let i=r.match(/^(\\\\s*)([^]*\\\\S)(\\\\s*)$/);t.text=i[2],t.raws.left=i[1],t.raws.right=i[3]}}createTokenizer(){this.tokenizer=wc(this.input)}decl(e,t){let r=new yc;this.init(r,e[0][2]);let i=e[e.length-1];for(i[0]===\";\"&&(this.semicolon=!0,e.pop()),r.source.end=this.getPosition(i[3]||i[2]||vc(e)),r.source.end.offset++;e[0][0]!==\"word\";)e.length===1&&this.unknownWord(e),r.raws.before+=e.shift()[1];for(r.source.start=this.getPosition(e[0][2]),r.prop=\"\";e.length;){let u=e[0][0];if(u===\":\"||u===\"space\"||u===\"comment\")break;r.prop+=e.shift()[1]}r.raws.between=\"\";let n;for(;e.length;)if(n=e.shift(),n[0]===\":\"){r.raws.between+=n[1];break}else n[0]===\"word\"&&/\\\\w/.test(n[1])&&this.unknownWord([n]),r.raws.between+=n[1];(r.prop[0]===\"_\"||r.prop[0]===\"*\")&&(r.raws.before+=r.prop[0],r.prop=r.prop.slice(1));let o=[],l;for(;e.length&&(l=e[0][0],!(l!==\"space\"&&l!==\"comment\"));)o.push(e.shift());this.precheckMissedSemicolon(e);for(let u=e.length-1;u>=0;u--){if(n=e[u],n[1].toLowerCase()===\"!important\"){r.important=!0;let c=this.stringFrom(e,u);c=this.spacesFromEnd(e)+c,c!==\" !important\"&&(r.raws.important=c);break}else if(n[1].toLowerCase()===\"important\"){let c=e.slice(0),h=\"\";for(let d=u;d>0;d--){let m=c[d][0];if(h.trim().indexOf(\"!\")===0&&m!==\"space\")break;h=c.pop()[1]+h}h.trim().indexOf(\"!\")===0&&(r.important=!0,r.raws.important=h,e=c)}if(n[0]!==\"space\"&&n[0]!==\"comment\")break}e.some(u=>u[0]!==\"space\"&&u[0]!==\"comment\")&&(r.raws.between+=o.map(u=>u[1]).join(\"\"),o=[]),this.raw(r,\"value\",o.concat(e),t),r.value.includes(\":\")&&!t&&this.checkMissedSemicolon(e)}doubleColon(e){throw this.input.error(\"Double colon\",{offset:e[2]},{offset:e[2]+e[1].length})}emptyRule(e){let t=new xi;this.init(t,e[2]),t.selector=\"\",t.raws.between=\"\",this.current=t}end(e){this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.semicolon=!1,this.current.raws.after=(this.current.raws.after||\"\")+this.spaces,this.spaces=\"\",this.current.parent?(this.current.source.end=this.getPosition(e[2]),this.current.source.end.offset++,this.current=this.current.parent):this.unexpectedClose(e)}endFile(){this.current.parent&&this.unclosedBlock(),this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.current.raws.after=(this.current.raws.after||\"\")+this.spaces,this.root.source.end=this.getPosition(this.tokenizer.position())}freeSemicolon(e){if(this.spaces+=e[1],this.current.nodes){let t=this.current.nodes[this.current.nodes.length-1];t&&t.type===\"rule\"&&!t.raws.ownSemicolon&&(t.raws.ownSemicolon=this.spaces,this.spaces=\"\")}}getPosition(e){let t=this.input.fromOffset(e);return{column:t.col,line:t.line,offset:e}}init(e,t){this.current.push(e),e.source={input:this.input,start:this.getPosition(t)},e.raws.before=this.spaces,this.spaces=\"\",e.type!==\"comment\"&&(this.semicolon=!1)}other(e){let t=!1,r=null,i=!1,n=null,o=[],l=e[1].startsWith(\"--\"),a=[],u=e;for(;u;){if(r=u[0],a.push(u),r===\"(\"||r===\"[\")n||(n=u),o.push(r===\"(\"?\")\":\"]\");else if(l&&i&&r===\"{\")n||(n=u),o.push(\"}\");else if(o.length===0)if(r===\";\")if(i){this.decl(a,l);return}else break;else if(r===\"{\"){this.rule(a);return}else if(r===\"}\"){this.tokenizer.back(a.pop()),t=!0;break}else r===\":\"&&(i=!0);else r===o[o.length-1]&&(o.pop(),o.length===0&&(n=null));u=this.tokenizer.nextToken()}if(this.tokenizer.endOfFile()&&(t=!0),o.length>0&&this.unclosedBracket(n),t&&i){if(!l)for(;a.length&&(u=a[a.length-1][0],!(u!==\"space\"&&u!==\"comment\"));)this.tokenizer.back(a.pop());this.decl(a,l)}else this.unknownWord(a)}parse(){let e;for(;!this.tokenizer.endOfFile();)switch(e=this.tokenizer.nextToken(),e[0]){case\"space\":this.spaces+=e[1];break;case\";\":this.freeSemicolon(e);break;case\"}\":this.end(e);break;case\"comment\":this.comment(e);break;case\"at-word\":this.atrule(e);break;case\"{\":this.emptyRule(e);break;default:this.other(e);break}this.endFile()}precheckMissedSemicolon(){}raw(e,t,r,i){let n,o,l=r.length,a=\"\",u=!0,c,h;for(let d=0;d<l;d+=1)n=r[d],o=n[0],o===\"space\"&&d===l-1&&!i?u=!1:o===\"comment\"?(h=r[d-1]?r[d-1][0]:\"empty\",c=r[d+1]?r[d+1][0]:\"empty\",!Oi[h]&&!Oi[c]?a.slice(-1)===\",\"?u=!1:a+=n[1]:u=!1):a+=n[1];if(!u){let d=r.reduce((m,g)=>m+g[1],\"\");e.raws[t]={raw:d,value:a}}e[t]=a}rule(e){e.pop();let t=new xi;this.init(t,e[0][2]),t.raws.between=this.spacesAndCommentsFromEnd(e),this.raw(t,\"selector\",e),this.current=t}spacesAndCommentsFromEnd(e){let t,r=\"\";for(;e.length&&(t=e[e.length-1][0],!(t!==\"space\"&&t!==\"comment\"));)r=e.pop()[1]+r;return r}spacesAndCommentsFromStart(e){let t,r=\"\";for(;e.length&&(t=e[0][0],!(t!==\"space\"&&t!==\"comment\"));)r+=e.shift()[1];return r}spacesFromEnd(e){let t,r=\"\";for(;e.length&&(t=e[e.length-1][0],t===\"space\");)r=e.pop()[1]+r;return r}stringFrom(e,t){let r=\"\";for(let i=t;i<e.length;i++)r+=e[i][1];return e.splice(t,e.length-t),r}unclosedBlock(){let e=this.current.source.start;throw this.input.error(\"Unclosed block\",e.line,e.column)}unclosedBracket(e){throw this.input.error(\"Unclosed bracket\",{offset:e[2]},{offset:e[2]+1})}unexpectedClose(e){throw this.input.error(\"Unexpected }\",{offset:e[2]},{offset:e[2]+1})}unknownWord(e){throw this.input.error(\"Unknown word\",{offset:e[0][2]},{offset:e[0][2]+e[0][1].length})}unnamedAtrule(e,t){throw this.input.error(\"At-rule without name\",{offset:t[2]},{offset:t[2]+t[1].length})}};var xc=Ic;let Oc=Ie,Rc=xc,Ac=ur;function Kt(s,e){let t=new Ac(s,e),r=new Rc(t);try{r.parse()}catch(i){throw i}return r.root}var ks=Kt;Kt.default=Kt;Oc.registerParse(Kt);let{isClean:ce,my:Mc}=ot,Ec=Wn,$c=or,Nc=Ie,kc=Ms;let Ri=Es,Pc=ks,Dc=at;const Lc={atrule:\"AtRule\",comment:\"Comment\",decl:\"Declaration\",document:\"Document\",root:\"Root\",rule:\"Rule\"},Tc={AtRule:!0,AtRuleExit:!0,Comment:!0,CommentExit:!0,Declaration:!0,DeclarationExit:!0,Document:!0,DocumentExit:!0,Once:!0,OnceExit:!0,postcssPlugin:!0,prepare:!0,Root:!0,RootExit:!0,Rule:!0,RuleExit:!0},_c={Once:!0,postcssPlugin:!0,prepare:!0},Le=0;function Ve(s){return typeof s==\"object\"&&typeof s.then==\"function\"}function ao(s){let e=!1,t=Lc[s.type];return s.type===\"decl\"?e=s.prop.toLowerCase():s.type===\"atrule\"&&(e=s.name.toLowerCase()),e&&s.append?[t,t+\"-\"+e,Le,t+\"Exit\",t+\"Exit-\"+e]:e?[t,t+\"-\"+e,t+\"Exit\",t+\"Exit-\"+e]:s.append?[t,Le,t+\"Exit\"]:[t,t+\"Exit\"]}function Ai(s){let e;return s.type===\"document\"?e=[\"Document\",Le,\"DocumentExit\"]:s.type===\"root\"?e=[\"Root\",Le,\"RootExit\"]:e=ao(s),{eventIndex:0,events:e,iterator:0,node:s,visitorIndex:0,visitors:[]}}function is(s){return s[ce]=!1,s.nodes&&s.nodes.forEach(e=>is(e)),s}let ns={},Te=class lo{constructor(e,t,r){this.stringified=!1,this.processed=!1;let i;if(typeof t==\"object\"&&t!==null&&(t.type===\"root\"||t.type===\"document\"))i=is(t);else if(t instanceof lo||t instanceof Ri)i=is(t.root),t.map&&(typeof r.map==\"undefined\"&&(r.map={}),r.map.inline||(r.map.inline=!1),r.map.prev=t.map);else{let n=Pc;r.syntax&&(n=r.syntax.parse),r.parser&&(n=r.parser),n.parse&&(n=n.parse);try{i=n(t,r)}catch(o){this.processed=!0,this.error=o}i&&!i[Mc]&&Nc.rebuild(i)}this.result=new Ri(e,i,r),this.helpers=ee(x({},ns),{postcss:ns,result:this.result}),this.plugins=this.processor.plugins.map(n=>typeof n==\"object\"&&n.prepare?x(x({},n),n.prepare(this.result)):n)}async(){return this.error?Promise.reject(this.error):this.processed?Promise.resolve(this.result):(this.processing||(this.processing=this.runAsync()),this.processing)}catch(e){return this.async().catch(e)}finally(e){return this.async().then(e,e)}getAsyncError(){throw new Error(\"Use process(css).then(cb) to work with async plugins\")}handleError(e,t){let r=this.result.lastPlugin;try{t&&t.addToError(e),this.error=e,e.name===\"CssSyntaxError\"&&!e.plugin?(e.plugin=r.postcssPlugin,e.setMessage()):r.postcssVersion}catch(i){console&&console.error&&console.error(i)}return e}prepareVisitors(){this.listeners={};let e=(t,r,i)=>{this.listeners[r]||(this.listeners[r]=[]),this.listeners[r].push([t,i])};for(let t of this.plugins)if(typeof t==\"object\")for(let r in t){if(!Tc[r]&&/^[A-Z]/.test(r))throw new Error(\\`Unknown event \\${r} in \\${t.postcssPlugin}. Try to update PostCSS (\\${this.processor.version} now).\\`);if(!_c[r])if(typeof t[r]==\"object\")for(let i in t[r])i===\"*\"?e(t,r,t[r][i]):e(t,r+\"-\"+i.toLowerCase(),t[r][i]);else typeof t[r]==\"function\"&&e(t,r,t[r])}this.hasListener=Object.keys(this.listeners).length>0}async runAsync(){this.plugin=0;for(let e=0;e<this.plugins.length;e++){let t=this.plugins[e],r=this.runOnRoot(t);if(Ve(r))try{await r}catch(i){throw this.handleError(i)}}if(this.prepareVisitors(),this.hasListener){let e=this.result.root;for(;!e[ce];){e[ce]=!0;let t=[Ai(e)];for(;t.length>0;){let r=this.visitTick(t);if(Ve(r))try{await r}catch(i){let n=t[t.length-1].node;throw this.handleError(i,n)}}}if(this.listeners.OnceExit)for(let[t,r]of this.listeners.OnceExit){this.result.lastPlugin=t;try{if(e.type===\"document\"){let i=e.nodes.map(n=>r(n,this.helpers));await Promise.all(i)}else await r(e,this.helpers)}catch(i){throw this.handleError(i)}}}return this.processed=!0,this.stringify()}runOnRoot(e){this.result.lastPlugin=e;try{if(typeof e==\"object\"&&e.Once){if(this.result.root.type===\"document\"){let t=this.result.root.nodes.map(r=>e.Once(r,this.helpers));return Ve(t[0])?Promise.all(t):t}return e.Once(this.result.root,this.helpers)}else if(typeof e==\"function\")return e(this.result.root,this.result)}catch(t){throw this.handleError(t)}}stringify(){if(this.error)throw this.error;if(this.stringified)return this.result;this.stringified=!0,this.sync();let e=this.result.opts,t=$c;e.syntax&&(t=e.syntax.stringify),e.stringifier&&(t=e.stringifier),t.stringify&&(t=t.stringify);let i=new Ec(t,this.result.root,this.result.opts).generate();return this.result.css=i[0],this.result.map=i[1],this.result}sync(){if(this.error)throw this.error;if(this.processed)return this.result;if(this.processed=!0,this.processing)throw this.getAsyncError();for(let e of this.plugins){let t=this.runOnRoot(e);if(Ve(t))throw this.getAsyncError()}if(this.prepareVisitors(),this.hasListener){let e=this.result.root;for(;!e[ce];)e[ce]=!0,this.walkSync(e);if(this.listeners.OnceExit)if(e.type===\"document\")for(let t of e.nodes)this.visitSync(this.listeners.OnceExit,t);else this.visitSync(this.listeners.OnceExit,e)}return this.result}then(e,t){return this.async().then(e,t)}toString(){return this.css}visitSync(e,t){for(let[r,i]of e){this.result.lastPlugin=r;let n;try{n=i(t,this.helpers)}catch(o){throw this.handleError(o,t.proxyOf)}if(t.type!==\"root\"&&t.type!==\"document\"&&!t.parent)return!0;if(Ve(n))throw this.getAsyncError()}}visitTick(e){let t=e[e.length-1],{node:r,visitors:i}=t;if(r.type!==\"root\"&&r.type!==\"document\"&&!r.parent){e.pop();return}if(i.length>0&&t.visitorIndex<i.length){let[o,l]=i[t.visitorIndex];t.visitorIndex+=1,t.visitorIndex===i.length&&(t.visitors=[],t.visitorIndex=0),this.result.lastPlugin=o;try{return l(r.toProxy(),this.helpers)}catch(a){throw this.handleError(a,r)}}if(t.iterator!==0){let o=t.iterator,l;for(;l=r.nodes[r.indexes[o]];)if(r.indexes[o]+=1,!l[ce]){l[ce]=!0,e.push(Ai(l));return}t.iterator=0,delete r.indexes[o]}let n=t.events;for(;t.eventIndex<n.length;){let o=n[t.eventIndex];if(t.eventIndex+=1,o===Le){r.nodes&&r.nodes.length&&(r[ce]=!0,t.iterator=r.getIterator());return}else if(this.listeners[o]){t.visitors=this.listeners[o];return}}e.pop()}walkSync(e){e[ce]=!0;let t=ao(e);for(let r of t)if(r===Le)e.nodes&&e.each(i=>{i[ce]||this.walkSync(i)});else{let i=this.listeners[r];if(i&&this.visitSync(i,e.toProxy()))return}}warnings(){return this.sync().warnings()}get content(){return this.stringify().content}get css(){return this.stringify().css}get map(){return this.stringify().map}get messages(){return this.sync().messages}get opts(){return this.result.opts}get processor(){return this.result.processor}get root(){return this.sync().root}get[Symbol.toStringTag](){return\"LazyResult\"}};Te.registerPostcss=s=>{ns=s};var uo=Te;Te.default=Te;Dc.registerLazyResult(Te);kc.registerLazyResult(Te);let Fc=Wn,Uc=or;let Bc=ks;const zc=Es;let os=class{constructor(e,t,r){t=t.toString(),this.stringified=!1,this._processor=e,this._css=t,this._opts=r,this._map=void 0;let i,n=Uc;this.result=new zc(this._processor,i,this._opts),this.result.css=t;let o=this;Object.defineProperty(this.result,\"root\",{get(){return o.root}});let l=new Fc(n,i,this._opts,t);if(l.isMap()){let[a,u]=l.generate();a&&(this.result.css=a),u&&(this.result.map=u)}else l.clearAnnotation(),this.result.css=l.css}async(){return this.error?Promise.reject(this.error):Promise.resolve(this.result)}catch(e){return this.async().catch(e)}finally(e){return this.async().then(e,e)}sync(){if(this.error)throw this.error;return this.result}then(e,t){return this.async().then(e,t)}toString(){return this._css}warnings(){return[]}get content(){return this.result.css}get css(){return this.result.css}get map(){return this.result.map}get messages(){return[]}get opts(){return this.result.opts}get processor(){return this.result.processor}get root(){if(this._root)return this._root;let e,t=Bc;try{e=t(this._css,this._opts)}catch(r){this.error=r}if(this.error)throw this.error;return this._root=e,e}get[Symbol.toStringTag](){return\"NoWorkResult\"}};var Wc=os;os.default=os;let Gc=Wc,Vc=uo,jc=Ms,Hc=at,tt=class{constructor(e=[]){this.version=\"8.4.38\",this.plugins=this.normalize(e)}normalize(e){let t=[];for(let r of e)if(r.postcss===!0?r=r():r.postcss&&(r=r.postcss),typeof r==\"object\"&&Array.isArray(r.plugins))t=t.concat(r.plugins);else if(typeof r==\"object\"&&r.postcssPlugin)t.push(r);else if(typeof r==\"function\")t.push(r);else if(!(typeof r==\"object\"&&(r.parse||r.stringify)))throw new Error(r+\" is not a PostCSS plugin\");return t}process(e,t={}){return!this.plugins.length&&!t.parser&&!t.stringifier&&!t.syntax?new Gc(this,e,t):new Vc(this,e,t)}use(e){return this.plugins=this.plugins.concat(this.normalize([e])),this}};var Yc=tt;tt.default=tt;Hc.registerProcessor(tt);jc.registerProcessor(tt);let Zc=lr,Jc=_n,Xc=cr,Kc=$s,Qc=ur,qc=at,eh=Ns;function rt(s,e){if(Array.isArray(s))return s.map(o=>rt(o));let i=s,{inputs:t}=i,r=xe(i,[\"inputs\"]);if(t){e=[];for(let o of t){let l=ee(x({},o),{__proto__:Qc.prototype});l.map&&(l.map=ee(x({},l.map),{__proto__:Jc.prototype})),e.push(l)}}if(r.nodes&&(r.nodes=s.nodes.map(o=>rt(o,e))),r.source){let n=r.source,{inputId:o}=n,l=xe(n,[\"inputId\"]);r.source=l,o!=null&&(r.source.input=e[o])}if(r.type===\"root\")return new qc(r);if(r.type===\"decl\")return new Zc(r);if(r.type===\"rule\")return new eh(r);if(r.type===\"comment\")return new Xc(r);if(r.type===\"atrule\")return new Kc(r);throw new Error(\"Unknown node type: \"+s.type)}var th=rt;rt.default=rt;let rh=Os,co=lr,sh=uo,ih=Ie,Ps=Yc,nh=or,oh=th,ho=Ms,ah=eo,fo=cr,po=$s,lh=Es,uh=ur,ch=ks,hh=no,mo=Ns,go=at,fh=ar;function $(...s){return s.length===1&&Array.isArray(s[0])&&(s=s[0]),new Ps(s)}$.plugin=function(e,t){let r=!1;function i(...o){console&&console.warn&&!r&&(r=!0,console.warn(e+\\`: postcss.plugin was deprecated. Migration guide:\nhttps://evilmartians.com/chronicles/postcss-8-plugin-migration\\`),process.env.LANG&&process.env.LANG.startsWith(\"cn\")&&console.warn(e+\\`: \\\\u91CC\\\\u9762 postcss.plugin \\\\u88AB\\\\u5F03\\\\u7528. \\\\u8FC1\\\\u79FB\\\\u6307\\\\u5357:\nhttps://www.w3ctech.com/topic/2226\\`));let l=t(...o);return l.postcssPlugin=e,l.postcssVersion=new Ps().version,l}let n;return Object.defineProperty(i,\"postcss\",{get(){return n||(n=i()),n}}),i.process=function(o,l,a){return $([i(a)]).process(o,l)},i};$.stringify=nh;$.parse=ch;$.fromJSON=oh;$.list=hh;$.comment=s=>new fo(s);$.atRule=s=>new po(s);$.decl=s=>new co(s);$.rule=s=>new mo(s);$.root=s=>new go(s);$.document=s=>new ho(s);$.CssSyntaxError=rh;$.Declaration=co;$.Container=ih;$.Processor=Ps;$.Document=ho;$.Comment=fo;$.Warning=ah;$.AtRule=po;$.Result=lh;$.Input=uh;$.Rule=mo;$.Root=go;$.Node=fh;sh.registerPostcss($);var ph=$;$.default=$;const U=Ou(ph);U.stringify;U.fromJSON;U.plugin;U.parse;U.list;U.document;U.comment;U.atRule;U.rule;U.decl;U.root;U.CssSyntaxError;U.Declaration;U.Container;U.Processor;U.Document;U.Comment;U.Warning;U.AtRule;U.Result;U.Input;U.Rule;U.Root;U.Node;class Ds{constructor(...e){te(this,\"parentElement\",null),te(this,\"parentNode\",null),te(this,\"ownerDocument\"),te(this,\"firstChild\",null),te(this,\"lastChild\",null),te(this,\"previousSibling\",null),te(this,\"nextSibling\",null),te(this,\"ELEMENT_NODE\",1),te(this,\"TEXT_NODE\",3),te(this,\"nodeType\"),te(this,\"nodeName\"),te(this,\"RRNodeType\")}get childNodes(){const e=[];let t=this.firstChild;for(;t;)e.push(t),t=t.nextSibling;return e}contains(e){if(e instanceof Ds){if(e.ownerDocument!==this.ownerDocument)return!1;if(e===this)return!0}else return!1;for(;e.parentNode;){if(e.parentNode===this)return!0;e=e.parentNode}return!1}appendChild(e){throw new Error(\"RRDomException: Failed to execute 'appendChild' on 'RRNode': This RRNode type does not support this method.\")}insertBefore(e,t){throw new Error(\"RRDomException: Failed to execute 'insertBefore' on 'RRNode': This RRNode type does not support this method.\")}removeChild(e){throw new Error(\"RRDomException: Failed to execute 'removeChild' on 'RRNode': This RRNode type does not support this method.\")}toString(){return\"RRNode\"}}const Mi={Node:[\"childNodes\",\"parentNode\",\"parentElement\",\"textContent\"],ShadowRoot:[\"host\",\"styleSheets\"],Element:[\"shadowRoot\",\"querySelector\",\"querySelectorAll\"],MutationObserver:[]},Ei={Node:[\"contains\",\"getRootNode\"],ShadowRoot:[\"getSelection\"],Element:[],MutationObserver:[\"constructor\"]},kt={},dh=()=>!!globalThis.Zone;function Ls(s){if(kt[s])return kt[s];const e=globalThis[s],t=e.prototype,r=s in Mi?Mi[s]:void 0,i=!!(r&&r.every(l=>{var a,u;return!!((u=(a=Object.getOwnPropertyDescriptor(t,l))==null?void 0:a.get)!=null&&u.toString().includes(\"[native code]\"))})),n=s in Ei?Ei[s]:void 0,o=!!(n&&n.every(l=>{var a;return typeof t[l]==\"function\"&&((a=t[l])==null?void 0:a.toString().includes(\"[native code]\"))}));if(i&&o&&!dh())return kt[s]=e.prototype,e.prototype;try{const l=document.createElement(\"iframe\");document.body.appendChild(l);const a=l.contentWindow;if(!a)return e.prototype;const u=a[s].prototype;return document.body.removeChild(l),u?kt[s]=u:t}catch(l){return t}}const Rr={};function ge(s,e,t){var r;const i=\\`\\${s}.\\${String(t)}\\`;if(Rr[i])return Rr[i].call(e);const n=Ls(s),o=(r=Object.getOwnPropertyDescriptor(n,t))==null?void 0:r.get;return o?(Rr[i]=o,o.call(e)):e[t]}const Ar={};function yo(s,e,t){const r=\\`\\${s}.\\${String(t)}\\`;if(Ar[r])return Ar[r].bind(e);const n=Ls(s)[t];return typeof n!=\"function\"?e[t]:(Ar[r]=n,n.bind(e))}function mh(s){return ge(\"Node\",s,\"childNodes\")}function gh(s){return ge(\"Node\",s,\"parentNode\")}function yh(s){return ge(\"Node\",s,\"parentElement\")}function wh(s){return ge(\"Node\",s,\"textContent\")}function Sh(s,e){return yo(\"Node\",s,\"contains\")(e)}function bh(s){return yo(\"Node\",s,\"getRootNode\")()}function Ch(s){return!s||!(\"host\"in s)?null:ge(\"ShadowRoot\",s,\"host\")}function vh(s){return s.styleSheets}function Ih(s){return!s||!(\"shadowRoot\"in s)?null:ge(\"Element\",s,\"shadowRoot\")}function xh(s,e){return ge(\"Element\",s,\"querySelector\")(e)}function Oh(s,e){return ge(\"Element\",s,\"querySelectorAll\")(e)}function wo(){return Ls(\"MutationObserver\").constructor}const v={childNodes:mh,parentNode:gh,parentElement:yh,textContent:wh,contains:Sh,getRootNode:bh,host:Ch,styleSheets:vh,shadowRoot:Ih,querySelector:xh,querySelectorAll:Oh,mutationObserver:wo};function J(s,e,t=document){const r={capture:!0,passive:!0};return t.addEventListener(s,e,r),()=>t.removeEventListener(s,e,r)}const Re=\\`Please stop import mirror directly. Instead of that,\\\\r\nnow you can use replayer.getMirror() to access the mirror instance of a replayer,\\\\r\nor you can use record.mirror to access the mirror instance during recording.\\`;let $i={map:{},getId(){return console.error(Re),-1},getNode(){return console.error(Re),null},removeNodeFromMap(){console.error(Re)},has(){return console.error(Re),!1},reset(){console.error(Re)}};typeof window!=\"undefined\"&&window.Proxy&&window.Reflect&&($i=new Proxy($i,{get(s,e,t){return e===\"map\"&&console.error(Re),Reflect.get(s,e,t)}}));function st(s,e,t={}){let r=null,i=0;return function(...n){const o=Date.now();!i&&t.leading===!1&&(i=o);const l=e-(o-i),a=this;l<=0||l>e?(r&&(clearTimeout(r),r=null),i=o,s.apply(a,n)):!r&&t.trailing!==!1&&(r=setTimeout(()=>{i=t.leading===!1?0:Date.now(),r=null,s.apply(a,n)},l))}}function hr(s,e,t,r,i=window){const n=i.Object.getOwnPropertyDescriptor(s,e);return i.Object.defineProperty(s,e,r?t:{set(o){setTimeout(()=>{t.set.call(this,o)},0),n&&n.set&&n.set.call(this,o)}}),()=>hr(s,e,n||{},!0)}function Fe(s,e,t){try{if(!(e in s))return()=>{};const r=s[e],i=t(r);return typeof i==\"function\"&&(i.prototype=i.prototype||{},Object.defineProperties(i,{__rrweb_original__:{enumerable:!1,value:r}})),s[e]=i,()=>{s[e]=r}}catch(r){return()=>{}}}let Qt=Date.now;/[1-9][0-9]{12}/.test(Date.now().toString())||(Qt=()=>new Date().getTime());function So(s){var e,t,r,i;const n=s.document;return{left:n.scrollingElement?n.scrollingElement.scrollLeft:s.pageXOffset!==void 0?s.pageXOffset:n.documentElement.scrollLeft||(n==null?void 0:n.body)&&((e=v.parentElement(n.body))==null?void 0:e.scrollLeft)||((t=n==null?void 0:n.body)==null?void 0:t.scrollLeft)||0,top:n.scrollingElement?n.scrollingElement.scrollTop:s.pageYOffset!==void 0?s.pageYOffset:(n==null?void 0:n.documentElement.scrollTop)||(n==null?void 0:n.body)&&((r=v.parentElement(n.body))==null?void 0:r.scrollTop)||((i=n==null?void 0:n.body)==null?void 0:i.scrollTop)||0}}function bo(){return window.innerHeight||document.documentElement&&document.documentElement.clientHeight||document.body&&document.body.clientHeight}function Co(){return window.innerWidth||document.documentElement&&document.documentElement.clientWidth||document.body&&document.body.clientWidth}function vo(s){return s?s.nodeType===s.ELEMENT_NODE?s:v.parentElement(s):null}function X(s,e,t,r){if(!s)return!1;const i=vo(s);if(!i)return!1;try{if(typeof e==\"string\"){if(i.classList.contains(e)||r&&i.closest(\".\"+e)!==null)return!0}else if(Gt(i,e,r))return!0}catch(n){}return!!(t&&(i.matches(t)||r&&i.closest(t)!==null))}function Rh(s,e){return e.getId(s)!==-1}function Mr(s,e,t){return s.tagName===\"TITLE\"&&t.headTitleMutations?!0:e.getId(s)===Ze}function Io(s,e){if(je(s))return!1;const t=e.getId(s);if(!e.has(t))return!0;const r=v.parentNode(s);return r&&r.nodeType===s.DOCUMENT_NODE?!1:r?Io(r,e):!0}function as(s){return!!s.changedTouches}function Ah(s=window){\"NodeList\"in s&&!s.NodeList.prototype.forEach&&(s.NodeList.prototype.forEach=Array.prototype.forEach),\"DOMTokenList\"in s&&!s.DOMTokenList.prototype.forEach&&(s.DOMTokenList.prototype.forEach=Array.prototype.forEach)}function xo(s,e){return!!(s.nodeName===\"IFRAME\"&&e.getMeta(s))}function Oo(s,e){return!!(s.nodeName===\"LINK\"&&s.nodeType===s.ELEMENT_NODE&&s.getAttribute&&s.getAttribute(\"rel\")===\"stylesheet\"&&e.getMeta(s))}function ls(s){return s?s instanceof Ds&&\"shadowRoot\"in s?!!s.shadowRoot:!!v.shadowRoot(s):!1}class Mh{constructor(){w(this,\"id\",1),w(this,\"styleIDMap\",new WeakMap),w(this,\"idStyleMap\",new Map)}getId(e){var t;return(t=this.styleIDMap.get(e))!=null?t:-1}has(e){return this.styleIDMap.has(e)}add(e,t){if(this.has(e))return this.getId(e);let r;return t===void 0?r=this.id++:r=t,this.styleIDMap.set(e,r),this.idStyleMap.set(r,e),r}getStyle(e){return this.idStyleMap.get(e)||null}reset(){this.styleIDMap=new WeakMap,this.idStyleMap=new Map,this.id=1}generateId(){return this.id++}}function Ro(s){var e;let t=null;return\"getRootNode\"in s&&((e=v.getRootNode(s))==null?void 0:e.nodeType)===Node.DOCUMENT_FRAGMENT_NODE&&v.host(v.getRootNode(s))&&(t=v.host(v.getRootNode(s))),t}function Eh(s){let e=s,t;for(;t=Ro(e);)e=t;return e}function $h(s){const e=s.ownerDocument;if(!e)return!1;const t=Eh(s);return v.contains(e,t)}function Ao(s){const e=s.ownerDocument;return e?v.contains(e,s)||$h(s):!1}var R=(s=>(s[s.DomContentLoaded=0]=\"DomContentLoaded\",s[s.Load=1]=\"Load\",s[s.FullSnapshot=2]=\"FullSnapshot\",s[s.IncrementalSnapshot=3]=\"IncrementalSnapshot\",s[s.Meta=4]=\"Meta\",s[s.Custom=5]=\"Custom\",s[s.Plugin=6]=\"Plugin\",s))(R||{}),I=(s=>(s[s.Mutation=0]=\"Mutation\",s[s.MouseMove=1]=\"MouseMove\",s[s.MouseInteraction=2]=\"MouseInteraction\",s[s.Scroll=3]=\"Scroll\",s[s.ViewportResize=4]=\"ViewportResize\",s[s.Input=5]=\"Input\",s[s.TouchMove=6]=\"TouchMove\",s[s.MediaInteraction=7]=\"MediaInteraction\",s[s.StyleSheetRule=8]=\"StyleSheetRule\",s[s.CanvasMutation=9]=\"CanvasMutation\",s[s.Font=10]=\"Font\",s[s.Log=11]=\"Log\",s[s.Drag=12]=\"Drag\",s[s.StyleDeclaration=13]=\"StyleDeclaration\",s[s.Selection=14]=\"Selection\",s[s.AdoptedStyleSheet=15]=\"AdoptedStyleSheet\",s[s.CustomElement=16]=\"CustomElement\",s))(I||{}),K=(s=>(s[s.MouseUp=0]=\"MouseUp\",s[s.MouseDown=1]=\"MouseDown\",s[s.Click=2]=\"Click\",s[s.ContextMenu=3]=\"ContextMenu\",s[s.DblClick=4]=\"DblClick\",s[s.Focus=5]=\"Focus\",s[s.Blur=6]=\"Blur\",s[s.TouchStart=7]=\"TouchStart\",s[s.TouchMove_Departed=8]=\"TouchMove_Departed\",s[s.TouchEnd=9]=\"TouchEnd\",s[s.TouchCancel=10]=\"TouchCancel\",s))(K||{}),he=(s=>(s[s.Mouse=0]=\"Mouse\",s[s.Pen=1]=\"Pen\",s[s.Touch=2]=\"Touch\",s))(he||{}),_e=(s=>(s[s[\"2D\"]=0]=\"2D\",s[s.WebGL=1]=\"WebGL\",s[s.WebGL2=2]=\"WebGL2\",s))(_e||{}),Ae=(s=>(s[s.Play=0]=\"Play\",s[s.Pause=1]=\"Pause\",s[s.Seeked=2]=\"Seeked\",s[s.VolumeChange=3]=\"VolumeChange\",s[s.RateChange=4]=\"RateChange\",s))(Ae||{}),Mo=(s=>(s[s.Document=0]=\"Document\",s[s.DocumentType=1]=\"DocumentType\",s[s.Element=2]=\"Element\",s[s.Text=3]=\"Text\",s[s.CDATA=4]=\"CDATA\",s[s.Comment=5]=\"Comment\",s))(Mo||{});function Ni(s){return\"__ln\"in s}class Nh{constructor(){w(this,\"length\",0),w(this,\"head\",null),w(this,\"tail\",null)}get(e){if(e>=this.length)throw new Error(\"Position outside of list range\");let t=this.head;for(let r=0;r<e;r++)t=(t==null?void 0:t.next)||null;return t}addNode(e){const t={value:e,previous:null,next:null};if(e.__ln=t,e.previousSibling&&Ni(e.previousSibling)){const r=e.previousSibling.__ln.next;t.next=r,t.previous=e.previousSibling.__ln,e.previousSibling.__ln.next=t,r&&(r.previous=t)}else if(e.nextSibling&&Ni(e.nextSibling)&&e.nextSibling.__ln.previous){const r=e.nextSibling.__ln.previous;t.previous=r,t.next=e.nextSibling.__ln,e.nextSibling.__ln.previous=t,r&&(r.next=t)}else this.head&&(this.head.previous=t),t.next=this.head,this.head=t;t.next===null&&(this.tail=t),this.length++}removeNode(e){const t=e.__ln;this.head&&(t.previous?(t.previous.next=t.next,t.next?t.next.previous=t.previous:this.tail=t.previous):(this.head=t.next,this.head?this.head.previous=null:this.tail=null),e.__ln&&delete e.__ln,this.length--)}}const ki=(s,e)=>\\`\\${s}@\\${e}\\`;class kh{constructor(){w(this,\"frozen\",!1),w(this,\"locked\",!1),w(this,\"texts\",[]),w(this,\"attributes\",[]),w(this,\"attributeMap\",new WeakMap),w(this,\"removes\",[]),w(this,\"mapRemoves\",[]),w(this,\"movedMap\",{}),w(this,\"addedSet\",new Set),w(this,\"movedSet\",new Set),w(this,\"droppedSet\",new Set),w(this,\"removesSubTreeCache\",new Set),w(this,\"mutationCb\"),w(this,\"blockClass\"),w(this,\"blockSelector\"),w(this,\"maskTextClass\"),w(this,\"maskTextSelector\"),w(this,\"inlineStylesheet\"),w(this,\"maskInputOptions\"),w(this,\"maskTextFn\"),w(this,\"maskInputFn\"),w(this,\"keepIframeSrcFn\"),w(this,\"recordCanvas\"),w(this,\"inlineImages\"),w(this,\"slimDOMOptions\"),w(this,\"dataURLOptions\"),w(this,\"doc\"),w(this,\"mirror\"),w(this,\"iframeManager\"),w(this,\"stylesheetManager\"),w(this,\"shadowDomManager\"),w(this,\"canvasManager\"),w(this,\"processedNodeManager\"),w(this,\"unattachedDoc\"),w(this,\"processMutations\",e=>{e.forEach(this.processMutation),this.emit()}),w(this,\"emit\",()=>{if(this.frozen||this.locked)return;const e=[],t=new Set,r=new Nh,i=a=>{let u=a,c=Ze;for(;c===Ze;)u=u&&u.nextSibling,c=u&&this.mirror.getId(u);return c},n=a=>{const u=v.parentNode(a);if(!u||!Ao(a))return;let c=!1;if(a.nodeType===Node.TEXT_NODE){const g=u.tagName;if(g===\"TEXTAREA\")return;g===\"STYLE\"&&this.addedSet.has(u)&&(c=!0)}const h=je(u)?this.mirror.getId(Ro(a)):this.mirror.getId(u),d=i(a);if(h===-1||d===-1)return r.addNode(a);const m=Ee(a,{doc:this.doc,mirror:this.mirror,blockClass:this.blockClass,blockSelector:this.blockSelector,maskTextClass:this.maskTextClass,maskTextSelector:this.maskTextSelector,skipChild:!0,newlyAddedElement:!0,inlineStylesheet:this.inlineStylesheet,maskInputOptions:this.maskInputOptions,maskTextFn:this.maskTextFn,maskInputFn:this.maskInputFn,slimDOMOptions:this.slimDOMOptions,dataURLOptions:this.dataURLOptions,recordCanvas:this.recordCanvas,inlineImages:this.inlineImages,onSerialize:g=>{xo(g,this.mirror)&&this.iframeManager.addIframe(g),Oo(g,this.mirror)&&this.stylesheetManager.trackLinkElement(g),ls(a)&&this.shadowDomManager.addShadowRoot(v.shadowRoot(a),this.doc)},onIframeLoad:(g,p)=>{this.iframeManager.attachIframe(g,p),this.shadowDomManager.observeAttachShadow(g)},onStylesheetLoad:(g,p)=>{this.stylesheetManager.attachLinkElement(g,p)},cssCaptured:c});m&&(e.push({parentId:h,nextId:d,node:m}),t.add(m.id))};for(;this.mapRemoves.length;)this.mirror.removeNodeFromMap(this.mapRemoves.shift());for(const a of this.movedSet)Pi(this.removesSubTreeCache,a,this.mirror)&&!this.movedSet.has(v.parentNode(a))||n(a);for(const a of this.addedSet)!Di(this.droppedSet,a)&&!Pi(this.removesSubTreeCache,a,this.mirror)||Di(this.movedSet,a)?n(a):this.droppedSet.add(a);let o=null;for(;r.length;){let a=null;if(o){const u=this.mirror.getId(v.parentNode(o.value)),c=i(o.value);u!==-1&&c!==-1&&(a=o)}if(!a){let u=r.tail;for(;u;){const c=u;if(u=u.previous,c){const h=this.mirror.getId(v.parentNode(c.value));if(i(c.value)===-1)continue;if(h!==-1){a=c;break}else{const m=c.value,g=v.parentNode(m);if(g&&g.nodeType===Node.DOCUMENT_FRAGMENT_NODE){const p=v.host(g);if(this.mirror.getId(p)!==-1){a=c;break}}}}}}if(!a){for(;r.head;)r.removeNode(r.head.value);break}o=a.previous,r.removeNode(a.value),n(a.value)}const l={texts:this.texts.map(a=>{const u=a.node,c=v.parentNode(u);return c&&c.tagName===\"TEXTAREA\"&&this.genTextAreaValueMutation(c),{id:this.mirror.getId(u),value:a.value}}).filter(a=>!t.has(a.id)).filter(a=>this.mirror.has(a.id)),attributes:this.attributes.map(a=>{const{attributes:u}=a;if(typeof u.style==\"string\"){const c=JSON.stringify(a.styleDiff),h=JSON.stringify(a._unchangedStyles);c.length<u.style.length&&(c+h).split(\"var(\").length===u.style.split(\"var(\").length&&(u.style=a.styleDiff)}return{id:this.mirror.getId(a.node),attributes:u}}).filter(a=>!t.has(a.id)).filter(a=>this.mirror.has(a.id)),removes:this.removes,adds:e};!l.texts.length&&!l.attributes.length&&!l.removes.length&&!l.adds.length||(this.texts=[],this.attributes=[],this.attributeMap=new WeakMap,this.removes=[],this.addedSet=new Set,this.movedSet=new Set,this.droppedSet=new Set,this.removesSubTreeCache=new Set,this.movedMap={},this.mutationCb(l))}),w(this,\"genTextAreaValueMutation\",e=>{let t=this.attributeMap.get(e);t||(t={node:e,attributes:{},styleDiff:{},_unchangedStyles:{}},this.attributes.push(t),this.attributeMap.set(e,t)),t.attributes.value=Array.from(v.childNodes(e),r=>v.textContent(r)||\"\").join(\"\")}),w(this,\"processMutation\",e=>{if(!Mr(e.target,this.mirror,this.slimDOMOptions))switch(e.type){case\"characterData\":{const t=v.textContent(e.target);!X(e.target,this.blockClass,this.blockSelector,!1)&&t!==e.oldValue&&this.texts.push({value:Xi(e.target,this.maskTextClass,this.maskTextSelector,!0)&&t?this.maskTextFn?this.maskTextFn(t,vo(e.target)):t.replace(/[\\\\S]/g,\"*\"):t,node:e.target});break}case\"attributes\":{const t=e.target;let r=e.attributeName,i=e.target.getAttribute(r);if(r===\"value\"){const o=fs(t);i=hs({element:t,maskInputOptions:this.maskInputOptions,tagName:t.tagName,type:o,value:i,maskInputFn:this.maskInputFn})}if(X(e.target,this.blockClass,this.blockSelector,!1)||i===e.oldValue)return;let n=this.attributeMap.get(e.target);if(t.tagName===\"IFRAME\"&&r===\"src\"&&!this.keepIframeSrcFn(i))if(!t.contentDocument)r=\"rr_src\";else return;if(n||(n={node:e.target,attributes:{},styleDiff:{},_unchangedStyles:{}},this.attributes.push(n),this.attributeMap.set(e.target,n)),r===\"type\"&&t.tagName===\"INPUT\"&&(e.oldValue||\"\").toLowerCase()===\"password\"&&t.setAttribute(\"data-rr-is-password\",\"true\"),!Ji(t.tagName,r))if(n.attributes[r]=Zi(this.doc,Ce(t.tagName),Ce(r),i),r===\"style\"){if(!this.unattachedDoc)try{this.unattachedDoc=document.implementation.createHTMLDocument()}catch(l){this.unattachedDoc=this.doc}const o=this.unattachedDoc.createElement(\"span\");e.oldValue&&o.setAttribute(\"style\",e.oldValue);for(const l of Array.from(t.style)){const a=t.style.getPropertyValue(l),u=t.style.getPropertyPriority(l);a!==o.style.getPropertyValue(l)||u!==o.style.getPropertyPriority(l)?u===\"\"?n.styleDiff[l]=a:n.styleDiff[l]=[a,u]:n._unchangedStyles[l]=[a,u]}for(const l of Array.from(o.style))t.style.getPropertyValue(l)===\"\"&&(n.styleDiff[l]=!1)}else r===\"open\"&&t.tagName===\"DIALOG\"&&(t.matches(\"dialog:modal\")?n.attributes.rr_open_mode=\"modal\":n.attributes.rr_open_mode=\"non-modal\");break}case\"childList\":{if(X(e.target,this.blockClass,this.blockSelector,!0))return;if(e.target.tagName===\"TEXTAREA\"){this.genTextAreaValueMutation(e.target);return}e.addedNodes.forEach(t=>this.genAdds(t,e.target)),e.removedNodes.forEach(t=>{const r=this.mirror.getId(t),i=je(e.target)?this.mirror.getId(v.host(e.target)):this.mirror.getId(e.target);X(e.target,this.blockClass,this.blockSelector,!1)||Mr(t,this.mirror,this.slimDOMOptions)||!Rh(t,this.mirror)||(this.addedSet.has(t)?(us(this.addedSet,t),this.droppedSet.add(t)):this.addedSet.has(e.target)&&r===-1||Io(e.target,this.mirror)||(this.movedSet.has(t)&&this.movedMap[ki(r,i)]?us(this.movedSet,t):(this.removes.push({parentId:i,id:r,isShadow:je(e.target)&&He(e.target)?!0:void 0}),Ph(t,this.removesSubTreeCache))),this.mapRemoves.push(t))});break}}}),w(this,\"genAdds\",(e,t)=>{if(!this.processedNodeManager.inOtherBuffer(e,this)&&!(this.addedSet.has(e)||this.movedSet.has(e))){if(this.mirror.hasNode(e)){if(Mr(e,this.mirror,this.slimDOMOptions))return;this.movedSet.add(e);let r=null;t&&this.mirror.hasNode(t)&&(r=this.mirror.getId(t)),r&&r!==-1&&(this.movedMap[ki(this.mirror.getId(e),r)]=!0)}else this.addedSet.add(e),this.droppedSet.delete(e);X(e,this.blockClass,this.blockSelector,!1)||(v.childNodes(e).forEach(r=>this.genAdds(r)),ls(e)&&v.childNodes(v.shadowRoot(e)).forEach(r=>{this.processedNodeManager.add(r,this),this.genAdds(r,e)}))}})}init(e){[\"mutationCb\",\"blockClass\",\"blockSelector\",\"maskTextClass\",\"maskTextSelector\",\"inlineStylesheet\",\"maskInputOptions\",\"maskTextFn\",\"maskInputFn\",\"keepIframeSrcFn\",\"recordCanvas\",\"inlineImages\",\"slimDOMOptions\",\"dataURLOptions\",\"doc\",\"mirror\",\"iframeManager\",\"stylesheetManager\",\"shadowDomManager\",\"canvasManager\",\"processedNodeManager\"].forEach(t=>{this[t]=e[t]})}freeze(){this.frozen=!0,this.canvasManager.freeze()}unfreeze(){this.frozen=!1,this.canvasManager.unfreeze(),this.emit()}isFrozen(){return this.frozen}lock(){this.locked=!0,this.canvasManager.lock()}unlock(){this.locked=!1,this.canvasManager.unlock(),this.emit()}reset(){this.shadowDomManager.reset(),this.canvasManager.reset()}}function us(s,e){s.delete(e),v.childNodes(e).forEach(t=>us(s,t))}function Ph(s,e){const t=[s];for(;t.length;){const r=t.pop();e.has(r)||(e.add(r),v.childNodes(r).forEach(i=>t.push(i)))}}function Pi(s,e,t){return s.size===0?!1:Dh(s,e)}function Dh(s,e,t){const r=v.parentNode(e);return r?s.has(r):!1}function Di(s,e){return s.size===0?!1:Eo(s,e)}function Eo(s,e){const t=v.parentNode(e);return t?s.has(t)?!0:Eo(s,t):!1}let Ye;function Lh(s){Ye=s}function Th(){Ye=void 0}const O=s=>Ye?(...t)=>{try{return s(...t)}catch(r){if(Ye&&Ye(r)===!0)return;throw r}}:s,be=[];function lt(s){try{if(\"composedPath\"in s){const e=s.composedPath();if(e.length)return e[0]}else if(\"path\"in s&&s.path.length)return s.path[0]}catch(e){}return s&&s.target}function $o(s,e){const t=new kh;be.push(t),t.init(s);const r=new(wo())(O(t.processMutations.bind(t)));return r.observe(e,{attributes:!0,attributeOldValue:!0,characterData:!0,characterDataOldValue:!0,childList:!0,subtree:!0}),r}function _h({mousemoveCb:s,sampling:e,doc:t,mirror:r}){if(e.mousemove===!1)return()=>{};const i=typeof e.mousemove==\"number\"?e.mousemove:50,n=typeof e.mousemoveCallback==\"number\"?e.mousemoveCallback:500;let o=[],l;const a=st(O(h=>{const d=Date.now()-l;s(o.map(m=>(m.timeOffset-=d,m)),h),o=[],l=null}),n),u=O(st(O(h=>{const d=lt(h),{clientX:m,clientY:g}=as(h)?h.changedTouches[0]:h;l||(l=Qt()),o.push({x:m,y:g,id:r.getId(d),timeOffset:Qt()-l}),a(typeof DragEvent!=\"undefined\"&&h instanceof DragEvent?I.Drag:h instanceof MouseEvent?I.MouseMove:I.TouchMove)}),i,{trailing:!1})),c=[J(\"mousemove\",u,t),J(\"touchmove\",u,t),J(\"drag\",u,t)];return O(()=>{c.forEach(h=>h())})}function Fh({mouseInteractionCb:s,doc:e,mirror:t,blockClass:r,blockSelector:i,sampling:n}){if(n.mouseInteraction===!1)return()=>{};const o=n.mouseInteraction===!0||n.mouseInteraction===void 0?{}:n.mouseInteraction,l=[];let a=null;const u=c=>h=>{const d=lt(h);if(X(d,r,i,!0))return;let m=null,g=c;if(\"pointerType\"in h){switch(h.pointerType){case\"mouse\":m=he.Mouse;break;case\"touch\":m=he.Touch;break;case\"pen\":m=he.Pen;break}m===he.Touch?K[c]===K.MouseDown?g=\"TouchStart\":K[c]===K.MouseUp&&(g=\"TouchEnd\"):he.Pen}else as(h)&&(m=he.Touch);m!==null?(a=m,(g.startsWith(\"Touch\")&&m===he.Touch||g.startsWith(\"Mouse\")&&m===he.Mouse)&&(m=null)):K[c]===K.Click&&(m=a,a=null);const p=as(h)?h.changedTouches[0]:h;if(!p)return;const f=t.getId(d),{clientX:S,clientY:b}=p;O(s)(x({type:K[g],id:f,x:S,y:b},m!==null&&{pointerType:m}))};return Object.keys(K).filter(c=>Number.isNaN(Number(c))&&!c.endsWith(\"_Departed\")&&o[c]!==!1).forEach(c=>{let h=Ce(c);const d=u(c);if(window.PointerEvent)switch(K[c]){case K.MouseDown:case K.MouseUp:h=h.replace(\"mouse\",\"pointer\");break;case K.TouchStart:case K.TouchEnd:return}l.push(J(h,d,e))}),O(()=>{l.forEach(c=>c())})}function No({scrollCb:s,doc:e,mirror:t,blockClass:r,blockSelector:i,sampling:n}){const o=O(st(O(l=>{const a=lt(l);if(!a||X(a,r,i,!0))return;const u=t.getId(a);if(a===e&&e.defaultView){const c=So(e.defaultView);s({id:u,x:c.left,y:c.top})}else s({id:u,x:a.scrollLeft,y:a.scrollTop})}),n.scroll||100));return J(\"scroll\",o,e)}function Uh({viewportResizeCb:s},{win:e}){let t=-1,r=-1;const i=O(st(O(()=>{const n=bo(),o=Co();(t!==n||r!==o)&&(s({width:Number(o),height:Number(n)}),t=n,r=o)}),200));return J(\"resize\",i,e)}const Bh=[\"INPUT\",\"TEXTAREA\",\"SELECT\"],Li=new WeakMap;function zh({inputCb:s,doc:e,mirror:t,blockClass:r,blockSelector:i,ignoreClass:n,ignoreSelector:o,maskInputOptions:l,maskInputFn:a,sampling:u,userTriggeredOnInput:c}){function h(b){let y=lt(b);const C=b.isTrusted,N=y&&y.tagName;if(y&&N===\"OPTION\"&&(y=v.parentElement(y)),!y||!N||Bh.indexOf(N)<0||X(y,r,i,!0)||y.classList.contains(n)||o&&y.matches(o))return;let D=y.value,H=!1;const _=fs(y)||\"\";_===\"radio\"||_===\"checkbox\"?H=y.checked:(l[N.toLowerCase()]||l[_])&&(D=hs({element:y,maskInputOptions:l,tagName:N,type:_,value:D,maskInputFn:a})),d(y,c?{text:D,isChecked:H,userTriggered:C}:{text:D,isChecked:H});const G=y.name;_===\"radio\"&&G&&H&&e.querySelectorAll(\\`input[type=\"radio\"][name=\"\\${G}\"]\\`).forEach(Y=>{if(Y!==y){const Q=Y.value;d(Y,c?{text:Q,isChecked:!H,userTriggered:!1}:{text:Q,isChecked:!H})}})}function d(b,y){const C=Li.get(b);if(!C||C.text!==y.text||C.isChecked!==y.isChecked){Li.set(b,y);const N=t.getId(b);O(s)(ee(x({},y),{id:N}))}}const g=(u.input===\"last\"?[\"change\"]:[\"input\",\"change\"]).map(b=>J(b,O(h),e)),p=e.defaultView;if(!p)return()=>{g.forEach(b=>b())};const f=p.Object.getOwnPropertyDescriptor(p.HTMLInputElement.prototype,\"value\"),S=[[p.HTMLInputElement.prototype,\"value\"],[p.HTMLInputElement.prototype,\"checked\"],[p.HTMLSelectElement.prototype,\"value\"],[p.HTMLTextAreaElement.prototype,\"value\"],[p.HTMLSelectElement.prototype,\"selectedIndex\"],[p.HTMLOptionElement.prototype,\"selected\"]];return f&&f.set&&g.push(...S.map(b=>hr(b[0],b[1],{set(){O(h)({target:this,isTrusted:!1})}},!1,p))),O(()=>{g.forEach(b=>b())})}function qt(s){const e=[];function t(r,i){if(Pt(\"CSSGroupingRule\")&&r.parentRule instanceof CSSGroupingRule||Pt(\"CSSMediaRule\")&&r.parentRule instanceof CSSMediaRule||Pt(\"CSSSupportsRule\")&&r.parentRule instanceof CSSSupportsRule||Pt(\"CSSConditionRule\")&&r.parentRule instanceof CSSConditionRule){const o=Array.from(r.parentRule.cssRules).indexOf(r);i.unshift(o)}else if(r.parentStyleSheet){const o=Array.from(r.parentStyleSheet.cssRules).indexOf(r);i.unshift(o)}return i}return t(s,e)}function de(s,e,t){let r,i;return s?(s.ownerNode?r=e.getId(s.ownerNode):i=t.getId(s),{styleId:i,id:r}):{}}function Wh({styleSheetRuleCb:s,mirror:e,stylesheetManager:t},{win:r}){if(!r.CSSStyleSheet||!r.CSSStyleSheet.prototype)return()=>{};const i=r.CSSStyleSheet.prototype.insertRule;r.CSSStyleSheet.prototype.insertRule=new Proxy(i,{apply:O((c,h,d)=>{const[m,g]=d,{id:p,styleId:f}=de(h,e,t.styleMirror);return(p&&p!==-1||f&&f!==-1)&&s({id:p,styleId:f,adds:[{rule:m,index:g}]}),c.apply(h,d)})}),r.CSSStyleSheet.prototype.addRule=function(c,h,d=this.cssRules.length){const m=\\`\\${c} { \\${h} }\\`;return r.CSSStyleSheet.prototype.insertRule.apply(this,[m,d])};const n=r.CSSStyleSheet.prototype.deleteRule;r.CSSStyleSheet.prototype.deleteRule=new Proxy(n,{apply:O((c,h,d)=>{const[m]=d,{id:g,styleId:p}=de(h,e,t.styleMirror);return(g&&g!==-1||p&&p!==-1)&&s({id:g,styleId:p,removes:[{index:m}]}),c.apply(h,d)})}),r.CSSStyleSheet.prototype.removeRule=function(c){return r.CSSStyleSheet.prototype.deleteRule.apply(this,[c])};let o;r.CSSStyleSheet.prototype.replace&&(o=r.CSSStyleSheet.prototype.replace,r.CSSStyleSheet.prototype.replace=new Proxy(o,{apply:O((c,h,d)=>{const[m]=d,{id:g,styleId:p}=de(h,e,t.styleMirror);return(g&&g!==-1||p&&p!==-1)&&s({id:g,styleId:p,replace:m}),c.apply(h,d)})}));let l;r.CSSStyleSheet.prototype.replaceSync&&(l=r.CSSStyleSheet.prototype.replaceSync,r.CSSStyleSheet.prototype.replaceSync=new Proxy(l,{apply:O((c,h,d)=>{const[m]=d,{id:g,styleId:p}=de(h,e,t.styleMirror);return(g&&g!==-1||p&&p!==-1)&&s({id:g,styleId:p,replaceSync:m}),c.apply(h,d)})}));const a={};Dt(\"CSSGroupingRule\")?a.CSSGroupingRule=r.CSSGroupingRule:(Dt(\"CSSMediaRule\")&&(a.CSSMediaRule=r.CSSMediaRule),Dt(\"CSSConditionRule\")&&(a.CSSConditionRule=r.CSSConditionRule),Dt(\"CSSSupportsRule\")&&(a.CSSSupportsRule=r.CSSSupportsRule));const u={};return Object.entries(a).forEach(([c,h])=>{u[c]={insertRule:h.prototype.insertRule,deleteRule:h.prototype.deleteRule},h.prototype.insertRule=new Proxy(u[c].insertRule,{apply:O((d,m,g)=>{const[p,f]=g,{id:S,styleId:b}=de(m.parentStyleSheet,e,t.styleMirror);return(S&&S!==-1||b&&b!==-1)&&s({id:S,styleId:b,adds:[{rule:p,index:[...qt(m),f||0]}]}),d.apply(m,g)})}),h.prototype.deleteRule=new Proxy(u[c].deleteRule,{apply:O((d,m,g)=>{const[p]=g,{id:f,styleId:S}=de(m.parentStyleSheet,e,t.styleMirror);return(f&&f!==-1||S&&S!==-1)&&s({id:f,styleId:S,removes:[{index:[...qt(m),p]}]}),d.apply(m,g)})})}),O(()=>{r.CSSStyleSheet.prototype.insertRule=i,r.CSSStyleSheet.prototype.deleteRule=n,o&&(r.CSSStyleSheet.prototype.replace=o),l&&(r.CSSStyleSheet.prototype.replaceSync=l),Object.entries(a).forEach(([c,h])=>{h.prototype.insertRule=u[c].insertRule,h.prototype.deleteRule=u[c].deleteRule})})}function ko({mirror:s,stylesheetManager:e},t){var r,i,n;let o=null;t.nodeName===\"#document\"?o=s.getId(t):o=s.getId(v.host(t));const l=t.nodeName===\"#document\"?(r=t.defaultView)==null?void 0:r.Document:(n=(i=t.ownerDocument)==null?void 0:i.defaultView)==null?void 0:n.ShadowRoot,a=l!=null&&l.prototype?Object.getOwnPropertyDescriptor(l==null?void 0:l.prototype,\"adoptedStyleSheets\"):void 0;return o===null||o===-1||!l||!a?()=>{}:(Object.defineProperty(t,\"adoptedStyleSheets\",{configurable:a.configurable,enumerable:a.enumerable,get(){var u;return(u=a.get)==null?void 0:u.call(this)},set(u){var c;const h=(c=a.set)==null?void 0:c.call(this,u);if(o!==null&&o!==-1)try{e.adoptStyleSheets(u,o)}catch(d){}return h}}),O(()=>{Object.defineProperty(t,\"adoptedStyleSheets\",{configurable:a.configurable,enumerable:a.enumerable,get:a.get,set:a.set})}))}function Gh({styleDeclarationCb:s,mirror:e,ignoreCSSAttributes:t,stylesheetManager:r},{win:i}){const n=i.CSSStyleDeclaration.prototype.setProperty;i.CSSStyleDeclaration.prototype.setProperty=new Proxy(n,{apply:O((l,a,u)=>{var c;const[h,d,m]=u;if(t.has(h))return n.apply(a,[h,d,m]);const{id:g,styleId:p}=de((c=a.parentRule)==null?void 0:c.parentStyleSheet,e,r.styleMirror);return(g&&g!==-1||p&&p!==-1)&&s({id:g,styleId:p,set:{property:h,value:d,priority:m},index:qt(a.parentRule)}),l.apply(a,u)})});const o=i.CSSStyleDeclaration.prototype.removeProperty;return i.CSSStyleDeclaration.prototype.removeProperty=new Proxy(o,{apply:O((l,a,u)=>{var c;const[h]=u;if(t.has(h))return o.apply(a,[h]);const{id:d,styleId:m}=de((c=a.parentRule)==null?void 0:c.parentStyleSheet,e,r.styleMirror);return(d&&d!==-1||m&&m!==-1)&&s({id:d,styleId:m,remove:{property:h},index:qt(a.parentRule)}),l.apply(a,u)})}),O(()=>{i.CSSStyleDeclaration.prototype.setProperty=n,i.CSSStyleDeclaration.prototype.removeProperty=o})}function Vh({mediaInteractionCb:s,blockClass:e,blockSelector:t,mirror:r,sampling:i,doc:n}){const o=O(a=>st(O(u=>{const c=lt(u);if(!c||X(c,e,t,!0))return;const{currentTime:h,volume:d,muted:m,playbackRate:g,loop:p}=c;s({type:a,id:r.getId(c),currentTime:h,volume:d,muted:m,playbackRate:g,loop:p})}),i.media||500)),l=[J(\"play\",o(Ae.Play),n),J(\"pause\",o(Ae.Pause),n),J(\"seeked\",o(Ae.Seeked),n),J(\"volumechange\",o(Ae.VolumeChange),n),J(\"ratechange\",o(Ae.RateChange),n)];return O(()=>{l.forEach(a=>a())})}function jh({fontCb:s,doc:e}){const t=e.defaultView;if(!t)return()=>{};const r=[],i=new WeakMap,n=t.FontFace;t.FontFace=function(a,u,c){const h=new n(a,u,c);return i.set(h,{family:a,buffer:typeof u!=\"string\",descriptors:c,fontSource:typeof u==\"string\"?u:JSON.stringify(Array.from(new Uint8Array(u)))}),h};const o=Fe(e.fonts,\"add\",function(l){return function(a){return setTimeout(O(()=>{const u=i.get(a);u&&(s(u),i.delete(a))}),0),l.apply(this,[a])}});return r.push(()=>{t.FontFace=n}),r.push(o),O(()=>{r.forEach(l=>l())})}function Hh(s){const{doc:e,mirror:t,blockClass:r,blockSelector:i,selectionCb:n}=s;let o=!0;const l=O(()=>{const a=e.getSelection();if(!a||o&&(a!=null&&a.isCollapsed))return;o=a.isCollapsed||!1;const u=[],c=a.rangeCount||0;for(let h=0;h<c;h++){const d=a.getRangeAt(h),{startContainer:m,startOffset:g,endContainer:p,endOffset:f}=d;X(m,r,i,!0)||X(p,r,i,!0)||u.push({start:t.getId(m),startOffset:g,end:t.getId(p),endOffset:f})}n({ranges:u})});return l(),J(\"selectionchange\",l)}function Yh({doc:s,customElementCb:e}){const t=s.defaultView;return!t||!t.customElements?()=>{}:Fe(t.customElements,\"define\",function(i){return function(n,o,l){try{e({define:{name:n}})}catch(a){console.warn(\\`Custom element callback failed for \\${n}\\`)}return i.apply(this,[n,o,l])}})}function Zh(s,e){const{mutationCb:t,mousemoveCb:r,mouseInteractionCb:i,scrollCb:n,viewportResizeCb:o,inputCb:l,mediaInteractionCb:a,styleSheetRuleCb:u,styleDeclarationCb:c,canvasMutationCb:h,fontCb:d,selectionCb:m,customElementCb:g}=s;s.mutationCb=(...p)=>{e.mutation&&e.mutation(...p),t(...p)},s.mousemoveCb=(...p)=>{e.mousemove&&e.mousemove(...p),r(...p)},s.mouseInteractionCb=(...p)=>{e.mouseInteraction&&e.mouseInteraction(...p),i(...p)},s.scrollCb=(...p)=>{e.scroll&&e.scroll(...p),n(...p)},s.viewportResizeCb=(...p)=>{e.viewportResize&&e.viewportResize(...p),o(...p)},s.inputCb=(...p)=>{e.input&&e.input(...p),l(...p)},s.mediaInteractionCb=(...p)=>{e.mediaInteaction&&e.mediaInteaction(...p),a(...p)},s.styleSheetRuleCb=(...p)=>{e.styleSheetRule&&e.styleSheetRule(...p),u(...p)},s.styleDeclarationCb=(...p)=>{e.styleDeclaration&&e.styleDeclaration(...p),c(...p)},s.canvasMutationCb=(...p)=>{e.canvasMutation&&e.canvasMutation(...p),h(...p)},s.fontCb=(...p)=>{e.font&&e.font(...p),d(...p)},s.selectionCb=(...p)=>{e.selection&&e.selection(...p),m(...p)},s.customElementCb=(...p)=>{e.customElement&&e.customElement(...p),g(...p)}}function Jh(s,e={}){const t=s.doc.defaultView;if(!t)return()=>{};Zh(s,e);let r;s.recordDOM&&(r=$o(s,s.doc));const i=_h(s),n=Fh(s),o=No(s),l=Uh(s,{win:t}),a=zh(s),u=Vh(s);let c=()=>{},h=()=>{},d=()=>{},m=()=>{};s.recordDOM&&(c=Wh(s,{win:t}),h=ko(s,s.doc),d=Gh(s,{win:t}),s.collectFonts&&(m=jh(s)));const g=Hh(s),p=Yh(s),f=[];for(const S of s.plugins)f.push(S.observer(S.callback,t,S.options));return O(()=>{be.forEach(S=>S.reset()),r==null||r.disconnect(),i(),n(),o(),l(),a(),u(),c(),h(),d(),m(),g(),p(),f.forEach(S=>S())})}function Pt(s){return typeof window[s]!=\"undefined\"}function Dt(s){return!!(typeof window[s]!=\"undefined\"&&window[s].prototype&&\"insertRule\"in window[s].prototype&&\"deleteRule\"in window[s].prototype)}class Ti{constructor(e){w(this,\"iframeIdToRemoteIdMap\",new WeakMap),w(this,\"iframeRemoteIdToIdMap\",new WeakMap),this.generateIdFn=e}getId(e,t,r,i){const n=r||this.getIdToRemoteIdMap(e),o=i||this.getRemoteIdToIdMap(e);let l=n.get(t);return l||(l=this.generateIdFn(),n.set(t,l),o.set(l,t)),l}getIds(e,t){const r=this.getIdToRemoteIdMap(e),i=this.getRemoteIdToIdMap(e);return t.map(n=>this.getId(e,n,r,i))}getRemoteId(e,t,r){const i=r||this.getRemoteIdToIdMap(e);if(typeof t!=\"number\")return t;const n=i.get(t);return n||-1}getRemoteIds(e,t){const r=this.getRemoteIdToIdMap(e);return t.map(i=>this.getRemoteId(e,i,r))}reset(e){if(!e){this.iframeIdToRemoteIdMap=new WeakMap,this.iframeRemoteIdToIdMap=new WeakMap;return}this.iframeIdToRemoteIdMap.delete(e),this.iframeRemoteIdToIdMap.delete(e)}getIdToRemoteIdMap(e){let t=this.iframeIdToRemoteIdMap.get(e);return t||(t=new Map,this.iframeIdToRemoteIdMap.set(e,t)),t}getRemoteIdToIdMap(e){let t=this.iframeRemoteIdToIdMap.get(e);return t||(t=new Map,this.iframeRemoteIdToIdMap.set(e,t)),t}}class Xh{constructor(e){w(this,\"iframes\",new WeakMap),w(this,\"crossOriginIframeMap\",new WeakMap),w(this,\"crossOriginIframeMirror\",new Ti(Yi)),w(this,\"crossOriginIframeStyleMirror\"),w(this,\"crossOriginIframeRootIdMap\",new WeakMap),w(this,\"mirror\"),w(this,\"mutationCb\"),w(this,\"wrappedEmit\"),w(this,\"loadListener\"),w(this,\"stylesheetManager\"),w(this,\"recordCrossOriginIframes\"),this.mutationCb=e.mutationCb,this.wrappedEmit=e.wrappedEmit,this.stylesheetManager=e.stylesheetManager,this.recordCrossOriginIframes=e.recordCrossOriginIframes,this.crossOriginIframeStyleMirror=new Ti(this.stylesheetManager.styleMirror.generateId.bind(this.stylesheetManager.styleMirror)),this.mirror=e.mirror,this.recordCrossOriginIframes&&window.addEventListener(\"message\",this.handleMessage.bind(this))}addIframe(e){this.iframes.set(e,!0),e.contentWindow&&this.crossOriginIframeMap.set(e.contentWindow,e)}addLoadListener(e){this.loadListener=e}attachIframe(e,t){var r,i;this.mutationCb({adds:[{parentId:this.mirror.getId(e),nextId:null,node:t}],removes:[],texts:[],attributes:[],isAttachIframe:!0}),this.recordCrossOriginIframes&&((r=e.contentWindow)==null||r.addEventListener(\"message\",this.handleMessage.bind(this))),(i=this.loadListener)==null||i.call(this,e),e.contentDocument&&e.contentDocument.adoptedStyleSheets&&e.contentDocument.adoptedStyleSheets.length>0&&this.stylesheetManager.adoptStyleSheets(e.contentDocument.adoptedStyleSheets,this.mirror.getId(e.contentDocument))}handleMessage(e){const t=e;if(t.data.type!==\"rrweb\"||t.origin!==t.data.origin||!e.source)return;const i=this.crossOriginIframeMap.get(e.source);if(!i)return;const n=this.transformCrossOriginEvent(i,t.data.event);n&&this.wrappedEmit(n,t.data.isCheckout)}transformCrossOriginEvent(e,t){var r;switch(t.type){case R.FullSnapshot:{this.crossOriginIframeMirror.reset(e),this.crossOriginIframeStyleMirror.reset(e),this.replaceIdOnNode(t.data.node,e);const i=t.data.node.id;return this.crossOriginIframeRootIdMap.set(e,i),this.patchRootIdOnNode(t.data.node,i),{timestamp:t.timestamp,type:R.IncrementalSnapshot,data:{source:I.Mutation,adds:[{parentId:this.mirror.getId(e),nextId:null,node:t.data.node}],removes:[],texts:[],attributes:[],isAttachIframe:!0}}}case R.Meta:case R.Load:case R.DomContentLoaded:return!1;case R.Plugin:return t;case R.Custom:return this.replaceIds(t.data.payload,e,[\"id\",\"parentId\",\"previousId\",\"nextId\"]),t;case R.IncrementalSnapshot:switch(t.data.source){case I.Mutation:return t.data.adds.forEach(i=>{this.replaceIds(i,e,[\"parentId\",\"nextId\",\"previousId\"]),this.replaceIdOnNode(i.node,e);const n=this.crossOriginIframeRootIdMap.get(e);n&&this.patchRootIdOnNode(i.node,n)}),t.data.removes.forEach(i=>{this.replaceIds(i,e,[\"parentId\",\"id\"])}),t.data.attributes.forEach(i=>{this.replaceIds(i,e,[\"id\"])}),t.data.texts.forEach(i=>{this.replaceIds(i,e,[\"id\"])}),t;case I.Drag:case I.TouchMove:case I.MouseMove:return t.data.positions.forEach(i=>{this.replaceIds(i,e,[\"id\"])}),t;case I.ViewportResize:return!1;case I.MediaInteraction:case I.MouseInteraction:case I.Scroll:case I.CanvasMutation:case I.Input:return this.replaceIds(t.data,e,[\"id\"]),t;case I.StyleSheetRule:case I.StyleDeclaration:return this.replaceIds(t.data,e,[\"id\"]),this.replaceStyleIds(t.data,e,[\"styleId\"]),t;case I.Font:return t;case I.Selection:return t.data.ranges.forEach(i=>{this.replaceIds(i,e,[\"start\",\"end\"])}),t;case I.AdoptedStyleSheet:return this.replaceIds(t.data,e,[\"id\"]),this.replaceStyleIds(t.data,e,[\"styleIds\"]),(r=t.data.styles)==null||r.forEach(i=>{this.replaceStyleIds(i,e,[\"styleId\"])}),t}}return!1}replace(e,t,r,i){for(const n of i)!Array.isArray(t[n])&&typeof t[n]!=\"number\"||(Array.isArray(t[n])?t[n]=e.getIds(r,t[n]):t[n]=e.getId(r,t[n]));return t}replaceIds(e,t,r){return this.replace(this.crossOriginIframeMirror,e,t,r)}replaceStyleIds(e,t,r){return this.replace(this.crossOriginIframeStyleMirror,e,t,r)}replaceIdOnNode(e,t){this.replaceIds(e,t,[\"id\",\"rootId\"]),\"childNodes\"in e&&e.childNodes.forEach(r=>{this.replaceIdOnNode(r,t)})}patchRootIdOnNode(e,t){e.type!==Mo.Document&&!e.rootId&&(e.rootId=t),\"childNodes\"in e&&e.childNodes.forEach(r=>{this.patchRootIdOnNode(r,t)})}}class Kh{constructor(e){w(this,\"shadowDoms\",new WeakSet),w(this,\"mutationCb\"),w(this,\"scrollCb\"),w(this,\"bypassOptions\"),w(this,\"mirror\"),w(this,\"restoreHandlers\",[]),this.mutationCb=e.mutationCb,this.scrollCb=e.scrollCb,this.bypassOptions=e.bypassOptions,this.mirror=e.mirror,this.init()}init(){this.reset(),this.patchAttachShadow(Element,document)}addShadowRoot(e,t){if(!He(e)||this.shadowDoms.has(e))return;this.shadowDoms.add(e);const r=$o(ee(x({},this.bypassOptions),{doc:t,mutationCb:this.mutationCb,mirror:this.mirror,shadowDomManager:this}),e);this.restoreHandlers.push(()=>r.disconnect()),this.restoreHandlers.push(No(ee(x({},this.bypassOptions),{scrollCb:this.scrollCb,doc:e,mirror:this.mirror}))),setTimeout(()=>{e.adoptedStyleSheets&&e.adoptedStyleSheets.length>0&&this.bypassOptions.stylesheetManager.adoptStyleSheets(e.adoptedStyleSheets,this.mirror.getId(v.host(e))),this.restoreHandlers.push(ko({mirror:this.mirror,stylesheetManager:this.bypassOptions.stylesheetManager},e))},0)}observeAttachShadow(e){!e.contentWindow||!e.contentDocument||this.patchAttachShadow(e.contentWindow.Element,e.contentDocument)}patchAttachShadow(e,t){const r=this;this.restoreHandlers.push(Fe(e.prototype,\"attachShadow\",function(i){return function(n){const o=i.call(this,n),l=v.shadowRoot(this);return l&&Ao(this)&&r.addShadowRoot(l,t),o}}))}reset(){this.restoreHandlers.forEach(e=>{try{e()}catch(t){}}),this.restoreHandlers=[],this.shadowDoms=new WeakSet}}var $e=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",Qh=typeof Uint8Array==\"undefined\"?[]:new Uint8Array(256);for(var Lt=0;Lt<$e.length;Lt++)Qh[$e.charCodeAt(Lt)]=Lt;var qh=function(s){var e=new Uint8Array(s),t,r=e.length,i=\"\";for(t=0;t<r;t+=3)i+=$e[e[t]>>2],i+=$e[(e[t]&3)<<4|e[t+1]>>4],i+=$e[(e[t+1]&15)<<2|e[t+2]>>6],i+=$e[e[t+2]&63];return r%3===2?i=i.substring(0,i.length-1)+\"=\":r%3===1&&(i=i.substring(0,i.length-2)+\"==\"),i};const _i=new Map;function ef(s,e){let t=_i.get(s);return t||(t=new Map,_i.set(s,t)),t.has(e)||t.set(e,[]),t.get(e)}const Po=(s,e,t)=>{if(!s||!(Lo(s,e)||typeof s==\"object\"))return;const r=s.constructor.name,i=ef(t,r);let n=i.indexOf(s);return n===-1&&(n=i.length,i.push(s)),n};function Bt(s,e,t){if(s instanceof Array)return s.map(r=>Bt(r,e,t));if(s===null)return s;if(s instanceof Float32Array||s instanceof Float64Array||s instanceof Int32Array||s instanceof Uint32Array||s instanceof Uint8Array||s instanceof Uint16Array||s instanceof Int16Array||s instanceof Int8Array||s instanceof Uint8ClampedArray)return{rr_type:s.constructor.name,args:[Object.values(s)]};if(s instanceof ArrayBuffer){const r=s.constructor.name,i=qh(s);return{rr_type:r,base64:i}}else{if(s instanceof DataView)return{rr_type:s.constructor.name,args:[Bt(s.buffer,e,t),s.byteOffset,s.byteLength]};if(s instanceof HTMLImageElement){const r=s.constructor.name,{src:i}=s;return{rr_type:r,src:i}}else if(s instanceof HTMLCanvasElement){const r=\"HTMLImageElement\",i=s.toDataURL();return{rr_type:r,src:i}}else{if(s instanceof ImageData)return{rr_type:s.constructor.name,args:[Bt(s.data,e,t),s.width,s.height]};if(Lo(s,e)||typeof s==\"object\"){const r=s.constructor.name,i=Po(s,e,t);return{rr_type:r,index:i}}}}return s}const Do=(s,e,t)=>s.map(r=>Bt(r,e,t)),Lo=(s,e)=>!![\"WebGLActiveInfo\",\"WebGLBuffer\",\"WebGLFramebuffer\",\"WebGLProgram\",\"WebGLRenderbuffer\",\"WebGLShader\",\"WebGLShaderPrecisionFormat\",\"WebGLTexture\",\"WebGLUniformLocation\",\"WebGLVertexArrayObject\",\"WebGLVertexArrayObjectOES\"].filter(i=>typeof e[i]==\"function\").find(i=>s instanceof e[i]);function tf(s,e,t,r){const i=[],n=Object.getOwnPropertyNames(e.CanvasRenderingContext2D.prototype);for(const o of n)try{if(typeof e.CanvasRenderingContext2D.prototype[o]!=\"function\")continue;const l=Fe(e.CanvasRenderingContext2D.prototype,o,function(a){return function(...u){return X(this.canvas,t,r,!0)||setTimeout(()=>{const c=Do(u,e,this);s(this.canvas,{type:_e[\"2D\"],property:o,args:c})},0),a.apply(this,u)}});i.push(l)}catch(l){const a=hr(e.CanvasRenderingContext2D.prototype,o,{set(u){s(this.canvas,{type:_e[\"2D\"],property:o,args:[u],setter:!0})}});i.push(a)}return()=>{i.forEach(o=>o())}}function rf(s){return s===\"experimental-webgl\"?\"webgl\":s}function Fi(s,e,t,r){const i=[];try{const n=Fe(s.HTMLCanvasElement.prototype,\"getContext\",function(o){return function(l,...a){if(!X(this,e,t,!0)){const u=rf(l);if(\"__context\"in this||(this.__context=u),r&&[\"webgl\",\"webgl2\"].includes(u))if(a[0]&&typeof a[0]==\"object\"){const c=a[0];c.preserveDrawingBuffer||(c.preserveDrawingBuffer=!0)}else a.splice(0,1,{preserveDrawingBuffer:!0})}return o.apply(this,[l,...a])}});i.push(n)}catch(n){console.error(\"failed to patch HTMLCanvasElement.prototype.getContext\")}return()=>{i.forEach(n=>n())}}function Ui(s,e,t,r,i,n){const o=[],l=Object.getOwnPropertyNames(s);for(const a of l)if(![\"isContextLost\",\"canvas\",\"drawingBufferWidth\",\"drawingBufferHeight\"].includes(a))try{if(typeof s[a]!=\"function\")continue;const u=Fe(s,a,function(c){return function(...h){const d=c.apply(this,h);if(Po(d,n,this),\"tagName\"in this.canvas&&!X(this.canvas,r,i,!0)){const m=Do(h,n,this),g={type:e,property:a,args:m};t(this.canvas,g)}return d}});o.push(u)}catch(u){const c=hr(s,a,{set(h){t(this.canvas,{type:e,property:a,args:[h],setter:!0})}});o.push(c)}return o}function sf(s,e,t,r){const i=[];return i.push(...Ui(e.WebGLRenderingContext.prototype,_e.WebGL,s,t,r,e)),typeof e.WebGL2RenderingContext!=\"undefined\"&&i.push(...Ui(e.WebGL2RenderingContext.prototype,_e.WebGL2,s,t,r,e)),()=>{i.forEach(n=>n())}}const To=\"KGZ1bmN0aW9uKCkgewogICJ1c2Ugc3RyaWN0IjsKICB2YXIgY2hhcnMgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CiAgdmFyIGxvb2t1cCA9IHR5cGVvZiBVaW50OEFycmF5ID09PSAidW5kZWZpbmVkIiA/IFtdIDogbmV3IFVpbnQ4QXJyYXkoMjU2KTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7CiAgICBsb29rdXBbY2hhcnMuY2hhckNvZGVBdChpKV0gPSBpOwogIH0KICB2YXIgZW5jb2RlID0gZnVuY3Rpb24oYXJyYXlidWZmZXIpIHsKICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGFycmF5YnVmZmVyKSwgaTIsIGxlbiA9IGJ5dGVzLmxlbmd0aCwgYmFzZTY0ID0gIiI7CiAgICBmb3IgKGkyID0gMDsgaTIgPCBsZW47IGkyICs9IDMpIHsKICAgICAgYmFzZTY0ICs9IGNoYXJzW2J5dGVzW2kyXSA+PiAyXTsKICAgICAgYmFzZTY0ICs9IGNoYXJzWyhieXRlc1tpMl0gJiAzKSA8PCA0IHwgYnl0ZXNbaTIgKyAxXSA+PiA0XTsKICAgICAgYmFzZTY0ICs9IGNoYXJzWyhieXRlc1tpMiArIDFdICYgMTUpIDw8IDIgfCBieXRlc1tpMiArIDJdID4+IDZdOwogICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaTIgKyAyXSAmIDYzXTsKICAgIH0KICAgIGlmIChsZW4gJSAzID09PSAyKSB7CiAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgIj0iOwogICAgfSBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7CiAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgIj09IjsKICAgIH0KICAgIHJldHVybiBiYXNlNjQ7CiAgfTsKICBjb25zdCBsYXN0QmxvYk1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgY29uc3QgdHJhbnNwYXJlbnRCbG9iTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBhc3luYyBmdW5jdGlvbiBnZXRUcmFuc3BhcmVudEJsb2JGb3Iod2lkdGgsIGhlaWdodCwgZGF0YVVSTE9wdGlvbnMpIHsKICAgIGNvbnN0IGlkID0gYCR7d2lkdGh9LSR7aGVpZ2h0fWA7CiAgICBpZiAoIk9mZnNjcmVlbkNhbnZhcyIgaW4gZ2xvYmFsVGhpcykgewogICAgICBpZiAodHJhbnNwYXJlbnRCbG9iTWFwLmhhcyhpZCkpIHJldHVybiB0cmFuc3BhcmVudEJsb2JNYXAuZ2V0KGlkKTsKICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsKICAgICAgb2Zmc2NyZWVuLmdldENvbnRleHQoIjJkIik7CiAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBvZmZzY3JlZW4uY29udmVydFRvQmxvYihkYXRhVVJMT3B0aW9ucyk7CiAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpOwogICAgICBjb25zdCBiYXNlNjQgPSBlbmNvZGUoYXJyYXlCdWZmZXIpOwogICAgICB0cmFuc3BhcmVudEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgICByZXR1cm4gYmFzZTY0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogIH0KICBjb25zdCB3b3JrZXIgPSBzZWxmOwogIHdvcmtlci5vbm1lc3NhZ2UgPSBhc3luYyBmdW5jdGlvbihlKSB7CiAgICBpZiAoIk9mZnNjcmVlbkNhbnZhcyIgaW4gZ2xvYmFsVGhpcykgewogICAgICBjb25zdCB7IGlkLCBiaXRtYXAsIHdpZHRoLCBoZWlnaHQsIGRhdGFVUkxPcHRpb25zIH0gPSBlLmRhdGE7CiAgICAgIGNvbnN0IHRyYW5zcGFyZW50QmFzZTY0ID0gZ2V0VHJhbnNwYXJlbnRCbG9iRm9yKAogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodCwKICAgICAgICBkYXRhVVJMT3B0aW9ucwogICAgICApOwogICAgICBjb25zdCBvZmZzY3JlZW4gPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOwogICAgICBjb25zdCBjdHggPSBvZmZzY3JlZW4uZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDApOwogICAgICBiaXRtYXAuY2xvc2UoKTsKICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IG9mZnNjcmVlbi5jb252ZXJ0VG9CbG9iKGRhdGFVUkxPcHRpb25zKTsKICAgICAgY29uc3QgdHlwZSA9IGJsb2IudHlwZTsKICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBibG9iLmFycmF5QnVmZmVyKCk7CiAgICAgIGNvbnN0IGJhc2U2NCA9IGVuY29kZShhcnJheUJ1ZmZlcik7CiAgICAgIGlmICghbGFzdEJsb2JNYXAuaGFzKGlkKSAmJiBhd2FpdCB0cmFuc3BhcmVudEJhc2U2NCA9PT0gYmFzZTY0KSB7CiAgICAgICAgbGFzdEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgICAgIHJldHVybiB3b3JrZXIucG9zdE1lc3NhZ2UoeyBpZCB9KTsKICAgICAgfQogICAgICBpZiAobGFzdEJsb2JNYXAuZ2V0KGlkKSA9PT0gYmFzZTY0KSByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQgfSk7CiAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7CiAgICAgICAgaWQsCiAgICAgICAgdHlwZSwKICAgICAgICBiYXNlNjQsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0CiAgICAgIH0pOwogICAgICBsYXN0QmxvYk1hcC5zZXQoaWQsIGJhc2U2NCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQ6IGUuZGF0YS5pZCB9KTsKICAgIH0KICB9Owp9KSgpOwovLyMgc291cmNlTWFwcGluZ1VSTD1pbWFnZS1iaXRtYXAtZGF0YS11cmwtd29ya2VyLUlKcEM3Z19iLmpzLm1hcAo=\",nf=s=>Uint8Array.from(atob(s),e=>e.charCodeAt(0)),Bi=typeof window!=\"undefined\"&&window.Blob&&new Blob([nf(To)],{type:\"text/javascript;charset=utf-8\"});function of(s){let e;try{if(e=Bi&&(window.URL||window.webkitURL).createObjectURL(Bi),!e)throw\"\";const t=new Worker(e,{name:s==null?void 0:s.name});return t.addEventListener(\"error\",()=>{(window.URL||window.webkitURL).revokeObjectURL(e)}),t}catch(t){return new Worker(\"data:text/javascript;base64,\"+To,{name:s==null?void 0:s.name})}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}class af{constructor(e){w(this,\"pendingCanvasMutations\",new Map),w(this,\"rafStamps\",{latestId:0,invokeId:null}),w(this,\"mirror\"),w(this,\"mutationCb\"),w(this,\"resetObservers\"),w(this,\"frozen\",!1),w(this,\"locked\",!1),w(this,\"processMutation\",(a,u)=>{(this.rafStamps.invokeId&&this.rafStamps.latestId!==this.rafStamps.invokeId||!this.rafStamps.invokeId)&&(this.rafStamps.invokeId=this.rafStamps.latestId),this.pendingCanvasMutations.has(a)||this.pendingCanvasMutations.set(a,[]),this.pendingCanvasMutations.get(a).push(u)});const{sampling:t=\"all\",win:r,blockClass:i,blockSelector:n,recordCanvas:o,dataURLOptions:l}=e;this.mutationCb=e.mutationCb,this.mirror=e.mirror,o&&t===\"all\"&&this.initCanvasMutationObserver(r,i,n),o&&typeof t==\"number\"&&this.initCanvasFPSObserver(t,r,i,n,{dataURLOptions:l})}reset(){this.pendingCanvasMutations.clear(),this.resetObservers&&this.resetObservers()}freeze(){this.frozen=!0}unfreeze(){this.frozen=!1}lock(){this.locked=!0}unlock(){this.locked=!1}initCanvasFPSObserver(e,t,r,i,n){const o=Fi(t,r,i,!0),l=new Map,a=new of;a.onmessage=g=>{const{id:p}=g.data;if(l.set(p,!1),!(\"base64\"in g.data))return;const{base64:f,type:S,width:b,height:y}=g.data;this.mutationCb({id:p,type:_e[\"2D\"],commands:[{property:\"clearRect\",args:[0,0,b,y]},{property:\"drawImage\",args:[{rr_type:\"ImageBitmap\",args:[{rr_type:\"Blob\",data:[{rr_type:\"ArrayBuffer\",base64:f}],type:S}]},0,0]}]})};const u=1e3/e;let c=0,h;const d=()=>{const g=[];return t.document.querySelectorAll(\"canvas\").forEach(p=>{X(p,r,i,!0)||g.push(p)}),g},m=g=>{if(c&&g-c<u){h=requestAnimationFrame(m);return}c=g,d().forEach(async p=>{var f;const S=this.mirror.getId(p);if(l.get(S)||p.width===0||p.height===0)return;if(l.set(S,!0),[\"webgl\",\"webgl2\"].includes(p.__context)){const y=p.getContext(p.__context);((f=y==null?void 0:y.getContextAttributes())==null?void 0:f.preserveDrawingBuffer)===!1&&y.clear(y.COLOR_BUFFER_BIT)}const b=await createImageBitmap(p);a.postMessage({id:S,bitmap:b,width:p.width,height:p.height,dataURLOptions:n.dataURLOptions},[b])}),h=requestAnimationFrame(m)};h=requestAnimationFrame(m),this.resetObservers=()=>{o(),cancelAnimationFrame(h)}}initCanvasMutationObserver(e,t,r){this.startRAFTimestamping(),this.startPendingCanvasMutationFlusher();const i=Fi(e,t,r,!1),n=tf(this.processMutation.bind(this),e,t,r),o=sf(this.processMutation.bind(this),e,t,r);this.resetObservers=()=>{i(),n(),o()}}startPendingCanvasMutationFlusher(){requestAnimationFrame(()=>this.flushPendingCanvasMutations())}startRAFTimestamping(){const e=t=>{this.rafStamps.latestId=t,requestAnimationFrame(e)};requestAnimationFrame(e)}flushPendingCanvasMutations(){this.pendingCanvasMutations.forEach((e,t)=>{const r=this.mirror.getId(t);this.flushPendingCanvasMutationFor(t,r)}),requestAnimationFrame(()=>this.flushPendingCanvasMutations())}flushPendingCanvasMutationFor(e,t){if(this.frozen||this.locked)return;const r=this.pendingCanvasMutations.get(e);if(!r||t===-1)return;const i=r.map(o=>{const u=o,{type:l}=u;return xe(u,[\"type\"])}),{type:n}=r[0];this.mutationCb({id:t,type:n,commands:i}),this.pendingCanvasMutations.delete(e)}}class lf{constructor(e){w(this,\"trackedLinkElements\",new WeakSet),w(this,\"mutationCb\"),w(this,\"adoptedStyleSheetCb\"),w(this,\"styleMirror\",new Mh),this.mutationCb=e.mutationCb,this.adoptedStyleSheetCb=e.adoptedStyleSheetCb}attachLinkElement(e,t){\"_cssText\"in t.attributes&&this.mutationCb({adds:[],removes:[],texts:[],attributes:[{id:t.id,attributes:t.attributes}]}),this.trackLinkElement(e)}trackLinkElement(e){this.trackedLinkElements.has(e)||(this.trackedLinkElements.add(e),this.trackStylesheetInLinkElement(e))}adoptStyleSheets(e,t){if(e.length===0)return;const r={id:t,styleIds:[]},i=[];for(const n of e){let o;this.styleMirror.has(n)?o=this.styleMirror.getId(n):(o=this.styleMirror.add(n),i.push({styleId:o,rules:Array.from(n.rules||CSSRule,(l,a)=>({rule:Vi(l,n.href),index:a}))})),r.styleIds.push(o)}i.length>0&&(r.styles=i),this.adoptedStyleSheetCb(r)}reset(){this.styleMirror.reset(),this.trackedLinkElements=new WeakSet}trackStylesheetInLinkElement(e){}}class uf{constructor(){w(this,\"nodeMap\",new WeakMap),w(this,\"active\",!1)}inOtherBuffer(e,t){const r=this.nodeMap.get(e);return r&&Array.from(r).some(i=>i!==t)}add(e,t){this.active||(this.active=!0,requestAnimationFrame(()=>{this.nodeMap=new WeakMap,this.active=!1})),this.nodeMap.set(e,(this.nodeMap.get(e)||new Set).add(t))}destroy(){}}let W,zt,Er,er=!1;try{if(Array.from([1],s=>s*2)[0]!==2){const s=document.createElement(\"iframe\");document.body.appendChild(s),Array.from=((Gs=s.contentWindow)==null?void 0:Gs.Array.from)||Array.from,document.body.removeChild(s)}}catch(s){console.debug(\"Unable to override Array.from\",s)}const se=ua();function ut(s={}){const{emit:e,checkoutEveryNms:t,checkoutEveryNth:r,blockClass:i=\"rr-block\",blockSelector:n=null,ignoreClass:o=\"rr-ignore\",ignoreSelector:l=null,maskTextClass:a=\"rr-mask\",maskTextSelector:u=null,inlineStylesheet:c=!0,maskAllInputs:h,maskInputOptions:d,slimDOMOptions:m,maskInputFn:g,maskTextFn:p,hooks:f,packFn:S,sampling:b={},dataURLOptions:y={},mousemoveWait:C,recordDOM:N=!0,recordCanvas:D=!1,recordCrossOriginIframes:H=!1,recordAfter:_=s.recordAfter===\"DOMContentLoaded\"?s.recordAfter:\"load\",userTriggeredOnInput:G=!1,collectFonts:Y=!1,inlineImages:Q=!1,plugins:oe,keepIframeSrcFn:A=()=>!1,ignoreCSSAttributes:Ue=new Set([]),errorHandler:Be}=s;Lh(Be);const V=H?window.parent===window:!0;let q=!1;if(!V)try{window.parent.document&&(q=!1)}catch(M){q=!0}if(V&&!e)throw new Error(\"emit function is required\");if(!V&&!q)return()=>{};C!==void 0&&b.mousemove===void 0&&(b.mousemove=C),se.reset();const ye=h===!0?{color:!0,date:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0,textarea:!0,select:!0,password:!0}:d!==void 0?d:{password:!0},ae=m===!0||m===\"all\"?{script:!0,comment:!0,headFavicon:!0,headWhitespace:!0,headMetaSocial:!0,headMetaRobots:!0,headMetaHttpEquiv:!0,headMetaVerification:!0,headMetaAuthorship:m===\"all\",headMetaDescKeywords:m===\"all\",headTitleMutations:m===\"all\"}:m||{};Ah();let Ts,fr=0;const _s=M=>{for(const re of oe||[])re.eventProcessor&&(M=re.eventProcessor(M));return S&&!q&&(M=S(M)),M};W=(M,re)=>{var B;const z=M;if(z.timestamp=Qt(),(B=be[0])!=null&&B.isFrozen()&&z.type!==R.FullSnapshot&&!(z.type===R.IncrementalSnapshot&&z.data.source===I.Mutation)&&be.forEach(le=>le.unfreeze()),V)e==null||e(_s(z),re);else if(q){const le={type:\"rrweb\",event:_s(z),origin:window.location.origin,isCheckout:re};window.parent.postMessage(le,\"*\")}if(z.type===R.FullSnapshot)Ts=z,fr=0;else if(z.type===R.IncrementalSnapshot){if(z.data.source===I.Mutation&&z.data.isAttachIframe)return;fr++;const le=r&&fr>=r,k=t&&z.timestamp-Ts.timestamp>t;(le||k)&&zt(!0)}};const ct=M=>{W({type:R.IncrementalSnapshot,data:x({source:I.Mutation},M)})},Fs=M=>W({type:R.IncrementalSnapshot,data:x({source:I.Scroll},M)}),Us=M=>W({type:R.IncrementalSnapshot,data:x({source:I.CanvasMutation},M)}),_o=M=>W({type:R.IncrementalSnapshot,data:x({source:I.AdoptedStyleSheet},M)}),we=new lf({mutationCb:ct,adoptedStyleSheetCb:_o}),Se=new Xh({mirror:se,mutationCb:ct,stylesheetManager:we,recordCrossOriginIframes:H,wrappedEmit:W});for(const M of oe||[])M.getMirror&&M.getMirror({nodeMirror:se,crossOriginIframeMirror:Se.crossOriginIframeMirror,crossOriginIframeStyleMirror:Se.crossOriginIframeStyleMirror});const pr=new uf;Er=new af({recordCanvas:D,mutationCb:Us,win:window,blockClass:i,blockSelector:n,mirror:se,sampling:b.canvas,dataURLOptions:y});const ht=new Kh({mutationCb:ct,scrollCb:Fs,bypassOptions:{blockClass:i,blockSelector:n,maskTextClass:a,maskTextSelector:u,inlineStylesheet:c,maskInputOptions:ye,dataURLOptions:y,maskTextFn:p,maskInputFn:g,recordCanvas:D,inlineImages:Q,sampling:b,slimDOMOptions:ae,iframeManager:Se,stylesheetManager:we,canvasManager:Er,keepIframeSrcFn:A,processedNodeManager:pr},mirror:se});zt=(M=!1)=>{if(!N)return;W({type:R.Meta,data:{href:window.location.href,width:Co(),height:bo()}},M),we.reset(),ht.init(),be.forEach(B=>B.lock());const re=Pa(document,{mirror:se,blockClass:i,blockSelector:n,maskTextClass:a,maskTextSelector:u,inlineStylesheet:c,maskAllInputs:ye,maskTextFn:p,maskInputFn:g,slimDOM:ae,dataURLOptions:y,recordCanvas:D,inlineImages:Q,onSerialize:B=>{xo(B,se)&&Se.addIframe(B),Oo(B,se)&&we.trackLinkElement(B),ls(B)&&ht.addShadowRoot(v.shadowRoot(B),document)},onIframeLoad:(B,z)=>{Se.attachIframe(B,z),ht.observeAttachShadow(B)},onStylesheetLoad:(B,z)=>{we.attachLinkElement(B,z)},keepIframeSrcFn:A});if(!re)return console.warn(\"Failed to snapshot the document\");W({type:R.FullSnapshot,data:{node:re,initialOffset:So(window)}},M),be.forEach(B=>B.unlock()),document.adoptedStyleSheets&&document.adoptedStyleSheets.length>0&&we.adoptStyleSheets(document.adoptedStyleSheets,se.getId(document))};try{const M=[],re=z=>{var le;return O(Jh)({mutationCb:ct,mousemoveCb:(k,dr)=>W({type:R.IncrementalSnapshot,data:{source:dr,positions:k}}),mouseInteractionCb:k=>W({type:R.IncrementalSnapshot,data:x({source:I.MouseInteraction},k)}),scrollCb:Fs,viewportResizeCb:k=>W({type:R.IncrementalSnapshot,data:x({source:I.ViewportResize},k)}),inputCb:k=>W({type:R.IncrementalSnapshot,data:x({source:I.Input},k)}),mediaInteractionCb:k=>W({type:R.IncrementalSnapshot,data:x({source:I.MediaInteraction},k)}),styleSheetRuleCb:k=>W({type:R.IncrementalSnapshot,data:x({source:I.StyleSheetRule},k)}),styleDeclarationCb:k=>W({type:R.IncrementalSnapshot,data:x({source:I.StyleDeclaration},k)}),canvasMutationCb:Us,fontCb:k=>W({type:R.IncrementalSnapshot,data:x({source:I.Font},k)}),selectionCb:k=>{W({type:R.IncrementalSnapshot,data:x({source:I.Selection},k)})},customElementCb:k=>{W({type:R.IncrementalSnapshot,data:x({source:I.CustomElement},k)})},blockClass:i,ignoreClass:o,ignoreSelector:l,maskTextClass:a,maskTextSelector:u,maskInputOptions:ye,inlineStylesheet:c,sampling:b,recordDOM:N,recordCanvas:D,inlineImages:Q,userTriggeredOnInput:G,collectFonts:Y,doc:z,maskInputFn:g,maskTextFn:p,keepIframeSrcFn:A,blockSelector:n,slimDOMOptions:ae,dataURLOptions:y,mirror:se,iframeManager:Se,stylesheetManager:we,shadowDomManager:ht,processedNodeManager:pr,canvasManager:Er,ignoreCSSAttributes:Ue,plugins:((le=oe==null?void 0:oe.filter(k=>k.observer))==null?void 0:le.map(k=>({observer:k.observer,options:k.options,callback:dr=>W({type:R.Plugin,data:{plugin:k.name,payload:dr}})})))||[]},f)};Se.addLoadListener(z=>{try{M.push(re(z.contentDocument))}catch(le){console.warn(le)}});const B=()=>{zt(),M.push(re(document)),er=!0};return document.readyState===\"interactive\"||document.readyState===\"complete\"?B():(M.push(J(\"DOMContentLoaded\",()=>{W({type:R.DomContentLoaded,data:{}}),_===\"DOMContentLoaded\"&&B()})),M.push(J(\"load\",()=>{W({type:R.Load,data:{}}),_===\"load\"&&B()},window))),()=>{M.forEach(z=>z()),pr.destroy(),er=!1,Th()}}catch(M){console.warn(M)}}ut.addCustomEvent=(s,e)=>{if(!er)throw new Error(\"please add custom event after start recording\");W({type:R.Custom,data:{tag:s,payload:e}})};ut.freezePage=()=>{be.forEach(s=>s.freeze())};ut.takeFullSnapshot=s=>{if(!er)throw new Error(\"please take full snapshot after start recording\");zt(s)};ut.mirror=se;var zi;(function(s){s[s.NotStarted=0]=\"NotStarted\",s[s.Running=1]=\"Running\",s[s.Stopped=2]=\"Stopped\"})(zi||(zi={}));exports.record=ut;\nif (typeof module.exports == \"object\" && typeof exports == \"object\") {\n var __cp = (to, from, except, desc) => {\n if ((from && typeof from === \"object\") || typeof from === \"function\") {\n for (let key of Object.getOwnPropertyNames(from)) {\n if (!Object.prototype.hasOwnProperty.call(to, key) && key !== except)\n Object.defineProperty(to, key, {\n get: () => from[key],\n enumerable: !(desc = Object.getOwnPropertyDescriptor(from, key)) || desc.enumerable,\n });\n }\n }\n return to;\n };\n module.exports = __cp(module.exports, exports);\n}\nreturn module.exports;\n}))\n//# sourceMappingURL=record.umd.min.cjs.map`;\n","import { type SessionRecordingOptions, type StringUUID } from \"@lmnr-ai/types\";\nimport { Page as PlaywrightPage } from \"playwright\";\nimport { Page as PuppeteerPage } from \"puppeteer\";\n\nimport { LaminarClient } from \"..\";\nimport { initializeLogger } from \"../utils\";\nimport { RECORDER } from \"./recorder\";\n\nexport const LMNR_SEND_EVENTS_FUNCTION_NAME = 'lmnrSendEvents';\n\nconst logger = initializeLogger();\n\ninterface LmnrWindow extends Window {\n lmnrRrwebEventsBatch: any[];\n lmnrChunkSequence: number;\n lmnrSendInProgress: boolean;\n lmnrStartedRecordingEvents: boolean;\n lmnrRrweb: any;\n lmnrSendEvents: (chunk: any) => void;\n}\n\n/**\n * If the first argument is a string, return an object with the name of the method\n * and the argument as the value.\n * Otherwise, return the shallow copy of the arguments.\n *\n * This is useful for Stagehand, where the first argument is often a string, but is named\n * 'instruction', so we add a name to it on the spans.\n *\n * @param args - Args of a function.\n * @param name - The name to add on the first argument if it is a string.\n * @returns The arguments as an object with the name of the method and the argument\n * as the value, or the arguments as is.\n */\nexport const nameArgsOrCopy = (args: any[], name: string = \"instruction\") => {\n if (args.length === 1 && typeof args[0] === 'string') {\n return { [name]: args[0] };\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return [...args];\n};\n\n\nexport interface EventChunk {\n batchId: string;\n chunkIndex: number;\n totalChunks: number;\n data: string;\n isFinal: boolean;\n}\n\nexport const takeFullSnapshot = async (\n page: PlaywrightPage | PuppeteerPage,\n): Promise<boolean> => await (page as PlaywrightPage).evaluate(() => {\n if ((window as unknown as LmnrWindow).lmnrRrweb) {\n try {\n (window as unknown as LmnrWindow).lmnrRrweb.record.takeFullSnapshot();\n return true;\n } catch (error) {\n logger.error(\"Error taking full snapshot: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n return false;\n }\n }\n return false;\n});\n\nexport const injectSessionRecorder = async (\n page: PlaywrightPage | PuppeteerPage,\n sessionRecordingOptions?: SessionRecordingOptions,\n) => {\n const tryRunScript = async <R>(\n script: (...args: any[]) => Promise<R>,\n maxAttempts: number = 5,\n ): Promise<R | undefined> => {\n for (let i = 0; i < maxAttempts; i++) {\n try {\n return await script();\n } catch (error) {\n logger.error(\"Operation \" + script.name + \" failed: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n await new Promise(resolve => setTimeout(resolve, 500));\n }\n };\n\n // Both Puppeteer and Playwright have a evaluate method, but the types are different\n // and TypeScript is not liking that the signature is different.\n\n const castedPage = page as PlaywrightPage;\n\n let isRrwebPresent = false;\n try {\n isRrwebPresent = await castedPage.evaluate(() =>\n typeof (window as unknown as LmnrWindow).lmnrRrweb !== 'undefined',\n );\n } catch (error) {\n logger.debug(\"ailed to check if session recorder is loaded: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n\n // Load rrweb and set up recording\n if (!isRrwebPresent) {\n const result = await tryRunScript(async function injectSessionRecorder() {\n await castedPage.evaluate(RECORDER);\n return true;\n });\n if (!result) {\n logger.error(\"Failed to load session recorder\");\n return;\n }\n try {\n await castedPage.evaluate(injectScript, sessionRecordingOptions);\n } catch (error) {\n logger.debug(\"Failed to inject session recorder: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n};\n\n\n// Removes the heavy client prop and the apiKey to avoid security issues\nexport const cleanStagehandLLMClient = (llmClient: object): object =>\n Object.fromEntries(\n Object.entries(llmClient)\n .filter(([key]) => key !== \"client\")\n .map(([key, value]) =>\n key === \"clientOptions\"\n ? [\n key,\n Object.fromEntries(\n Object.entries(value).filter(([key]) => key !== \"apiKey\"),\n ),\n ]\n : [key, value],\n ),\n );\n\n\n// Stagehand uses zod 3.x or 4.x, so we need to support both versions via duck-typing\nexport const prettyPrintZodSchema = (schema: any, indent = 2): string => {\n // Use duck-typing instead of instanceof to support both Zod v3 and v4\n const def = schema?._def;\n if (!def || def.typeName !== 'ZodObject') {\n throw new Error('Not a Zod object schema');\n }\n\n const indentString = ' '.repeat(indent);\n\n const shape = schema.shape;\n const entries = Object.entries(shape);\n\n const reconstructed: string[] = entries.map(([key, value]) => {\n // Base type detection function using duck-typing\n const getBaseType = (val: any): string => {\n const valDef = val?._def;\n if (!valDef) return 'z.unknown()';\n\n const typeName = valDef.typeName;\n\n if (typeName === 'ZodString') {\n return 'z.string()';\n }\n if (typeName === 'ZodNumber') {\n return 'z.number()';\n }\n if (typeName === 'ZodBoolean') {\n return 'z.boolean()';\n }\n if (typeName === 'ZodArray') {\n const elementType = valDef.type;\n if (elementType?._def?.typeName === 'ZodObject') {\n return `z.array(${prettyPrintZodSchema(elementType)})`;\n } else {\n return `z.array(${getBaseType(elementType)})`;\n }\n }\n if (typeName === 'ZodObject') {\n return prettyPrintZodSchema(val);\n }\n if (typeName === 'ZodEnum') {\n const enumValues = valDef.values;\n if (Array.isArray(enumValues)) {\n return `z.enum([${enumValues.map(v => `'${v}'`).join(', ')}])`;\n }\n return 'z.enum([...])';\n }\n if (typeName === 'ZodLiteral') {\n const literalValue = valDef.value;\n if (typeof literalValue === 'string') {\n return `z.literal('${literalValue}')`;\n }\n return `z.literal(${literalValue})`;\n }\n if (typeName === 'ZodUnion') {\n const options = valDef.options;\n if (Array.isArray(options)) {\n return `z.union([${options.map(getBaseType).join(', ')}])`;\n }\n return 'z.union([...])';\n }\n if (typeName === 'ZodDate') {\n return 'z.date()';\n }\n if (typeName === 'ZodRecord') {\n const keyType = valDef.keyType;\n const valueType = valDef.valueType;\n\n let keyTypeStr = 'z.string()';\n if (keyType && keyType._def?.typeName !== 'ZodString') {\n keyTypeStr = getBaseType(keyType);\n }\n\n let valueTypeStr = 'z.any()';\n if (valueType) {\n valueTypeStr = getBaseType(valueType);\n }\n\n return `z.record(${keyTypeStr}, ${valueTypeStr})`;\n }\n if (typeName === 'ZodMap') {\n const keyType = valDef.keyType;\n const valueType = valDef.valueType;\n\n let keyTypeStr = 'z.any()';\n if (keyType) {\n keyTypeStr = getBaseType(keyType);\n }\n\n let valueTypeStr = 'z.any()';\n if (valueType) {\n valueTypeStr = getBaseType(valueType);\n }\n\n return `z.map(${keyTypeStr}, ${valueTypeStr})`;\n }\n if (typeName === 'ZodTuple') {\n const items = valDef.items;\n\n if (Array.isArray(items)) {\n const itemsTypeStr = items.map(item => getBaseType(item)).join(', ');\n return `z.tuple([${itemsTypeStr}])`;\n }\n return 'z.tuple([])';\n }\n if (typeName === 'ZodNullable') {\n return `${getBaseType(valDef.innerType)}.nullable()`;\n }\n if (typeName === 'ZodOptional') {\n return `${getBaseType(valDef.innerType)}.optional()`;\n }\n // Add more type checks as needed\n return 'z.any()';\n };\n\n // Check for modifiers and description\n const applyModifiers = (val: any, baseType: string): string => {\n let result = baseType;\n let currentVal = val;\n\n // Check for .nullable() modifier using duck-typing\n if (currentVal?._def?.typeName === 'ZodNullable') {\n result = `${getBaseType(currentVal._def.innerType)}.nullable()`;\n currentVal = currentVal._def.innerType;\n }\n\n // Check for .optional() modifier using duck-typing\n if (currentVal?._def?.typeName === 'ZodOptional') {\n if (!result.endsWith('.nullable()')) {\n result = `${getBaseType(currentVal._def.innerType)}.optional()`;\n }\n }\n\n // Check for description\n const description = val?._def?.description;\n if (typeof description === 'string') {\n result += `.describe('${description.replace(/'/g, \"\\\\'\")}')`;\n }\n\n return result;\n };\n\n const baseType = getBaseType(value);\n const finalType = applyModifiers(value, baseType);\n\n return `${indentString}${key}: ${finalType},`;\n });\n\n return `z.object({\\n${reconstructed.join('\\n')}\\n})`;\n};\n\n\n// copied from https://github.com/browserbase/stagehand/blob/main/lib/llm/LLMProvider.ts#L62\nconst modelToProviderMap: Record<string, string> = {\n \"gpt-4.1\": \"openai\",\n \"gpt-4.1-mini\": \"openai\",\n \"gpt-4.1-nano\": \"openai\",\n \"o4-mini\": \"openai\",\n //prettier-ignore\n \"o3\": \"openai\",\n \"o3-mini\": \"openai\",\n //prettier-ignore\n \"o1\": \"openai\",\n \"o1-mini\": \"openai\",\n \"gpt-4o\": \"openai\",\n \"gpt-4o-mini\": \"openai\",\n \"gpt-4o-2024-08-06\": \"openai\",\n \"gpt-4.5-preview\": \"openai\",\n \"o1-preview\": \"openai\",\n \"claude-3-5-sonnet-latest\": \"anthropic\",\n \"claude-3-5-sonnet-20240620\": \"anthropic\",\n \"claude-3-5-sonnet-20241022\": \"anthropic\",\n \"claude-3-7-sonnet-20250219\": \"anthropic\",\n \"claude-3-7-sonnet-latest\": \"anthropic\",\n \"cerebras-llama-3.3-70b\": \"cerebras\",\n \"cerebras-llama-3.1-8b\": \"cerebras\",\n \"groq-llama-3.3-70b-versatile\": \"groq\",\n \"groq-llama-3.3-70b-specdec\": \"groq\",\n \"moonshotai/kimi-k2-instruct\": \"groq\",\n \"gemini-1.5-flash\": \"google\",\n \"gemini-1.5-pro\": \"google\",\n \"gemini-1.5-flash-8b\": \"google\",\n \"gemini-2.0-flash-lite\": \"google\",\n \"gemini-2.0-flash\": \"google\",\n \"gemini-2.5-flash-preview-04-17\": \"google\",\n \"gemini-2.5-pro-preview-03-25\": \"google\",\n};\n\nexport const modelToProvider = (model: string): string | undefined => {\n const clean = model.toLowerCase().trim();\n if (clean.startsWith(\"gpt-\") || clean.match(/^o\\d-/)) {\n return \"openai\";\n }\n if (clean.startsWith(\"claude-\")) {\n return \"anthropic\";\n }\n if (clean.startsWith(\"gemini-\")) {\n return \"google\";\n }\n if (clean.startsWith(\"cerebras-\")) {\n return \"cerebras\";\n }\n if (clean.startsWith(\"groq-\")) {\n return \"groq\";\n }\n return modelToProviderMap[clean];\n};\n\n/**\n * The session recording inject script function.\n * This function runs in the browser context and sets up rrweb recording.\n * Exported so it can be converted to a string for CDP Runtime.evaluate.\n * @param {SessionRecordingOptions} sessionRecordingOptions - Optional recording options\n * for masking inputs\n * @param {boolean} stringifyCallbackArgs - If true, stringify arguments when calling\n * lmnrSendEvents (for raw CDP bindings).\n */\nexport const injectScript = (\n sessionRecordingOptions?: SessionRecordingOptions,\n stringifyCallbackArgs?: boolean,\n) => {\n const BATCH_TIMEOUT = 2000; // Send events every 2 seconds\n const HEARTBEAT_INTERVAL = 1000;\n const CHUNK_SIZE = 256 * 1024; // 256KB chunks for CDP message limits\n\n (window as unknown as LmnrWindow).lmnrRrwebEventsBatch = [];\n (window as unknown as LmnrWindow).lmnrChunkSequence = 0;\n (window as unknown as LmnrWindow).lmnrSendInProgress = false;\n\n // Define a wrapper function that handles stringification based on the parameter\n const sendEvent = stringifyCallbackArgs\n ? (chunk: any) => (window as unknown as LmnrWindow).lmnrSendEvents(JSON.stringify(chunk))\n : (chunk: any) => (window as unknown as LmnrWindow).lmnrSendEvents(chunk);\n\n // Gzip compress a string using CompressionStream API (main thread, no workers)\n const gzipCompress = async (str: string): Promise<Uint8Array<ArrayBuffer>> => {\n const encoder = new TextEncoder();\n const inputBytes = encoder.encode(str);\n\n const cs = new CompressionStream('gzip');\n const writer = cs.writable.getWriter();\n const reader = cs.readable.getReader();\n\n // TODO: investigate why the events are not sent if we await the write and close\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n writer.write(inputBytes);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n writer.close();\n\n const parts = [];\n let totalLength = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n parts.push(value);\n totalLength += value.length;\n }\n\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n };\n\n // Convert a Uint8Array to base64 string\n const bufferToBase64 = async (buffer: Uint8Array<ArrayBuffer>): Promise<string> => {\n const base64url = await new Promise<string>((r) => {\n const reader = new FileReader();\n reader.onload = () => r(reader.result as string);\n reader.readAsDataURL(new Blob([buffer]));\n });\n return base64url.slice(base64url.indexOf(',') + 1);\n };\n\n // Create chunks from a string with metadata\n const createChunks = (str: string, batchId: string): EventChunk[] => {\n const chunks = [];\n const totalChunks = Math.ceil(str.length / CHUNK_SIZE);\n\n for (let i = 0; i < str.length; i += CHUNK_SIZE) {\n const chunk = str.slice(i, i + CHUNK_SIZE);\n chunks.push({\n batchId: batchId,\n chunkIndex: chunks.length,\n totalChunks: totalChunks,\n data: chunk,\n isFinal: chunks.length === totalChunks - 1,\n });\n }\n\n return chunks;\n };\n\n const sendBatchIfReady = async () => {\n if ((window as unknown as LmnrWindow).lmnrRrwebEventsBatch.length === 0) {\n return;\n }\n if (typeof (window as unknown as LmnrWindow).lmnrSendEvents !== 'function') {\n return;\n }\n // Prevent overlapping sends - if previous send is still in progress,\n // events stay in the batch and will be picked up next interval\n if ((window as unknown as LmnrWindow).lmnrSendInProgress) {\n return;\n }\n\n (window as unknown as LmnrWindow).lmnrSendInProgress = true;\n const events = (window as unknown as LmnrWindow).lmnrRrwebEventsBatch;\n (window as unknown as LmnrWindow).lmnrRrwebEventsBatch = [];\n\n try {\n // Compress each event's data field individually\n const compressedEvents = [];\n for (const event of events) {\n try {\n const dataString = JSON.stringify(event.data);\n const compressed = await gzipCompress(dataString);\n const base64Data = await bufferToBase64(compressed);\n compressedEvents.push({\n ...event,\n data: base64Data,\n });\n } catch (e) {\n console.error('Failed to compress event:', e);\n }\n }\n\n const batchId = `${Date.now()}_${(window as unknown as LmnrWindow).lmnrChunkSequence++}`;\n const batchString = JSON.stringify(compressedEvents);\n\n if (batchString.length <= CHUNK_SIZE) {\n sendEvent({\n batchId: batchId,\n chunkIndex: 0,\n totalChunks: 1,\n data: batchString,\n isFinal: true,\n });\n } else {\n const chunks = createChunks(batchString, batchId);\n for (const chunk of chunks) {\n sendEvent(chunk);\n }\n }\n } catch (error) {\n console.error('Failed to send events:', error);\n } finally {\n (window as unknown as LmnrWindow).lmnrSendInProgress = false;\n }\n };\n\n if (!(window as unknown as LmnrWindow).lmnrStartedRecordingEvents) {\n // It's fine to retrigger the interval even if the original function\n // is async and still running.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n setInterval(sendBatchIfReady, BATCH_TIMEOUT);\n\n (window as unknown as LmnrWindow).lmnrRrweb.record({\n emit(event: any) {\n // Synchronous emit - just push to batch, no async processing.\n // Compression happens later in sendBatchIfReady.\n (window as unknown as LmnrWindow).lmnrRrwebEventsBatch.push(event);\n },\n recordCanvas: true,\n collectFonts: true,\n recordCrossOriginIframes: true,\n maskInputOptions: {\n password: true,\n textarea: sessionRecordingOptions?.maskInputOptions?.textarea || false,\n text: sessionRecordingOptions?.maskInputOptions?.text || false,\n number: sessionRecordingOptions?.maskInputOptions?.number || false,\n select: sessionRecordingOptions?.maskInputOptions?.select || false,\n email: sessionRecordingOptions?.maskInputOptions?.email || false,\n tel: sessionRecordingOptions?.maskInputOptions?.tel || false,\n },\n });\n\n // Heartbeat events to indicate the session is still alive\n setInterval(\n () => {\n (window as unknown as LmnrWindow).lmnrRrweb.record.addCustomEvent('heartbeat', {\n title: document.title,\n url: document.URL,\n });\n },\n HEARTBEAT_INTERVAL,\n );\n\n (window as unknown as LmnrWindow).lmnrStartedRecordingEvents = true;\n }\n};\n\n\n// Buffer for storing incomplete chunk batches\nexport interface ChunkBuffer {\n chunks: Map<number, string>;\n total: number;\n timestamp: number;\n}\n\nconst OLD_BUFFER_TIMEOUT = 60000; // 60 seconds in milliseconds\n\nexport async function sendEvents(\n chunk: EventChunk,\n client: LaminarClient,\n chunkBuffers: Map<string, ChunkBuffer>,\n sessionId: StringUUID,\n traceId: StringUUID,\n): Promise<void> {\n try {\n // Handle chunked data\n const { batchId, chunkIndex, totalChunks, data } = chunk;\n\n // Validate required fields\n if (!sessionId || !traceId) {\n logger.debug(\"Missing sessionId or traceId in chunk\");\n return;\n }\n\n // Initialize buffer for this batch if needed\n if (!chunkBuffers.has(batchId)) {\n chunkBuffers.set(batchId, {\n chunks: new Map(),\n total: totalChunks,\n timestamp: Date.now(),\n });\n }\n\n const buffer = chunkBuffers.get(batchId)!;\n\n // Store chunk\n buffer.chunks.set(chunkIndex, data);\n\n // Check if we have all chunks\n if (buffer.chunks.size === totalChunks) {\n // Reassemble the full message\n let fullData = \"\";\n for (let i = 0; i < totalChunks; i++) {\n fullData += buffer.chunks.get(i);\n }\n\n // Parse the JSON\n const events = JSON.parse(fullData) as Record<string, any>[];\n\n // Send to server\n if (events && events.length > 0) {\n // Fire and forget - don't await to avoid blocking\n await client.browserEvents.send({ sessionId, traceId, events }).catch((error) => {\n logger.debug(\"Failed to send events: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }\n\n // Clean up buffer\n chunkBuffers.delete(batchId);\n }\n\n // Clean up old incomplete buffers\n const currentTime = Date.now();\n const toDelete: string[] = [];\n\n for (const [bid, buffer] of chunkBuffers.entries()) {\n if (currentTime - buffer.timestamp > OLD_BUFFER_TIMEOUT) {\n toDelete.push(bid);\n }\n }\n\n for (const bid of toDelete) {\n logger.debug(`Cleaning up incomplete chunk buffer: ${bid}`);\n chunkBuffers.delete(bid);\n }\n } catch (error) {\n logger.debug(\"Could not send events: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n}\n","import { LaminarClient } from '@lmnr-ai/client';\nimport { SessionRecordingOptions } from '@lmnr-ai/types';\nimport { diag, type Span, trace } from '@opentelemetry/api';\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\nimport type * as PlaywrightLib from \"playwright\";\nimport type { Browser, BrowserContext, Page } from 'playwright';\n\nimport { version as SDK_VERSION } from \"../../package.json\";\nimport { observe } from '../decorators';\nimport { Laminar } from '../laminar';\nimport { TRACE_HAS_BROWSER_SESSION } from '../opentelemetry-lib/tracing/attributes';\nimport { LaminarContextManager } from '../opentelemetry-lib/tracing/context';\nimport { initializeLogger, newUUID, NIL_UUID, otelTraceIdToUUID, StringUUID } from '../utils';\nimport {\n ChunkBuffer,\n EventChunk,\n injectSessionRecorder,\n LMNR_SEND_EVENTS_FUNCTION_NAME,\n sendEvents,\n takeFullSnapshot,\n} from \"./utils\";\n\nconst logger = initializeLogger();\n\n/* eslint-disable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type\n*/\nexport class PlaywrightInstrumentation extends InstrumentationBase {\n private _patchedBrowsers: Set<Browser> = new Set();\n private _parentSpans: Map<StringUUID, Span> = new Map();\n private _client: LaminarClient;\n private _sessionRecordingOptions?: SessionRecordingOptions;\n\n constructor(client: LaminarClient, sessionRecordingOptions?: SessionRecordingOptions) {\n super(\n \"@lmnr/playwright-instrumentation\",\n SDK_VERSION,\n {\n enabled: true,\n },\n );\n this._client = client;\n this._sessionRecordingOptions = sessionRecordingOptions;\n }\n\n // It's the caller's responsibility to ensure the span is ended\n public setParentSpanForSession(sessionId: StringUUID, span: Span) {\n this._parentSpans.set(sessionId, span);\n }\n\n public removeAndEndParentSpanForSession(sessionId: StringUUID) {\n const span = this._parentSpans.get(sessionId);\n if (span && span.isRecording()) {\n span.end();\n }\n this._parentSpans.delete(sessionId);\n }\n\n public getParentSpanForSession(sessionId: StringUUID): Span | undefined {\n return this._parentSpans.get(sessionId);\n }\n\n protected init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(\n \"playwright\",\n // TODO: test if the older versions work\n ['>=1.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return module;\n }\n\n public manuallyInstrument(pwModule: {\n chromium?: typeof PlaywrightLib.chromium,\n firefox?: typeof PlaywrightLib.firefox,\n webkit?: typeof PlaywrightLib.webkit,\n }) {\n const browsers = [pwModule.chromium, pwModule.firefox, pwModule.webkit] as const;\n\n for (const browserType of browsers) {\n if (browserType) {\n this._wrap(\n browserType,\n 'launch',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n browserType,\n 'connect',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n browserType,\n 'connectOverCDP',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n browserType,\n 'launchPersistentContext',\n this.patchBrowserNewContext(),\n );\n }\n }\n\n return pwModule;\n }\n\n private patch(moduleExports: typeof PlaywrightLib, moduleVersion?: string) {\n diag.debug(`patching playwright ${moduleVersion}`);\n const browsers = ['chromium', 'firefox', 'webkit'] as const;\n\n for (const browserType of browsers) {\n if (moduleExports[browserType]) {\n // First we need to patch the browser launch to get access to the Page class\n this._wrap(\n moduleExports[browserType],\n `launch`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports[browserType],\n `connect`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports[browserType],\n 'connectOverCDP',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports[browserType],\n 'launchPersistentContext',\n this.patchBrowserNewContext(),\n );\n }\n }\n\n return moduleExports;\n }\n\n private unpatch(moduleExports: typeof PlaywrightLib, moduleVersion?: string) {\n diag.debug(`unpatching playwright ${moduleVersion}`);\n const browsers = ['chromium', 'firefox', 'webkit'] as const;\n\n for (const browserType of browsers) {\n if (moduleExports[browserType]) {\n // First we need to patch the browser launch to get access to the Page class\n this._wrap(\n moduleExports[browserType],\n `launch`,\n this.patchNewBrowser(),\n );\n }\n }\n\n for (const browser of this._patchedBrowsers) {\n this._unwrap(browser, 'newContext');\n }\n }\n\n private patchNewBrowser() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: any[]) {\n const browser: Browser = await original.call(this, ...args);\n const sessionId = newUUID();\n\n for (const context of browser.contexts()) {\n context.on('page', (page: Page) => plugin.patchPage(page, sessionId));\n for (const page of context.pages()) {\n await plugin.patchPage(page, sessionId);\n }\n }\n\n plugin._wrap(\n browser,\n 'newContext',\n plugin.patchBrowserNewContext(),\n );\n\n plugin._patchedBrowsers.add(browser);\n return browser;\n };\n }\n\n private patchBrowserNewContext() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: unknown[]) {\n const context: BrowserContext = await original.bind(this).apply(this, args);\n const sessionId = newUUID();\n // Patch pages created by browser, e.g. new tab\n context.on('page', async (page) => plugin.patchPage(page, sessionId));\n\n // Patch pages that are already created\n for (const page of context.pages()) {\n await plugin.patchPage(page, sessionId);\n }\n\n return context;\n };\n }\n\n public async patchPage(page: Page, sessionId: StringUUID) {\n const wrapped = async () => {\n // Note: be careful with await here, if the await is removed,\n // this creates a race condition, and playwright fails.\n await observe({ name: 'playwright.page' }, async () => {\n await this._patchPage(page, sessionId);\n });\n };\n\n const parentSpan = this.getParentSpanForSession(sessionId);\n if (parentSpan) {\n return await Laminar.withSpan(\n parentSpan,\n wrapped,\n );\n }\n\n return await wrapped();\n }\n\n private async _patchPage(page: Page, sessionId: StringUUID) {\n const originalBringToFront = page.bringToFront.bind(page);\n page.bringToFront = async () => {\n await originalBringToFront();\n await takeFullSnapshot(page);\n };\n\n const currentSpan = trace.getSpan(LaminarContextManager.getContext()) ?? trace.getActiveSpan();\n currentSpan?.setAttribute(TRACE_HAS_BROWSER_SESSION, true);\n const otelTraceId = currentSpan?.spanContext().traceId;\n const traceId = otelTraceId ? otelTraceIdToUUID(otelTraceId) : NIL_UUID;\n\n page.on('domcontentloaded', async () => {\n try {\n await injectSessionRecorder(page, this._sessionRecordingOptions);\n } catch (error) {\n logger.error(\"Error in onLoad handler: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n });\n\n const chunkBuffers = new Map<string, ChunkBuffer>();\n\n await injectSessionRecorder(page, this._sessionRecordingOptions);\n try {\n await page.exposeFunction(LMNR_SEND_EVENTS_FUNCTION_NAME, async (chunk: EventChunk) => {\n await sendEvents(chunk, this._client, chunkBuffers, sessionId, traceId);\n });\n } catch (error) {\n logger.debug(\"Could not expose function \" + LMNR_SEND_EVENTS_FUNCTION_NAME + \": \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}\n/* eslint-enable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type\n*/\n","import { trace } from \"@opentelemetry/api\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\n\nimport { observe as laminarObserve } from \"../../decorators\";\nimport { SPAN_TYPE } from \"../../opentelemetry-lib/tracing/attributes\";\nimport { LaminarContextManager } from \"../../opentelemetry-lib/tracing/context\";\nimport { modelToProvider } from \"../utils\";\n\nexport interface GlobalLLMClientOptions {\n provider: \"openai\" | \"anthropic\" | \"cerebras\" | \"groq\" | (string & {})\n model: string\n}\n\ninterface CreateChatCompletionOptions {\n options: {\n messages?: any[];\n temperature?: number;\n top_p?: number;\n frequency_penalty?: number;\n presence_penalty?: number;\n maxTokens?: number;\n maxOutputTokens?: number;\n response_model?: {\n name: string;\n schema: any;\n };\n tools?: any[];\n };\n logger?: (message: any) => void;\n retries?: number;\n}\n\ninterface LLMResponse {\n id: string;\n object: string;\n created: number;\n model: string;\n choices?: {\n index: number;\n message: {\n role: string;\n content: string | null;\n tool_calls?: {\n id: string;\n type: string;\n function: {\n name: string;\n arguments: string;\n };\n }[];\n };\n finish_reason: string;\n }[];\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\n/**\n * Creates a wrapper function for LLM client's createChatCompletion method\n * that adds OpenTelemetry tracing with detailed span attributes.\n *\n * This wrapper is shared between Stagehand v2 and v3 instrumentations.\n *\n * @param globalLLMClientOptions - WeakMap to track LLM client options (provider and model)\n * @returns A wrapper function compatible with OpenTelemetry's _wrap method\n */\nexport const createLLMClientCreateChatCompletionWrapper = (\n globalLLMClientOptions: WeakMap<any, GlobalLLMClientOptions | undefined>,\n) => (original: (...args: any[]) => Promise<any>) =>\n async function createChatCompletion(this: any, ...args: any[]) {\n const options = args[0] as CreateChatCompletionOptions;\n return await laminarObserve({\n name: \"createChatCompletion\",\n // input and output are set as gen_ai.prompt and gen_ai.completion\n ignoreInput: true,\n ignoreOutput: true,\n }, async () => {\n const currentSpan = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n const span = currentSpan!;\n const innerOptions = options.options;\n const recordedProvider = globalLLMClientOptions.get(this)?.provider;\n const provider = (\n recordedProvider === \"aisdk\"\n && globalLLMClientOptions.get(this)?.model\n )\n ? (\n modelToProvider(globalLLMClientOptions.get(this)!.model)\n ?? \"aisdk\"\n )\n : recordedProvider;\n\n // Set request attributes\n span.setAttributes({\n [SPAN_TYPE]: \"LLM\",\n ...(innerOptions.temperature ? {\n \"gen_ai.request.temperature\": innerOptions.temperature,\n } : {}),\n ...(innerOptions.top_p ? {\n \"gen_ai.request.top_p\": innerOptions.top_p,\n } : {}),\n ...(innerOptions.frequency_penalty ? {\n \"gen_ai.request.frequency_penalty\": innerOptions.frequency_penalty,\n } : {}),\n ...(innerOptions.presence_penalty ? {\n \"gen_ai.request.presence_penalty\": innerOptions.presence_penalty,\n } : {}),\n ...((innerOptions.maxTokens !== undefined || innerOptions.maxOutputTokens !== undefined) ? {\n \"gen_ai.request.max_tokens\": innerOptions.maxTokens ?? innerOptions.maxOutputTokens,\n } : {}),\n ...(globalLLMClientOptions.get(this) ? {\n \"gen_ai.request.model\": globalLLMClientOptions.get(this)?.model,\n \"gen_ai.system\": provider,\n } : {}),\n });\n\n // Set message attributes\n innerOptions.messages?.forEach((message, index) => {\n span.setAttributes({\n [`gen_ai.prompt.${index}.role`]: message.role,\n [`gen_ai.prompt.${index}.content`]: JSON.stringify(message.content),\n });\n });\n\n // Set tool/function attributes\n innerOptions.tools?.forEach((tool, index) => {\n span.setAttributes({\n [`llm.request.functions.${index}.name`]: tool.name,\n [`llm.request.functions.${index}.description`]: tool.description,\n [`llm.request.functions.${index}.parameters`]: JSON.stringify(tool.parameters),\n });\n });\n\n // Set structured output schema if present\n if (innerOptions.response_model?.schema) {\n const schema = zodToJsonSchema(innerOptions.response_model.schema);\n if (schema) {\n span.setAttributes({\n [`gen_ai.request.structured_output_schema`]: JSON.stringify(schema),\n });\n }\n }\n\n // Execute the original method\n const result = await original.bind(this).apply(this, args) as LLMResponse;\n\n // Set response attributes\n span.setAttributes({\n \"gen_ai.response.model\": result.model,\n \"gen_ai.usage.input_tokens\": result.usage?.prompt_tokens ?? 0,\n \"gen_ai.usage.output_tokens\": result.usage?.completion_tokens ?? 0,\n \"llm.usage.total_tokens\": result.usage?.total_tokens ?? 0,\n });\n\n // Set completion attributes\n result.choices?.forEach(choice => {\n const index = choice.index;\n span.setAttributes({\n [`gen_ai.completion.${index}.finish_reason`]: choice.finish_reason,\n [`gen_ai.completion.${index}.role`]: choice.message.role,\n });\n if (choice.message.content) {\n span.setAttribute(\n `gen_ai.completion.${index}.content`,\n JSON.stringify(choice.message.content),\n );\n }\n choice.message.tool_calls?.forEach((toolCall, toolCallIndex) => {\n span.setAttributes({\n [`gen_ai.completion.${index}.message.tool_calls.${toolCallIndex}.id`]: toolCall.id,\n [`gen_ai.completion.${index}.message.tool_calls.${toolCallIndex}.name`]:\n toolCall.function.name,\n [`gen_ai.completion.${index}.message.tool_calls.${toolCallIndex}.arguments`]:\n JSON.stringify(toolCall.function.arguments),\n });\n });\n });\n\n // Handle special case when choices is empty (structured output mode)\n if (!result.choices || result.choices.length === 0) {\n const data = (result as any).data;\n if (data) {\n span.setAttributes({\n \"gen_ai.completion.0.role\": \"assistant\",\n \"gen_ai.completion.0.content\": typeof data === \"string\"\n ? data\n : JSON.stringify(data),\n });\n }\n }\n\n return result;\n });\n };\n","import { diag, trace } from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\nimport { z } from \"zod/v3\";\n\nimport { version as SDK_VERSION } from \"../../../package.json\";\nimport { observe as laminarObserve } from \"../../decorators\";\nimport { Laminar } from \"../../laminar\";\nimport { LaminarContextManager } from \"../../opentelemetry-lib/tracing/context\";\nimport { newUUID, StringUUID } from \"../../utils\";\nimport { PlaywrightInstrumentation } from \"../playwright\";\nimport {\n cleanStagehandLLMClient,\n nameArgsOrCopy,\n prettyPrintZodSchema,\n} from \"../utils\";\nimport { createLLMClientCreateChatCompletionWrapper } from \"./shared-llm-wrapper\";\n\n// Stagehand interfaces:\ntype AvailableModel = string;\n\ninterface ActOptions {\n action: string;\n modelName?: AvailableModel;\n modelClientOptions?: any; // ClientOptions\n variables?: Record<string, string>;\n domSettleTimeoutMs?: number;\n timeoutMs?: number;\n iframes?: boolean;\n frameId?: string;\n}\ntype LLMResponse = {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: {\n index: number;\n message: {\n role: string;\n content: string | null;\n tool_calls: {\n id: string;\n type: string;\n function: {\n name: string;\n arguments: string;\n };\n }[];\n };\n finish_reason: string;\n }[];\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n};\n\ninterface ChatCompletionInnerOptions {\n messages: any[]; // ChatMessage[]\n temperature?: number;\n top_p?: number;\n frequency_penalty?: number;\n presence_penalty?: number;\n image?: {\n buffer: Buffer;\n description?: string;\n };\n response_model?: {\n name: string;\n schema: any; // ZodType\n };\n tools?: any[]; // LLMTool[]\n tool_choice?: \"auto\" | \"none\" | \"required\";\n maxTokens?: number;\n requestId?: string;\n};\n\ninterface CreateChatCompletionOptions {\n options: ChatCompletionInnerOptions;\n logger: (message: any) => void;\n retries?: number;\n}\n\ndeclare abstract class LLMClient {\n type: \"openai\" | \"anthropic\" | \"cerebras\" | \"groq\" | (string & {});\n modelName: AvailableModel | (string & {});\n hasVision: boolean;\n clientOptions: any; // ClientOptions\n userProvidedInstructions?: string;\n constructor(modelName: AvailableModel, userProvidedInstructions?: string);\n abstract createChatCompletion<T = LLMResponse>(\n options: CreateChatCompletionOptions\n ): Promise<T>;\n generateText: (args: any) => Promise<any>;\n streamText: (args: any) => any;\n streamObject: (args: any) => any;\n generateImage: (args: any) => Promise<any>;\n embed: (args: any) => Promise<any>;\n embedMany: (args: any) => Promise<any>;\n transcribe: (args: any) => Promise<any>;\n generateSpeech: (args: any) => Promise<any>;\n};\n\ninterface StagehandPage {\n act: (args: any) => Promise<any>;\n extract: (args: any) => Promise<any>;\n observe: (args: any) => Promise<any>;\n on: (args: any) => any;\n}\n// ================================\n\n\ninterface GlobalLLMClientOptions {\n // named `type` in Stagehand\n provider: \"openai\" | \"anthropic\" | \"cerebras\" | \"groq\" | (string & {})\n model: string\n}\n\ntype AgentClient = {\n execute: (\n instructionOrOptions: string | object,\n ) => Promise<object>;\n};\n\n/* eslint-disable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return\n*/\nexport class StagehandV2Instrumentation extends InstrumentationBase {\n private playwrightInstrumentation: PlaywrightInstrumentation;\n private globalLLMClientOptions: WeakMap<\n LLMClient,\n GlobalLLMClientOptions | undefined\n > = new WeakMap();\n private globalAgentOptions: WeakMap<\n object,\n Record<string, any> | undefined\n > = new WeakMap();\n private stagehandInstanceToSessionId: WeakMap<object, StringUUID> = new WeakMap();\n\n constructor(playwrightInstrumentation: PlaywrightInstrumentation) {\n super(\n \"@lmnr/browserbase-stagehand-instrumentation\",\n SDK_VERSION,\n {\n enabled: true,\n },\n );\n this.playwrightInstrumentation = playwrightInstrumentation;\n }\n\n protected init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(\n \"@browserbasehq/stagehand\",\n ['>=1.0.0 <3.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return module;\n }\n\n private patch(moduleExports: any, moduleVersion?: string) {\n diag.debug(`patching stagehand ${moduleVersion}`);\n // Check if Stagehand is non-configurable\n const descriptor = Object.getOwnPropertyDescriptor(moduleExports, 'Stagehand');\n if (descriptor && !descriptor.configurable) {\n // Create a proxy for the entire module exports\n const originalStagehand = moduleExports.Stagehand;\n const patchedConstructor = this.patchStagehandConstructor()(originalStagehand);\n\n // Create a proxy for the module exports\n return new Proxy(moduleExports, {\n get: (target, prop) => {\n if (prop === 'Stagehand') {\n return patchedConstructor;\n }\n return target[prop as keyof typeof target];\n },\n });\n } else {\n // If it's configurable, use the standard _wrap method\n this._wrap(\n moduleExports,\n 'Stagehand',\n this.patchStagehandConstructor(),\n );\n\n return moduleExports;\n }\n }\n\n public manuallyInstrument(Stagehand: any) {\n diag.debug('manually instrumenting stagehand');\n\n // Since we can't replace the Stagehand constructor directly due to non-configurable property,\n // we'll patch the prototype methods of the existing constructor\n\n // First, patch the init method on the prototype\n if (Stagehand && Stagehand.prototype) {\n this._wrap(\n Stagehand.prototype,\n 'init',\n this.patchStagehandInit(),\n );\n this._wrap(\n Stagehand.prototype,\n 'close',\n this.patchStagehandClose(),\n );\n }\n }\n\n private unpatch(moduleExports: any, moduleVersion?: string) {\n diag.debug(`unpatching stagehand ${moduleVersion}`);\n this._unwrap(moduleExports, 'Stagehand');\n\n if (moduleExports.Stagehand) {\n this._unwrap(moduleExports.Stagehand.prototype, 'init');\n this._unwrap(moduleExports.Stagehand.prototype, 'close');\n if (moduleExports.Stagehand.prototype?.page) {\n this._unwrap(moduleExports.Stagehand.prototype.page, 'act');\n this._unwrap(moduleExports.Stagehand.prototype.page, 'extract');\n this._unwrap(moduleExports.Stagehand.prototype.page, 'observe');\n const observeHandler = (moduleExports.Stagehand.prototype.page).observeHandler;\n if (observeHandler) {\n this._unwrap(observeHandler, 'observe');\n }\n const extractHandler = (moduleExports.Stagehand.prototype.page).extractHandler;\n if (extractHandler) {\n this._unwrap(extractHandler, 'textExtract');\n this._unwrap(extractHandler, 'domExtract');\n }\n const actHandler = (moduleExports.Stagehand.prototype.page).actHandler;\n if (actHandler) {\n this._unwrap(actHandler, 'act');\n }\n }\n }\n\n return moduleExports;\n }\n\n private patchStagehandConstructor() {\n const instrumentation = this;\n\n return (Original: any) => {\n // Create a constructor function that maintains the same signature\n const Stagehand = function (this: InstanceType<typeof Original>, ...args: any[]) {\n // Only apply if this is a new instance\n if (!(this instanceof Stagehand)) {\n return new (Stagehand)(...args);\n }\n\n const instance = new Original(args.length > 0 ? args[0] : undefined);\n Object.assign(this, instance);\n\n instrumentation._wrap(\n this,\n 'init',\n instrumentation.patchStagehandInit(),\n );\n\n instrumentation._wrap(\n this,\n 'close',\n instrumentation.patchStagehandClose(),\n );\n\n return this;\n } as unknown as typeof Original;\n\n // Copy static properties\n Object.setPrototypeOf(Stagehand, Original);\n // Copy prototype properties\n Stagehand.prototype = Object.create(Original.prototype);\n Stagehand.prototype.constructor = Stagehand;\n\n return Stagehand;\n };\n }\n\n private patchStagehandInit() {\n const instrumentation = this;\n\n return (original: any) => async function method(this: any) {\n const sessionId = newUUID();\n\n // Make sure the parent span is set before calling the original init method\n // so that playwright instrumentation does not set its default parent span\n const parentSpan = Laminar.startSpan({\n name: 'Stagehand',\n });\n instrumentation.playwrightInstrumentation.setParentSpanForSession(sessionId, parentSpan);\n\n const result = await original.bind(this).apply(this);\n for (const page of this.context.pages()) {\n await instrumentation.playwrightInstrumentation.patchPage(page, sessionId);\n }\n await instrumentation.playwrightInstrumentation.patchPage(this.page, sessionId);\n\n instrumentation._wrap(\n this,\n 'agent',\n instrumentation.patchStagehandAgentInitializer(sessionId),\n );\n\n // when new playwright page opens, we need to add playwright instrumentation\n // to it and instrument the stagehand page stored on the stagehand instance\n this.context.on('page', async (page: any) => {\n await instrumentation.playwrightInstrumentation.patchPage(page, sessionId);\n instrumentation.patchStagehandPage(this.stagehandPage, sessionId);\n });\n\n instrumentation.patchStagehandPage(this.stagehandPage, sessionId);\n if (this.llmClient) {\n instrumentation.globalLLMClientOptions.set(this.llmClient, {\n provider: this.llmClient.type,\n model: this.llmClient.modelName,\n });\n instrumentation._wrap(\n this.llmClient,\n 'createChatCompletion',\n instrumentation.patchStagehandLLMClientCreateChatCompletion(),\n );\n }\n\n instrumentation.stagehandInstanceToSessionId.set(this, sessionId);\n return result;\n };\n }\n\n private patchStagehandClose() {\n const instrumentation = this;\n return (original: Function) => async function method(this: any, ...args: any[]) {\n // Clean up the session from the registry\n const sessionId = instrumentation.stagehandInstanceToSessionId.get(this);\n if (sessionId) {\n instrumentation.playwrightInstrumentation.removeAndEndParentSpanForSession(sessionId);\n instrumentation.stagehandInstanceToSessionId.delete(this);\n }\n\n await original.bind(this).apply(this, args);\n };\n }\n\n private patchStagehandPage(page: StagehandPage, sessionId: StringUUID) {\n const actHandler = (page as any).actHandler;\n if (actHandler) {\n if (actHandler.act) {\n this._wrap(\n actHandler,\n 'act',\n this.patchStagehandV1ActHandlerAct(),\n );\n }\n if (actHandler.actFromObserveResult) {\n this._wrap(\n actHandler,\n 'actFromObserveResult',\n this.patchStagehandV2ActHandlerActFromObserveResult(),\n );\n }\n if (actHandler.observeAct) {\n this._wrap(\n actHandler,\n 'observeAct',\n this.patchStagehandV2ActHandlerObserveAct(),\n );\n }\n }\n\n const observeHandler = (page as any).observeHandler;\n if (observeHandler) {\n this._wrap(\n observeHandler,\n 'observe',\n this.patchStagehandObserveHandler(),\n );\n }\n\n const extractHandler = (page as any).extractHandler;\n if (extractHandler) {\n if (extractHandler.textExtract) {\n this._wrap(\n extractHandler,\n 'textExtract',\n this.patchStagehandExtractHandlerTextExtract(),\n );\n }\n\n if (extractHandler.domExtract) {\n this._wrap(\n extractHandler,\n 'domExtract',\n this.patchStagehandExtractHandlerDomExtract(),\n );\n }\n }\n\n this._wrap(\n page,\n 'act',\n this.patchStagehandGlobalMethod('act', sessionId),\n );\n\n this._wrap(\n page,\n 'extract',\n this.patchStagehandGlobalMethod('extract', sessionId),\n );\n\n this._wrap(\n page,\n 'observe',\n this.patchStagehandGlobalMethod('observe', sessionId),\n );\n }\n\n private patchStagehandGlobalMethod(methodName: string, sessionId: StringUUID) {\n const instrumentation = this;\n return (original: (...args: any[]) => Promise<any>) =>\n async function method(this: any, ...args: any[]) {\n const input = nameArgsOrCopy(args);\n if (methodName === \"extract\"\n && Array.isArray(input)\n && input.length > 0 && (input[0])?.schema\n ) {\n // We need to clone the input object to avoid mutating the original object\n // because the original object is passed to the LLM client\n const { schema, ...rest } = input[0];\n let prettySchema = schema?.shape;\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n input[0] = { ...rest, schema: prettySchema };\n }\n return await Laminar.withSpan(\n instrumentation.playwrightInstrumentation.getParentSpanForSession(sessionId)!,\n async () => await laminarObserve(\n {\n name: `stagehand.${methodName}`,\n input,\n },\n async (thisArg: any, rest: any[]) => await original.apply(thisArg, rest),\n this, args,\n ),\n );\n };\n }\n\n private patchStagehandV1ActHandlerAct() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function act(this: any, ...args: any[]) {\n return await laminarObserve(\n {\n name: 'stagehand.actHandler.act',\n input: {\n action: args[0].action,\n llmClient: cleanStagehandLLMClient(args[0].llmClient ?? {}),\n chunksSeen: args[0].chunksSeen,\n steps: args[0].steps,\n requestId: args[0].requestId,\n schema: args[0].schema,\n retries: args[0].retries,\n variables: args[0].variables,\n previousSelectors: args[0].previousSelectors,\n skipActionCacheForThisStep: args[0].skipActionCacheForThisStep,\n domSettleTimeoutMs: args[0].domSettleTimeoutMs,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandV2ActHandlerActFromObserveResult() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function act(this: any, ...args: any[]) {\n return await laminarObserve(\n {\n name: 'stagehand.actHandler.actFromObserveResult',\n input: {\n observe: args?.[0] ?? null,\n domSettleTimeoutMs: args?.[1] ?? null,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandV2ActHandlerObserveAct() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function act(this: any, ...args: any[]) {\n const actOptions = args?.[0] as ActOptions | undefined;\n const llmClient = args.filter((arg) =>\n Object.keys(arg).includes('modelName'),\n )[0] as LLMClient | undefined;\n const requestId = typeof args?.[3] === 'string' ? args?.[3] : null;\n return await laminarObserve(\n {\n name: 'stagehand.actHandler.observeAct',\n input: {\n action: actOptions?.action,\n modelName: actOptions?.modelName,\n variables: actOptions?.variables,\n domSettleTimeoutMs: actOptions?.domSettleTimeoutMs,\n timeoutMs: actOptions?.timeoutMs,\n llmClient: cleanStagehandLLMClient(llmClient ?? {}),\n requestId: requestId,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n // Stagehand uses zod 3.x, so we need to use the v3 version of zod\n private patchStagehandExtractHandlerTextExtract() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function textExtract(this: any, ...args: any[]) {\n const schema = (args[0].schema as z.AnyZodObject);\n let prettySchema = schema?.shape;\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n return await laminarObserve(\n {\n name: 'stagehand.extractHandler.textExtract',\n input: {\n instruction: args[0].instruction,\n llmClient: cleanStagehandLLMClient(args[0].llmClient ?? {}),\n requestId: args[0].requestId,\n schema: prettySchema,\n content: args[0].content,\n domSettleTimeoutMs: args[0].domSettleTimeoutMs,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandExtractHandlerDomExtract() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function domExtract(this: any, ...args: any[]) {\n const schema = (args[0].schema as z.AnyZodObject);\n let prettySchema = schema?.shape;\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n\n return await laminarObserve(\n {\n name: 'stagehand.extractHandler.domExtract',\n input: {\n instruction: args[0].instruction,\n llmClient: cleanStagehandLLMClient(args[0].llmClient ?? {}),\n requestId: args[0].requestId,\n schema: prettySchema,\n content: args[0].content,\n chunksSeen: args[0].chunksSeen,\n domSettleTimeoutMs: args[0].domSettleTimeoutMs,\n },\n },\n async () => await original.apply(this, args),\n );\n };\n }\n\n private patchStagehandObserveHandler() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function observe(this: any, ...args: any[]) {\n\n return await laminarObserve(\n {\n name: 'stagehand.observeHandler.observe',\n input: {\n instruction: args[0].instruction,\n llmClient: cleanStagehandLLMClient(args[0].llmClient ?? {}),\n requestId: args[0].requestId,\n returnAction: args[0].returnAction,\n onlyVisible: args[0].onlyVisible,\n drawOverlay: args[0].drawOverlay,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandLLMClientCreateChatCompletion() {\n return createLLMClientCreateChatCompletionWrapper(this.globalLLMClientOptions);\n }\n\n private patchStagehandAgentInitializer(sessionId: StringUUID) {\n const instrumentation = this;\n return (original: (...args: any[]) => any) =>\n function agent(this: any, ...args: any[]) {\n if (args.length > 0 && typeof args[0] === 'object') {\n instrumentation.globalAgentOptions.set(this, args[0]);\n }\n const agent = original.bind(this).apply(this, args);\n instrumentation.patchStagehandAgent(agent, sessionId);\n return agent;\n };\n }\n\n private patchStagehandAgent(agent: AgentClient, sessionId: StringUUID) {\n this._wrap(\n agent,\n 'execute',\n this.patchStagehandAgentExecute(sessionId),\n );\n }\n\n private patchStagehandAgentExecute(sessionId: StringUUID) {\n const instrumentation = this;\n return (original: (this: any, ...args: any[]) => Promise<any>) =>\n async function execute(this: any, ...args: any[]) {\n const input = nameArgsOrCopy(args);\n\n return await Laminar.withSpan(\n instrumentation.playwrightInstrumentation.getParentSpanForSession(sessionId)!,\n async () => await laminarObserve(\n {\n name: 'stagehand.agent.execute',\n input,\n },\n async () => await laminarObserve(\n {\n name: 'execute',\n // input and output are set as gen_ai.prompt and gen_ai.completion\n ignoreInput: true,\n ignoreOutput: true,\n spanType: \"LLM\",\n },\n async () => {\n const span = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n\n const provider = instrumentation.globalAgentOptions.get(this)?.provider\n ?? instrumentation.globalLLMClientOptions.get(this)?.provider;\n const model = instrumentation.globalAgentOptions.get(this)?.model\n ?? instrumentation.globalLLMClientOptions.get(this)?.model;\n span?.setAttributes({\n ...(provider ? { \"gen_ai.system\": provider } : {}),\n ...(model ? { \"gen_ai.request.model\": model } : {}),\n });\n\n let promptIndex = 0;\n if (instrumentation.globalAgentOptions.get(this)?.instructions) {\n span?.setAttributes({\n \"gen_ai.prompt.0.content\":\n instrumentation.globalAgentOptions.get(this)?.instructions,\n \"gen_ai.prompt.0.role\": \"system\",\n });\n promptIndex++;\n }\n\n const instruction = typeof input === 'string' ? input : (input as any).instruction;\n if (instruction) {\n span?.setAttributes({\n [`gen_ai.prompt.${promptIndex}.content`]: instruction,\n [`gen_ai.prompt.${promptIndex}.role`]: \"user\",\n });\n }\n\n const result = await original\n .bind(this)\n .apply(this, args);\n\n if (result.completed && result.success && result.message) {\n const content = [{ type: \"text\", text: result.message }];\n if (result.actions && result.actions.length > 0) {\n content.push({\n type: \"text\",\n text: JSON.stringify({ actions: result.actions }),\n });\n }\n span?.setAttributes({\n \"gen_ai.completion.0.content\": JSON.stringify(content),\n \"gen_ai.completion.0.role\": \"assistant\",\n });\n } else if (result.completed && !result.success) {\n span?.recordException(new Error(result.message));\n }\n if (result.usage) {\n span?.setAttributes({\n \"gen_ai.usage.input_tokens\": result.usage.input_tokens,\n \"gen_ai.usage.output_tokens\": result.usage.output_tokens,\n \"llm.usage.total_tokens\":\n result.usage.input_tokens + result.usage.output_tokens,\n });\n }\n return result;\n },\n ),\n ),\n );\n };\n }\n}\n/* eslint-enable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return\n*/\n","import { LaminarClient } from '@lmnr-ai/client';\nimport { SessionRecordingOptions } from '@lmnr-ai/types';\nimport { diag, trace } from '@opentelemetry/api';\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\nimport type * as PuppeteerLib from \"puppeteer\";\nimport type { Browser, BrowserContext, Page } from 'puppeteer';\nimport type * as PuppeteerCoreLib from \"puppeteer-core\";\n\nimport { version as SDK_VERSION } from \"../../package.json\";\nimport { observe } from '../decorators';\nimport { TRACE_HAS_BROWSER_SESSION } from '../opentelemetry-lib/tracing/attributes';\nimport { LaminarContextManager } from '../opentelemetry-lib/tracing/context';\nimport { initializeLogger, newUUID, NIL_UUID, otelTraceIdToUUID, StringUUID } from '../utils';\nimport {\n ChunkBuffer,\n EventChunk,\n injectSessionRecorder,\n LMNR_SEND_EVENTS_FUNCTION_NAME,\n sendEvents,\n takeFullSnapshot,\n} from \"./utils\";\n\nconst logger = initializeLogger();\n\n\n/* eslint-disable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type\n*/\nexport class PuppeteerInstrumentation extends InstrumentationBase {\n private _patchedBrowsers: Set<Browser> = new Set();\n private _client: LaminarClient;\n private _sessionRecordingOptions?: SessionRecordingOptions;\n\n constructor(client: LaminarClient, sessionRecordingOptions?: SessionRecordingOptions) {\n super(\n \"@lmnr/puppeteer-instrumentation\",\n SDK_VERSION,\n {\n enabled: true,\n },\n );\n this._client = client;\n this._sessionRecordingOptions = sessionRecordingOptions;\n }\n\n protected init(): InstrumentationModuleDefinition[] {\n const puppeteerInstrumentation = new InstrumentationNodeModuleDefinition(\n \"puppeteer\",\n // About two years before first writing this instrumentation\n // and apparently no big breaking changes afterwards\n // https://github.com/puppeteer/puppeteer/releases\n ['>=19.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n const puppeteerCoreInstrumentation = new InstrumentationNodeModuleDefinition(\n \"puppeteer-core\",\n ['>=19.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return [puppeteerInstrumentation, puppeteerCoreInstrumentation];\n }\n\n public manuallyInstrument(puppeteerModule: typeof PuppeteerLib | typeof PuppeteerCoreLib) {\n this._wrap(\n puppeteerModule,\n 'launch',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n puppeteerModule,\n 'connect',\n this.patchNewBrowser(),\n );\n\n return puppeteerModule;\n }\n\n private patch(\n moduleExports: typeof PuppeteerLib | typeof PuppeteerCoreLib,\n moduleVersion?: string,\n ) {\n diag.debug(`patching puppeteer ${moduleVersion}`);\n this._wrap(\n moduleExports,\n `launch`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports.PuppeteerNode.prototype,\n `launch`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports,\n `connect`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports.Puppeteer.prototype,\n `connect`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports.default,\n `launch`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports.default,\n `connect`,\n this.patchNewBrowser(),\n );\n\n return moduleExports;\n }\n\n private unpatch(moduleExports: typeof PuppeteerLib, moduleVersion?: string) {\n diag.debug(`unpatching puppeteer ${moduleVersion}`);\n this._unwrap(\n moduleExports,\n `launch`,\n );\n\n this._unwrap(\n moduleExports,\n `connect`,\n );\n\n this._unwrap(\n moduleExports.PuppeteerNode.prototype,\n `launch`,\n );\n\n this._unwrap(\n moduleExports.Puppeteer.prototype,\n `connect`,\n );\n\n this._unwrap(\n moduleExports.default,\n `connect`,\n );\n\n this._unwrap(\n moduleExports.default,\n `launch`,\n );\n\n for (const browser of this._patchedBrowsers) {\n this._unwrap(browser, 'createBrowserContext');\n }\n }\n\n private patchNewBrowser() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: any[]) {\n const browser: Browser = await original.call(this, ...args);\n const sessionId = newUUID();\n\n for (const context of browser.browserContexts()) {\n context.on('targetcreated', (target) => {\n target.page().then(page => {\n if (page) {\n plugin.patchPage(page, sessionId).catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }\n })\n .catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n await Promise.all((await context.pages()).map(page => plugin.patchPage(page, sessionId)));\n }\n\n plugin._wrap(\n browser,\n 'createBrowserContext',\n plugin.patchBrowserNewContext(),\n );\n\n plugin._patchedBrowsers.add(browser);\n return browser;\n };\n }\n\n private patchBrowserNewContext() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: unknown[]) {\n const context: BrowserContext = await original.bind(this).apply(this, args);\n const sessionId = newUUID();\n // Patch pages created by browser, e.g. new tab\n context.on('targetcreated', (target) => {\n target.page().then(page => {\n if (page) {\n plugin.patchPage(page, sessionId).catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }\n })\n .catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n context.on('targetchanged', (target) => {\n target.page().then(page => {\n if (page) {\n plugin.patchPage(page, sessionId).catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }\n })\n .catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n\n // Patch pages that are already created\n for (const page of await context.pages()) {\n await plugin.patchPage(page, sessionId);\n }\n\n return context;\n };\n }\n\n public async patchPage(page: Page, sessionId: StringUUID) {\n return await observe({ name: 'puppeteer.page' }, async () => {\n await this._patchPage(page, sessionId);\n });\n }\n\n private async _patchPage(page: Page, sessionId: StringUUID) {\n const originalBringToFront = page.bringToFront.bind(page);\n\n page.bringToFront = async () => {\n await originalBringToFront();\n await takeFullSnapshot(page);\n };\n\n const currentSpan = trace.getSpan(LaminarContextManager.getContext()) ?? trace.getActiveSpan();\n currentSpan?.setAttribute(TRACE_HAS_BROWSER_SESSION, true);\n const otelTraceId = currentSpan?.spanContext().traceId;\n const traceId = otelTraceId ? otelTraceIdToUUID(otelTraceId) : NIL_UUID;\n\n page.on('domcontentloaded', () => {\n injectSessionRecorder(page, this._sessionRecordingOptions).catch(error => {\n logger.error(\"Error in onLoad handler: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n\n await injectSessionRecorder(page, this._sessionRecordingOptions);\n\n const chunkBuffers = new Map<string, ChunkBuffer>();\n\n try {\n await page.exposeFunction(LMNR_SEND_EVENTS_FUNCTION_NAME, async (chunk: EventChunk) => {\n await sendEvents(chunk, this._client, chunkBuffers, sessionId, traceId);\n });\n } catch (error) {\n logger.debug(\"Could not expose function \" + LMNR_SEND_EVENTS_FUNCTION_NAME + \": \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}\n/* eslint-enable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type\n*/\n","import { initializeLogger } from \"../../../utils\";\n\nexport const logger = initializeLogger();\n\n// CDP timeout for operations\nexport const CDP_OPERATION_TIMEOUT_MS = 10000;\n\n// URLs that should be skipped for recording\nexport const SKIP_URL_PATTERNS = [\n \"about:blank\",\n \"chrome-error://\",\n \"chrome://\",\n \"edge-error://\",\n \"edge://\",\n \"about:neterror\",\n \"about:certerror\",\n \"devtools://\",\n];\n","import { SessionRecordingOptions } from \"@lmnr-ai/types\";\n\nimport { RECORDER } from \"../../recorder\";\nimport { injectScript } from \"../../utils\";\nimport {\n CDP_OPERATION_TIMEOUT_MS,\n logger,\n SKIP_URL_PATTERNS,\n} from \"./constants\";\nimport {\n type FrameTree,\n type RuntimeBindingCalledEvent,\n type RuntimeEvaluateResult,\n type StagehandCdpConnection,\n type StagehandV3Page,\n type V3RecorderState,\n} from \"./types\";\n\n/**\n * Check if a URL should be skipped for recording (error pages, blank pages, etc.)\n */\nexport function shouldSkipUrl(url: string): boolean {\n if (!url) return true;\n return SKIP_URL_PATTERNS.some(pattern => url.startsWith(pattern));\n}\n\n/**\n * Create an isolated world for a page and return the execution context ID\n */\nexport async function getOrCreateIsolatedWorld(\n page: StagehandV3Page,\n): Promise<{ contextId: number; frameId: string } | null> {\n try {\n // Get the frame tree to find the main frame\n const frameTreeResult = await Promise.race([\n page.sendCDP<{ frameTree: FrameTree }>(\"Page.getFrameTree\"),\n new Promise<null>((_, reject) =>\n setTimeout(() => reject(new Error(\"Timeout getting frame tree\")), CDP_OPERATION_TIMEOUT_MS),\n ),\n ]);\n\n if (!frameTreeResult) return null;\n\n const frameId = frameTreeResult.frameTree.frame.id;\n\n // Create isolated world\n const isolatedWorldResult = await Promise.race([\n page.sendCDP<{ executionContextId: number }>(\"Page.createIsolatedWorld\", {\n frameId,\n worldName: \"laminar-recorder\",\n }),\n new Promise<null>((_, reject) =>\n setTimeout(() => reject(\n new Error(\"Timeout creating isolated world\")), CDP_OPERATION_TIMEOUT_MS,\n ),\n ),\n ]);\n\n if (!isolatedWorldResult) return null;\n\n return {\n contextId: isolatedWorldResult.executionContextId,\n frameId,\n };\n } catch (error) {\n logger.debug(\"Failed to create isolated world: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n}\n\n/**\n * Check if the session recorder is already present in the page\n */\nexport async function isRecorderPresent(\n page: StagehandV3Page,\n contextId: number,\n): Promise<boolean> {\n try {\n const result = await Promise.race([\n page.sendCDP<RuntimeEvaluateResult>(\"Runtime.evaluate\", {\n expression: \"typeof window.lmnrRrweb !== 'undefined'\",\n contextId,\n returnByValue: true,\n }),\n new Promise<null>((_, reject) =>\n setTimeout(() => reject(new Error(\"Timeout checking recorder\")), CDP_OPERATION_TIMEOUT_MS),\n ),\n ]);\n\n if (!result) return true; // On timeout, assume present to avoid double injection\n return result.result?.value === true;\n } catch (error) {\n logger.debug(\"Failed to check if recorder is present: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n return true; // On error, assume present to be safe\n }\n}\n\n/**\n * Inject the session recorder into a page using CDP\n */\nexport async function injectRecorderViaCDP(\n page: StagehandV3Page,\n state: V3RecorderState,\n conn: StagehandCdpConnection,\n sessionRecordingOptions?: SessionRecordingOptions,\n bindingHandler?: (event: RuntimeBindingCalledEvent) => void,\n): Promise<number | null> {\n try {\n // Check if we should skip this page\n let url: string;\n try {\n url = page.url();\n } catch (error) {\n logger.debug(\"Failed to get page URL, page might be closed: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n\n if (shouldSkipUrl(url)) {\n logger.debug(`Skipping recorder injection for URL: ${url}`);\n return null;\n }\n\n // Get or create isolated world\n const worldResult = await getOrCreateIsolatedWorld(page);\n if (!worldResult) {\n logger.debug(\"Failed to get isolated world for page\");\n return null;\n }\n\n const { contextId, frameId } = worldResult;\n\n // Check if already injected\n if (await isRecorderPresent(page, contextId)) {\n logger.debug(\"Recorder already present, skipping injection\");\n // Still register the context mapping\n state.contextIdToSession.set(contextId, {\n sessionId: state.sessionId,\n traceId: state.traceId,\n });\n return contextId;\n }\n\n // Inject rrweb base\n try {\n await page.sendCDP(\"Runtime.evaluate\", {\n expression: RECORDER,\n contextId,\n });\n } catch (error) {\n logger.debug(\"Failed to inject rrweb: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n\n // Inject recording setup script using the existing injectScript function\n // Convert function to string and create an IIFE with options\n // Pass true for stringifyCallbackArgs since CDP bindings require stringified arguments\n const optionsJson = JSON.stringify(sessionRecordingOptions ?? {});\n const injectExpression = `(${injectScript.toString()})(${optionsJson}, true);`;\n try {\n await page.sendCDP(\"Runtime.evaluate\", {\n expression: injectExpression,\n contextId,\n });\n } catch (error) {\n logger.debug(\"Failed to inject recording setup: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n\n // Add binding globally (not scoped to execution context)\n // The Runtime.bindingCalled event will include the executionContextId\n try {\n await page.sendCDP(\"Runtime.addBinding\", {\n name: \"lmnrSendEvents\",\n });\n logger.debug(`Added binding 'lmnrSendEvents' for page ${frameId}, context ${contextId}`);\n } catch (error) {\n // Binding might already exist, that's ok\n logger.debug(\"Binding may already exist: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n\n // Set up binding handler on this page using the internal Stagehand CDP session\n // The page.sendCDP method goes through the page's mainSession, so we need to listen there\n // We can access the session through the connection's internal structure\n if (bindingHandler) {\n try {\n const pageTargetId = page.targetId();\n if (!state.pageSessionHandlers.has(pageTargetId)) {\n // Access the connection's sessions map to find the session for this page\n const connInternal = conn as unknown as {\n getSession(sessionId: string): {\n on<P>(event: string, handler: (params: P) => void): void\n } | undefined;\n sessions: Map<string, unknown>;\n };\n\n // In Stagehand v3, each page has a corresponding session\n // We need to find the session that owns this page/target\n // The session for a page target is tracked in the context\n // We can iterate sessions and try to set up the listener\n if (connInternal.sessions) {\n for (const [sessionId, session] of connInternal.sessions.entries()) {\n try {\n // Set up the handler on each session (the correct one will receive the events)\n const sessionTyped = session as {\n on<P>(event: string, handler: (params: P) => void): void\n };\n if (sessionTyped.on) {\n sessionTyped.on<RuntimeBindingCalledEvent>(\n \"Runtime.bindingCalled\",\n bindingHandler,\n );\n logger.debug(`Set up binding handler on session ${sessionId}`);\n }\n } catch (error) {\n // Session might be closed, continue with next session\n logger.debug(`Failed to set up binding handler on session ${sessionId}: ` +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n state.pageSessionHandlers.set(pageTargetId, bindingHandler);\n }\n } catch (error) {\n logger.debug(\"Failed to set up binding handler: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // Register context mapping\n state.contextIdToSession.set(contextId, {\n sessionId: state.sessionId,\n traceId: state.traceId,\n });\n logger.debug(\n `Registered context mapping: contextId=${contextId}, sessionId=${state.sessionId}`,\n );\n\n // Mark page as instrumented\n state.instrumentedPageIds.add(frameId);\n\n logger.debug(`Successfully injected recorder into page ${frameId}`);\n return contextId;\n } catch (error) {\n logger.debug(\"Error injecting recorder: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n}\n","import { type SessionRecordingOptions, type StringUUID } from \"@lmnr-ai/types\";\n\nimport { EventChunk, sendEvents } from \"../../utils\";\nimport { injectRecorderViaCDP, shouldSkipUrl } from \"./cdp-helpers\";\nimport { logger } from \"./constants\";\nimport {\n RuntimeBindingCalledEvent,\n StagehandV3Context,\n TargetCreatedEvent,\n TargetInfoChangedEvent,\n V3RecorderState,\n} from \"./types\";\n\n/**\n * Handle Runtime.bindingCalled events\n */\nexport function createBindingHandler(\n state: V3RecorderState,\n): (event: RuntimeBindingCalledEvent) => void {\n return (event: RuntimeBindingCalledEvent) => {\n if (event.name !== \"lmnrSendEvents\") return;\n const sessionInfo = state.contextIdToSession.get(event.executionContextId);\n if (!sessionInfo) {\n logger.debug(\"No session info found for context ID: \" + event.executionContextId);\n // Try to find any matching session (for cases where context ID changed)\n // This is a fallback - normally the context should be mapped\n if (state.contextIdToSession.size > 0) {\n // Use the first available session info as fallback\n const [, fallbackInfo] = state.contextIdToSession.entries().next().value as\n [number, { sessionId: StringUUID; traceId: StringUUID }];\n if (fallbackInfo) {\n try {\n const chunk = JSON.parse(event.payload) as EventChunk;\n void sendEvents(\n chunk,\n state.client,\n state.chunkBuffers,\n fallbackInfo.sessionId,\n fallbackInfo.traceId,\n );\n } catch (error) {\n logger.debug(\"Failed to parse binding payload: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n return;\n }\n\n try {\n const chunk = JSON.parse(event.payload) as EventChunk;\n void sendEvents(\n chunk,\n state.client,\n state.chunkBuffers,\n sessionInfo.sessionId,\n sessionInfo.traceId,\n );\n } catch (error) {\n logger.debug(\"Failed to handle binding event: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n };\n}\n\n/**\n * Handle Target.targetCreated events for new pages\n */\nexport function createTargetCreatedHandler(\n context: StagehandV3Context,\n state: V3RecorderState,\n sessionRecordingOptions?: SessionRecordingOptions,\n): (event: TargetCreatedEvent) => Promise<void> {\n return async (event: TargetCreatedEvent) => {\n try {\n if (event.targetInfo.type !== \"page\") return;\n\n // Wait a bit for the page to be available in the context\n await new Promise(resolve => setTimeout(resolve, 200));\n // Try to inject into all uninstrumented pages\n for (const page of context.pages()) {\n try {\n const pageId = page.mainFrameId();\n if (!state.instrumentedPageIds.has(pageId)) {\n await injectRecorderViaCDP(\n page,\n state,\n context.conn,\n sessionRecordingOptions,\n state.bindingHandler ?? undefined,\n );\n }\n } catch (error) {\n // Page might have been closed or CDP session lost, continue with next page\n logger.debug(\"Error injecting recorder into new page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n } catch (error) {\n logger.debug(\"Error handling target created event: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n };\n}\n\n/**\n * Handle Target.targetInfoChanged events for URL changes/navigation\n */\nexport function createTargetInfoChangedHandler(\n context: StagehandV3Context,\n state: V3RecorderState,\n sessionRecordingOptions?: SessionRecordingOptions,\n): (event: TargetInfoChangedEvent) => Promise<void> {\n return async (event: TargetInfoChangedEvent) => {\n // Only handle page targets\n if (event.targetInfo.type !== \"page\") return;\n\n const url = event.targetInfo.url;\n\n if (shouldSkipUrl(url)) return;\n\n logger.debug(`Target URL changed to ${url}, checking if recorder injection needed`);\n\n await new Promise(resolve => setTimeout(resolve, 150));\n\n try {\n for (const page of context.pages()) {\n // Try to match by target ID\n const targetId = page.targetId();\n if (targetId === event.targetInfo.targetId) {\n await injectRecorderViaCDP(\n page, state, context.conn, sessionRecordingOptions, state.bindingHandler ?? undefined,\n );\n break;\n }\n }\n } catch (error) {\n logger.debug(\"Error handling target info change: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n };\n}\n","import { LaminarClient } from \"@lmnr-ai/client\";\nimport { type SessionRecordingOptions } from \"@lmnr-ai/types\";\nimport { diag, type Span, trace } from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\n\nimport { version as SDK_VERSION } from \"../../../../package.json\";\nimport { observe as laminarObserve } from \"../../../decorators\";\nimport { Laminar } from \"../../../laminar\";\nimport { TRACE_HAS_BROWSER_SESSION } from \"../../../opentelemetry-lib/tracing/attributes\";\nimport { LaminarContextManager } from \"../../../opentelemetry-lib/tracing/context\";\nimport { newUUID, otelTraceIdToUUID, StringUUID } from \"../../../utils\";\nimport { nameArgsOrCopy, prettyPrintZodSchema } from \"../../utils\";\nimport {\n createLLMClientCreateChatCompletionWrapper,\n GlobalLLMClientOptions,\n} from \"../shared-llm-wrapper\";\nimport { injectRecorderViaCDP } from \"./cdp-helpers\";\nimport { logger } from \"./constants\";\nimport {\n createBindingHandler,\n createTargetCreatedHandler,\n createTargetInfoChangedHandler,\n} from \"./event-handlers\";\nimport {\n StagehandV3Context,\n TargetCreatedEvent,\n TargetInfoChangedEvent,\n V3RecorderState,\n} from \"./types\";\n\n/* eslint-disable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return,\n @typescript-eslint/no-misused-promises\n*/\nexport class StagehandInstrumentation extends InstrumentationBase {\n private stagehandInstanceToSessionId: WeakMap<object, StringUUID> = new WeakMap();\n private globalLLMClientOptions: WeakMap<\n any,\n GlobalLLMClientOptions | undefined\n > = new WeakMap();\n private globalAgentOptions: WeakMap<\n object,\n Record<string, any> | undefined\n > = new WeakMap();\n private sessionIdToParentSpan: Map<StringUUID, Span> = new Map();\n\n // Session recording state per Stagehand instance\n private stagehandInstanceToRecorderState: WeakMap<object, V3RecorderState> = new WeakMap();\n\n // LaminarClient for sending events (set externally)\n private _client: LaminarClient | null = null;\n\n // Session recording options\n private _sessionRecordingOptions?: SessionRecordingOptions;\n\n constructor(sessionRecordingOptions?: SessionRecordingOptions) {\n super(\n \"@lmnr/browserbase-stagehand-instrumentation\",\n SDK_VERSION,\n {\n enabled: true,\n },\n );\n this._sessionRecordingOptions = sessionRecordingOptions;\n }\n\n /**\n * Set the LaminarClient to use for sending browser events.\n * This must be called before Stagehand.init() to enable session recording.\n */\n public setClient(client: LaminarClient): void {\n this._client = client;\n }\n\n /**\n * Get the LaminarClient instance\n */\n public get client(): LaminarClient | null {\n return this._client;\n }\n\n protected init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(\n \"@browserbasehq/stagehand\",\n ['>=3.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return module;\n }\n\n private patch(moduleExports: any, moduleVersion?: string) {\n diag.debug(`patching stagehand ${moduleVersion}`);\n\n // Check if Stagehand is non-configurable\n const descriptor = Object.getOwnPropertyDescriptor(moduleExports, 'Stagehand');\n if (descriptor && !descriptor.configurable) {\n // Create a proxy for the entire module exports\n const originalStagehand = moduleExports.Stagehand;\n const patchedConstructor = this.patchStagehandConstructor()(originalStagehand);\n\n // Create a proxy for the module exports\n return new Proxy(moduleExports, {\n get: (target, prop) => {\n if (prop === 'Stagehand') {\n return patchedConstructor;\n }\n return target[prop as keyof typeof target];\n },\n });\n } else {\n // If it's configurable, use the standard _wrap method\n this._wrap(\n moduleExports,\n 'Stagehand',\n this.patchStagehandConstructor(),\n );\n\n return moduleExports;\n }\n }\n\n public manuallyInstrument(Stagehand: any) {\n diag.debug('manually instrumenting stagehand');\n\n // Patch the prototype methods of the existing constructor\n if (Stagehand && Stagehand.prototype) {\n this._wrap(\n Stagehand.prototype,\n 'init',\n this.patchStagehandInit(),\n );\n this._wrap(\n Stagehand.prototype,\n 'close',\n this.patchStagehandClose(),\n );\n }\n }\n\n private unpatch(moduleExports: any, moduleVersion?: string) {\n diag.debug(`unpatching stagehand ${moduleVersion}`);\n this._unwrap(moduleExports, 'Stagehand');\n\n if (moduleExports.Stagehand && moduleExports.Stagehand.prototype) {\n this._unwrap(moduleExports.Stagehand.prototype, 'init');\n this._unwrap(moduleExports.Stagehand.prototype, 'close');\n this._unwrap(moduleExports.Stagehand.prototype, 'act');\n this._unwrap(moduleExports.Stagehand.prototype, 'extract');\n this._unwrap(moduleExports.Stagehand.prototype, 'observe');\n\n // Try to unwrap handler methods if they exist on the prototype\n const prototype = moduleExports.Stagehand.prototype;\n if (prototype.actHandler) {\n this._unwrap(prototype.actHandler, 'act');\n this._unwrap(prototype.actHandler, 'actFromObserveResult');\n }\n if (prototype.extractHandler) {\n this._unwrap(prototype.extractHandler, 'extract');\n }\n if (prototype.observeHandler) {\n this._unwrap(prototype.observeHandler, 'observe');\n }\n // Try to unwrap LLM client if it exists\n if (prototype.llmClient) {\n this._unwrap(prototype.llmClient, 'createChatCompletion');\n }\n }\n\n return moduleExports;\n }\n\n private patchStagehandConstructor() {\n const instrumentation = this;\n\n return (Original: any) => {\n // Create a constructor function that maintains the same signature\n const Stagehand = function (this: InstanceType<typeof Original>, ...args: any[]) {\n // Only apply if this is a new instance\n if (!(this instanceof Stagehand)) {\n return new (Stagehand)(...args);\n }\n\n const instance = new Original(args.length > 0 ? args[0] : undefined);\n Object.assign(this, instance);\n\n instrumentation._wrap(\n this,\n 'init',\n instrumentation.patchStagehandInit(),\n );\n\n instrumentation._wrap(\n this,\n 'close',\n instrumentation.patchStagehandClose(),\n );\n\n return this;\n } as unknown as typeof Original;\n\n // Copy static properties\n Object.setPrototypeOf(Stagehand, Original);\n // Copy prototype properties\n Stagehand.prototype = Object.create(Original.prototype);\n Stagehand.prototype.constructor = Stagehand;\n\n return Stagehand;\n };\n }\n\n private patchStagehandInit() {\n const instrumentation = this;\n\n return (original: any) => async function method(this: any) {\n const sessionId = newUUID();\n\n // Create parent span for this Stagehand session\n const parentSpan = Laminar.startSpan({\n name: 'Stagehand',\n });\n instrumentation.sessionIdToParentSpan.set(sessionId, parentSpan);\n\n instrumentation.stagehandInstanceToSessionId.set(this, sessionId);\n\n // Get trace ID from current span context\n const currentSpan = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n currentSpan?.setAttribute(TRACE_HAS_BROWSER_SESSION, true);\n const otelTraceId = parentSpan.spanContext().traceId;\n const traceId = otelTraceIdToUUID(otelTraceId);\n\n // Call the original init method first\n const result = await original.bind(this).apply(this);\n\n // After init, wrap the global methods on the stagehand instance\n instrumentation._wrap(\n this,\n 'act',\n instrumentation.patchStagehandGlobalMethod('act', sessionId, parentSpan),\n );\n\n instrumentation._wrap(\n this,\n 'extract',\n instrumentation.patchStagehandGlobalMethod('extract', sessionId, parentSpan),\n );\n\n instrumentation._wrap(\n this,\n 'observe',\n instrumentation.patchStagehandGlobalMethod('observe', sessionId, parentSpan),\n );\n\n // Wrap handler methods if they exist\n if (this.actHandler) {\n instrumentation.patchActHandler(this.actHandler);\n }\n\n if (this.extractHandler) {\n instrumentation.patchExtractHandler(this.extractHandler);\n }\n\n if (this.observeHandler) {\n instrumentation.patchObserveHandler(this.observeHandler);\n }\n\n // Wrap LLM client if it exists\n if (this.llmClient) {\n instrumentation.globalLLMClientOptions.set(this.llmClient, {\n provider: this.llmClient.type,\n model: this.llmClient.modelName,\n });\n instrumentation._wrap(\n this.llmClient,\n 'createChatCompletion',\n instrumentation.patchStagehandLLMClientCreateChatCompletion(),\n );\n }\n\n // Wrap agent method if it exists\n instrumentation._wrap(\n this,\n 'agent',\n instrumentation.patchStagehandAgentInitializer(sessionId, parentSpan),\n );\n\n // Set up session recording if client is available\n if (instrumentation._client) {\n await instrumentation.setupSessionRecording(this, sessionId, traceId);\n }\n\n // Patch all existing pages\n if (this.context && this.context.pages) {\n for (const page of this.context.pages()) {\n instrumentation.patchStagehandPage(page, parentSpan);\n }\n }\n\n // Set up listener for new pages\n if (this.context && this.context.on) {\n this.context.on('page', (page: any) => {\n instrumentation.patchStagehandPage(page, parentSpan);\n });\n }\n\n return result;\n };\n }\n\n /**\n * Set up session recording for a Stagehand instance\n */\n private async setupSessionRecording(\n stagehandInstance: any,\n sessionId: StringUUID,\n traceId: StringUUID,\n ): Promise<void> {\n if (!this._client) {\n logger.debug(\"No Laminar client available, skipping session recording setup\");\n return;\n }\n\n // Get the context from the Stagehand instance\n const context = stagehandInstance.context as StagehandV3Context | undefined;\n if (!context || !context.conn) {\n logger.debug(\"No context or connection available, skipping session recording setup\");\n return;\n }\n // Create recorder state\n const recorderState: V3RecorderState = {\n sessionId,\n traceId,\n client: this._client,\n chunkBuffers: new Map(),\n contextIdToSession: new Map(),\n instrumentedPageIds: new Set(),\n bindingHandler: null,\n targetCreatedHandler: null,\n targetInfoChangedHandler: null,\n pageSessionHandlers: new Map(),\n };\n\n // Store recorder state\n this.stagehandInstanceToRecorderState.set(stagehandInstance, recorderState);\n\n // Set up binding event handler\n // (will be registered on individual page sessions during injection)\n const bindingHandler = createBindingHandler(recorderState);\n recorderState.bindingHandler = bindingHandler;\n\n // Set up target created handler for new pages\n const targetCreatedHandler = createTargetCreatedHandler(\n context,\n recorderState,\n this._sessionRecordingOptions,\n );\n recorderState.targetCreatedHandler = targetCreatedHandler;\n context.conn.on<TargetCreatedEvent>(\"Target.targetCreated\", targetCreatedHandler);\n\n // Set up target info changed handler for re-injection after navigation\n const targetInfoChangedHandler = createTargetInfoChangedHandler(\n context,\n recorderState,\n this._sessionRecordingOptions,\n );\n recorderState.targetInfoChangedHandler = targetInfoChangedHandler;\n context.conn.on<TargetInfoChangedEvent>(\"Target.targetInfoChanged\", targetInfoChangedHandler);\n\n // Inject recorder into all existing pages\n try {\n const pages = context.pages();\n let injectedCount = 0;\n for (const page of pages) {\n try {\n const result = await injectRecorderViaCDP(\n page,\n recorderState,\n context.conn,\n this._sessionRecordingOptions,\n bindingHandler,\n );\n if (result !== null) {\n injectedCount++;\n }\n } catch (error) {\n // Page might have been closed or CDP session lost, continue with next page\n logger.debug(\"Error injecting recorder into page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n logger.debug(\n `Injected session recorder into ${injectedCount} of ${pages.length} existing page(s)`,\n );\n } catch (error) {\n logger.debug(\"Error accessing pages for recorder injection: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n private patchStagehandClose() {\n const instrumentation = this;\n return (original: Function) => async function method(this: any, ...args: any[]) {\n // Clean up session recording before closing\n instrumentation.cleanupSessionRecording(this);\n\n // Clean up the session from the registry\n const sessionId = instrumentation.stagehandInstanceToSessionId.get(this);\n if (sessionId) {\n instrumentation.stagehandInstanceToSessionId.delete(this);\n }\n\n await original.bind(this).apply(this, args);\n\n // Clean up the parent span from the registry\n if (sessionId) {\n const parentSpan = instrumentation.sessionIdToParentSpan.get(sessionId);\n if (parentSpan) {\n parentSpan.end();\n instrumentation.sessionIdToParentSpan.delete(sessionId);\n }\n }\n };\n }\n\n /**\n * Clean up session recording resources for a Stagehand instance\n */\n private cleanupSessionRecording(stagehandInstance: any): void {\n const recorderState = this.stagehandInstanceToRecorderState.get(stagehandInstance);\n if (!recorderState) return;\n\n // Get the context to remove event listeners\n const context = stagehandInstance.context as StagehandV3Context | undefined;\n if (context && context.conn) {\n // Remove target created handler\n if (recorderState.targetCreatedHandler) {\n try {\n context.conn.off(\"Target.targetCreated\", recorderState.targetCreatedHandler);\n } catch (error) {\n logger.debug(\"Error removing target created handler: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // Remove target info changed handler\n if (recorderState.targetInfoChangedHandler) {\n try {\n context.conn.off(\"Target.targetInfoChanged\", recorderState.targetInfoChangedHandler);\n } catch (error) {\n logger.debug(\"Error removing target info changed handler: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n\n // Clear state\n recorderState.contextIdToSession.clear();\n recorderState.instrumentedPageIds.clear();\n recorderState.chunkBuffers.clear();\n recorderState.pageSessionHandlers.clear();\n recorderState.bindingHandler = null;\n recorderState.targetCreatedHandler = null;\n recorderState.targetInfoChangedHandler = null;\n\n // Remove from WeakMap\n this.stagehandInstanceToRecorderState.delete(stagehandInstance);\n\n logger.debug(\"Cleaned up session recording for Stagehand instance\");\n }\n\n private patchStagehandGlobalMethod(methodName: string, sessionId: StringUUID, parentSpan: any) {\n return (original: (...args: any[]) => Promise<any>) =>\n async function method(this: any, ...args: any[]) {\n const input = nameArgsOrCopy(args);\n const currentSpan = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n\n // Handle extract schema pretty-printing\n if (methodName === \"extract\"\n && Array.isArray(input)\n && input.length > 1 && (input[1])?.shape\n ) {\n // We need to clone the input object to avoid mutating the original object\n // because the original object is passed to the LLM client\n const schema = input[1];\n let prettySchema = schema?.shape;\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n input[1] = prettySchema;\n }\n\n // Also handle extract when options contain schema\n if (methodName === \"extract\"\n && Array.isArray(input)\n && input.length > 0\n && typeof input[0] === 'string'\n && input.length > 1\n && (input[1])?.shape\n ) {\n const schema = input[1];\n let prettySchema = schema?.shape;\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n input[1] = prettySchema;\n }\n\n return await Laminar.withSpan(\n currentSpan ?? parentSpan,\n async () => await laminarObserve(\n {\n name: `stagehand.${methodName}`,\n input,\n },\n async (thisArg: any, rest: any[]) => {\n const span = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n span?.setAttribute(TRACE_HAS_BROWSER_SESSION, true);\n return await original.apply(thisArg, rest);\n },\n this, args,\n ),\n );\n };\n }\n\n private patchActHandler(actHandler: any) {\n // Patch the main act method on the handler\n this._wrap(\n actHandler,\n 'act',\n this.patchActHandlerAct(),\n );\n\n // Patch actFromObserveResult\n this._wrap(\n actHandler,\n 'actFromObserveResult',\n this.patchActHandlerActFromObserveResult(),\n );\n }\n\n private patchActHandlerAct() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function act(this: any, ...args: any[]) {\n const params = args[0];\n return await laminarObserve(\n {\n name: 'stagehand.actHandler.act',\n input: {\n instruction: params?.instruction,\n variables: params?.variables,\n timeout: params?.timeout,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchActHandlerActFromObserveResult() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function actFromObserveResult(this: any, ...args: any[]) {\n const action = args[0];\n const domSettleTimeoutMs = args[2];\n return await laminarObserve(\n {\n name: 'stagehand.actHandler.actFromObserveResult',\n input: {\n action: action,\n domSettleTimeoutMs: domSettleTimeoutMs,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchExtractHandler(extractHandler: any) {\n // Patch the main extract method on the handler\n this._wrap(\n extractHandler,\n 'extract',\n this.patchExtractHandlerExtract(),\n );\n }\n\n private patchExtractHandlerExtract() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function extract(this: any, ...args: any[]) {\n const params = args[0];\n const schema = params?.schema;\n let prettySchema = schema?.shape;\n\n if (schema) {\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n }\n\n return await laminarObserve(\n {\n name: 'stagehand.extractHandler.extract',\n input: {\n instruction: params?.instruction,\n schema: prettySchema,\n timeout: params?.timeout,\n selector: params?.selector,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchObserveHandler(observeHandler: any) {\n // Patch the main observe method on the handler\n this._wrap(\n observeHandler,\n 'observe',\n this.patchObserveHandlerObserve(),\n );\n }\n\n private patchObserveHandlerObserve() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function observe(this: any, ...args: any[]) {\n const params = args[0];\n return await laminarObserve(\n {\n name: 'stagehand.observeHandler.observe',\n input: {\n instruction: params?.instruction,\n timeout: params?.timeout,\n selector: params?.selector,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandLLMClientCreateChatCompletion() {\n return createLLMClientCreateChatCompletionWrapper(this.globalLLMClientOptions);\n }\n\n private patchStagehandAgentInitializer(sessionId: StringUUID, parentSpan: Span) {\n const instrumentation = this;\n return (original: (...args: any[]) => any) =>\n function agent(this: any, ...args: any[]) {\n if (args.length > 0 && typeof args[0] === 'object') {\n instrumentation.globalAgentOptions.set(this, args[0]);\n }\n const agent = original.bind(this).apply(this, args);\n instrumentation.patchStagehandAgent(agent, sessionId, parentSpan);\n return agent;\n };\n }\n\n private patchStagehandAgent(agent: any, sessionId: StringUUID, parentSpan: Span) {\n this._wrap(\n agent,\n 'execute',\n this.patchStagehandAgentExecute(sessionId, parentSpan),\n );\n\n // Wrap additional agent methods\n this.wrapAgentMethod(\n agent, 'captureScreenshot', parentSpan, { spanType: \"TOOL\", ignoreOutput: true },\n );\n this.wrapAgentMethod(agent, 'setViewport', parentSpan);\n this.wrapAgentMethod(agent, 'setCurrentUrl', parentSpan);\n }\n\n private patchStagehandAgentExecute(sessionId: StringUUID, parentSpan: Span) {\n const instrumentation = this;\n return (original: (this: any, ...args: any[]) => Promise<any>) =>\n async function execute(this: any, ...args: any[]) {\n const input = nameArgsOrCopy(args);\n\n return await Laminar.withSpan(\n parentSpan,\n async () => await laminarObserve(\n {\n name: 'stagehand.agent.execute',\n input,\n },\n async () => await laminarObserve(\n {\n name: 'execute',\n // input and output are set as gen_ai.prompt and gen_ai.completion\n ignoreInput: true,\n ignoreOutput: true,\n spanType: \"LLM\",\n },\n async () => {\n const span = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n\n const agentOptions = instrumentation.globalAgentOptions.get(this);\n const provider = agentOptions?.model?.provider\n ?? (\n (agentOptions?.model as string | undefined)?.includes(\"/\") ?\n (agentOptions?.model as string | undefined)?.split(\"/\")[0] :\n instrumentation.globalLLMClientOptions.get(this)?.provider);\n const model = agentOptions?.model?.modelName\n ?? instrumentation.globalLLMClientOptions.get(this)?.model;\n span?.setAttributes({\n ...(provider ? { \"gen_ai.system\": provider } : {}),\n ...(model ? { \"gen_ai.request.model\": model } : {}),\n });\n\n let promptIndex = 0;\n if (agentOptions?.systemPrompt) {\n span?.setAttributes({\n \"gen_ai.prompt.0.content\": agentOptions.systemPrompt,\n \"gen_ai.prompt.0.role\": \"system\",\n });\n promptIndex++;\n }\n\n const instruction = typeof input === 'string' ? input : (input as any).instruction;\n if (instruction) {\n span?.setAttributes({\n [`gen_ai.prompt.${promptIndex}.content`]: instruction,\n [`gen_ai.prompt.${promptIndex}.role`]: \"user\",\n });\n }\n\n const result = await original\n .bind(this)\n .apply(this, args);\n\n if (result.completed && result.success && result.message) {\n const content = [{ type: \"text\", text: result.message }];\n if (result.actions && result.actions.length > 0) {\n content.push({\n type: \"text\",\n text: JSON.stringify({ actions: result.actions }),\n });\n }\n span?.setAttributes({\n \"gen_ai.completion.0.content\": JSON.stringify(content),\n \"gen_ai.completion.0.role\": \"assistant\",\n });\n } else if (result.completed && !result.success) {\n span?.recordException(new Error(result.message));\n }\n if (result.usage) {\n span?.setAttributes({\n \"gen_ai.usage.input_tokens\": result.usage.input_tokens,\n \"gen_ai.usage.output_tokens\": result.usage.output_tokens,\n \"llm.usage.total_tokens\":\n result.usage.input_tokens + result.usage.output_tokens,\n });\n }\n return result;\n },\n ),\n ),\n );\n };\n }\n\n private wrapAgentMethod(\n agent: any,\n methodName: string,\n parentSpan: Span,\n options?: {\n spanType?: \"TOOL\" | \"LLM\" | \"DEFAULT\" | \"EVALUATOR\" | \"EVALUATION\" | \"EXECUTOR\";\n ignoreOutput?: boolean;\n },\n ) {\n if (typeof agent[methodName] !== 'function') return;\n\n this._wrap(\n agent,\n methodName,\n (original: (...args: any[]) => Promise<any>) =>\n async function method(this: any, ...args: any[]) {\n const currentSpan = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n return await Laminar.withSpan(\n currentSpan ?? parentSpan,\n async () => await laminarObserve(\n {\n name: `stagehand.agent.${methodName}`,\n ...(options?.spanType ? { spanType: options.spanType } : {}),\n ...(options?.ignoreOutput ? { ignoreOutput: true } : {}),\n },\n async (argVals: any[]) => await original.bind(this).apply(this, argVals),\n args,\n ),\n );\n },\n );\n }\n\n private patchStagehandPage(page: any, parentSpan: Span) {\n const pageMethods = [\n 'goto',\n 'reload',\n 'goBack',\n 'goForward',\n 'click',\n 'scroll',\n 'dragAndDrop',\n 'type',\n 'keyPress',\n 'keyDown',\n 'keyUp',\n ];\n\n for (const methodName of pageMethods) {\n if (typeof page[methodName] !== 'function') continue;\n\n this._wrap(\n page,\n methodName,\n (original: (...args: any[]) => Promise<any>) =>\n async function method(this: any, ...args: any[]) {\n const currentSpan = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n return await Laminar.withSpan(\n currentSpan ?? parentSpan,\n async () => await laminarObserve(\n {\n name: `stagehand.page.${methodName}`,\n },\n async (argVals: any[]) => await original.bind(this).apply(this, argVals),\n args,\n ),\n );\n },\n );\n }\n }\n}\n/* eslint-enable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return,\n @typescript-eslint/no-misused-promises\n*/\n","import { SpanStatusCode } from \"@opentelemetry/api\";\n\nimport { LaminarSpan } from \"../../tracing/span\";\n\n// Re-export attribute keys we use frequently\nconst LLM_REQUEST_MODEL = \"gen_ai.request.model\";\nconst LLM_RESPONSE_MODEL = \"gen_ai.response.model\";\nconst LLM_SYSTEM = \"gen_ai.system\";\nconst LLM_USAGE_TOTAL_TOKENS = \"llm.usage.total_tokens\";\n\n/**\n * Set an attribute on a span only if the value is non-null, non-undefined, and non-empty.\n */\nfunction safeSetAttribute(\n span: LaminarSpan,\n key: string,\n value: unknown,\n): void {\n if (value === null || value === undefined) return;\n if (typeof value === \"string\" && value.length === 0) return;\n if (Array.isArray(value) && value.length === 0) return;\n span.setAttribute(key, value as any);\n}\n\n/**\n * Convert an SDK object to a plain JSON-serializable object.\n */\nfunction toDict(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj !== \"object\") return obj;\n if (Array.isArray(obj)) return obj.map(toDict);\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {\n if (v !== undefined) {\n result[k] = toDict(v);\n }\n }\n return result;\n}\n\n/**\n * Normalize contents to an array of {role, parts} message objects.\n * The GenAI SDK accepts many content shapes; this normalizes them for attribute logging.\n */\nfunction contentToMessages(\n contents: unknown,\n systemInstruction?: unknown,\n): unknown[] {\n const messages: unknown[] = [];\n\n if (systemInstruction) {\n if (typeof systemInstruction === \"string\") {\n messages.push({ role: \"system\", content: systemInstruction });\n } else if (typeof systemInstruction === \"object\" && systemInstruction !== null) {\n messages.push({ role: \"system\", ...(toDict(systemInstruction) as Record<string, any>) });\n }\n }\n\n if (typeof contents === \"string\") {\n messages.push({ role: \"user\", content: contents });\n } else if (Array.isArray(contents)) {\n for (const item of contents) {\n if (typeof item === \"string\") {\n messages.push({ role: \"user\", content: item });\n } else {\n messages.push(toDict(item));\n }\n }\n } else if (contents && typeof contents === \"object\") {\n messages.push(toDict(contents));\n }\n\n return messages;\n}\n\n/**\n * Extract function declarations from the tools config.\n */\nfunction extractToolDefinitions(config: any): any[] {\n if (!config?.tools) return [];\n const tools: any[] = [];\n const toolsArray = Array.isArray(config.tools) ? config.tools : [config.tools];\n\n for (const tool of toolsArray) {\n if (!tool) continue;\n // Tool can be a Tool object with functionDeclarations\n if (tool.functionDeclarations) {\n for (const fd of tool.functionDeclarations) {\n tools.push(toDict(fd));\n }\n }\n // Or it could be a single FunctionDeclaration-like object\n if (tool.name && !tool.functionDeclarations) {\n tools.push(toDict(tool));\n }\n }\n return tools;\n}\n\n/**\n * Set request attributes on a span from generateContent params.\n */\nexport function setRequestAttributes(\n span: LaminarSpan,\n params: any,\n traceContent: boolean,\n): void {\n safeSetAttribute(span, LLM_SYSTEM, \"gemini\");\n\n safeSetAttribute(span, LLM_REQUEST_MODEL, params?.model);\n\n const config = params?.config;\n if (config) {\n safeSetAttribute(span, \"gen_ai.request.temperature\", config.temperature);\n safeSetAttribute(span, \"gen_ai.request.top_p\", config.topP);\n safeSetAttribute(span, \"gen_ai.request.top_k\", config.topK);\n safeSetAttribute(span, \"gen_ai.request.max_tokens\", config.maxOutputTokens);\n safeSetAttribute(span, \"gen_ai.request.frequency_penalty\", config.frequencyPenalty);\n safeSetAttribute(span, \"gen_ai.request.presence_penalty\", config.presencePenalty);\n safeSetAttribute(span, \"gen_ai.request.seed\", config.seed);\n safeSetAttribute(span, \"gen_ai.request.choice_count\", config.candidateCount);\n\n if (config.stopSequences && config.stopSequences.length > 0) {\n safeSetAttribute(span, \"gen_ai.request.stop_sequences\", JSON.stringify(config.stopSequences));\n }\n\n const outputSchema = config.responseSchema ?? config.responseJsonSchema;\n if (outputSchema) {\n safeSetAttribute(\n span,\n \"gen_ai.request.structured_output_schema\",\n JSON.stringify(toDict(outputSchema)),\n );\n }\n\n // Tool definitions\n const toolDefs = extractToolDefinitions(config);\n if (toolDefs.length > 0) {\n safeSetAttribute(span, \"gen_ai.tool.definitions\", JSON.stringify(toolDefs));\n }\n }\n\n // Input messages (content-traced only)\n if (traceContent) {\n const messages = contentToMessages(params?.contents, config?.systemInstruction);\n if (messages.length > 0) {\n safeSetAttribute(span, \"gen_ai.input.messages\", JSON.stringify(messages));\n }\n }\n}\n\n/**\n * Set response attributes on a span from a GenerateContentResponse.\n */\nexport function setResponseAttributes(\n span: LaminarSpan,\n response: any,\n traceContent: boolean,\n): void {\n if (!response) return;\n\n safeSetAttribute(span, LLM_RESPONSE_MODEL, response.modelVersion);\n\n // Usage metadata\n const usage = response.usageMetadata;\n if (usage) {\n safeSetAttribute(span, \"gen_ai.usage.input_tokens\", usage.promptTokenCount);\n\n const outputTokens =\n (usage.candidatesTokenCount ?? 0) + (usage.thoughtsTokenCount ?? 0);\n if (outputTokens > 0) {\n safeSetAttribute(span, \"gen_ai.usage.output_tokens\", outputTokens);\n }\n\n safeSetAttribute(span, LLM_USAGE_TOTAL_TOKENS, usage.totalTokenCount);\n safeSetAttribute(span, \"gen_ai.usage.reasoning_tokens\", usage.thoughtsTokenCount);\n safeSetAttribute(span, \"gen_ai.usage.cache_read_input_tokens\", usage.cachedContentTokenCount);\n }\n\n // Response content (content-traced only)\n if (traceContent && response.candidates) {\n const outputMessages: any[] = [];\n\n for (let i = 0; i < response.candidates.length; i++) {\n const candidate = response.candidates[i];\n const content = candidate?.content;\n if (!content) continue;\n\n const role = content.role ?? \"model\";\n\n // Extract text content and tool calls\n const parts = content.parts ?? [];\n const textParts: string[] = [];\n const toolCalls: any[] = [];\n\n for (let j = 0; j < parts.length; j++) {\n const part = parts[j];\n if (part.text !== undefined) {\n textParts.push(part.text);\n }\n if (part.functionCall) {\n toolCalls.push({\n name: part.functionCall.name,\n id: part.functionCall.id,\n arguments: JSON.stringify(toDict(part.functionCall.args)),\n });\n }\n }\n\n const completionContent = textParts.join(\"\");\n\n outputMessages.push({\n role,\n content: completionContent,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n });\n }\n\n if (outputMessages.length > 0) {\n safeSetAttribute(span, \"gen_ai.output.messages\", JSON.stringify(outputMessages));\n }\n }\n}\n\n/**\n * Merge consecutive text parts in accumulated streaming parts.\n */\nfunction mergeTextParts(parts: any[]): any[] {\n if (parts.length === 0) return parts;\n\n const merged: any[] = [];\n for (const part of parts) {\n if (\n part.text !== undefined &&\n merged.length > 0 &&\n merged[merged.length - 1].text !== undefined\n ) {\n merged[merged.length - 1] = {\n ...merged[merged.length - 1],\n text: merged[merged.length - 1].text + part.text,\n };\n } else {\n merged.push({ ...part });\n }\n }\n return merged;\n}\n\n/**\n * Wrap a streaming async generator to accumulate response data and set span attributes\n * when iteration completes, throws, or is terminated early by the consumer.\n *\n * generateContentStream returns Promise<AsyncGenerator<GenerateContentResponse>>.\n * This wraps the inner async generator.\n */\nexport function wrapStreamingResponse(\n span: LaminarSpan,\n asyncGen: AsyncGenerator<any>,\n traceContent: boolean,\n): AsyncGenerator<any> {\n const accumulatedParts: any[] = [];\n let promptTokenCount: number | undefined;\n let candidatesTokenCount: number | undefined;\n let thoughtsTokenCount: number | undefined;\n let totalTokenCount: number | undefined;\n let cachedContentTokenCount: number | undefined;\n let role: string | undefined;\n let modelVersion: string | undefined;\n let sawUsageMetadata = false;\n\n async function* wrapper(): AsyncGenerator<any> {\n let streamError: unknown;\n let finalizeError: unknown;\n try {\n for await (const chunk of asyncGen) {\n // Accumulate parts\n if (chunk?.candidates) {\n for (const candidate of chunk.candidates) {\n const parts = candidate?.content?.parts;\n if (parts) {\n accumulatedParts.push(...parts);\n }\n if (candidate?.content?.role && !role) {\n role = candidate.content.role;\n }\n }\n }\n\n // Accumulate usage\n const usage = chunk?.usageMetadata;\n if (usage) {\n sawUsageMetadata = true;\n if (promptTokenCount === undefined && usage.promptTokenCount !== undefined) {\n promptTokenCount = usage.promptTokenCount;\n }\n if (usage.candidatesTokenCount !== undefined) {\n candidatesTokenCount = usage.candidatesTokenCount;\n }\n if (usage.thoughtsTokenCount !== undefined) {\n thoughtsTokenCount = usage.thoughtsTokenCount;\n }\n if (usage.totalTokenCount !== undefined) {\n totalTokenCount = usage.totalTokenCount;\n }\n if (cachedContentTokenCount === undefined\n && usage.cachedContentTokenCount !== undefined) {\n cachedContentTokenCount = usage.cachedContentTokenCount;\n }\n }\n\n if (chunk?.modelVersion && !modelVersion) {\n modelVersion = chunk.modelVersion;\n }\n\n yield chunk;\n }\n } catch (error) {\n streamError = error;\n span.setAttribute(\"error.type\", (error as Error).constructor?.name ?? \"Error\");\n span.recordException(error as Error);\n span.setStatus({ code: SpanStatusCode.ERROR });\n throw error;\n } finally {\n try {\n const hasResponseData = (\n modelVersion !== undefined\n || role !== undefined\n || accumulatedParts.length > 0\n || sawUsageMetadata\n );\n if (hasResponseData) {\n const mergedParts = mergeTextParts(accumulatedParts);\n const compoundResponse = {\n modelVersion,\n candidates: [\n {\n content: {\n role: role ?? \"model\",\n parts: mergedParts,\n },\n },\n ],\n usageMetadata: {\n promptTokenCount,\n candidatesTokenCount,\n thoughtsTokenCount,\n totalTokenCount,\n cachedContentTokenCount,\n },\n };\n\n setResponseAttributes(span, compoundResponse, traceContent);\n }\n } catch (caughtFinalizeError) {\n // Do not override the original stream error.\n if (!streamError) {\n finalizeError = caughtFinalizeError;\n }\n } finally {\n span.end();\n }\n }\n if (finalizeError) {\n if (finalizeError instanceof Error) {\n throw finalizeError;\n }\n throw new Error(\"Failed to finalize google-genai stream span\");\n }\n }\n\n return wrapper();\n}\n","import { context, diag, SpanStatusCode } from \"@opentelemetry/api\";\nimport { isTracingSuppressed } from \"@opentelemetry/core\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\n\nimport { version as SDK_VERSION } from \"../../../../package.json\";\nimport { Laminar } from \"../../../laminar\";\nimport { setRequestAttributes, setResponseAttributes, wrapStreamingResponse } from \"./utils\";\n\nconst WRAPPED_SYMBOL = Symbol(\"lmnr.google-genai.wrapped\");\nconst CLASS_PATCH_DATA_SYMBOL = Symbol(\"lmnr.google-genai.classPatchData\");\n\ntype ClassPatchData = {\n instrumentation: GoogleGenAiInstrumentation;\n traceContent: boolean;\n originalModelsDescriptor: PropertyDescriptor | undefined;\n};\n\n/* eslint-disable\n @typescript-eslint/no-unsafe-return\n*/\nexport class GoogleGenAiInstrumentation extends InstrumentationBase {\n private traceContent: boolean;\n\n constructor(config?: { traceContent?: boolean }) {\n super(\n \"@lmnr/google-genai-instrumentation\",\n SDK_VERSION,\n { enabled: true },\n );\n this.traceContent = config?.traceContent ?? true;\n }\n\n protected init(): InstrumentationModuleDefinition {\n return new InstrumentationNodeModuleDefinition(\n \"@google/genai\",\n [\">=1.0.0\"],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n }\n\n public manuallyInstrument(genaiModule: any): void {\n diag.debug(\"Manually instrumenting @google/genai\");\n const GoogleGenAIClass = this.resolveGoogleGenAIClass(genaiModule);\n if (GoogleGenAIClass) {\n this.patchGoogleGenAIClass(GoogleGenAIClass);\n } else {\n diag.warn(\n \"Could not find GoogleGenAI class in google_genai manual instrumentation input. \" +\n \"Pass either GoogleGenAI class or module object with GoogleGenAI export.\",\n );\n }\n }\n\n private patch(moduleExports: any): any {\n diag.debug(\"Patching @google/genai\");\n const GoogleGenAIClass = this.resolveGoogleGenAIClass(moduleExports);\n if (GoogleGenAIClass) {\n this.patchGoogleGenAIClass(GoogleGenAIClass);\n }\n return moduleExports;\n }\n\n private unpatch(moduleExports: any): void {\n diag.debug(\"Unpatching @google/genai\");\n const GoogleGenAIClass = this.resolveGoogleGenAIClass(moduleExports);\n if (GoogleGenAIClass) {\n this.unpatchGoogleGenAIClass(GoogleGenAIClass);\n }\n }\n\n private resolveGoogleGenAIClass(moduleOrClass: any): any {\n if (typeof moduleOrClass === \"function\") {\n return moduleOrClass;\n }\n if (moduleOrClass?.GoogleGenAI && typeof moduleOrClass.GoogleGenAI === \"function\") {\n return moduleOrClass.GoogleGenAI;\n }\n return undefined;\n }\n\n private patchGoogleGenAIClass(GoogleGenAIClass: any): void {\n const classPatchData = (\n GoogleGenAIClass[CLASS_PATCH_DATA_SYMBOL] as ClassPatchData | undefined\n );\n if (classPatchData) {\n classPatchData.instrumentation = this;\n classPatchData.traceContent = this.traceContent;\n return;\n }\n\n const originalModelsDescriptor = Object.getOwnPropertyDescriptor(\n GoogleGenAIClass.prototype,\n \"models\",\n );\n if (originalModelsDescriptor && !originalModelsDescriptor.configurable) {\n diag.warn(\"Could not patch GoogleGenAI.prototype.models: descriptor is non-configurable.\");\n return;\n }\n\n const patchData: ClassPatchData = {\n instrumentation: this,\n traceContent: this.traceContent,\n originalModelsDescriptor,\n };\n Object.defineProperty(GoogleGenAIClass, CLASS_PATCH_DATA_SYMBOL, {\n value: patchData,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n\n Object.defineProperty(GoogleGenAIClass.prototype, \"models\", {\n configurable: true,\n enumerable: originalModelsDescriptor?.enumerable ?? true,\n get: function () {\n if (originalModelsDescriptor?.get) {\n return originalModelsDescriptor.get.call(this);\n }\n return undefined;\n },\n set: function (value: any) {\n patchData.instrumentation.patchModelsInstance(value, patchData);\n if (originalModelsDescriptor?.set) {\n originalModelsDescriptor.set.call(this, value);\n return;\n }\n Object.defineProperty(this, \"models\", {\n value,\n writable: true,\n configurable: true,\n enumerable: true,\n });\n },\n });\n }\n\n private unpatchGoogleGenAIClass(GoogleGenAIClass: any): void {\n const classPatchData = GoogleGenAIClass[CLASS_PATCH_DATA_SYMBOL] as ClassPatchData | undefined;\n if (!classPatchData) {\n return;\n }\n if (classPatchData.originalModelsDescriptor) {\n Object.defineProperty(\n GoogleGenAIClass.prototype,\n \"models\",\n classPatchData.originalModelsDescriptor,\n );\n } else {\n delete GoogleGenAIClass.prototype.models;\n }\n delete GoogleGenAIClass[CLASS_PATCH_DATA_SYMBOL];\n }\n\n private patchModelsInstance(models: any, classPatchData: ClassPatchData): void {\n if (!models || typeof models !== \"object\") return;\n if (typeof models.generateContent !== \"function\") return;\n if (typeof models.generateContentStream !== \"function\") return;\n\n // Guard against double-wrapping\n if (models[WRAPPED_SYMBOL]) return;\n\n const originalGenerateContent = models.generateContent.bind(models);\n const originalGenerateContentStream = models.generateContentStream.bind(models);\n models.generateContent = async function (params: any) {\n if (isTracingSuppressed(context.active())) {\n return originalGenerateContent(params);\n }\n\n const span = Laminar.startSpan({\n name: \"gemini.generate_content\",\n spanType: \"LLM\",\n });\n\n setRequestAttributes(span, params, classPatchData.traceContent);\n\n return Laminar.withSpan(span, async () => {\n try {\n const response = await originalGenerateContent(params);\n setResponseAttributes(span, response, classPatchData.traceContent);\n return response;\n } catch (error) {\n span.setAttribute(\"error.type\", (error as Error).constructor?.name ?? \"Error\");\n span.setStatus({ code: SpanStatusCode.ERROR });\n throw error;\n }\n }, true);\n };\n\n models.generateContentStream = async function (params: any) {\n if (isTracingSuppressed(context.active())) {\n return originalGenerateContentStream(params);\n }\n\n const span = Laminar.startSpan({\n name: \"gemini.generate_content_stream\",\n spanType: \"LLM\",\n });\n\n setRequestAttributes(span, params, classPatchData.traceContent);\n\n try {\n const asyncGen = await originalGenerateContentStream(params);\n return wrapStreamingResponse(span, asyncGen, classPatchData.traceContent);\n } catch (error) {\n span.setAttribute(\"error.type\", (error as Error).constructor?.name ?? \"Error\");\n span.recordException(error as Error);\n span.setStatus({ code: SpanStatusCode.ERROR });\n span.end();\n throw error;\n }\n };\n\n models[WRAPPED_SYMBOL] = true;\n }\n}\n/* eslint-enable\n @typescript-eslint/no-unsafe-return\n*/\n","import type * as KernelSDK from \"@onkernel/sdk\";\nimport { diag } from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\n\nimport { version as SDK_VERSION } from \"../../../package.json\";\nimport { observe } from \"../../decorators\";\nimport { Laminar } from \"../../laminar\";\n\nconst WRAPPED_BROWSER_METHODS: (keyof KernelSDK.Kernel.Browsers)[] = [\n 'create',\n 'retrieve',\n 'list',\n 'delete',\n 'deleteByID',\n 'loadExtensions',\n];\n\nconst WRAPPED_COMPUTER_METHODS: (keyof KernelSDK.Kernel.Browsers.Computer)[] = [\n \"captureScreenshot\",\n \"clickMouse\",\n \"dragMouse\",\n \"moveMouse\",\n \"pressKey\",\n \"scroll\",\n \"typeText\",\n];\n\nconst WRAPPED_PROCESS_METHODS: (keyof KernelSDK.Kernel.Browsers.Process)[] = [\n \"exec\",\n \"kill\",\n \"spawn\",\n \"status\",\n \"stdin\",\n \"stdoutStream\",\n];\n\n/* eslint-disable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type\n*/\nexport class KernelInstrumentation extends InstrumentationBase {\n constructor() {\n super(\n \"@lmnr/kernel-instrumentation\",\n SDK_VERSION,\n {\n enabled: true,\n },\n );\n }\n\n protected init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(\n \"@onkernel/sdk\",\n ['>=0.7.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return module;\n }\n\n public manuallyInstrument(kernelModule: typeof KernelSDK) {\n // Instrument resource classes\n for (const wrappedMethod of WRAPPED_BROWSER_METHODS) {\n this._wrap(\n kernelModule.Kernel.Browsers.prototype,\n wrappedMethod,\n this.patchMethod('Browser', wrappedMethod, 'DEFAULT'),\n );\n }\n for (const wrappedMethod of WRAPPED_COMPUTER_METHODS) {\n if (wrappedMethod === 'captureScreenshot') {\n this._wrap(\n kernelModule.Kernel.Browsers.Computer.prototype,\n wrappedMethod,\n this.patchTakeScreenshot(),\n );\n } else {\n this._wrap(\n kernelModule.Kernel.Browsers.Computer.prototype,\n wrappedMethod,\n this.patchMethod('Computer', wrappedMethod, 'TOOL'),\n );\n }\n }\n for (const wrappedMethod of WRAPPED_PROCESS_METHODS) {\n this._wrap(\n kernelModule.Kernel.Browsers.Process.prototype,\n wrappedMethod,\n this.patchProcessMethod(wrappedMethod),\n );\n }\n\n // Wrap the Kernel.app() factory method to patch KernelApp.action()\n this._wrap(\n kernelModule.Kernel.prototype,\n 'app',\n this.patchAppFactory(),\n );\n }\n\n private patchMethod(className: string, method: string, spanType: 'DEFAULT' | 'TOOL'): any {\n const plugin = this;\n return (original: (...args: any[]) => KernelSDK.APIPromise<unknown>) =>\n async function (this: any, ...args: any[]) {\n // Use observe() to automatically handle span lifecycle, input/output capture, and errors\n return await observe(\n {\n name: `${className}.${method}`,\n spanType,\n input: plugin.formatInput(args),\n },\n async (innerArgs: any[]) =>\n await (original.bind(this).apply(this, innerArgs)),\n args,\n );\n };\n }\n\n private patchTakeScreenshot(): any {\n const plugin = this;\n return (original: (...args: any[]) => KernelSDK.APIPromise<unknown>) =>\n async function (this: any, ...args: any[]) {\n // Use observe() to automatically handle span lifecycle, input/output capture, and errors\n const span = Laminar.startSpan({\n name: `Computer.captureScreenshot`,\n spanType: 'TOOL',\n input: plugin.formatInput(args),\n });\n try {\n const res = await original.bind(this).apply(this, args) as KernelSDK.APIPromise<unknown>;\n // We could actually parse binary and decode here, but we would need to consume\n // the api response byte stream, which may break the subsequent operations\n // on the response.\n span.setAttribute('lmnr.span.output', '<BASE64_ENCODED_IMAGE>');\n return res;\n } finally {\n span.end();\n }\n };\n }\n\n private patchProcessMethod(method: string): any {\n const plugin = this;\n return (original: (...args: any[]) => KernelSDK.APIPromise<unknown>) =>\n async function (this: any, ...args: any[]) {\n // First parameter of spawn and exec is the session ID, for others its PID (string)\n const input = ['spawn', 'exec'].includes(method)\n ? plugin.formatInput(args)\n : plugin.formatProcessInput(args);\n const span = Laminar.startSpan({\n name: `Process.${method}`,\n spanType: 'TOOL',\n input,\n });\n try {\n const result = await (original.bind(this).apply(this, args) as KernelSDK.APIPromise<{\n stderr_b64?: string,\n stdout_b64?: string,\n }>);\n const output = {\n ...(\n result?.stderr_b64\n ? { stderr: Buffer.from(result.stderr_b64, 'base64').toString('utf-8') }\n : {}\n ),\n ...(\n result?.stdout_b64\n ? { stdout: Buffer.from(result.stdout_b64, 'base64').toString('utf-8') }\n : {}),\n ...result,\n };\n span.setAttribute('lmnr.span.output', JSON.stringify(output));\n return result;\n } finally {\n span.end();\n }\n };\n }\n\n\n private patchAppFactory() {\n const plugin = this;\n return (original: Function) => function (this: any, name: string): any {\n // Call the original app() method to get the KernelApp instance\n const kernelApp = original.call(this, name);\n\n // Patch the action method on the returned KernelApp instance\n plugin._wrap(\n kernelApp,\n 'action',\n plugin.patchKernelAppAction(),\n );\n\n return kernelApp;\n };\n }\n\n private patchKernelAppAction() {\n return (original: any) => function (this: any, name: string, handler: Function): any {\n // Wrap the handler with observe\n const wrappedHandler = async (context: any, payload?: any) => {\n const result = await observe(\n {\n name: `action.${name}`,\n spanType: 'DEFAULT',\n },\n async (innerCtx: any, innerPayload: any) => {\n const result = await handler(innerCtx, innerPayload);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return result;\n },\n context,\n payload,\n );\n await Laminar.flush();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return result;\n };\n\n // Register the wrapped handler with the original action method\n return original.call(this, name, wrappedHandler);\n };\n }\n\n private formatInput(args: unknown[]): unknown[] {\n if (args.length === 0) {\n return [];\n }\n if (typeof args[0] === \"string\") {\n return [{ session_id: args[0] }, ...args.slice(1)];\n }\n return args;\n }\n\n private formatProcessInput(args: unknown[]): unknown[] {\n if (args.length === 0) {\n return [];\n }\n if (typeof args[0] === \"string\") {\n if (args.length === 1) {\n return [{ processID: args[0] }];\n }\n const requestParams = args[1] as { id?: string };\n if (requestParams.id) {\n return [{ processID: args[0], session_id: requestParams.id }, ...args.slice(1)];\n }\n return [{ processID: args[0] }, ...args.slice(1)];\n }\n return args;\n }\n\n private patch(moduleExports: typeof KernelSDK): any {\n diag.debug('Patching @onkernel/sdk');\n this.manuallyInstrument(moduleExports);\n return moduleExports;\n }\n\n private unpatch(moduleExports: typeof KernelSDK): void {\n diag.debug('Unpatching @onkernel/sdk');\n\n // Unwrap resource classes\n for (const wrappedMethod of WRAPPED_BROWSER_METHODS) {\n this._unwrap(moduleExports.Kernel.Browsers.prototype, wrappedMethod);\n }\n for (const wrappedMethod of WRAPPED_COMPUTER_METHODS) {\n this._unwrap(moduleExports.Kernel.Browsers.Computer.prototype, wrappedMethod);\n }\n for (const wrappedMethod of WRAPPED_PROCESS_METHODS) {\n this._unwrap(moduleExports.Kernel.Browsers.Process.prototype, wrappedMethod);\n }\n\n // Unwrap Kernel.app\n this._unwrap(moduleExports.Kernel.prototype, 'app');\n }\n}\n/* eslint-enable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type\n*/\n","import { createContextKey } from \"@opentelemetry/api\";\nimport { AsyncLocalStorage } from \"async_hooks\";\n\n// Laminar context key used to tell the OpenAI Responses API instrumentation\n// (once we add one to the TS SDK) that the current call is already being\n// tracked by the OpenAI Agents trace processor, so it should skip creating\n// a duplicate span for the same underlying HTTP request.\n//\n// We keep the raw key string alongside the symbol because\n// @opentelemetry/api's createContextKey returns an opaque symbol and some\n// downstream code (or future OpenAI Responses instrumentation) may want to\n// reference the human-readable name.\nexport const DISABLE_OPENAI_RESPONSES_INSTRUMENTATION_CONTEXT_KEY_RAW =\n \"LMNR_DISABLE_OPENAI_RESPONSES_INSTRUMENTATION\";\nexport const DISABLE_OPENAI_RESPONSES_INSTRUMENTATION_CONTEXT_KEY = createContextKey(\n DISABLE_OPENAI_RESPONSES_INSTRUMENTATION_CONTEXT_KEY_RAW,\n);\n\n// Task-local system instructions for the currently-executing model call.\n// Set by the wrapped getResponse / getStreamedResponse methods in index.ts\n// and read by the response/generation span_data handlers so the system\n// prompt can be prepended to gen_ai.input.messages.\nconst systemInstructionsStorage = new AsyncLocalStorage<string | undefined>();\n\nexport const getCurrentSystemInstructions = (): string | undefined =>\n systemInstructionsStorage.getStore();\n\nexport const runWithSystemInstructions = <T>(\n value: string | undefined,\n fn: () => T,\n): T => systemInstructionsStorage.run(value, fn);\n\n/* eslint-disable\n @typescript-eslint/prefer-promise-reject-errors,\n @typescript-eslint/no-unused-vars\n*/\n// Wrap an async iterable so that the system instructions ALS value is set for\n// each iteration step. We can't simply call `systemInstructionsStorage.run()`\n// once around generator creation, because the ALS context is restored as soon\n// as `.run()` returns — subsequent `next()` calls would see the old value.\nexport const wrapStreamWithSystemInstructions = <T>(\n value: string | undefined,\n source: AsyncIterable<T>,\n): AsyncIterable<T> => ({\n [Symbol.asyncIterator]() {\n let iterator: AsyncIterator<T> | undefined;\n const getIterator = (): AsyncIterator<T> => {\n if (iterator === undefined) {\n iterator = systemInstructionsStorage.run(value, () =>\n source[Symbol.asyncIterator](),\n );\n }\n return iterator;\n };\n return {\n next: (..._args: [] | [undefined]) =>\n systemInstructionsStorage.run(value, () => getIterator().next()),\n return: (returnValue?: any) => {\n const it = getIterator();\n return it.return\n ? systemInstructionsStorage.run(value, () => it.return!(returnValue))\n : Promise.resolve({ done: true, value: returnValue });\n },\n throw: (err?: any) => {\n const it = getIterator();\n return it.throw\n ? systemInstructionsStorage.run(value, () => it.throw!(err))\n : Promise.reject(err);\n },\n };\n },\n});\n/* eslint-enable\n @typescript-eslint/prefer-promise-reject-errors,\n @typescript-eslint/no-unused-vars\n*/\n\nexport const spanKind = (spanData: any): string => {\n if (spanData == null) {\n return \"\";\n }\n return typeof spanData.type === \"string\" ? (spanData.type as string) : \"\";\n};\n\nexport const spanName = (span: any, spanData: any): string => {\n const name = span?.name;\n if (typeof name === \"string\" && name) {\n return name;\n }\n const kind = spanKind(spanData);\n if (kind) {\n if (kind === \"agent\" || kind === \"custom\" || kind === \"function\" || kind === \"tool\") {\n return nameFromSpanData(spanData) || `agents.${kind}`;\n }\n return `agents.${kind}`;\n }\n return \"agents.span\";\n};\n\nexport type LaminarAgentsSpanType = \"LLM\" | \"TOOL\" | \"DEFAULT\";\n\nexport const mapSpanType = (spanData: any): LaminarAgentsSpanType => {\n const kind = spanKind(spanData);\n if (\n kind === \"generation\" ||\n kind === \"response\" ||\n kind === \"transcription\" ||\n kind === \"speech\" ||\n kind === \"speech_group\"\n ) {\n return \"LLM\";\n }\n if (\n kind === \"function\" ||\n kind === \"tool\" ||\n kind === \"mcp_list_tools\" ||\n kind === \"mcp_tools\" ||\n kind === \"handoff\"\n ) {\n return \"TOOL\";\n }\n return \"DEFAULT\";\n};\n\nexport const nameFromSpanData = (agent: any): string => {\n if (agent == null) {\n return \"\";\n }\n if (typeof agent === \"string\") {\n return agent;\n }\n if (typeof agent === \"object\") {\n if (typeof agent.name === \"string\") {\n return agent.name as string;\n }\n }\n return \"\";\n};\n\nexport const getFirstNotNull = (d: any, ...keys: string[]): any => {\n if (d == null) {\n return undefined;\n }\n for (const key of keys) {\n const v = d[key];\n if (v !== undefined && v !== null) {\n return v;\n }\n }\n return undefined;\n};\n\nexport const modelAsDict = (obj: any): Record<string, any> | undefined => {\n if (obj == null) {\n return undefined;\n }\n if (typeof obj !== \"object\") {\n return undefined;\n }\n if (Array.isArray(obj)) {\n return undefined;\n }\n // Plain object\n return obj as Record<string, any>;\n};\n\nexport const normalizeMessages = (\n data: any,\n role: string = \"user\",\n): Record<string, any>[] => {\n if (data == null) {\n return [];\n }\n\n if (typeof data === \"string\") {\n return [{ role, content: data }];\n }\n\n if (Array.isArray(data)) {\n const messages: Record<string, any>[] = [];\n for (const item of data) {\n if (item != null && typeof item === \"object\" && !Array.isArray(item)) {\n messages.push(item as Record<string, any>);\n } else {\n messages.push({ role, content: String(item) });\n }\n }\n return messages;\n }\n\n if (typeof data === \"object\") {\n return [data as Record<string, any>];\n }\n\n return [{ role, content: String(data) }];\n};\n","import type { Span } from \"@opentelemetry/api\";\n\nimport { initializeLogger } from \"../../../utils\";\nimport {\n LaminarAttributes,\n SPAN_INPUT,\n SPAN_OUTPUT,\n} from \"../../tracing/attributes\";\nimport { getFirstNotNull, modelAsDict, normalizeMessages } from \"./helpers\";\n\nconst logger = initializeLogger();\n\n// ---------------------------------------------------------------------------\n// gen_ai.input.messages / gen_ai.output.messages helpers\n// ---------------------------------------------------------------------------\n\nexport const setLmnrSpanIo = (\n lmnrSpan: Span,\n inputData: any,\n outputData: any,\n): void => {\n if (inputData !== undefined && inputData !== null) {\n lmnrSpan.setAttribute(SPAN_INPUT, JSON.stringify(inputData));\n }\n if (outputData !== undefined && outputData !== null) {\n lmnrSpan.setAttribute(SPAN_OUTPUT, JSON.stringify(outputData));\n }\n};\n\nexport const setGenAiInputMessages = (\n lmnrSpan: Span,\n inputData: any,\n systemInstructions?: string | null,\n): void => {\n const hasInput = inputData !== undefined && inputData !== null;\n if (!hasInput && !systemInstructions) {\n return;\n }\n const messages: Record<string, any>[] = hasInput\n ? normalizeMessages(inputData)\n : [];\n if (systemInstructions) {\n messages.unshift({\n role: \"system\",\n content: [{ type: \"input_text\", text: systemInstructions }],\n });\n }\n if (messages.length > 0) {\n lmnrSpan.setAttribute(\"gen_ai.input.messages\", JSON.stringify(messages));\n }\n};\n\nexport const setGenAiOutputMessages = (\n lmnrSpan: Span,\n outputData: any,\n): void => {\n if (outputData === undefined || outputData === null) {\n return;\n }\n const messages = normalizeMessages(outputData, \"assistant\");\n if (messages.length > 0) {\n lmnrSpan.setAttribute(\"gen_ai.output.messages\", JSON.stringify(messages));\n }\n};\n\nexport const setGenAiOutputMessagesFromResponse = (\n lmnrSpan: Span,\n response: any,\n): void => {\n if (response == null) {\n return;\n }\n\n let outputItems = response.output;\n if (!outputItems) {\n return;\n }\n\n const id = response.id;\n\n if (!Array.isArray(outputItems)) {\n logger.debug(\n \"Laminar OpenAI agents instrumentation, failed to parse output items. Expected array\",\n );\n outputItems = [];\n }\n\n const result = {\n id,\n object: \"response\",\n output: outputItems,\n };\n\n lmnrSpan.setAttribute(\"gen_ai.output.messages\", JSON.stringify(result));\n};\n\n// ---------------------------------------------------------------------------\n// Tool definitions\n// ---------------------------------------------------------------------------\n\nexport const setToolDefinitionsFromResponse = (\n lmnrSpan: Span,\n response: any,\n): void => {\n const tools = response?.tools;\n if (!tools || !Array.isArray(tools)) {\n return;\n }\n\n const toolDefs: Record<string, any>[] = [];\n for (const tool of tools) {\n const toolDict = modelAsDict(tool);\n if (!toolDict) {\n continue;\n }\n const toolType = toolDict.type;\n if (toolType === \"function\") {\n const funcDef: Record<string, any> = { type: \"function\" };\n const functionInfo = toolDict.function ?? toolDict;\n const fn: Record<string, any> = {\n name: functionInfo.name ?? \"\",\n };\n const desc = functionInfo.description;\n if (desc) {\n fn.description = desc;\n }\n const params = functionInfo.parameters;\n if (params) {\n fn.parameters = params;\n }\n const strict = functionInfo.strict;\n if (strict !== undefined && strict !== null) {\n fn.strict = strict;\n }\n funcDef.function = fn;\n toolDefs.push(funcDef);\n } else {\n toolDefs.push(toolDict);\n }\n }\n\n if (toolDefs.length > 0) {\n lmnrSpan.setAttribute(\"gen_ai.tool.definitions\", JSON.stringify(toolDefs));\n }\n};\n\n// ---------------------------------------------------------------------------\n// LLM attributes (model, usage, response_id)\n// ---------------------------------------------------------------------------\n\nexport const applyLlmAttributes = (\n lmnrSpan: Span,\n data: Record<string, any>,\n): void => {\n if (!data) {\n return;\n }\n\n const model = data.model;\n if (model) {\n lmnrSpan.setAttribute(LaminarAttributes.REQUEST_MODEL, model);\n lmnrSpan.setAttribute(LaminarAttributes.RESPONSE_MODEL, model);\n lmnrSpan.setAttribute(LaminarAttributes.PROVIDER, \"openai\");\n }\n\n const usage = data.usage;\n if (usage != null) {\n applyUsage(lmnrSpan, usage);\n }\n\n let responseId = data.response_id;\n if (responseId == null) {\n responseId = data.id;\n }\n if (responseId != null) {\n lmnrSpan.setAttribute(\"gen_ai.response.id\", responseId);\n }\n};\n\nconst applyUsage = (lmnrSpan: Span, usage: any): void => {\n if (usage == null) {\n return;\n }\n\n const inputTokens = getFirstNotNull(\n usage,\n \"input_tokens\",\n \"prompt_tokens\",\n \"input\",\n );\n const outputTokens = getFirstNotNull(\n usage,\n \"output_tokens\",\n \"completion_tokens\",\n \"output\",\n );\n const totalTokens = getFirstNotNull(usage, \"total_tokens\", \"total\");\n const inputTokensDetails = getFirstNotNull(\n usage,\n \"input_tokens_details\",\n \"prompt_tokens_details\",\n );\n const outputTokensDetails = getFirstNotNull(\n usage,\n \"output_tokens_details\",\n \"completion_tokens_details\",\n );\n\n let cachedInputTokens: number | undefined;\n let reasoningOutputTokens: number | undefined;\n\n if (\n inputTokensDetails?.cached_tokens !== undefined &&\n inputTokensDetails?.cached_tokens !== null\n ) {\n cachedInputTokens = Number(inputTokensDetails.cached_tokens);\n }\n if (\n outputTokensDetails?.reasoning_tokens !== undefined &&\n outputTokensDetails?.reasoning_tokens !== null\n ) {\n reasoningOutputTokens = Number(outputTokensDetails.reasoning_tokens);\n }\n if (inputTokens !== undefined && inputTokens !== null) {\n lmnrSpan.setAttribute(\n LaminarAttributes.INPUT_TOKEN_COUNT,\n Number(inputTokens),\n );\n }\n if (cachedInputTokens !== undefined) {\n lmnrSpan.setAttribute(\n \"gen_ai.usage.cache_read_input_tokens\",\n cachedInputTokens,\n );\n }\n if (outputTokens !== undefined && outputTokens !== null) {\n lmnrSpan.setAttribute(\n LaminarAttributes.OUTPUT_TOKEN_COUNT,\n Number(outputTokens),\n );\n }\n if (reasoningOutputTokens !== undefined) {\n lmnrSpan.setAttribute(\n \"gen_ai.usage.reasoning_output_tokens\",\n reasoningOutputTokens,\n );\n }\n if (totalTokens !== undefined && totalTokens !== null) {\n lmnrSpan.setAttribute(\n LaminarAttributes.TOTAL_TOKEN_COUNT,\n Number(totalTokens),\n );\n } else if (\n inputTokens !== undefined &&\n inputTokens !== null &&\n outputTokens !== undefined &&\n outputTokens !== null\n ) {\n lmnrSpan.setAttribute(\n LaminarAttributes.TOTAL_TOKEN_COUNT,\n Number(inputTokens) + Number(outputTokens),\n );\n }\n};\n\nexport const responseToLlmData = (response: any): Record<string, any> => {\n if (response == null) {\n return {};\n }\n return {\n model: response.model,\n usage: response.usage,\n response_id: response.id,\n };\n};\n","import { type Span, SpanStatusCode } from \"@opentelemetry/api\";\n\nimport { LaminarAttributes } from \"../../tracing/attributes\";\nimport {\n getCurrentSystemInstructions,\n nameFromSpanData,\n spanKind,\n} from \"./helpers\";\nimport {\n applyLlmAttributes,\n responseToLlmData,\n setGenAiInputMessages,\n setGenAiOutputMessages,\n setGenAiOutputMessagesFromResponse,\n setLmnrSpanIo,\n setToolDefinitionsFromResponse,\n} from \"./messages\";\n\n// ---------------------------------------------------------------------------\n// Error handling\n// ---------------------------------------------------------------------------\n\nexport const applySpanError = (lmnrSpan: Span, span: any): void => {\n const error = span?.error;\n if (!error) {\n return;\n }\n try {\n const message = error.message ?? String(error);\n lmnrSpan.setStatus({ code: SpanStatusCode.ERROR, message });\n } catch {\n // ignore\n }\n};\n\n// ---------------------------------------------------------------------------\n// Span data extraction\n// ---------------------------------------------------------------------------\n\nexport const applySpanData = (lmnrSpan: Span, spanData: any): void => {\n if (spanData == null) {\n return;\n }\n\n const kind = spanKind(spanData);\n\n if (kind === \"agent\") {\n applyAgentSpanData(lmnrSpan, spanData);\n } else if (kind === \"function\" || kind === \"tool\") {\n applyFunctionSpanData(lmnrSpan, spanData);\n } else if (kind === \"generation\") {\n applyGenerationSpanData(lmnrSpan, spanData);\n } else if (kind === \"response\") {\n applyResponseSpanData(lmnrSpan, spanData);\n } else if (kind === \"handoff\") {\n applyHandoffSpanData(lmnrSpan, spanData);\n } else if (kind === \"guardrail\") {\n applyGuardrailSpanData(lmnrSpan, spanData);\n } else if (kind === \"custom\") {\n applyCustomSpanData(lmnrSpan, spanData);\n } else if (kind === \"mcp_list_tools\" || kind === \"mcp_tools\") {\n applyMcpSpanData(lmnrSpan, spanData);\n } else if (kind === \"speech\") {\n applySpeechSpanData(lmnrSpan, spanData);\n } else if (kind === \"transcription\") {\n applyTranscriptionSpanData(lmnrSpan, spanData);\n } else if (kind === \"speech_group\") {\n applySpeechGroupSpanData(lmnrSpan, spanData);\n } else {\n // Fallback: set generic I/O\n setLmnrSpanIo(lmnrSpan, spanData?.input, spanData?.output);\n }\n};\n\nconst applyAgentSpanData = (lmnrSpan: Span, spanData: any): void => {\n const res: Record<string, any> = {};\n const name = spanData?.name;\n if (name) {\n res.name = name;\n }\n const handoffs = spanData?.handoffs;\n if (handoffs) {\n res.handoffs = handoffs;\n }\n const tools = spanData?.tools;\n if (tools) {\n res.tools = tools;\n }\n const outputType = spanData?.output_type;\n if (outputType) {\n res.output_type = outputType;\n }\n setLmnrSpanIo(lmnrSpan, res, null);\n};\n\nconst applyFunctionSpanData = (lmnrSpan: Span, spanData: any): void => {\n setLmnrSpanIo(lmnrSpan, spanData?.input, spanData?.output);\n};\n\nconst applyGenerationSpanData = (lmnrSpan: Span, spanData: any): void => {\n const inputData = spanData?.input;\n setGenAiInputMessages(lmnrSpan, inputData, getCurrentSystemInstructions());\n\n const outputData = spanData?.output;\n setGenAiOutputMessages(lmnrSpan, outputData);\n\n const llmData: Record<string, any> = {\n model: spanData?.model,\n usage: spanData?.usage,\n response_id: spanData?.response_id ?? spanData?.id,\n };\n applyLlmAttributes(lmnrSpan, llmData);\n};\n\nconst applyResponseSpanData = (lmnrSpan: Span, spanData: any): void => {\n // TS SDK stores the raw response under `_response` and raw input under `_input`\n // for non-OpenAI exporters (the OpenAI exporter strips them via\n // removePrivateFields). See\n // @openai/agents-core/dist/tracing/spans.d.ts::ResponseSpanData.\n const response = spanData?._response ?? spanData?.response;\n const responseInput = spanData?._input ?? spanData?.input;\n\n setGenAiInputMessages(lmnrSpan, responseInput, getCurrentSystemInstructions());\n\n if (response != null) {\n setGenAiOutputMessagesFromResponse(lmnrSpan, response);\n setToolDefinitionsFromResponse(lmnrSpan, response);\n applyLlmAttributes(lmnrSpan, responseToLlmData(response));\n } else if (spanData?.response_id) {\n // If we only have the response_id (OpenAI path strips the response body),\n // still surface it so callers can correlate.\n lmnrSpan.setAttribute(\"gen_ai.response.id\", spanData.response_id);\n }\n};\n\nconst applyHandoffSpanData = (lmnrSpan: Span, spanData: any): void => {\n const fromAgent = spanData?.from_agent;\n const toAgent = spanData?.to_agent;\n if (fromAgent) {\n lmnrSpan.setAttribute(\"openai.agents.handoff.from\", nameFromSpanData(fromAgent));\n }\n if (toAgent) {\n lmnrSpan.setAttribute(\"openai.agents.handoff.to\", nameFromSpanData(toAgent));\n }\n};\n\nconst applyGuardrailSpanData = (lmnrSpan: Span, spanData: any): void => {\n const name = spanData?.name;\n if (name) {\n lmnrSpan.setAttribute(\"openai.agents.guardrail.name\", name);\n }\n const triggered = spanData?.triggered;\n if (triggered !== undefined && triggered !== null) {\n lmnrSpan.setAttribute(\"openai.agents.guardrail.triggered\", Boolean(triggered));\n }\n};\n\nconst applyCustomSpanData = (lmnrSpan: Span, spanData: any): void => {\n const name = spanData?.name;\n if (name) {\n lmnrSpan.setAttribute(\"openai.agents.custom.name\", name);\n }\n const customData = spanData?.data;\n if (customData !== undefined && customData !== null) {\n lmnrSpan.setAttribute(\"openai.agents.custom.data\", JSON.stringify(customData));\n }\n};\n\nconst applyMcpSpanData = (lmnrSpan: Span, spanData: any): void => {\n const server = spanData?.server;\n if (server) {\n lmnrSpan.setAttribute(\"openai.agents.mcp.server\", server);\n }\n const result = spanData?.result;\n if (result !== undefined && result !== null) {\n lmnrSpan.setAttribute(\"openai.agents.mcp.result\", JSON.stringify(result));\n }\n};\n\nconst applySpeechSpanData = (lmnrSpan: Span, spanData: any): void => {\n const model = spanData?.model;\n if (model) {\n lmnrSpan.setAttribute(LaminarAttributes.REQUEST_MODEL, model);\n lmnrSpan.setAttribute(LaminarAttributes.RESPONSE_MODEL, model);\n lmnrSpan.setAttribute(LaminarAttributes.PROVIDER, \"openai\");\n }\n\n const inputText = spanData?.input;\n if (inputText) {\n setGenAiInputMessages(lmnrSpan, inputText);\n }\n\n const outputData = spanData?.output;\n if (outputData) {\n if (typeof outputData === \"object\" && !Array.isArray(outputData)) {\n // Speech output is {data: ..., format: ...}\n setGenAiOutputMessages(lmnrSpan, outputData.data);\n } else {\n setGenAiOutputMessages(lmnrSpan, outputData);\n }\n }\n};\n\nconst applyTranscriptionSpanData = (lmnrSpan: Span, spanData: any): void => {\n const model = spanData?.model;\n if (model) {\n lmnrSpan.setAttribute(LaminarAttributes.REQUEST_MODEL, model);\n lmnrSpan.setAttribute(LaminarAttributes.RESPONSE_MODEL, model);\n lmnrSpan.setAttribute(LaminarAttributes.PROVIDER, \"openai\");\n }\n\n const inputData = spanData?.input;\n if (inputData) {\n if (typeof inputData === \"object\" && !Array.isArray(inputData)) {\n setGenAiInputMessages(lmnrSpan, inputData.data);\n } else {\n setGenAiInputMessages(lmnrSpan, inputData);\n }\n }\n\n const outputText = spanData?.output;\n if (outputText) {\n setGenAiOutputMessages(lmnrSpan, outputText);\n }\n};\n\nconst applySpeechGroupSpanData = (lmnrSpan: Span, spanData: any): void => {\n const inputText = spanData?.input;\n if (inputText) {\n setGenAiInputMessages(lmnrSpan, inputText);\n }\n\n const outputText = spanData?.output;\n if (outputText) {\n setGenAiOutputMessages(lmnrSpan, outputText);\n }\n};\n","import type {\n Span as AgentsSpan,\n SpanData,\n Trace,\n TracingProcessor,\n} from \"@openai/agents\";\nimport { type Context, ROOT_CONTEXT, type Span as OtelSpan, trace } from \"@opentelemetry/api\";\n\nimport { Laminar } from \"../../../laminar\";\nimport { initializeLogger } from \"../../../utils\";\nimport { LaminarContextManager } from \"../../tracing/context\";\nimport { LaminarSpan } from \"../../tracing/span\";\nimport {\n DISABLE_OPENAI_RESPONSES_INSTRUMENTATION_CONTEXT_KEY,\n mapSpanType,\n nameFromSpanData,\n spanKind,\n spanName,\n} from \"./helpers\";\nimport { applySpanData, applySpanError } from \"./span-data\";\n\nconst logger = initializeLogger();\n\ninterface SpanEntry {\n lmnrSpan: OtelSpan;\n agentsSpan: AgentsSpan<SpanData>;\n // Context reference that was pushed onto the Laminar ALS stack when this\n // span started, so nested Laminar instrumentations (google-genai, etc.)\n // running inside the agents callback pick this span up as their parent.\n // `onSpanEnd` removes this exact reference via\n // `LaminarContextManager.removeContext` — using the reference (not a LIFO\n // pop) keeps the stack consistent when agent spans end out of order with\n // respect to other activated spans sharing the same async frame.\n activationContext?: Context;\n}\n\ninterface TraceState {\n rootSpan: OtelSpan | undefined;\n spans: Map<string, SpanEntry>;\n // When true, the trace has been marked as ended (via onTraceEnd or shutdown)\n // and we should not write any more spans into it.\n ended: boolean;\n // Maps destination agent name -> handoff parent Laminar span context so the\n // subsequent agent span becomes a sibling of the handoff span (both children\n // of the handoff's parent).\n pendingHandoffCtxs: Map<string, string>;\n}\n\n/* eslint-disable @typescript-eslint/require-await */\nexport class LaminarAgentsTraceProcessor implements TracingProcessor {\n private traces: Map<string, TraceState> = new Map();\n private disabled: boolean = false;\n\n start(): void {\n // Nothing to do - we don't run an export loop.\n }\n\n async onTraceStart(agentsTrace: Trace): Promise<void> {\n if (this.disabled) {\n return;\n }\n const traceId = agentsTrace.traceId;\n if (!traceId) {\n return;\n }\n try {\n const state = this.getOrCreateTrace(agentsTrace);\n\n // Update root span name to the actual trace name (it defaults to\n // \"agents.trace\" at creation time; see getOrCreateTrace).\n const traceName = agentsTrace.name;\n if (traceName && state.rootSpan !== undefined) {\n try {\n state.rootSpan.updateName(traceName);\n } catch {\n // ignore\n }\n }\n this.applyTraceMetadata(state.rootSpan, agentsTrace);\n } catch (e) {\n logger.debug(`Error in onTraceStart: ${String(e)}`);\n }\n }\n\n async onTraceEnd(agentsTrace: Trace): Promise<void> {\n if (this.disabled) {\n return;\n }\n const traceId = agentsTrace.traceId;\n if (!traceId) {\n return;\n }\n const state = this.traces.get(traceId);\n if (!state || state.ended) {\n return;\n }\n state.ended = true;\n this.endTraceState(state);\n this.traces.delete(traceId);\n }\n\n async onSpanStart(span: AgentsSpan<SpanData>): Promise<void> {\n if (this.disabled) {\n return;\n }\n const traceId = span.traceId;\n if (!traceId) {\n return;\n }\n let lmnrSpan: OtelSpan | undefined;\n try {\n const state = this.getOrCreateTrace(span);\n\n let parentSpanContext: string | undefined;\n\n const spanData = span.spanData;\n\n // If this is an agent span, check if a handoff targeting this agent is\n // pending. If so, make this span a child of the handoff's parent so the\n // subagent is nested correctly.\n if (spanKind(spanData) === \"agent\") {\n const thisAgentName = nameFromSpanData(\n (spanData as any)?.name ?? spanData,\n );\n const handoffCtx = state.pendingHandoffCtxs.get(thisAgentName);\n if (handoffCtx !== undefined) {\n state.pendingHandoffCtxs.delete(thisAgentName);\n parentSpanContext = handoffCtx;\n }\n }\n\n // Resolve the parent Laminar span explicitly via the agents SDK's\n // parentId (or falling back to the trace's root span). Relying on\n // LaminarContextManager.getContext() would consult a process-global\n // stack, which is unsafe when multiple agent runs execute concurrently.\n if (parentSpanContext === undefined) {\n const parentId = span.parentId;\n const parentEntry =\n parentId != null ? state.spans.get(parentId) : undefined;\n const parentLmnrSpan =\n parentEntry !== undefined ? parentEntry.lmnrSpan : state.rootSpan;\n if (parentLmnrSpan !== undefined) {\n try {\n const ctx = (\n parentLmnrSpan as LaminarSpan\n ).getLaminarSpanContext?.();\n if (ctx) {\n parentSpanContext = JSON.stringify(ctx);\n }\n } catch {\n // ignore\n }\n }\n }\n\n const spanType = mapSpanType(spanData);\n const name = spanName(span, spanData);\n\n // Mark the context so any future OpenAI Responses API instrumentation\n // (on the TS side) knows to skip — the agents run already records a\n // matching span for this underlying HTTP call. Start from ROOT_CONTEXT\n // (not getContext()) so the per-trace parent we resolved above — rather\n // than whatever happens to be globally active on the shared stack —\n // determines hierarchy. This keeps concurrent traces isolated.\n const ctx = ROOT_CONTEXT.setValue(\n DISABLE_OPENAI_RESPONSES_INSTRUMENTATION_CONTEXT_KEY,\n true,\n );\n\n // Use startSpan (not startActiveSpan) so we don't push onto the ALS\n // stack via Laminar's built-in activation path — that path uses\n // `popContext` (blunt LIFO) on `end()`, which corrupts the stack when\n // agent spans end out of order with respect to other activated spans.\n lmnrSpan = Laminar.startSpan({\n name,\n spanType,\n parentSpanContext,\n context: ctx,\n });\n\n const key = span.spanId;\n if (!key) {\n logger.debug(\"Span missing spanId, cannot track\");\n try {\n lmnrSpan.end();\n } catch {\n // ignore\n }\n return;\n }\n\n // Register the new span on the Laminar ALS stack so nested Laminar\n // instrumentation (google-genai, etc.) that runs inside the agent /\n // tool callback picks it up as parent via `getContext()`. We push the\n // context reference here and remove that exact reference in onSpanEnd\n // — never relying on LIFO order — so concurrent or out-of-order agent\n // span ends cannot corrupt the stack for unrelated activations sharing\n // the same async frame.\n let activationContext: Context | undefined;\n try {\n activationContext = trace.setSpan(ctx, lmnrSpan);\n LaminarContextManager.pushContext(activationContext);\n } catch {\n activationContext = undefined;\n }\n state.spans.set(key, { lmnrSpan, agentsSpan: span, activationContext });\n } catch (e) {\n logger.debug(`Error in onSpanStart: ${String(e)}`);\n if (lmnrSpan !== undefined) {\n try {\n lmnrSpan.end();\n } catch {\n // ignore\n }\n }\n }\n }\n\n async onSpanEnd(span: AgentsSpan<SpanData>): Promise<void> {\n if (this.disabled) {\n return;\n }\n const traceId = span.traceId;\n if (!traceId) {\n return;\n }\n\n const key = span.spanId;\n if (!key) {\n return;\n }\n\n const state = this.traces.get(traceId);\n const entry = state?.spans.get(key);\n if (!entry || !state) {\n return;\n }\n state.spans.delete(key);\n\n const spanData = span.spanData;\n try {\n try {\n applySpanData(entry.lmnrSpan, spanData);\n applySpanError(entry.lmnrSpan, span);\n } catch {\n // ignore\n }\n\n // When a handoff span ends, save the *parent* span's Laminar context keyed\n // by the destination agent name. The next agent span's start will consume\n // this so it becomes a sibling of the handoff span.\n if (spanKind(spanData) === \"handoff\") {\n try {\n const toAgent = nameFromSpanData((spanData as any)?.to_agent);\n if (toAgent) {\n const parentId = span.parentId;\n const parentEntry =\n parentId != null ? state.spans.get(parentId) : undefined;\n const parentLmnrSpan =\n parentEntry !== undefined ? parentEntry.lmnrSpan : state.rootSpan;\n if (parentLmnrSpan !== undefined) {\n const handoffCtx = (\n parentLmnrSpan as LaminarSpan\n ).getLaminarSpanContext?.();\n if (handoffCtx) {\n state.pendingHandoffCtxs.set(\n toAgent,\n JSON.stringify(handoffCtx),\n );\n }\n }\n }\n } catch {\n // ignore\n }\n }\n\n if (entry.activationContext !== undefined) {\n try {\n LaminarContextManager.removeContext(entry.activationContext);\n } catch {\n // ignore\n }\n }\n\n try {\n entry.lmnrSpan.end();\n } catch {\n // ignore\n }\n } catch {\n // ignore\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async shutdown(_timeout?: number): Promise<void> {\n this.disabled = true;\n const states = Array.from(this.traces.values()).filter((s) => !s.ended);\n for (const s of states) {\n s.ended = true;\n }\n this.traces.clear();\n for (const state of states) {\n this.endTraceState(state);\n }\n try {\n await Laminar.flush();\n } catch {\n // ignore\n }\n }\n\n async forceFlush(): Promise<void> {\n try {\n await Laminar.flush();\n } catch {\n // ignore\n }\n }\n\n private endTraceState(state: TraceState): void {\n // End all child spans (LIFO) then the root span.\n const remaining = Array.from(state.spans.values());\n state.spans.clear();\n for (let i = remaining.length - 1; i >= 0; i--) {\n const entry = remaining[i];\n try {\n const spanData = entry.agentsSpan?.spanData;\n applySpanData(entry.lmnrSpan, spanData);\n applySpanError(entry.lmnrSpan, entry.agentsSpan);\n } catch {\n // ignore\n }\n if (entry.activationContext !== undefined) {\n try {\n LaminarContextManager.removeContext(entry.activationContext);\n } catch {\n // ignore\n }\n }\n try {\n entry.lmnrSpan.end();\n } catch {\n // ignore\n }\n }\n try {\n state.rootSpan?.end();\n } catch {\n // ignore\n }\n }\n\n private getOrCreateTrace(\n traceOrSpan: Trace | AgentsSpan<SpanData>,\n ): TraceState {\n let traceId: string | undefined = (traceOrSpan as any).traceId;\n if (!traceId) {\n traceId = \"unknown\";\n }\n const existing = this.traces.get(traceId);\n if (existing) {\n return existing;\n }\n\n // Generic name; onTraceStart will update it to the actual trace name.\n // Start from ROOT_CONTEXT so the root span of a concurrently-running\n // agent trace cannot become a child of another trace's currently-active\n // span on the shared async context. Use startSpan (not startActiveSpan)\n // so the processor never touches the ALS context stack — see the child\n // span call-site for the rationale.\n const rootSpan = Laminar.startSpan({\n name: \"agents.trace\",\n context: ROOT_CONTEXT,\n });\n const state: TraceState = {\n rootSpan,\n spans: new Map(),\n ended: false,\n pendingHandoffCtxs: new Map(),\n };\n this.traces.set(traceId, state);\n return state;\n }\n\n private applyTraceMetadata(\n rootSpan: OtelSpan | undefined,\n agentsTrace: Trace,\n ): void {\n if (rootSpan === undefined) {\n return;\n }\n const metadata: Record<string, any> = {};\n const traceMetadata = agentsTrace.metadata;\n if (traceMetadata !== undefined && traceMetadata !== null) {\n Object.assign(metadata, traceMetadata);\n }\n const groupId = agentsTrace.groupId;\n if (groupId) {\n metadata[\"openai.agents.group_id\"] = groupId;\n }\n if (agentsTrace.name) {\n metadata[\"openai.agents.trace_name\"] = agentsTrace.name;\n }\n if (Object.keys(metadata).length > 0) {\n try {\n (rootSpan as LaminarSpan).setTraceMetadata?.(metadata);\n } catch {\n // ignore\n }\n }\n const sessionId = metadata.session_id;\n const userId = metadata.user_id;\n if (sessionId) {\n try {\n (rootSpan as LaminarSpan).setTraceSessionId?.(String(sessionId));\n } catch {\n // ignore\n }\n }\n if (userId) {\n try {\n (rootSpan as LaminarSpan).setTraceUserId?.(String(userId));\n } catch {\n // ignore\n }\n }\n }\n}\n/* eslint-enable @typescript-eslint/require-await */\n","import { diag } from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\n\nimport { version as SDK_VERSION } from \"../../../../package.json\";\nimport { initializeLogger } from \"../../../utils\";\nimport {\n runWithSystemInstructions,\n wrapStreamWithSystemInstructions,\n} from \"./helpers\";\nimport { LaminarAgentsTraceProcessor } from \"./processor\";\n\nexport {\n DISABLE_OPENAI_RESPONSES_INSTRUMENTATION_CONTEXT_KEY,\n DISABLE_OPENAI_RESPONSES_INSTRUMENTATION_CONTEXT_KEY_RAW,\n} from \"./helpers\";\nexport { LaminarAgentsTraceProcessor } from \"./processor\";\n\nconst logger = initializeLogger();\n\n/* eslint-disable\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return,\n @typescript-eslint/no-unsafe-argument\n*/\n\ntype ModelRequestLike = {\n systemInstructions?: string;\n} | undefined;\n\nconst wrapGetResponse = (original: Function): Function =>\n function (this: any, request: ModelRequestLike, ...rest: any[]) {\n const systemInstructions = request?.systemInstructions;\n return runWithSystemInstructions(systemInstructions, () =>\n original.call(this, request, ...rest),\n );\n };\n\nconst wrapGetStreamedResponse = (original: Function): Function =>\n function (this: any, request: ModelRequestLike, ...rest: any[]) {\n const systemInstructions = request?.systemInstructions;\n const source = original.call(this, request, ...rest) as AsyncIterable<any>;\n return wrapStreamWithSystemInstructions(systemInstructions, source);\n };\n\nconst MODEL_METHODS: readonly [\"getResponse\", \"getStreamedResponse\"] = [\n \"getResponse\",\n \"getStreamedResponse\",\n];\n\ntype AgentsOpenAIModule = {\n OpenAIResponsesModel?: { prototype: any };\n OpenAIChatCompletionsModel?: { prototype: any };\n};\n\ntype AgentsTracingModule = {\n addTraceProcessor?: (processor: any) => void;\n};\n\nexport class OpenAIAgentsInstrumentation extends InstrumentationBase {\n private _processor: LaminarAgentsTraceProcessor | undefined;\n private _wrappedPrototypes: WeakSet<object> = new WeakSet();\n\n constructor() {\n super(\"@lmnr/openai-agents-instrumentation\", SDK_VERSION, {\n enabled: true,\n });\n }\n\n protected init(): InstrumentationModuleDefinition[] {\n return [\n new InstrumentationNodeModuleDefinition(\n \"@openai/agents\",\n [\">=0.0.1\"],\n this.patchAgents.bind(this),\n this.unpatchAgents.bind(this),\n ),\n new InstrumentationNodeModuleDefinition(\n \"@openai/agents-openai\",\n [\">=0.0.1\"],\n this.patchAgentsOpenAI.bind(this),\n this.unpatchAgentsOpenAI.bind(this),\n ),\n ];\n }\n\n public manuallyInstrument(agentsModule: any) {\n if (!agentsModule) {\n logger.debug(\"@openai/agents module not provided, skipping\");\n return;\n }\n this.registerProcessor(agentsModule);\n this.patchModel(agentsModule);\n }\n\n private registerProcessor(module: AgentsTracingModule) {\n if (this._processor !== undefined) {\n return;\n }\n const addTraceProcessor = module.addTraceProcessor;\n if (typeof addTraceProcessor !== \"function\") {\n logger.debug(\"addTraceProcessor not found in @openai/agents module\");\n return;\n }\n try {\n const processor = new LaminarAgentsTraceProcessor();\n addTraceProcessor(processor);\n this._processor = processor;\n } catch (e) {\n logger.debug(`Failed to register Laminar Agents processor: ${String(e)}`);\n }\n }\n\n private patchModel(module: AgentsOpenAIModule) {\n for (const cls of [\n module.OpenAIResponsesModel,\n module.OpenAIChatCompletionsModel,\n ]) {\n if (!cls || !cls.prototype) {\n continue;\n }\n // @openai/agents re-exports the model classes from @openai/agents-openai,\n // so we may see the same prototype twice. Skip if already wrapped to\n // avoid double-wrapping getResponse/getStreamedResponse.\n if (this._wrappedPrototypes.has(cls.prototype)) {\n continue;\n }\n for (const method of MODEL_METHODS) {\n if (typeof cls.prototype[method] !== \"function\") {\n continue;\n }\n const wrapper = method === \"getResponse\"\n ? wrapGetResponse\n : wrapGetStreamedResponse;\n try {\n this._wrap(cls.prototype, method, wrapper as any);\n } catch (e) {\n logger.debug(`Failed to wrap ${method}: ${String(e)}`);\n }\n }\n this._wrappedPrototypes.add(cls.prototype);\n }\n }\n\n private unpatchModel(module: AgentsOpenAIModule) {\n for (const cls of [\n module.OpenAIResponsesModel,\n module.OpenAIChatCompletionsModel,\n ]) {\n if (!cls || !cls.prototype) {\n continue;\n }\n if (!this._wrappedPrototypes.has(cls.prototype)) {\n continue;\n }\n for (const method of MODEL_METHODS) {\n try {\n this._unwrap(cls.prototype, method);\n } catch {\n // ignore\n }\n }\n this._wrappedPrototypes.delete(cls.prototype);\n }\n }\n\n private patchAgents(moduleExports: any): any {\n diag.debug(\"Patching @openai/agents\");\n this.registerProcessor(moduleExports as AgentsTracingModule);\n // @openai/agents re-exports @openai/agents-openai, so model classes are here\n this.patchModel(moduleExports as AgentsOpenAIModule);\n return moduleExports;\n }\n\n private unpatchAgents(moduleExports: any): void {\n diag.debug(\"Unpatching @openai/agents\");\n this.unpatchModel(moduleExports as AgentsOpenAIModule);\n }\n\n private patchAgentsOpenAI(moduleExports: any): any {\n diag.debug(\"Patching @openai/agents-openai\");\n this.patchModel(moduleExports as AgentsOpenAIModule);\n return moduleExports;\n }\n\n private unpatchAgentsOpenAI(moduleExports: any): void {\n diag.debug(\"Unpatching @openai/agents-openai\");\n this.unpatchModel(moduleExports as AgentsOpenAIModule);\n }\n}\n/* eslint-enable\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return,\n @typescript-eslint/no-unsafe-argument\n*/\n","import { diag } from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\n\nimport { version as SDK_VERSION } from \"../../../package.json\";\nimport { Laminar } from \"../../laminar\";\n\n/* eslint-disable\n @typescript-eslint/no-unsafe-return,\n @typescript-eslint/no-unsafe-function-type\n*/\n\nexport class OpencodeInstrumentation extends InstrumentationBase {\n constructor() {\n super(\"lmnr-opencode-instrumentation\", SDK_VERSION, { enabled: true });\n }\n\n protected init(): InstrumentationModuleDefinition {\n return new InstrumentationNodeModuleDefinition(\n \"@opencode-ai/sdk\",\n [\">=1.0.0\"],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n }\n\n public manuallyInstrument(opencodeModule: any): void {\n diag.debug(\"Manually instrumenting @opencode-ai/sdk\");\n const SessionClass = this.resolveSessionClass(opencodeModule);\n if (SessionClass) {\n this.patchSessionClass(SessionClass);\n } else {\n diag.warn(\n \"Could not find Session class in opencode manual instrumentation input. \" +\n \"Pass the OpencodeClient class or the module object.\",\n );\n }\n }\n\n private resolveSessionClass(input: any): any {\n // Module-level import: { OpencodeClient, ... }\n if (input?.OpencodeClient) {\n return this.getSessionClass(input.OpencodeClient);\n }\n // Direct class passed\n if (typeof input === \"function\" && input.prototype) {\n return this.getSessionClass(input);\n }\n return null;\n }\n\n // session is a class field on OpencodeClient (not on the prototype), so we\n // must instantiate to trigger field initialization and discover Session's constructor.\n private getSessionClass(ClientClass: any): Function | null {\n try {\n const instance = new ClientClass();\n if (instance.session) {\n return instance.session.constructor;\n }\n } catch {\n // fall through\n }\n return null;\n }\n\n private patchSessionClass(SessionClass: Function): void {\n this._wrap(SessionClass.prototype, \"prompt\", this.patchPromptMethod());\n this._wrap(SessionClass.prototype, \"promptAsync\", this.patchPromptMethod());\n }\n\n private patchPromptMethod(): (original: Function) => Function {\n return (original: Function) => function (this: any, ...args: any[]) {\n const options = args[0];\n if (options?.body?.parts && Array.isArray(options.body.parts)) {\n const serializedContext = Laminar.serializeLaminarSpanContext();\n if (serializedContext) {\n options.body.parts = [\n ...options.body.parts,\n {\n type: \"text\",\n metadata: {\n lmnrSpanContext: serializedContext,\n },\n text: \"\",\n ignored: true,\n synthetic: true,\n },\n ];\n }\n }\n return original.apply(this, args);\n };\n }\n\n private patch(moduleExports: any): any {\n diag.debug(\"Patching @opencode-ai/sdk\");\n const SessionClass = this.resolveSessionClass(moduleExports);\n if (SessionClass) {\n this.patchSessionClass(SessionClass);\n }\n return moduleExports;\n }\n\n private unpatch(moduleExports: any): void {\n diag.debug(\"Unpatching @opencode-ai/sdk\");\n const SessionClass = this.resolveSessionClass(moduleExports);\n if (SessionClass) {\n this._unwrap(SessionClass.prototype, \"prompt\");\n this._unwrap(SessionClass.prototype, \"promptAsync\");\n }\n }\n}\n\n/* eslint-enable\n @typescript-eslint/no-unsafe-return,\n @typescript-eslint/no-unsafe-function-type\n*/\n","import { LaminarClient } from \"@lmnr-ai/client\";\nimport { SessionRecordingOptions } from \"@lmnr-ai/types\";\nimport { Instrumentation } from \"@opentelemetry/instrumentation\";\nimport { AnthropicInstrumentation } from \"@traceloop/instrumentation-anthropic\";\nimport { AzureOpenAIInstrumentation } from \"@traceloop/instrumentation-azure\";\nimport { BedrockInstrumentation } from \"@traceloop/instrumentation-bedrock\";\nimport { ChromaDBInstrumentation } from \"@traceloop/instrumentation-chromadb\";\nimport { CohereInstrumentation } from \"@traceloop/instrumentation-cohere\";\nimport { LangChainInstrumentation } from \"@traceloop/instrumentation-langchain\";\nimport { OpenAIInstrumentation } from \"@traceloop/instrumentation-openai\";\nimport { PineconeInstrumentation } from \"@traceloop/instrumentation-pinecone\";\nimport { QdrantInstrumentation } from \"@traceloop/instrumentation-qdrant\";\nimport { TogetherInstrumentation } from \"@traceloop/instrumentation-together\";\nimport {\n AIPlatformInstrumentation,\n VertexAIInstrumentation,\n} from \"@traceloop/instrumentation-vertexai\";\n\nimport { PlaywrightInstrumentation } from \"../../browser\";\nimport { PuppeteerInstrumentation } from \"../../browser/puppeteer\";\nimport { StagehandV2Instrumentation } from \"../../browser/stagehand/v2\";\nimport { StagehandInstrumentation as StagehandV3Instrumentation } from \"../../browser/stagehand/v3\";\nimport { initializeLogger } from \"../../utils\";\nimport { ClaudeAgentSDKInstrumentation } from \"../instrumentation/claude-agent-sdk\";\nimport { GoogleGenAiInstrumentation } from \"../instrumentation/google-genai\";\nimport { KernelInstrumentation } from \"../instrumentation/kernel\";\nimport { OpenAIAgentsInstrumentation } from \"../instrumentation/openai-agents\";\nimport { OpencodeInstrumentation } from \"../instrumentation/opencode\";\nimport { InitializeOptions } from \"../interfaces\";\n\nconst logger = initializeLogger();\n\n/**\n * Initialize and return Laminar instrumentations.\n * Useful to use with libraries that initialize tracing and can register passed\n * instrumentations.\n *\n * @param options\n * @param {string} options.baseUrl - Base URL of the Laminar API.\n * @param {string} options.apiKey - Laminar project API key. If not provided, will use\n * the LMNR_PROJECT_API_KEY environment variable.\n * @param {number} options.httpPort - Laminar API http port. If not provided, will use\n * the port from the baseUrl or defaults to 443. Only required for Playwright/Puppeteer\n * instrumentations for sending browser sessions.\n * @param {boolean} options.suppressContentTracing - Whether to suppress content tracing.\n * @param {InitializeOptions[\"instrumentModules\"]} options.instrumentModules - Record of modules\n * to instrument.\n * If not provided, all auto-instrumentable modules will be instrumented, which include\n * LLM calls (OpenAI, Anthropic, etc), Langchain, VectorDB calls (Pinecone, Qdrant, etc).\n * Pass an empty object {} to disable any kind of automatic instrumentation.\n * If you only want to auto-instrument specific modules, then pass them in the object.\n *\n * @returns {Instrumentation[]} Array of enabled instrumentations. It is your responsibility\n * to enable them and register them with the OpenTelemetry SDK. For example, you could use\n * registerInstrumentations from the opentelemetry-api to register them.\n */\nexport const initializeLaminarInstrumentations = (\n options: {\n baseUrl?: string;\n apiKey?: string;\n httpPort?: number;\n suppressContentTracing?: boolean;\n instrumentModules?: InitializeOptions[\"instrumentModules\"];\n sessionRecordingOptions?: SessionRecordingOptions;\n } = {},\n) => {\n const apiKey = options.apiKey ?? process.env.LMNR_PROJECT_API_KEY;\n\n // Only create client if we have an API key. That is, only send browser\n // session events to Laminar backend, but not other OTEL backends.\n let client: LaminarClient | undefined;\n if (apiKey) {\n const url =\n options.baseUrl ?? process?.env?.LMNR_BASE_URL ?? \"https://api.lmnr.ai\";\n const port =\n options.httpPort ??\n (url.match(/:\\d{1,5}$/g)\n ? parseInt(url.match(/:\\d{1,5}$/g)![0].slice(1))\n : 443);\n const urlWithoutSlash = url.replace(/\\/$/, \"\").replace(/:\\d{1,5}$/g, \"\");\n client = new LaminarClient({\n baseUrl: `${urlWithoutSlash}:${port}`,\n projectApiKey: apiKey,\n });\n }\n\n return options?.instrumentModules !== undefined\n ? manuallyInitInstrumentations(\n client,\n options.instrumentModules,\n options.suppressContentTracing,\n options.sessionRecordingOptions,\n )\n : initInstrumentations(\n client,\n options.suppressContentTracing,\n options.sessionRecordingOptions,\n );\n};\n\n/**\n * Get the appropriate Stagehand instrumentation based on the installed version.\n * Returns v3 instrumentation for stagehand >= 3.0.0, otherwise v2.\n */\nconst getStagehandInstrumentation = (\n playwrightInstrumentation: PlaywrightInstrumentation,\n client: LaminarClient,\n sessionRecordingOptions?: SessionRecordingOptions,\n): StagehandV2Instrumentation | StagehandV3Instrumentation => {\n try {\n // Try to require the stagehand package to get its version\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const stagehandPkg = require(\"@browserbasehq/stagehand/package.json\");\n const version = stagehandPkg.version;\n const majorVersion = parseInt(version.split(\".\")[0], 10);\n\n if (majorVersion >= 3) {\n const stagehandInstrumentation = new StagehandV3Instrumentation(\n sessionRecordingOptions,\n );\n stagehandInstrumentation.setClient(client);\n return stagehandInstrumentation;\n } else {\n return new StagehandV2Instrumentation(playwrightInstrumentation);\n }\n } catch {\n // If we can't find the package, default to v3\n }\n\n const stagehandInstrumentation = new StagehandV3Instrumentation(\n sessionRecordingOptions,\n );\n stagehandInstrumentation.setClient(client);\n return stagehandInstrumentation;\n};\n\nconst initInstrumentations = (\n client: LaminarClient | undefined,\n suppressContentTracing?: boolean,\n sessionRecordingOptions?: SessionRecordingOptions,\n): Instrumentation[] => {\n const enrichTokens = false;\n const instrumentations: Instrumentation[] = [];\n\n instrumentations.push(\n new OpenAIInstrumentation({\n enrichTokens,\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new AnthropicInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new AzureOpenAIInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new CohereInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new VertexAIInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new AIPlatformInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new BedrockInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(new PineconeInstrumentation());\n\n instrumentations.push(\n new LangChainInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new TogetherInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new ChromaDBInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new QdrantInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n // Browser instrumentations require a client (API key)\n if (client) {\n const playwrightInstrumentation = new PlaywrightInstrumentation(\n client,\n sessionRecordingOptions,\n );\n instrumentations.push(playwrightInstrumentation);\n\n instrumentations.push(\n getStagehandInstrumentation(\n playwrightInstrumentation,\n client,\n sessionRecordingOptions,\n ),\n );\n\n instrumentations.push(\n new PuppeteerInstrumentation(client, sessionRecordingOptions),\n );\n }\n\n instrumentations.push(\n new GoogleGenAiInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(new KernelInstrumentation());\n\n instrumentations.push(new ClaudeAgentSDKInstrumentation());\n\n instrumentations.push(new OpencodeInstrumentation());\n\n instrumentations.push(new OpenAIAgentsInstrumentation());\n\n return instrumentations;\n};\n\nconst manuallyInitInstrumentations = (\n client: LaminarClient | undefined,\n instrumentModules: InitializeOptions[\"instrumentModules\"],\n suppressContentTracing?: boolean,\n sessionRecordingOptions?: SessionRecordingOptions,\n): Instrumentation[] => {\n const enrichTokens = false;\n const instrumentations: Instrumentation[] = [];\n let playwrightInstrumentation: PlaywrightInstrumentation | undefined;\n\n if (instrumentModules?.OpenAI && instrumentModules?.openAI) {\n throw new Error(\n \"`openAI` is deprecated, but both `OpenAI` and `openAI` are provided. \" +\n \"Please use `OpenAI` only.\",\n );\n }\n\n if (instrumentModules?.openAI) {\n const openAIInstrumentation = new OpenAIInstrumentation({\n enrichTokens,\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(openAIInstrumentation);\n openAIInstrumentation.manuallyInstrument(instrumentModules.openAI);\n }\n\n if (instrumentModules?.OpenAI) {\n const openAIInstrumentation = new OpenAIInstrumentation({\n enrichTokens,\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(openAIInstrumentation);\n openAIInstrumentation.manuallyInstrument(instrumentModules.OpenAI);\n }\n\n if (instrumentModules?.anthropic) {\n const anthropicInstrumentation = new AnthropicInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(anthropicInstrumentation);\n anthropicInstrumentation.manuallyInstrument(\n instrumentModules.anthropic,\n );\n }\n\n if (instrumentModules?.azureOpenAI) {\n const azureOpenAIInstrumentation = new AzureOpenAIInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(azureOpenAIInstrumentation as Instrumentation);\n azureOpenAIInstrumentation.manuallyInstrument(\n instrumentModules.azureOpenAI,\n );\n }\n\n if (instrumentModules?.cohere) {\n const cohereInstrumentation = new CohereInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(cohereInstrumentation);\n cohereInstrumentation.manuallyInstrument(instrumentModules.cohere);\n }\n\n if (instrumentModules?.google_vertexai) {\n const vertexaiInstrumentation = new VertexAIInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(vertexaiInstrumentation);\n vertexaiInstrumentation.manuallyInstrument(\n instrumentModules.google_vertexai,\n );\n }\n\n if (instrumentModules?.google_aiplatform) {\n const aiplatformInstrumentation = new AIPlatformInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(aiplatformInstrumentation);\n aiplatformInstrumentation.manuallyInstrument(\n instrumentModules.google_aiplatform,\n );\n }\n\n if (instrumentModules?.bedrock) {\n const bedrockInstrumentation = new BedrockInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(bedrockInstrumentation);\n bedrockInstrumentation.manuallyInstrument(instrumentModules.bedrock);\n }\n\n if (instrumentModules?.pinecone) {\n const instrumentation = new PineconeInstrumentation();\n instrumentations.push(instrumentation as Instrumentation);\n instrumentation.manuallyInstrument(instrumentModules.pinecone);\n }\n\n if (instrumentModules?.langchain) {\n const langchainInstrumentation = new LangChainInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(langchainInstrumentation);\n langchainInstrumentation.manuallyInstrument(instrumentModules.langchain);\n }\n\n if (instrumentModules?.llamaIndex) {\n logger.warn(\n \"Llamaindex JS is deprecated. Not enabling any instrumentation.\",\n );\n }\n\n if (instrumentModules?.chromadb) {\n const chromadbInstrumentation = new ChromaDBInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(chromadbInstrumentation);\n chromadbInstrumentation.manuallyInstrument(instrumentModules.chromadb);\n }\n\n if (instrumentModules?.qdrant) {\n const qdrantInstrumentation = new QdrantInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(qdrantInstrumentation);\n qdrantInstrumentation.manuallyInstrument(instrumentModules.qdrant);\n }\n\n if (instrumentModules?.together) {\n const togetherInstrumentation = new TogetherInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(togetherInstrumentation);\n togetherInstrumentation.manuallyInstrument(\n instrumentModules.together,\n );\n }\n\n if (instrumentModules?.playwright && client) {\n playwrightInstrumentation = new PlaywrightInstrumentation(\n client,\n sessionRecordingOptions,\n );\n instrumentations.push(playwrightInstrumentation);\n playwrightInstrumentation.manuallyInstrument(instrumentModules.playwright);\n }\n\n if (instrumentModules?.puppeteer && client) {\n const puppeteerInstrumentation = new PuppeteerInstrumentation(\n client,\n sessionRecordingOptions,\n );\n instrumentations.push(puppeteerInstrumentation);\n puppeteerInstrumentation.manuallyInstrument(instrumentModules.puppeteer);\n }\n\n if (instrumentModules?.stagehand && client) {\n if (!playwrightInstrumentation) {\n playwrightInstrumentation = new PlaywrightInstrumentation(\n client,\n sessionRecordingOptions,\n );\n instrumentations.push(playwrightInstrumentation);\n }\n const stagehandInstrumentation = getStagehandInstrumentation(\n playwrightInstrumentation,\n client,\n sessionRecordingOptions,\n );\n instrumentations.push(stagehandInstrumentation);\n stagehandInstrumentation.manuallyInstrument(instrumentModules.stagehand);\n }\n\n if (instrumentModules?.google_genai) {\n const googleGenAiInstrumentation = new GoogleGenAiInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(googleGenAiInstrumentation);\n googleGenAiInstrumentation.manuallyInstrument(\n instrumentModules.google_genai,\n );\n }\n\n if (instrumentModules?.kernel) {\n const kernelInstrumentation = new KernelInstrumentation();\n instrumentations.push(kernelInstrumentation);\n kernelInstrumentation.manuallyInstrument(instrumentModules.kernel);\n }\n\n if (instrumentModules?.claudeAgentSDK) {\n const claudeAgentInstrumentation = new ClaudeAgentSDKInstrumentation();\n instrumentations.push(claudeAgentInstrumentation);\n claudeAgentInstrumentation.manuallyInstrument(\n instrumentModules.claudeAgentSDK,\n );\n }\n\n if (instrumentModules?.opencode) {\n const opencodeInstrumentation = new OpencodeInstrumentation();\n instrumentations.push(opencodeInstrumentation);\n opencodeInstrumentation.manuallyInstrument(instrumentModules.opencode);\n }\n\n if (instrumentModules?.openAIAgents) {\n const openAIAgentsInstrumentation = new OpenAIAgentsInstrumentation();\n instrumentations.push(openAIAgentsInstrumentation);\n openAIAgentsInstrumentation.manuallyInstrument(\n instrumentModules.openAIAgents,\n );\n }\n\n return instrumentations;\n};\n","export const getLangVersion: () => string | undefined = () => {\n if (process?.versions?.node) {\n return `node@${process.versions.node}`;\n }\n// else if (Deno?.version) {\n// return `deno@${Deno?.version?.deno}`;\n// }\n};\n","// This class could be just an initialization of the OTLP exporter,\n// but OTel v2 has some breaking changes, so we're applying\n// a small backward-compatibility fix here.\n\nimport { Metadata } from \"@grpc/grpc-js\";\nimport { ExportResult } from \"@opentelemetry/core\";\nimport {\n OTLPTraceExporter as ExporterGrpc,\n} from \"@opentelemetry/exporter-trace-otlp-grpc\";\nimport {\n OTLPTraceExporter as ExporterHttp,\n} from \"@opentelemetry/exporter-trace-otlp-proto\";\nimport { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\n\nimport { getOtelEnvVar, initializeLogger, parseOtelHeaders } from \"../../utils\";\nimport { makeSpanOtelV2Compatible } from \"./compat\";\n\nconst logger = initializeLogger();\n\nexport class LaminarSpanExporter implements SpanExporter {\n private exporter: SpanExporter;\n\n constructor(options: {\n baseUrl?: string;\n port?: number;\n apiKey?: string;\n forceHttp?: boolean;\n timeoutMillis?: number;\n } = {}) {\n let url = options.baseUrl ?? process?.env?.LMNR_BASE_URL;\n let port = options.port;\n let forceHttp = options.forceHttp ?? false;\n const key = options.apiKey ?? process?.env?.LMNR_PROJECT_API_KEY;\n\n // Determine headers - either from API key or OTEL env vars\n let headers: Record<string, string> = {};\n if (key) {\n headers = forceHttp\n ? { 'Authorization': `Bearer ${key}` }\n : { 'authorization': `Bearer ${key}` };\n if (!url) {\n url = 'https://api.lmnr.ai';\n }\n } else {\n const otelHeaders = getOtelEnvVar('HEADERS');\n if (otelHeaders) {\n headers = parseOtelHeaders(otelHeaders);\n }\n // Check for OTEL endpoint configuration\n const otelEndpoint = getOtelEnvVar('ENDPOINT');\n if (otelEndpoint && !url) {\n url = otelEndpoint;\n\n // Determine protocol from OTEL env vars\n const otelProtocol = getOtelEnvVar('PROTOCOL') || 'grpc/protobuf';\n const otelExporter = process?.env?.OTEL_EXPORTER;\n forceHttp = otelProtocol === 'http/protobuf'\n || otelProtocol === 'http/json'\n || otelExporter === 'otlp_http';\n } else if (otelEndpoint && url) {\n logger.warn(\n 'OTEL_ENDPOINT is set, but Laminar base URL is also set. Ignoring OTEL_ENDPOINT.',\n );\n }\n }\n\n if (!url) {\n throw new Error(\n 'Laminar base URL is not set and OTEL_ENDPOINT is not set. Please either\\n' +\n '- set the LMNR_BASE_URL environment variable\\n' +\n '- set the OTEL_ENDPOINT environment variable (if you are not using a Laminar API key)\\n' +\n '- pass the baseUrl parameter to Laminar.initialize',\n );\n }\n\n // Calculate port\n if (!port) {\n port = url.match(/:\\d{1,5}$/g)\n ? parseInt(url.match(/:\\d{1,5}$/g)![0].slice(1))\n : (forceHttp ? 443 : 8443);\n }\n\n const urlWithoutSlash = url.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '');\n\n if (forceHttp) {\n this.exporter = new ExporterHttp({\n url: `${urlWithoutSlash}:${port}/v1/traces`,\n headers,\n timeoutMillis: options.timeoutMillis ?? 30000,\n });\n } else {\n const metadata = new Metadata();\n Object.entries(headers).forEach(([key, value]) => {\n metadata.set(key, value);\n });\n this.exporter = new ExporterGrpc({\n url: `${urlWithoutSlash}:${port}`,\n metadata,\n timeoutMillis: options.timeoutMillis ?? 30000,\n });\n }\n }\n\n export(\n items: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ) {\n // ==== //\n // OTel v2 has renamed the instrumentationLibrary field to instrumentationScope,\n // but spans may be created by older versions of the SDK that don't have that change.\n // This is a small hack to support those older spans.\n items.forEach(makeSpanOtelV2Compatible);\n // ==== //\n\n return this.exporter.export(items, resultCallback);\n }\n\n async shutdown(): Promise<void> {\n return this.exporter.shutdown();\n }\n\n async forceFlush(): Promise<void> {\n return this.exporter.forceFlush?.();\n }\n}\n\n","import { LaminarClient } from \"@lmnr-ai/client\";\nimport { SpanType } from \"@lmnr-ai/types\";\nimport { AttributeValue, Context, context } from \"@opentelemetry/api\";\nimport {\n BatchSpanProcessor,\n SimpleSpanProcessor,\n type Span,\n SpanExporter,\n SpanProcessor,\n} from \"@opentelemetry/sdk-trace-base\";\nimport { Logger } from \"pino\";\n\nimport { version as SDK_VERSION } from \"../../../package.json\";\nimport {\n initializeLogger,\n metadataToAttributes,\n otelSpanIdToUUID,\n StringUUID,\n} from \"../../utils\";\nimport { getLangVersion } from \"../../version\";\nimport {\n ASSOCIATION_PROPERTIES,\n ASSOCIATION_PROPERTIES_OVERRIDES,\n PARENT_SPAN_IDS_PATH,\n PARENT_SPAN_PATH,\n ROLLOUT_SESSION_ID,\n SESSION_ID,\n SPAN_IDS_PATH,\n SPAN_INSTRUMENTATION_SOURCE,\n SPAN_LANGUAGE_VERSION,\n SPAN_PATH,\n SPAN_SDK_VERSION,\n SPAN_TYPE,\n TRACE_TYPE,\n USER_ID,\n} from \"./attributes\";\nimport {\n getParentSpanId,\n makeSpanOtelV2Compatible,\n OTelSpanCompat,\n} from \"./compat\";\nimport { ASSOCIATION_PROPERTIES_KEY, CONTEXT_SPAN_PATH_KEY } from \"./context\";\nimport { LaminarSpanExporter } from \"./exporter\";\n\ninterface LaminarSpanProcessorOptions {\n /**\n * The base URL of the Laminar API. Optional.\n * Defaults to https://api.lmnr.ai.\n */\n baseUrl?: string;\n /**\n * The port of the Laminar API. Optional.\n * Defaults to 8443.\n */\n port?: number;\n /**\n * Laminar project API key. Optional.\n * If not provided, the LMNR_PROJECT_API_KEY environment variable will be used.\n */\n apiKey?: string;\n /**\n * The maximum number of spans to export at a time. Optional.\n * Defaults to 512.\n */\n maxExportBatchSize?: number;\n /**\n * Whether to disable batching. Optional.\n * Defaults to false.\n */\n disableBatch?: boolean;\n /**\n * Whether to force HTTP and use OpenTelemetry HTTP/protobuf exporter.\n * Not recommended with Laminar backends.\n * Optional.\n * Defaults to false.\n */\n forceHttp?: boolean;\n /**\n * The timeout for sending traces data. Optional.\n * Defaults to 30 seconds.\n */\n traceExportTimeoutMillis?: number;\n\n /**\n * The exporter to use. Optional. If specified, some of the other options will be ignored.\n * Defaults to a new LaminarSpanExporter.\n */\n exporter?: SpanExporter;\n\n /**\n * The span processor to use. If passed, some of the other options will be ignored.\n * If passed, wraps the underlying span processor.\n */\n spanProcessor?: SpanProcessor;\n\n /**\n * The HTTP port to use. Optional.\n * If not provided, the `port` option will be used.\n */\n httpPort?: number;\n}\n\nexport class LaminarSpanProcessor implements SpanProcessor {\n private instance: BatchSpanProcessor | SimpleSpanProcessor;\n private client: LaminarClient | undefined;\n private logger: Logger;\n private readonly _spanIdToPath: Map<string, string[]> = new Map();\n private readonly _spanIdLists: Map<string, string[]> = new Map();\n\n /**\n * @param {object} options - The options for the Laminar span processor.\n * @param {string} options.baseUrl - The base URL of the Laminar API.\n * @param {number} options.port - The port of the Laminar API.\n * @param {string} options.apiKey - Laminar project API key or any other\n * authorization set as bearer token.\n * @param {boolean} options.disableBatch - Whether to disable batching (uses SimpleSpanProcessor).\n * @param {number} options.maxExportBatchSize - The maximum number of spans to export at a time\n * if disableBatch is false.\n * @param {number} options.traceExportTimeoutMillis - The timeout for sending traces data.\n * Defaults to 30 seconds.\n * @param {boolean} options.forceHttp - Whether to force HTTP and use OpenTelemetry\n * HTTP/protobuf exporter.\n * Not recommended with Laminar backends.\n */\n constructor(options: LaminarSpanProcessorOptions = {}) {\n this.logger = initializeLogger();\n if (\n options.spanProcessor &&\n options.spanProcessor instanceof LaminarSpanProcessor\n ) {\n this.instance = options.spanProcessor.instance;\n // Set by reference, so that updates from the inside are reflected here.\n this._spanIdToPath = options.spanProcessor._spanIdToPath;\n this._spanIdLists = options.spanProcessor._spanIdLists;\n } else if (options.spanProcessor) {\n this.instance = options.spanProcessor as\n | BatchSpanProcessor\n | SimpleSpanProcessor;\n } else {\n const exporter = options.exporter ?? new LaminarSpanExporter(options);\n this.instance = options.disableBatch\n ? new SimpleSpanProcessor(exporter)\n : new BatchSpanProcessor(exporter, {\n maxExportBatchSize: options.maxExportBatchSize ?? 512,\n exportTimeoutMillis: options.traceExportTimeoutMillis ?? 30000,\n });\n }\n\n if (process.env.LMNR_ROLLOUT_SESSION_ID) {\n this.client = new LaminarClient({\n baseUrl: options.baseUrl,\n projectApiKey: options.apiKey,\n port: options.httpPort ?? options.port,\n });\n }\n }\n\n forceFlush(): Promise<void> {\n return this.instance.forceFlush();\n }\n\n shutdown(): Promise<void> {\n return this.instance.shutdown();\n }\n\n onStart(spanArg: any, parentContext: Context): void {\n const span = spanArg as OTelSpanCompat;\n // Check for parent path attributes first (from serialized span context)\n const parentPathFromAttribute = span.attributes?.[PARENT_SPAN_PATH] as\n | string[]\n | undefined;\n const parentIdsPathFromAttribute = span.attributes?.[\n PARENT_SPAN_IDS_PATH\n ] as StringUUID[] | undefined;\n\n const parentSpanId = getParentSpanId(span);\n\n // Use parent path from attributes if available, otherwise fall back to cached paths\n const parentSpanPath =\n parentPathFromAttribute ??\n (parentSpanId !== undefined\n ? this._spanIdToPath.get(parentSpanId)\n : undefined);\n\n const spanId = span.spanContext().spanId;\n const parentSpanIdsPath =\n parentIdsPathFromAttribute ??\n (parentSpanId ? this._spanIdLists.get(parentSpanId) : []);\n const spanPath = parentSpanPath\n ? [...parentSpanPath, span.name]\n : [span.name];\n\n const spanIdUuid = otelSpanIdToUUID(spanId);\n const spanIdsPath = parentSpanIdsPath\n ? [...parentSpanIdsPath, spanIdUuid]\n : [spanIdUuid];\n\n span.setAttribute(SPAN_IDS_PATH, spanIdsPath);\n this._spanIdLists.set(spanId, spanIdsPath);\n\n span.setAttribute(SPAN_PATH, spanPath);\n context.active().setValue(CONTEXT_SPAN_PATH_KEY, spanPath);\n this._spanIdToPath.set(spanId, spanPath);\n\n span.setAttribute(SPAN_INSTRUMENTATION_SOURCE, \"javascript\");\n span.setAttribute(SPAN_SDK_VERSION, SDK_VERSION);\n const langVersion = getLangVersion();\n if (langVersion) {\n span.setAttribute(SPAN_LANGUAGE_VERSION, langVersion);\n }\n\n // This sets the properties only if the context has them\n const associationProperties = context\n .active()\n .getValue(ASSOCIATION_PROPERTIES_KEY);\n if (associationProperties) {\n for (const [key, value] of Object.entries(associationProperties)) {\n if (Object.keys(ASSOCIATION_PROPERTIES_OVERRIDES).includes(key)) {\n span.setAttribute(ASSOCIATION_PROPERTIES_OVERRIDES[key], value);\n } else if (key === \"tracing_level\") {\n span.setAttribute(\"lmnr.internal.tracing_level\", value);\n } else if (key === \"rolloutSessionId\") {\n span.setAttribute(ROLLOUT_SESSION_ID, value);\n span.setAttribute(\"lmnr.rollout.session_id\", value);\n } else if (\n key === \"metadata\" &&\n typeof value === \"object\" &&\n value !== null\n ) {\n // Flatten metadata into individual attributes\n const metadataAttrs = metadataToAttributes(\n value as Record<string, unknown>,\n );\n span.setAttributes(metadataAttrs);\n } else if (key === \"userId\") {\n span.setAttribute(USER_ID, value);\n } else if (key === \"sessionId\") {\n span.setAttribute(SESSION_ID, value);\n } else if (key === \"traceType\") {\n span.setAttribute(TRACE_TYPE, value);\n } else if (key === \"tracingLevel\") {\n span.setAttribute(\"lmnr.internal.tracing_level\", value);\n } else {\n span.setAttribute(`${ASSOCIATION_PROPERTIES}.${key}`, value);\n }\n }\n }\n\n makeSpanOtelV2Compatible(span);\n\n if (process.env.LMNR_ROLLOUT_SESSION_ID && this.client) {\n this.client.rolloutSessions\n .sendSpanUpdate({\n sessionId: process.env.LMNR_ROLLOUT_SESSION_ID,\n span: {\n name: span.name,\n startTime: new Date(\n span.startTime[0] * 1000 + span.startTime[1] / 1e6,\n ).toISOString(),\n spanId: span.spanContext().spanId,\n traceId: span.spanContext().traceId,\n parentSpanId: getParentSpanId(span),\n attributes: attributesForStartEvent(span.name, span.attributes),\n spanType: inferSpanType(span.name, span.attributes),\n },\n })\n .catch((error: any) => {\n this.logger.debug(\n `Failed to send span update: ${error instanceof Error ? error.message : String(error)}`,\n );\n });\n }\n this.instance.onStart(span, parentContext);\n }\n\n // type ReadableSpan\n onEnd(span: any): void {\n const spanId = (span as Span).spanContext().spanId;\n this._spanIdLists.delete(spanId);\n this._spanIdToPath.delete(spanId);\n makeSpanOtelV2Compatible(span);\n this.instance.onEnd(span as Span);\n }\n\n /**\n * Set parent path information for a given span ID.\n * Used when initializing context from environment variables.\n *\n * @param parentSpanId - The span ID to set path information for\n * @param spanPath - The span path (array of span names)\n * @param spanIdsPath - The span IDs path (array of span ID UUIDs)\n */\n setParentPathInfo(\n parentSpanId: string,\n spanPath: string[],\n spanIdsPath: StringUUID[],\n ): void {\n this._spanIdToPath.set(parentSpanId, spanPath);\n this._spanIdLists.set(parentSpanId, spanIdsPath);\n }\n\n /**\n * Drop cached path entries for a given span id. For exporters that stamp\n * their own span id over the SDK-allocated one after `startSpan` has fired\n * `onStart` — without this, `onEnd` reads the mutated id and its delete is\n * a no-op, so the original entry leaks one pair of map entries per span.\n */\n dropPathInfo(spanId: string): void {\n this._spanIdToPath.delete(spanId);\n this._spanIdLists.delete(spanId);\n }\n\n clear() {\n this._spanIdToPath.clear();\n this._spanIdLists.clear();\n }\n}\n\nconst inferSpanType = (\n name: string,\n attributes: Record<string, AttributeValue | undefined>,\n): SpanType => {\n if (attributes[SPAN_TYPE]) {\n return attributes[SPAN_TYPE] as SpanType;\n }\n if (attributes[\"gen_ai.system\"]) {\n return \"LLM\";\n }\n if (\n Object.keys(attributes).some(\n (k) => k.startsWith(\"gen_ai.\") || k.startsWith(\"llm.\"),\n )\n ) {\n return \"LLM\";\n }\n if (\n name === \"ai.toolCall\" ||\n attributes[\"ai.toolCall.id\"] ||\n attributes[\"ai.toolCall.name\"]\n ) {\n return \"TOOL\";\n }\n return \"DEFAULT\";\n};\n\nconst attributesForStartEvent = (\n name: string,\n attributes: Record<string, AttributeValue | undefined>,\n): Record<string, AttributeValue> => {\n const keysToKeep = [\n SPAN_PATH,\n SPAN_TYPE,\n SPAN_IDS_PATH,\n PARENT_SPAN_PATH,\n PARENT_SPAN_IDS_PATH,\n SPAN_INSTRUMENTATION_SOURCE,\n SPAN_SDK_VERSION,\n SPAN_LANGUAGE_VERSION,\n \"gen_ai.request.model\",\n \"gen_ai.response.model\",\n \"gen_ai.system\",\n \"lmnr.span.original_type\",\n \"ai.model.id\",\n ];\n const newAttributes = Object.fromEntries(\n Object.entries(attributes).filter(([key]) => keysToKeep.includes(key)),\n );\n\n // Common scenario, because we don't have the response model in the start event.\n // Atrificially set the response model to the request model, just so frontend\n // can show the model in the UI.\n if (\n attributes[\"gen_ai.request.model\"] &&\n !attributes[\"gen_ai.response.model\"]\n ) {\n newAttributes[\"gen_ai.response.model\"] = attributes[\"gen_ai.request.model\"];\n }\n return {\n [SPAN_TYPE]: inferSpanType(name, attributes),\n ...newAttributes,\n };\n};\n","import { Context, type Span, type SpanOptions, trace, type Tracer } from \"@opentelemetry/api\";\n\nimport { LaminarContextManager } from \"./context\";\nimport { LaminarSpan } from \"./span\";\n\n\nexport class LaminarTracer implements Tracer {\n private _tracer: Tracer;\n constructor(tracer: Tracer) {\n this._tracer = tracer;\n }\n\n public startSpan(name: string, options?: SpanOptions, context?: Context): Span {\n return new LaminarSpan(\n this._tracer.startSpan(name, options, context || LaminarContextManager.getContext()),\n );\n }\n\n public startActiveSpan<F extends (span: Span) => unknown>(name: string, fn: F): ReturnType<F>;\n public startActiveSpan<F extends (span: Span) => unknown>(\n name: string,\n options: SpanOptions,\n fn: F,\n ): ReturnType<F>;\n public startActiveSpan<F extends (span: Span) => unknown>(\n name: string,\n options: SpanOptions,\n context: Context,\n fn: F,\n ): ReturnType<F>;\n\n public startActiveSpan<F extends (span: Span) => unknown>(\n name: string,\n optionsOrFn?: SpanOptions | F,\n contextOrFn?: Context | F,\n fn?: F,\n ): ReturnType<F> {\n let contextToUse: Context;\n if (typeof contextOrFn !== \"function\" && contextOrFn !== undefined) {\n contextToUse = contextOrFn;\n } else {\n contextToUse = LaminarContextManager.getContext();\n }\n\n const wrapped = (fn: F) => (span: Span): ReturnType<F> => {\n const laminarSpan = new LaminarSpan(span);\n const ctxWithAssociationProperties = LaminarContextManager.setAssociationProperties(\n laminarSpan,\n contextToUse,\n );\n const newContext = trace.setSpan(ctxWithAssociationProperties, laminarSpan);\n const currentStack = LaminarContextManager.getContextStack();\n const res = LaminarContextManager.runWithIsolatedContext(\n [...currentStack, newContext],\n () => fn(laminarSpan) as ReturnType<F>,\n );\n // We don't pop the context here, because it is the caller's responsibility to\n // end the span. LaminarSpan.end() will pop the context.\n return res;\n };\n if (typeof optionsOrFn === \"function\") {\n return this._tracer.startActiveSpan(name, {}, contextToUse, wrapped(optionsOrFn));\n }\n if (typeof contextOrFn === \"function\") {\n return this._tracer.startActiveSpan(\n name,\n optionsOrFn as SpanOptions,\n contextToUse,\n wrapped(contextOrFn),\n );\n }\n\n // Use the provided context or the current Laminar context\n return this._tracer.startActiveSpan(\n name,\n optionsOrFn as SpanOptions,\n contextToUse,\n wrapped(fn as F),\n );\n }\n}\n\n","import {\n Context,\n context,\n createContextKey,\n ROOT_CONTEXT,\n} from \"@opentelemetry/api\";\n\nimport { CONTEXT_SPAN_PATH_KEY } from \"./context\";\n\n// Function to check if a global context manager is already configured\nexport const isGlobalContextManagerConfigured = () => {\n // Create a temporary context key for testing\n const testKey = createContextKey('lmnr-test-context-manager-check');\n\n // Create a context with this key\n const testContext = ROOT_CONTEXT.setValue(testKey, 'lmnr-test-value');\n\n // Try to make this context active\n let isContextManagerWorking = false;\n\n context.with(testContext, () => {\n // If the context manager is configured and enabled,\n // active() should return our test context\n const activeContext = context.active();\n isContextManagerWorking = activeContext.getValue(testKey) === 'lmnr-test-value';\n });\n\n return isContextManagerWorking;\n};\n\nexport const getSpanPath = (entityContext: Context): string | undefined => {\n const path = entityContext.getValue(CONTEXT_SPAN_PATH_KEY) as string | undefined;\n return path ? `${path}` : undefined;\n};\n","import { context, trace, Tracer, TracerProvider } from \"@opentelemetry/api\";\nimport { AsyncLocalStorageContextManager } from \"@opentelemetry/context-async-hooks\";\nimport { registerInstrumentations } from \"@opentelemetry/instrumentation\";\nimport { AlwaysOnSampler } from \"@opentelemetry/sdk-trace-base\";\nimport { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\";\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n} from \"@opentelemetry/semantic-conventions\";\n\nimport { version as SDK_VERSION } from \"../../../package.json\";\nimport { initializeLogger } from \"../../utils\";\nimport { _configuration } from \"../configuration\";\nimport { InitializeOptions } from \"../interfaces\";\nimport { createResource } from \"./compat\";\nimport { consumeStreamResult, waitForPendingStreams } from \"./stream-utils\";\n\nexport { consumeStreamResult, waitForPendingStreams };\nimport { initializeLaminarInstrumentations } from \"./instrumentations\";\nimport { LaminarSpanProcessor } from \"./processor\";\nimport { LaminarTracer } from \"./tracer\";\nimport { isGlobalContextManagerConfigured } from \"./utils\";\n\nconst logger = initializeLogger();\n\nlet spanProcessor: LaminarSpanProcessor;\nlet tracerProvider: TracerProvider | undefined;\nlet _baseHttpUrl: string = \"https://api.lmnr.ai:443\";\nlet _apiKey: string | undefined;\n\n/**\n * Initializes the Tracing SDK.\n * Must be called once before any other SDK methods.\n *\n * @param options - The options to initialize the SDK. See the {@link InitializeOptions}\n * for details.\n */\nexport const startTracing = (options: InitializeOptions) => {\n _baseHttpUrl = `${options.baseHttpUrl ?? options.baseUrl}:${options.httpPort ?? 443}`;\n _apiKey = options.apiKey;\n\n const instrumentations = initializeLaminarInstrumentations({\n baseUrl: _baseHttpUrl,\n apiKey: _apiKey,\n suppressContentTracing: !shouldSendTraces(),\n instrumentModules: options.instrumentModules,\n sessionRecordingOptions: options.sessionRecordingOptions,\n });\n\n const port = options.forceHttp ? options.httpPort : options.port;\n\n spanProcessor = new LaminarSpanProcessor({\n spanProcessor: options.spanProcessor,\n baseUrl: options.baseUrl,\n port,\n httpPort: options.httpPort,\n apiKey: options.apiKey,\n forceHttp: options.forceHttp,\n traceExportTimeoutMillis: options.traceExportTimeoutMillis,\n maxExportBatchSize: options.maxExportBatchSize,\n exporter: options.exporter,\n disableBatch: options.disableBatch,\n });\n\n const newProvider = new NodeTracerProvider({\n spanProcessors: [spanProcessor],\n sampler: new AlwaysOnSampler(),\n resource: createResource({\n [ATTR_SERVICE_NAME]: \"laminar-tracer-resource\",\n [ATTR_SERVICE_VERSION]: SDK_VERSION,\n }),\n });\n\n tracerProvider = newProvider;\n\n // Usually, we would do `tracerProvider.register()`, which does three things:\n // 1. Sets the global tracer provider\n // 2. Sets the global context manager to a default one, unless we specify a custom one\n // 3. Sets the global propagator to a default one, unless we specify a custom one\n // We don't do that, because Opentelemetry only allows setting these global\n // OTel API instances once.\n //\n // Instead, we do the following:\n // 1. Carry the global tracer provider around without globally registering it.\n // - Set this tracer provider in the auto-instrumentations from OpenLLMetry\n // - expose the `getTracer` function, which will return a tracer from our\n // tracer provider.\n // 2. Set a context manager globally, only if we are the first ones to do so.\n // - If we are not the first ones, we don't set the global context manager.\n // - If an existing context manager is not broken, it suffices for our purposes\n // for carrying the parent span context.\n // - If any library tries to do so afterwards (and they will, e.g. @vercel/otel\n // or @sentry/node do tracerProvider.register() internally), there will be\n // an error message at their initialization.\n // - We recommend to initialize Laminar after other tracing libraries to avoid that\n // 3. We don't do anything about the propagator, because no Laminar functionality\n // depends on it. We might want to revisit this in the future w.r.t. `LaminarSpanContext`.\n\n // This is a small hack to only set the global context manager if there is none.\n if (!isGlobalContextManagerConfigured()) {\n const contextManager = new AsyncLocalStorageContextManager();\n contextManager.enable();\n context.setGlobalContextManager(contextManager);\n logger.debug(\"Laminar set global OTel Context Manager\");\n }\n logger.debug(\"Global OTel Context Manager exists\");\n\n logger.debug(\n `Laminar registering ${instrumentations.length} instrumentations`,\n );\n // Similarly, we carry our global tracer provider around without globally\n // registering it.\n registerInstrumentations({\n instrumentations,\n tracerProvider: newProvider,\n });\n};\n\nexport const patchModules = (\n modules: InitializeOptions[\"instrumentModules\"],\n) => {\n const instrumentations = initializeLaminarInstrumentations({\n baseUrl: _baseHttpUrl,\n apiKey: _apiKey,\n instrumentModules: modules,\n suppressContentTracing: !shouldSendTraces(),\n sessionRecordingOptions: _configuration?.sessionRecordingOptions,\n });\n registerInstrumentations({\n instrumentations,\n tracerProvider: tracerProvider,\n });\n};\n\nexport const shouldSendTraces = () => {\n if (!_configuration) {\n /**\n * We've only seen this happen in Next.js where apparently\n * the initialization in `instrumentation.ts` somehow does not\n * respect `Object.freeze`. Unlike original OpenLLMetry/Traceloop,\n * we return true here, because we have other mechanisms\n * {@link withTracingLevel} to disable tracing inputs and outputs.\n */\n return true;\n }\n\n if (\n _configuration.traceContent === false ||\n (process.env.TRACELOOP_TRACE_CONTENT || \"true\").toLowerCase() === \"false\"\n ) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Get the tracer provider. Returns Laminar's tracer provider if Laminar is initialized,\n * otherwise returns the global tracer provider.\n * @returns The tracer provider.\n */\nexport const getTracerProvider = (): TracerProvider =>\n tracerProvider ?? trace.getTracerProvider();\n\n/**\n * Get the tracer.\n * @returns Laminar's tracer if Laminar is initialized,\n * otherwise returns Laminar's tracer from the global tracer provider\n *\n * @example\n * // instrumentation.ts\n * import { Laminar } from '@lmnr-ai/lmnr';\n * Laminar.initialize()\n *\n * // File that calls AI SDK.\n * import { getTracer } from '@lmnr-ai/lmnr';\n * import { openai } from \"@ai-sdk/openai\";\n * import { generateText } from \"ai\";\n *\n * const response = await generateText({\n * model: openai(\"gpt-4.1-nano\"),\n * prompt: \"What is the capital of France?\",\n * experimental_telemetry: {\n * isEnabled: true,\n * tracer: getTracer(),\n * }\n * })\n */\nexport const getTracer = (): Tracer => {\n const TRACER_NAME = \"lmnr.tracer\";\n const TRACER_VERSION = \"0.0.1\";\n const provider = getTracerProvider();\n return new LaminarTracer(provider.getTracer(TRACER_NAME, TRACER_VERSION));\n};\n\n/**\n * Get the span processor.\n * Used internally for setting parent path information when initializing from environment.\n * @returns The span processor, or undefined if not initialized.\n */\nexport const getSpanProcessor = (): LaminarSpanProcessor | undefined =>\n spanProcessor;\n\nexport const forceFlush = async () => {\n // Wait for pending stream processing with 5 second timeout\n await waitForPendingStreams(5000);\n await spanProcessor.forceFlush();\n};\n\nexport const clearSpanProcessor = () => {\n spanProcessor.clear();\n};\n","import { diag, DiagConsoleLogger, DiagLogLevel } from \"@opentelemetry/api\";\n\nimport { type InitializeOptions } from \"../interfaces\";\nimport { startTracing } from \"../tracing\";\n\nexport let _configuration: InitializeOptions | undefined;\n\n/**\n * Initializes the SDK.\n * Must be called once before any other SDK methods.\n *\n * @param options - The options to initialize the SDK. See the {@link InitializeOptions}\n * for details.\n * @throws {InitializationError} if the configuration is invalid or if failed to fetch\n * feature data.\n */\nexport const initializeTracing = (options: InitializeOptions) => {\n if (_configuration) {\n return;\n }\n\n // Only set defaults if not already provided and if we have an API key\n // (when using OTEL env vars, we don't need a baseUrl or API key)\n const apiKey = options.apiKey ?? process.env.LMNR_PROJECT_API_KEY;\n if (!options.baseUrl && apiKey) {\n options.baseUrl = process.env.LMNR_BASE_URL || \"https://api.lmnr.ai:8443\";\n }\n if (!options.apiKey) {\n options.apiKey = apiKey;\n }\n\n _configuration = Object.freeze(options);\n\n if (options.logLevel) {\n diag.setLogger(\n new DiagConsoleLogger(),\n {\n logLevel: logLevelToOtelLogLevel(options.logLevel),\n suppressOverrideMessage: true,\n },\n );\n }\n\n startTracing(_configuration);\n};\n\nconst logLevelToOtelLogLevel = (\n logLevel: \"debug\" | \"info\" | \"warn\" | \"error\",\n) => {\n switch (logLevel) {\n case \"debug\":\n return DiagLogLevel.DEBUG;\n case \"info\":\n return DiagLogLevel.INFO;\n case \"warn\":\n return DiagLogLevel.WARN;\n case \"error\":\n return DiagLogLevel.ERROR;\n }\n};\n\nexport const _resetConfiguration = () => {\n _configuration = undefined;\n};\n","import { LaminarSpanContext, TraceType, TracingLevel } from \"@lmnr-ai/types\";\nimport { AttributeValue, context, type Span, trace } from \"@opentelemetry/api\";\nimport { suppressTracing } from \"@opentelemetry/core\";\n\nimport {\n deserializeLaminarSpanContext,\n initializeLogger,\n tryToOtelSpanContext,\n} from \"../../utils\";\nimport { getStream, StreamInfo } from \"../instrumentation/aisdk/utils\";\nimport { getTracer, shouldSendTraces } from \".\";\nimport {\n SPAN_INPUT,\n SPAN_OUTPUT,\n} from \"./attributes\";\nimport {\n ASSOCIATION_PROPERTIES_KEY,\n LaminarContextManager,\n} from \"./context\";\nimport { handleStreamResult } from \"./stream-utils\";\n\nconst logger = initializeLogger();\n\nexport { consumeStreamResult, waitForPendingStreams } from \"./stream-utils\";\n\nexport type DecoratorConfig = {\n name: string;\n contextProperties?: {\n userId?: string;\n sessionId?: string;\n traceType?: TraceType;\n tracingLevel?: TracingLevel;\n metadata?: Record<string, any>;\n };\n spanAttributes?: Record<string, AttributeValue>;\n input?: unknown;\n ignoreInput?: boolean;\n ignoreOutput?: boolean;\n inputParameters?: unknown[];\n suppressTracing?: boolean;\n parentSpanContext?: string | LaminarSpanContext;\n};\n\n// Overload for when thisArg is provided (method call)\nexport function observeBase<\n A extends unknown[],\n This,\n F extends (this: This, ...args: A) => ReturnType<F>,\n>(\n config: DecoratorConfig,\n fn: F,\n thisArg: This,\n ...args: A\n): ReturnType<F>;\n\n// Overload for when thisArg is not provided (standalone function)\nexport function observeBase<\n A extends unknown[],\n F extends (...args: A) => ReturnType<F>,\n>(\n config: DecoratorConfig,\n fn: F,\n thisArg: undefined,\n ...args: A\n): ReturnType<F>;\n\n// Implementation signature (more permissive to handle both cases)\nexport function observeBase<\n A extends unknown[],\n F extends (this: ThisParameterType<F>, ...args: A) => ReturnType<F>,\n>(\n {\n name,\n contextProperties,\n spanAttributes,\n input,\n ignoreInput,\n ignoreOutput,\n inputParameters,\n suppressTracing: shouldSuppressTracing,\n parentSpanContext,\n }: DecoratorConfig,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n): ReturnType<F> {\n let entityContext = LaminarContextManager.getContext();\n\n if (shouldSuppressTracing) {\n entityContext = suppressTracing(entityContext);\n }\n\n if (parentSpanContext) {\n try {\n const laminarContext = typeof parentSpanContext === 'string'\n ? deserializeLaminarSpanContext(parentSpanContext)\n : parentSpanContext;\n\n const spanContext = tryToOtelSpanContext(laminarContext);\n entityContext = trace.setSpan(entityContext, trace.wrapSpanContext(spanContext));\n } catch (e) {\n logger.warn(\"Failed to parse parent span context: \" +\n (e instanceof Error ? e.message : String(e)),\n );\n }\n }\n\n // Set context properties for propagation to child spans\n try {\n if (contextProperties && Object.keys(contextProperties).length > 0) {\n const currentAssociationProperties = entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {};\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n { ...currentAssociationProperties, ...contextProperties },\n );\n }\n } catch (e) {\n logger.warn(\"Failed to set context properties: \" +\n (e instanceof Error ? e.message : String(e)),\n );\n }\n\n return context.with(entityContext, () =>\n getTracer().startActiveSpan(\n name,\n {\n attributes: spanAttributes,\n },\n entityContext,\n (span: Span) => {\n if (shouldSendTraces() && !ignoreInput) {\n try {\n const spanInput = inputParameters ?? args;\n if (input !== undefined) {\n span.setAttribute(\n SPAN_INPUT,\n typeof input === 'string' ? input : serialize(input),\n );\n } else if (\n spanInput.length === 1 &&\n typeof spanInput[0] === \"object\" &&\n !(spanInput[0] instanceof Map)\n ) {\n span.setAttribute(\n SPAN_INPUT,\n typeof spanInput[0] === 'string' ? spanInput[0] : serialize(spanInput[0]),\n );\n } else {\n // pass an array of the arguments without names\n // Need to convert it to map from argument name to value,\n // if we figure out how to do it elegantly\n span.setAttribute(\n SPAN_INPUT,\n serialize(spanInput.length > 0 ? spanInput : {}),\n );\n }\n } catch (error) {\n logger.warn(\"Failed to serialize input: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n let res: ReturnType<F>;\n try {\n res = fn.apply(thisArg as ThisParameterType<F>, args);\n } catch (error) {\n try {\n span.recordException(error as Error);\n span.end();\n } catch (error) {\n logger.warn(\"Failed to record exception and end span: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n throw error;\n }\n\n if (res instanceof Promise) {\n return res.then((resolvedRes) => {\n // Check if the resolved result is a stream\n let streamInfo: StreamInfo = { type: null };\n try {\n streamInfo = getStream(resolvedRes);\n } catch (error) {\n logger.warn(\"Failed to get stream info: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n if (streamInfo.type !== null) {\n return handleStreamResult(\n resolvedRes,\n streamInfo,\n span,\n ignoreOutput,\n serialize,\n ) as ReturnType<F>;\n }\n\n // Not a stream, handle normally\n try {\n if (shouldSendTraces() && !ignoreOutput) {\n span.setAttribute(\n SPAN_OUTPUT,\n serialize(resolvedRes),\n );\n }\n } catch (error) {\n logger.warn(\"Failed to serialize async output: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n } finally {\n try {\n span.end();\n } catch (error) {\n logger.warn(\"Failed to end span: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return resolvedRes;\n })\n .catch((error) => {\n try {\n span.recordException(error as Error);\n span.end();\n } catch (error) {\n logger.warn(\"Failed to record exception and end span: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n throw error;\n }) as ReturnType<F>;\n }\n\n // Check if the result is a stream\n let streamInfo: StreamInfo = { type: null };\n try {\n streamInfo = getStream(res);\n } catch (error) {\n logger.warn(\"Failed to get stream info: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n if (streamInfo.type !== null) {\n return handleStreamResult(\n res, streamInfo, span, ignoreOutput, serialize) as ReturnType<F>;\n }\n\n try {\n if (shouldSendTraces() && !ignoreOutput) {\n span.setAttribute(\n SPAN_OUTPUT,\n typeof res === 'string' ? res : serialize(res),\n );\n }\n } catch (error) {\n logger.warn(\"Failed to serialize output: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n } finally {\n try {\n span.end();\n } catch (error) {\n logger.warn(\"Failed to end span: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n return res;\n },\n ),\n );\n}\n\nconst normalizePayload = (payload: unknown, seen: WeakSet<any>): unknown => {\n if (payload instanceof Map) {\n return Array.from(payload.entries());\n } else if (Array.isArray(payload)) {\n return payload.map((value) => normalizePayload(value, seen));\n } else if (!payload) {\n return payload;\n } else if (typeof payload === \"object\") {\n if (seen.has(payload)) {\n return \"[Circular reference]\";\n }\n seen.add(payload);\n\n // serialize object one by one\n const output: any = {};\n Object.entries(payload as any).forEach(([key, value]) => {\n\n output[key] = normalizePayload(value, seen);\n });\n return output;\n }\n\n return payload;\n};\n\nconst serialize = (payload: unknown): string =>\n JSON.stringify(normalizePayload(payload, new WeakSet()));\n","import { LaminarSpanContext, RolloutParam, TraceType, TracingLevel } from '@lmnr-ai/types';\nimport { AttributeValue } from \"@opentelemetry/api\";\n\nimport { observeBase } from './opentelemetry-lib';\nimport {\n ASSOCIATION_PROPERTIES,\n PARENT_SPAN_IDS_PATH,\n PARENT_SPAN_PATH,\n SPAN_TYPE,\n} from \"./opentelemetry-lib/tracing/attributes\";\nimport {\n ASSOCIATION_PROPERTIES_KEY,\n LaminarContextManager,\n} from \"./opentelemetry-lib/tracing/context\";\nimport { deserializeLaminarSpanContext, initializeLogger } from \"./utils\";\n\nconst logger = initializeLogger();\n\ndeclare global {\n var _rolloutFunctions: Map<string, {\n fn: (...args: any[]) => any;\n params: RolloutParam[];\n name: string;\n }> | undefined;\n var _set_rollout_global: boolean;\n var _currentExportName: string | undefined;\n}\n\ninterface ObserveOptions {\n name?: string;\n sessionId?: string;\n userId?: string;\n rolloutSessionId?: string;\n traceType?: TraceType;\n spanType?: 'DEFAULT' | 'LLM' | 'TOOL' | 'EVALUATOR' | 'EVALUATION' | 'EXECUTOR';\n input?: unknown;\n ignoreInput?: boolean;\n ignoreOutput?: boolean;\n parentSpanContext?: string | LaminarSpanContext;\n metadata?: Record<string, any>;\n tags?: string[];\n rolloutEntrypoint?: boolean;\n}\n\n/**\n * Extracts parameter names from a function using regex (fallback for runtime parsing)\n * Note: This is a best-effort fallback. For TypeScript files, use ts-parser.ts instead.\n */\nconst extractParamNames = (fn: (...args: any[]) => any): RolloutParam[] => {\n const fnStr = fn.toString();\n\n // Match function parameters - handles regular functions, arrow functions, async functions\n const paramMatch = fnStr.match(\n /(?:async\\s+)?(?:function\\s*)?\\(([^)]*)\\)|(?:async\\s*)?([^=\\s(]+)\\s*=>/,\n );\n\n if (!paramMatch) {\n return [];\n }\n\n const paramsStr = paramMatch[1] || paramMatch[2] || '';\n\n if (!paramsStr.trim()) {\n return [];\n }\n\n // Split by comma and extract parameter names with metadata\n const params = paramsStr.split(',').map(param => {\n const trimmed = param.trim();\n\n // Check if it's destructured (starts with { or [)\n if (trimmed.startsWith('{')) {\n return {\n name: '_destructured',\n required: !trimmed.includes('='), // Has default if includes =\n };\n }\n\n if (trimmed.startsWith('[')) {\n return {\n name: '_arrayDestructured',\n required: !trimmed.includes('='),\n };\n }\n\n // Extract default value if present\n const hasDefault = trimmed.includes('=');\n let defaultValue: string | undefined;\n let nameWithoutDefault = trimmed;\n\n if (hasDefault) {\n const parts = trimmed.split('=');\n nameWithoutDefault = parts[0].trim();\n defaultValue = parts.slice(1).join('=').trim();\n }\n\n // Check for optional marker (?)\n const isOptional = nameWithoutDefault.includes('?');\n\n // Remove type annotations and whitespace\n const name = nameWithoutDefault\n .replace(/:.+$/, '') // Remove type annotations\n .replace(/\\?/g, '') // Remove optional marker\n .replace(/\\s+/g, ''); // Remove whitespace\n\n // Extract just the parameter name\n const simpleNameMatch = name.match(/^[a-zA-Z_$][a-zA-Z0-9_$]*/);\n const paramName = simpleNameMatch ? simpleNameMatch[0] : name;\n\n return {\n name: paramName,\n required: !hasDefault && !isOptional,\n default: defaultValue,\n };\n });\n\n return params.filter(p => p.name && p.name.length > 0);\n};\n\n/**\n * The main decorator entrypoint for Laminar. This is used to wrap\n * functions and methods to create spans.\n *\n * When `rolloutEntrypoint: true` is set, returns a wrapped function that can be\n * used for agent debugging sessions with `npx lmnr serve`.\n *\n * @param options - Configuration options for the span\n * @param options.name - Name of the span. Function name is used if not specified.\n * @param options.sessionId - Session ID to associate with the span and the following context.\n * @param options.userId - User ID to associate with the span and the following context.\n * This is different from the id of a Laminar user.\n * @param options.traceType - Type of the trace. Unless it is within evaluation, it should be\n * 'DEFAULT'.\n * @param options.spanType - Type of the span. 'DEFAULT' is used if not specified. If the type\n * is 'LLM', you must manually specify some attributes. See `Laminar.setSpanAttributes`\n * for more information.\n * @param options.input - Force override the input for the span. If not specified, the\n * input will be the arguments passed to the function.\n * @param options.ignoreInput - Whether to ignore the input altogether.\n * @param options.ignoreOutput - Whether to ignore the output altogether.\n * @param options.parentSpanContext - Parent span context to associate with this span.\n * @param options.metadata - Metadata to add to a trace for further filtering. Must be\n * JSON serializable.\n * @param options.tags - Tags to associate with the span.\n * @param options.rolloutEntrypoint - When true, returns a wrapped function for\n * rollout debugging. When false/undefined, executes the function immediately.\n * @param fn - The function to wrap\n * @param args - Arguments to pass to the function (only when rolloutEntrypoint is\n * false/undefined)\n * @returns Wrapped function (when rolloutEntrypoint: true) or Promise with result\n * @throws Exception - Re-throws the exception if the wrapped function throws an exception.\n *\n * @example\n * ```typescript\n * // Regular usage (immediate execution)\n * await observe({ name: 'my_function' }, async (x: string) => {\n * // Your code here\n * return x.toUpperCase();\n * }, 'hello');\n *\n * // Rollout entrypoint (returns wrapped function)\n * export const myAgent = observe(\n * { name: 'agent', rolloutEntrypoint: true },\n * async (input: string) => {\n * // Your agent code here\n * return processInput(input);\n * }\n * );\n * // Then call: await myAgent('hello');\n * ```\n */\n// Overload: when rolloutEntrypoint is true, return wrapped function\nexport function observe<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n options: ObserveOptions & { rolloutEntrypoint: true },\n fn: F,\n ...args: A\n): F;\n\nexport function observe<F extends (...args: any[]) => ReturnType<F>>(\n options: ObserveOptions & { rolloutEntrypoint: true },\n fn: F,\n): F;\n\n// Overload: when rolloutEntrypoint is false/undefined, execute immediately\nexport function observe<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n options: ObserveOptions,\n fn: F,\n ...args: A\n): ReturnType<F>;\n\n// Implementation\nexport function observe<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n options: ObserveOptions,\n fn: F,\n ...args: A\n): F | ReturnType<F> {\n if (fn === undefined || typeof fn !== \"function\") {\n throw new Error(\"Invalid `observe` usage. Second argument `fn` must be a function.\");\n }\n\n const {\n name,\n sessionId,\n userId,\n traceType,\n spanType,\n input,\n ignoreInput,\n ignoreOutput,\n parentSpanContext,\n metadata,\n tags,\n rolloutEntrypoint,\n } = options;\n const spanName = name ?? fn.name;\n\n // If rolloutEntrypoint is true, return a wrapped function\n if (rolloutEntrypoint) {\n // Extract parameter names for rollout\n const params = extractParamNames(fn);\n // Get rollout session ID from env var if in rollout mode\n const envRolloutSessionId = process.env.LMNR_ROLLOUT_SESSION_ID;\n\n // Create wrapped function\n const wrappedFn = ((...fnArgs: Parameters<F>): ReturnType<F> => {\n const observeOptions = {\n sessionId,\n traceType,\n spanType,\n userId,\n rolloutSessionId: envRolloutSessionId,\n tags,\n metadata,\n };\n\n const contextProperties = buildContextProperties(observeOptions);\n const spanAttributes = buildSpanAttributes(observeOptions);\n\n const argsToPass = (args && args.length > 0) ? args : fnArgs;\n\n return observeBase<A, F>({\n name: spanName,\n contextProperties,\n spanAttributes,\n input: input ?? argsToPass,\n ignoreInput,\n ignoreOutput,\n parentSpanContext,\n }, fn, undefined, ...argsToPass);\n }) as F;\n\n // If in registration mode, register this function\n if (globalThis._set_rollout_global) {\n if (!globalThis._rolloutFunctions) {\n globalThis._rolloutFunctions = new Map();\n }\n\n // Use current export name if available, otherwise use function name\n const exportName = globalThis._currentExportName || spanName || 'unknown';\n\n globalThis._rolloutFunctions.set(exportName, {\n fn: wrappedFn as (...args: any[]) => any,\n params,\n name: spanName,\n });\n }\n\n return wrappedFn;\n }\n\n // Regular execution mode (backward compatible)\n const observeOptions = {\n sessionId,\n traceType,\n spanType,\n userId,\n tags,\n metadata,\n parentSpanContext,\n };\n\n const contextProperties = buildContextProperties(observeOptions);\n const spanAttributes = buildSpanAttributes(observeOptions);\n\n return observeBase<A, F>({\n name: spanName,\n contextProperties,\n spanAttributes,\n input,\n ignoreInput,\n ignoreOutput,\n parentSpanContext,\n }, fn, undefined, ...args);\n}\n\n/**\n * Sets the tracing level for any spans inside the function. This is useful for\n * conditionally disabling the tracing for certain functions.\n * Tracing level must be one of the values in {@link TracingLevel}. Returns the\n * result of the wrapped function, so you can use it in an `await` statement if\n * needed.\n *\n * @param tracingLevel - The tracing level to set.\n * @returns The result of the wrapped function.\n *\n * @example\n * ```typescript\n * import { withTracingLevel, TracingLevel } from '@lmnr-ai/lmnr';\n *\n * const result = await withTracingLevel(TracingLevel.META_ONLY, () => {\n * openai.chat.completions.create({});\n * });\n * ```\n */\nexport function withTracingLevel<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n tracingLevel: TracingLevel,\n fn: F,\n ...args: A\n): ReturnType<F> {\n let entityContext = LaminarContextManager.getContext();\n const currentAssociationProperties = entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {};\n\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n { ...currentAssociationProperties, \"tracing_level\": tracingLevel },\n );\n\n const result = LaminarContextManager.runWithIsolatedContext(\n [entityContext],\n () => fn(...args),\n );\n\n const newAssociationProperties = (\n entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {}\n ) as Record<string, any>;\n delete newAssociationProperties[\"tracing_level\"];\n\n entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n newAssociationProperties,\n );\n\n return result;\n}\n\n/**\n * Builds context-level association properties that propagate to child spans.\n * These properties flow through the OpenTelemetry context and are inherited by\n * any child spans created with startActiveSpan.\n */\nconst buildContextProperties = (\n options: Partial<ObserveOptions>,\n): {\n userId?: string;\n sessionId?: string;\n rolloutSessionId?: string;\n traceType?: TraceType;\n tracingLevel?: TracingLevel;\n metadata?: Record<string, any>;\n} => {\n const parentSpanContext = options.parentSpanContext;\n const globalMetadata = LaminarContextManager.getGlobalMetadata();\n const ctxAssociationProperties = LaminarContextManager.getAssociationProperties();\n\n let parentMetadata: Record<string, any> | undefined;\n let parentTraceType: TraceType | undefined;\n let parentTracingLevel: TracingLevel | undefined;\n let parentUserId: string | undefined;\n let parentSessionId: string | undefined;\n let parentRolloutSessionId: string | undefined;\n\n if (parentSpanContext) {\n try {\n const laminarContext = typeof parentSpanContext === 'string'\n ? deserializeLaminarSpanContext(parentSpanContext)\n : parentSpanContext;\n\n parentMetadata = laminarContext.metadata;\n parentTraceType = laminarContext.traceType;\n parentTracingLevel = laminarContext.tracingLevel;\n parentUserId = laminarContext.userId;\n parentSessionId = laminarContext.sessionId;\n parentRolloutSessionId = laminarContext.rolloutSessionId;\n } catch (e) {\n logger.warn(\"Failed to parse parent span context: \" +\n (e instanceof Error ? e.message : String(e)),\n );\n }\n }\n\n const contextProperties: {\n userId?: string;\n sessionId?: string;\n rolloutSessionId?: string;\n traceType?: TraceType;\n tracingLevel?: TracingLevel;\n metadata?: Record<string, any>;\n } = {};\n\n const sessionIdValue = options.sessionId ?? parentSessionId ?? ctxAssociationProperties.sessionId;\n if (sessionIdValue) {\n contextProperties.sessionId = sessionIdValue;\n }\n\n const userIdValue = options.userId ?? parentUserId ?? ctxAssociationProperties.userId;\n if (userIdValue) {\n contextProperties.userId = userIdValue;\n }\n\n const rolloutSessionIdValue = options.rolloutSessionId ?? parentRolloutSessionId\n ?? ctxAssociationProperties.rolloutSessionId;\n if (rolloutSessionIdValue) {\n contextProperties.rolloutSessionId = rolloutSessionIdValue;\n }\n\n const traceTypeValue = options.traceType ?? parentTraceType\n ?? ([\"EVALUATION\", \"EXECUTOR\", \"EVALUATOR\"].includes(options.spanType ?? \"DEFAULT\")\n ? \"EVALUATION\"\n : undefined\n )\n ?? ctxAssociationProperties.traceType\n ?? \"DEFAULT\";\n if (traceTypeValue) {\n contextProperties.traceType = traceTypeValue;\n }\n\n const tracingLevelValue = parentTracingLevel ?? ctxAssociationProperties.tracingLevel;\n if (tracingLevelValue) {\n contextProperties.tracingLevel = tracingLevelValue;\n }\n\n const mergedMetadata = {\n ...globalMetadata,\n ...ctxAssociationProperties.metadata,\n ...parentMetadata,\n ...options.metadata,\n ...(rolloutSessionIdValue ? { 'rollout.session_id': rolloutSessionIdValue } : {}),\n };\n\n if (Object.keys(mergedMetadata).length > 0) {\n contextProperties.metadata = mergedMetadata;\n }\n\n return contextProperties;\n};\n\n/**\n * Builds span-specific attributes that do NOT propagate to child spans.\n * These include spanType, tags, and parent span path information.\n */\nconst buildSpanAttributes = (\n options: Partial<ObserveOptions>,\n): Record<string, AttributeValue> => {\n const spanAttributes: Record<string, AttributeValue> = {};\n\n if (options.spanType) {\n spanAttributes[SPAN_TYPE] = options.spanType;\n }\n\n if (options.tags) {\n spanAttributes[`${ASSOCIATION_PROPERTIES}.tags`] = Array.from(new Set(options.tags));\n }\n\n if (options.parentSpanContext) {\n try {\n const laminarContext = typeof options.parentSpanContext === 'string'\n ? deserializeLaminarSpanContext(options.parentSpanContext)\n : options.parentSpanContext;\n\n if (laminarContext.spanPath) {\n spanAttributes[PARENT_SPAN_PATH] = laminarContext.spanPath;\n }\n if (laminarContext.spanIdsPath) {\n spanAttributes[PARENT_SPAN_IDS_PATH] = laminarContext.spanIdsPath;\n }\n } catch (e) {\n logger.warn(\"Failed to parse parent span context for span attributes: \" +\n (e instanceof Error ? e.message : String(e)),\n );\n }\n }\n\n return spanAttributes;\n};\n\n/**\n * Decorator that wraps a method to automatically observe it with Laminar tracing.\n * This decorator uses the TypeScript 5.0+ standard decorator syntax.\n *\n * **Important**: Use this decorator only if your `tsconfig.json` does NOT have\n * `experimentalDecorators: true`. If you're using experimental decorators, use\n * {@link observeExperimentalDecorator} instead.\n *\n * This decorator can be used on class methods to automatically create spans.\n *\n * @param config - Configuration for the observe decorator, can be static or a function\n * @returns A method decorator\n *\n * @example\n * ```typescript\n * // In your tsconfig.json, ensure experimentalDecorators is NOT enabled:\n * // {\n * // \"compilerOptions\": {\n * // \"experimentalDecorators\": false // or omit this line\n * // }\n * // }\n *\n * import { observeDecorator } from '@lmnr-ai/lmnr';\n *\n * class MyService {\n * @observeDecorator({ name: 'processData', spanType: 'DEFAULT' })\n * async processData(input: string) {\n * // Your code here\n * return `processed: ${input}`;\n * }\n *\n * @observeDecorator((thisArg, ...args) => ({\n * name: `dynamicMethod_${args[0]}`,\n * sessionId: thisArg.sessionId\n * }))\n * async dynamicMethod(id: string) {\n * // Your code here\n * }\n * }\n * ```\n */\nexport function observeDecorator<This, Args extends unknown[], Return>(\n config:\n | Partial<ObserveOptions>\n | ((thisArg: This, ...funcArgs: Args) => Partial<ObserveOptions>),\n) {\n return function (\n originalMethod: (this: This, ...args: Args) => Return,\n context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>,\n ) {\n if (context.kind !== 'method') {\n throw new Error(\n `observeDecorator can only be applied to methods. Applied to: ${String(context.name)}`,\n );\n }\n\n const methodName = String(context.name);\n\n return function (this: This, ...args: Args): Return {\n let actualConfig: Partial<ObserveOptions>;\n\n if (typeof config === \"function\") {\n actualConfig = config(this, ...args);\n } else {\n actualConfig = config;\n }\n\n const observeName = actualConfig.name ?? methodName;\n const contextProperties = buildContextProperties(actualConfig);\n const spanAttributes = buildSpanAttributes(actualConfig);\n\n return observeBase(\n {\n name: observeName,\n contextProperties,\n spanAttributes,\n input: actualConfig.input,\n ignoreInput: actualConfig.ignoreInput,\n ignoreOutput: actualConfig.ignoreOutput,\n parentSpanContext: actualConfig.parentSpanContext,\n },\n originalMethod,\n this,\n ...args,\n );\n };\n };\n}\n\n/**\n * Decorator that wraps a method to automatically observe it with Laminar tracing.\n * This decorator uses the legacy experimental decorator syntax\n * (requires `--experimentalDecorators` flag).\n *\n * **Important**: Use this decorator only if your `tsconfig.json` has\n * `experimentalDecorators: true` in the `compilerOptions` section\n * (or if you compile with the `--experimentalDecorators` flag).\n * For TypeScript 5.0+ projects without experimental decorators, use\n * {@link observeDecorator} instead.\n *\n * This decorator can be used on class methods to automatically create spans.\n *\n * Use this only if you need the legacy experimental decorator syntax.\n * @param config - Configuration for the observe decorator, can be static or a function\n * @returns A method decorator\n *\n * @example\n * ```typescript\n * // In your tsconfig.json, ensure experimentalDecorators is enabled:\n * // {\n * // \"compilerOptions\": {\n * // \"experimentalDecorators\": true\n * // }\n * // }\n *\n * import { observeExperimentalDecorator } from '@lmnr-ai/lmnr';\n *\n * class MyService {\n * @observeExperimentalDecorator({ name: 'processData', spanType: 'DEFAULT' })\n * async processData(input: string) {\n * // Your code here\n * return `processed: ${input}`;\n * }\n *\n * @observeExperimentalDecorator((thisArg, ...args) => ({\n * name: `dynamicMethod_${args[0]}`,\n * sessionId: thisArg.sessionId\n * }))\n * async dynamicMethod(id: string) {\n * // Your code here\n * }\n * }\n * ```\n */\nexport function observeExperimentalDecorator(\n config:\n | Partial<ObserveOptions>\n | ((thisArg: unknown, ...funcArgs: unknown[]) => Partial<ObserveOptions>),\n) {\n return function (\n _target: unknown,\n propertyKey: string,\n descriptor: PropertyDescriptor,\n ) {\n if (!descriptor || typeof descriptor.value !== 'function') {\n throw new Error(\n \"observeExperimentalDecorator can only be applied to methods. \" +\n `Applied to: ${String(propertyKey)}`,\n );\n }\n\n const originalMethod = descriptor.value;\n\n descriptor.value = function (...args: unknown[]) {\n let actualConfig: Partial<ObserveOptions>;\n\n if (typeof config === \"function\") {\n actualConfig = config(this, ...args);\n } else {\n actualConfig = config;\n }\n\n const observeName = actualConfig.name ?? originalMethod.name;\n const contextProperties = buildContextProperties(actualConfig);\n const spanAttributes = buildSpanAttributes(actualConfig);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return observeBase(\n {\n name: observeName,\n contextProperties,\n spanAttributes,\n input: actualConfig.input,\n ignoreInput: actualConfig.ignoreInput,\n ignoreOutput: actualConfig.ignoreOutput,\n parentSpanContext: actualConfig.parentSpanContext,\n },\n originalMethod,\n this,\n ...args,\n );\n };\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"decorators-DrWG-1Po.mjs","names":["logger","logger","logger","contextApi","logger","logger","SDK_VERSION","logger","context","contextApi","logger","logger","SDK_VERSION","laminarObserve","SDK_VERSION","laminarObserve","observe","logger","SDK_VERSION","logger","SDK_VERSION","laminarObserve","observe","SDK_VERSION","SDK_VERSION","logger","logger","logger","SDK_VERSION","SDK_VERSION","logger","StagehandV3Instrumentation","logger","ExporterHttp","ExporterGrpc","SDK_VERSION","logger","SDK_VERSION","logger"],"sources":["../src/opentelemetry-lib/tracing/compat.ts","../src/opentelemetry-lib/instrumentation/aisdk/utils.ts","../src/opentelemetry-lib/tracing/stream-utils.ts","../../types/dist/index.mjs","../src/opentelemetry-lib/tracing/span.ts","../src/opentelemetry-lib/tracing/context.ts","../src/opentelemetry-lib/instrumentation/claude-agent-sdk/proxy.ts","../src/opentelemetry-lib/instrumentation/claude-agent-sdk/index.ts","../src/laminar.ts","../src/browser/recorder.ts","../src/browser/utils.ts","../src/browser/playwright.ts","../src/browser/stagehand/shared-llm-wrapper.ts","../src/browser/stagehand/v2.ts","../src/browser/puppeteer.ts","../src/browser/stagehand/v3/constants.ts","../src/browser/stagehand/v3/cdp-helpers.ts","../src/browser/stagehand/v3/event-handlers.ts","../src/browser/stagehand/v3/instrumentation.ts","../src/opentelemetry-lib/instrumentation/google-genai/utils.ts","../src/opentelemetry-lib/instrumentation/google-genai/index.ts","../src/opentelemetry-lib/instrumentation/kernel.ts","../src/opentelemetry-lib/instrumentation/openai-agents/helpers.ts","../src/opentelemetry-lib/instrumentation/openai-agents/messages.ts","../src/opentelemetry-lib/instrumentation/openai-agents/span-data.ts","../src/opentelemetry-lib/instrumentation/openai-agents/processor.ts","../src/opentelemetry-lib/instrumentation/openai-agents/index.ts","../src/opentelemetry-lib/instrumentation/opencode.ts","../src/opentelemetry-lib/tracing/instrumentations.ts","../src/version.ts","../src/opentelemetry-lib/tracing/exporter.ts","../src/opentelemetry-lib/tracing/processor.ts","../src/opentelemetry-lib/tracing/tracer.ts","../src/opentelemetry-lib/tracing/utils.ts","../src/opentelemetry-lib/tracing/index.ts","../src/opentelemetry-lib/configuration/index.ts","../src/opentelemetry-lib/tracing/decorators.ts","../src/decorators.ts"],"sourcesContent":["// Forward-compatibility with OTel v2 / v0.200 SDKs\nimport { SpanContext } from \"@opentelemetry/api\";\nimport { ReadableSpan, Span as SdkSpan } from \"@opentelemetry/sdk-trace-base\";\n\nimport { initializeLogger } from \"../../utils\";\n\nconst logger = initializeLogger();\n\n// Type definitions that cover both OTel SDK v1 and v2\n// In v1: spans have parentSpanId and instrumentationLibrary\n// In v2: spans have parentSpanContext and instrumentationScope\nexport type OTelSpanCompat = SdkSpan &\n ReadableSpan & {\n parentSpanId?: string;\n parentSpanContext?: SpanContext;\n instrumentationLibrary?: any;\n instrumentationScope?: any;\n };\n\ntype OTelReadableSpanCompat = ReadableSpan & {\n parentSpanId?: string;\n parentSpanContext?: SpanContext;\n instrumentationLibrary?: any;\n instrumentationScope?: any;\n};\n\n// In-place edits on span object for compatibility between OTel v1 and v2 SDKs\nexport const makeSpanOtelV2Compatible = (\n span: OTelSpanCompat | OTelReadableSpanCompat,\n) => {\n const spanAny = span as any;\n if (spanAny.instrumentationScope && !spanAny.instrumentationLibrary) {\n // Making the spans from V2 compatible with V1\n Object.assign(span, {\n instrumentationLibrary: spanAny.instrumentationScope,\n });\n } else if (spanAny.instrumentationLibrary && !spanAny.instrumentationScope) {\n // Making the spans from V1 compatible with V2\n Object.assign(span, {\n instrumentationScope: spanAny.instrumentationLibrary,\n });\n }\n\n // Handle parent span compatibility between SDK v1 and v2\n // SDK v1 uses parentSpanId (string), SDK v2 uses parentSpanContext (SpanContext)\n if (spanAny.parentSpanContext && !spanAny.parentSpanId) {\n // SDK v2 -> SDK v1: Extract spanId from parentSpanContext\n Object.defineProperty(span, \"parentSpanId\", {\n value: spanAny.parentSpanContext.spanId,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n } else if (spanAny.parentSpanId && !spanAny.parentSpanContext) {\n // SDK v1 -> SDK v2: Create a proper SpanContext object\n // We need to get the traceId from the span's own spanContext\n const spanContext = span.spanContext();\n Object.defineProperty(span, \"parentSpanContext\", {\n value: {\n traceId: spanContext.traceId,\n spanId: spanAny.parentSpanId,\n traceFlags: spanContext.traceFlags,\n traceState: spanContext.traceState,\n isRemote: spanContext.isRemote,\n },\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n};\n\nexport const getParentSpanId = (\n span: OTelSpanCompat | OTelReadableSpanCompat,\n): string | undefined => {\n const spanAny = span as any;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return spanAny.parentSpanContext?.spanId ?? spanAny.parentSpanId;\n};\n\n/**\n * Creates a Resource object compatible with both OTel v1 and v2.\n *\n * In v1, Resource is a class constructor: new Resource(attributes)\n * In v2, Resource class is not exported; use resourceFromAttributes(attributes) instead\n *\n * This function automatically detects which version is available and uses the appropriate API.\n */\nexport const createResource = (attributes: Record<string, string>): any => {\n // type IResource from `@opentelemetry/resources`\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const resources = require(\"@opentelemetry/resources\");\n\n // v2 uses resourceFromAttributes (0.200+ SDK, 2.x API)\n if (resources.resourceFromAttributes) {\n return resources.resourceFromAttributes(attributes);\n }\n\n // v1 uses Resource constructor (0.57.x SDK, 1.x API)\n if (resources.Resource) {\n return new resources.Resource(attributes);\n }\n\n throw new Error(\"Unable to create Resource: neither v1 nor v2 API found\");\n } catch {\n logger.debug(\n \"Laminar failed to @opentelemetry/resources, continuing without it\",\n );\n return undefined;\n }\n};\n","import { type LanguageModelV3Message, type LanguageModelV3Prompt } from \"@ai-sdk/provider\";\nimport { type LanguageModelV2Message, type LanguageModelV2Prompt } from \"@ai-sdk/provider-v2\";\nimport { type DataContent } from \"ai\";\n\n// Mirrors https://github.com/vercel/ai/blob/main/packages/ai/src/telemetry/stringify-for-telemetry.ts\n// This function is initially implemented by us, and is not exported from the ai sdk.\n// We copy it here for our own use.\nexport const stringifyPromptForTelemetry =\n (prompt: LanguageModelV2Prompt | LanguageModelV3Prompt): string =>\n JSON.stringify(\n prompt.map((message: LanguageModelV2Message | LanguageModelV3Message) => ({\n ...message,\n content:\n typeof message.content === 'string'\n ? message.content\n : message.content.map(part =>\n part.type === 'file'\n ? {\n ...part,\n data:\n part.data instanceof Uint8Array\n ? convertDataContentToBase64String(part.data)\n : part.data,\n }\n : part,\n ),\n })),\n );\n\n// https://github.com/vercel/ai/blob/main/packages/ai/src/prompt/data-content.ts\n/**\nConverts data content to a base64-encoded string.\n\n@param content - Data content to convert.\n@returns Base64-encoded string.\n*/\nconst convertDataContentToBase64String = (content: DataContent): string => {\n if (typeof content === 'string') {\n return content;\n }\n\n if (content instanceof ArrayBuffer) {\n return convertUint8ArrayToBase64(new Uint8Array(content));\n }\n\n return convertUint8ArrayToBase64(content);\n};\n\n// https://github.com/vercel/ai/blob/main/packages/provider-utils/src/uint8-utils.ts\nexport function convertUint8ArrayToBase64(array: Uint8Array): string {\n let latin1string = '';\n\n // Note: regular for loop to support older JavaScript versions that\n // do not support for..of on Uint8Array\n for (let i = 0; i < array.length; i++) {\n latin1string += String.fromCodePoint(array[i]);\n }\n\n return btoa(latin1string);\n}\n\n/**\n * Information about a detected stream\n */\nexport type StreamInfo =\n | { type: 'aisdk-result'; result: any }\n | { type: 'readable-stream'; stream: ReadableStream<unknown> }\n | { type: 'async-iterable'; iterable: AsyncIterable<unknown> }\n | { type: 'response'; response: Response }\n | { type: null };\n\n/**\n * This function checks if an object is stream or stream-like, and returns information\n * about the stream type and how to handle it.\n * @param response - The result of a function, either an AI SDK result, a raw stream, or any other\n * response.\n * @returns - StreamInfo object describing the stream type, or { type: null } if not a stream.\n */\nexport const getStream = (response: unknown): StreamInfo => {\n if (!response || typeof response !== 'object') {\n return { type: null };\n }\n\n // Check for AI SDK StreamTextResult (has textStream or fullStream property)\n if ('textStream' in response || 'fullStream' in response) {\n return { type: 'aisdk-result', result: response };\n }\n\n // Check for Response object (from createUIMessageStreamResponse, createTextStreamResponse, etc.)\n if (response instanceof Response) {\n return { type: 'response', response };\n }\n\n // Check for ReadableStream\n if (response instanceof ReadableStream) {\n return { type: 'readable-stream', stream: response };\n }\n\n // Check for AsyncIterable (but not ReadableStream, which also implements AsyncIterable)\n if (Symbol.asyncIterator in response && !(response instanceof ReadableStream)) {\n return { type: 'async-iterable', iterable: response as AsyncIterable<unknown> };\n }\n\n return { type: null };\n};\n\n/**\n * Consumes an AI SDK StreamTextResult and returns structured output\n * @param result - The AI SDK StreamTextResult object\n * @returns Promise that resolves to structured output with all relevant fields\n */\nexport const consumeAISDKResult = async (result: any): Promise<any> => {\n const output: any = {};\n const errors: any[] = [];\n\n // Helper to safely await a promise property\n const safeAwait = async (key: string, promise: PromiseLike<any>) => {\n try {\n output[key] = await promise;\n } catch (error) {\n errors.push({ field: key, error: error instanceof Error ? error.message : String(error) });\n }\n };\n\n // Collect all the promise properties in parallel\n const promises: Promise<void>[] = [];\n\n if ('text' in result) promises.push(safeAwait('text', result.text));\n if ('toolCalls' in result) promises.push(safeAwait('toolCalls', result.toolCalls));\n if ('reasoning' in result) promises.push(safeAwait('reasoning', result.reasoning));\n if ('finishReason' in result) promises.push(safeAwait('finishReason', result.finishReason));\n if ('usage' in result) promises.push(safeAwait('usage', result.usage));\n if ('files' in result) promises.push(safeAwait('files', result.files));\n if ('sources' in result) promises.push(safeAwait('sources', result.sources));\n\n await Promise.all(promises);\n\n if (errors.length > 0) {\n output._errors = errors;\n }\n\n return output;\n};\n\n/**\n * Consumes a ReadableStream while teeing it to pass through to the caller\n * @param stream - The ReadableStream to consume\n * @returns Object with the teed stream for the caller and a promise for the collected data\n */\nexport const consumeAndTeeReadableStream = <T>(\n stream: ReadableStream<T>,\n): { stream: ReadableStream<T>; dataPromise: Promise<{ chunks: T[]; error?: any }> } => {\n const [stream1, stream2] = stream.tee();\n\n const dataPromise = (async () => {\n const chunks: T[] = [];\n let error: any = undefined;\n\n try {\n const reader = stream2.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n } catch (err) {\n error = err;\n }\n\n return { chunks, error };\n })();\n\n return { stream: stream1, dataPromise };\n};\n\n/**\n * Consumes an AsyncIterable while yielding items to the caller\n * @param iterable - The AsyncIterable to consume\n * @returns Object with a wrapped iterable for the caller and a promise for the collected data\n */\nexport const consumeAndTeeAsyncIterable = <T>(\n iterable: AsyncIterable<T>,\n): { iterable: AsyncIterable<T>; dataPromise: Promise<{ chunks: T[]; error?: any }> } => {\n const chunks: T[] = [];\n let error: any = undefined;\n let resolveData!: (value: { chunks: T[]; error?: any }) => void;\n const dataPromise = new Promise<{ chunks: T[]; error?: any }>((resolve) => {\n resolveData = resolve;\n });\n\n const wrappedIterable = (async function* () {\n try {\n for await (const item of iterable) {\n chunks.push(item);\n yield item;\n }\n } catch (err) {\n error = err;\n throw err;\n } finally {\n resolveData({ chunks, error });\n }\n })();\n\n return { iterable: wrappedIterable, dataPromise };\n};\n\n/**\n * Consumes a Response object's body stream\n * @param response - The Response object to consume\n * @returns Promise that resolves to the consumed data\n */\nexport const consumeResponse = async (response: Response):\nPromise<{ chunks: any[]; error?: any }> => {\n const chunks: any[] = [];\n let error: any = undefined;\n\n if (!response.body) {\n return { chunks };\n }\n\n try {\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(decoder.decode(value, { stream: true }));\n }\n } finally {\n reader.releaseLock();\n }\n } catch (err) {\n error = err;\n }\n\n return { chunks, error };\n};\n","import type { Span } from \"@opentelemetry/api\";\n\nimport { initializeLogger } from \"../../utils\";\nimport {\n consumeAISDKResult,\n consumeAndTeeAsyncIterable,\n consumeAndTeeReadableStream,\n consumeResponse,\n getStream,\n} from \"../instrumentation/aisdk/utils\";\nimport { shouldSendTraces } from \".\";\nimport {\n SPAN_OUTPUT,\n} from \"./attributes\";\n\nconst logger = initializeLogger();\n\n// Track pending stream processing promises\nconst pendingStreamProcessing = new Set<Promise<void>>();\n\n/**\n * Wait for all pending stream processing to complete with a timeout\n * @param timeoutMs - Maximum time to wait in milliseconds (default: 5000)\n */\nexport const waitForPendingStreams = async (timeoutMs: number = 5000): Promise<void> => {\n if (pendingStreamProcessing.size === 0) {\n return;\n }\n logger.debug(`Waiting for ${pendingStreamProcessing.size} pending stream(s)`);\n\n const initialCount = pendingStreamProcessing.size;\n const pendingPromises = Array.from(pendingStreamProcessing);\n\n let timedOut = false;\n const timeoutPromise = new Promise<void>((resolve) => {\n setTimeout(() => {\n timedOut = true;\n resolve();\n }, timeoutMs);\n });\n\n await Promise.race([\n Promise.allSettled(pendingPromises),\n timeoutPromise,\n ]);\n\n if (timedOut && pendingStreamProcessing.size > 0) {\n logger.warn(\n `Timeout waiting for ${pendingStreamProcessing.size} pending stream(s) ` +\n `after ${timeoutMs}ms (started with ${initialCount})`,\n );\n }\n};\n\n/**\n * Consumes a stream result to ensure background processing completes.\n * This is useful in debugger mode where there's no caller to consume the stream.\n * @param result - The result that might be a stream\n * @returns The same result, or accumulated data if it was a stream\n */\nexport const consumeStreamResult = async (result: unknown): Promise<unknown> => {\n const streamInfo = getStream(result);\n\n if (streamInfo.type === null) {\n // Not a stream, return as-is\n logger.debug(\"Result is not a stream, returning as-is\");\n return result;\n }\n\n logger.debug(\"Result is a stream, consuming...\");\n\n if (streamInfo.type === 'aisdk-result') {\n // For AI SDK results, just await the text property to trigger consumption\n // The background task will handle collecting all data\n try {\n if ('text' in streamInfo.result) {\n await streamInfo.result.text;\n }\n } catch (error) {\n logger.warn(\"Error consuming AI SDK result stream: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n return result;\n }\n\n if (streamInfo.type === 'readable-stream') {\n // Consume the ReadableStream\n const chunks: unknown[] = [];\n try {\n const reader = streamInfo.stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n } catch (error) {\n logger.warn(\"Error consuming ReadableStream: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n return { type: 'stream', chunks };\n }\n\n if (streamInfo.type === 'async-iterable') {\n // Consume the AsyncIterable\n const chunks: unknown[] = [];\n try {\n for await (const chunk of streamInfo.iterable) {\n chunks.push(chunk);\n }\n } catch (error) {\n logger.warn(\"Error consuming AsyncIterable: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n return { type: 'async-iterable', chunks };\n }\n\n if (streamInfo.type === 'response') {\n // Consume the Response body\n try {\n const { chunks, error } = await consumeResponse(streamInfo.response);\n if (error) {\n logger.warn(\"Error consuming Response: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n return { type: 'response', chunks };\n } catch (error) {\n logger.warn(\"Error consuming Response: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n return result;\n }\n }\n\n return result;\n};\n\n/**\n * Track a background promise and ensure cleanup\n */\nconst trackStreamProcessing = (task: () => Promise<void>): void => {\n const processingPromise = task().finally(() => {\n pendingStreamProcessing.delete(processingPromise);\n });\n\n pendingStreamProcessing.add(processingPromise);\n};\n\n/**\n * Handles streaming results by consuming the stream in the background\n * while passing through the original result to the caller\n */\nexport const handleStreamResult = <T>(\n originalResult: T,\n streamInfo: ReturnType<typeof getStream>,\n span: Span,\n ignoreOutput: boolean | undefined,\n serialize: (payload: unknown) => string,\n): T | ReadableStream<unknown> | AsyncIterable<unknown> | Response => {\n logger.debug(`Handling stream result of type: ${streamInfo.type}`);\n\n if (streamInfo.type === 'aisdk-result') {\n // For AI SDK results, consume the promise properties in the background\n trackStreamProcessing(async () => {\n logger.debug('Starting background processing for AI SDK result');\n\n let partialOutput: any = {};\n try {\n partialOutput = await consumeAISDKResult(streamInfo.result);\n\n if (shouldSendTraces() && !ignoreOutput) {\n try {\n span.setAttribute(SPAN_OUTPUT, serialize(partialOutput));\n } catch (error) {\n logger.warn(\"Failed to serialize AI SDK stream output: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n } catch (error) {\n // Record partial output if we have any\n if (Object.keys(partialOutput).length > 0 && shouldSendTraces() && !ignoreOutput) {\n try {\n span.setAttribute(SPAN_OUTPUT, serialize(partialOutput));\n } catch (serError) {\n logger.warn(\"Failed to serialize partial AI SDK output: \" +\n `${serError instanceof Error ? serError.message : String(serError)}`);\n }\n }\n span.recordException(error as Error);\n } finally {\n logger.debug('Ending span for AI SDK result');\n span.end();\n }\n });\n\n return originalResult;\n }\n\n if (streamInfo.type === 'readable-stream') {\n logger.debug('Setting up background processing for ReadableStream');\n const { stream, dataPromise } = consumeAndTeeReadableStream(streamInfo.stream);\n\n // Consume in background\n trackStreamProcessing(async () => {\n try {\n const { chunks, error } = await dataPromise;\n\n if (shouldSendTraces() && !ignoreOutput) {\n try {\n const output = { type: 'stream', chunks };\n span.setAttribute(SPAN_OUTPUT, serialize(output));\n } catch (serError) {\n logger.warn(\"Failed to serialize stream output: \" +\n `${serError instanceof Error ? serError.message : String(serError)}`);\n }\n }\n\n if (error) {\n span.recordException(error as Error);\n }\n } finally {\n logger.debug('Ending span for ReadableStream');\n span.end();\n }\n });\n\n return stream;\n }\n\n if (streamInfo.type === 'async-iterable') {\n logger.debug('Setting up background processing for AsyncIterable');\n const { iterable, dataPromise } = consumeAndTeeAsyncIterable(streamInfo.iterable);\n\n // Consume in background\n trackStreamProcessing(async () => {\n try {\n const { chunks, error } = await dataPromise;\n\n if (shouldSendTraces() && !ignoreOutput) {\n try {\n const output = { type: 'async-iterable', chunks };\n span.setAttribute(SPAN_OUTPUT, serialize(output));\n } catch (serError) {\n logger.warn(\"Failed to serialize async iterable output: \" +\n `${serError instanceof Error ? serError.message : String(serError)}`);\n }\n }\n\n if (error) {\n span.recordException(error as Error);\n }\n } finally {\n logger.debug('Ending span for AsyncIterable');\n span.end();\n }\n });\n\n return iterable;\n }\n\n if (streamInfo.type === 'response') {\n logger.debug('Setting up background processing for Response');\n // For Response objects, extract the body stream and tee it\n const originalResponse = streamInfo.response;\n\n if (!originalResponse.body) {\n // No body, just return as-is and end span\n span.end();\n return originalResult;\n }\n\n const [stream1, stream2] = originalResponse.body.tee();\n\n // Create a new Response with the teed stream for the caller\n const newResponse = new Response(stream1, {\n status: originalResponse.status,\n statusText: originalResponse.statusText,\n headers: originalResponse.headers,\n });\n\n // Consume the other stream in background\n trackStreamProcessing(async () => {\n try {\n // Create a temporary Response to use consumeResponse helper\n const tempResponse = new Response(stream2);\n const { chunks, error } = await consumeResponse(tempResponse);\n\n if (shouldSendTraces() && !ignoreOutput) {\n try {\n const output = { type: 'response', chunks };\n span.setAttribute(SPAN_OUTPUT, serialize(output));\n } catch (serError) {\n logger.warn(\"Failed to serialize response output: \" +\n `${serError instanceof Error ? serError.message : String(serError)}`);\n }\n }\n\n if (error) {\n span.recordException(error as Error);\n }\n } catch (err) {\n span.recordException(err as Error);\n } finally {\n logger.debug('Ending span for Response');\n span.end();\n }\n });\n\n return newResponse;\n }\n\n // Should never reach here, but just in case\n logger.warn('Stream type not handled, ending span immediately');\n span.end();\n return originalResult;\n};\n","//#region src/tracing.ts\n/**\n* Tracing levels to conditionally disable tracing.\n*\n* OFF - No tracing is sent.\n* META_ONLY - Only metadata is sent (e.g. tokens, costs, etc.).\n* ALL - All data is sent.\n*/\nlet TracingLevel = /* @__PURE__ */ function(TracingLevel) {\n\tTracingLevel[\"OFF\"] = \"off\";\n\tTracingLevel[\"META_ONLY\"] = \"meta_only\";\n\tTracingLevel[\"ALL\"] = \"all\";\n\treturn TracingLevel;\n}({});\n//#endregion\n//#region src/worker-protocol.ts\n/**\n* Message prefix for protocol messages in stdout\n*/\nconst WORKER_MESSAGE_PREFIX = \"__LMNR_WORKER__:\";\n//#endregion\nexport { TracingLevel, WORKER_MESSAGE_PREFIX };\n\n//# sourceMappingURL=index.mjs.map","\nimport { LaminarSpanContext, TraceType, TracingLevel } from \"@lmnr-ai/types\";\nimport {\n Attributes,\n AttributeValue,\n type Context,\n Exception,\n HrTime,\n Link,\n type Span,\n SpanContext,\n SpanKind,\n SpanStatus,\n TimeInput,\n} from \"@opentelemetry/api\";\nimport { type InstrumentationScope } from \"@opentelemetry/core\";\nimport { ReadableSpan, type Span as SdkSpan, TimedEvent } from \"@opentelemetry/sdk-trace-base\";\n\nimport {\n initializeLogger,\n metadataToAttributes,\n otelSpanIdToUUID,\n otelTraceIdToUUID,\n StringUUID,\n} from \"../../utils\";\nimport {\n ASSOCIATION_PROPERTIES,\n ROLLOUT_SESSION_ID,\n SESSION_ID,\n SPAN_IDS_PATH,\n SPAN_INPUT,\n SPAN_OUTPUT,\n SPAN_PATH,\n TRACE_TYPE,\n USER_ID,\n} from \"./attributes\";\nimport { getParentSpanId, makeSpanOtelV2Compatible } from \"./compat\";\nimport { LaminarContextManager } from \"./context\";\n\nconst logger = initializeLogger();\n\n// We decided to implement raw otel Span interface and have _span: SdkSpan because SdkSpan\n// discourages use of its constructor directly in favour of Tracer.startSpan()\n// We are using constructor directly because we're implementing Tracer interface as well.\nexport class LaminarSpan implements Span, ReadableSpan {\n private _span: SdkSpan;\n // Whether the span is started by Laminar.startActiveSpan()\n private _activated: boolean;\n // When set, the span was pushed onto the process-global context stack via\n // `Laminar.startActiveSpan({ global: true })`. We remember the exact Context\n // reference so `end()` can pop the matching entry, even if spans end out of\n // order.\n private _globalActiveContext?: Context;\n\n constructor(span: Span, activated?: boolean) {\n if (span instanceof LaminarSpan) {\n this._activated = span.isActivated;\n this._span = span._span;\n } else {\n this._activated = activated ?? false;\n\n // This line assumes that the span passed here is an SdkSpan. Reason:\n // When using default OpenTelemetry Node SDK, i.e. NodeTracerProvider.getTracer().startSpan(),\n // the span returned is an SdkSpan. SDK span implements ReadableSpan, so attributes\n // can be accessed. Span, i.e. OpenTelemetry API Span, does not require that, so custom\n // SDK implementations may not implement certain ReadableSpan methods, in particular\n // `attributes` that we need to access.\n this._span = span as SdkSpan;\n }\n\n this.name = (this._span as unknown as SdkSpan).name;\n this.kind = (this._span as unknown as SdkSpan).kind;\n this.startTime = (this._span as unknown as SdkSpan).startTime;\n this.endTime = (this._span as unknown as SdkSpan).endTime;\n this.status = (this._span as unknown as SdkSpan).status;\n this.attributes = (this._span as unknown as SdkSpan).attributes;\n this.links = (this._span as unknown as SdkSpan).links;\n this.events = (this._span as unknown as SdkSpan).events;\n this.duration = (this._span as unknown as SdkSpan).duration;\n this.ended = (this._span as unknown as SdkSpan).ended;\n this.resource = (this._span as unknown as SdkSpan).resource;\n this.instrumentationLibrary = (this._span as any).instrumentationLibrary;\n this.droppedAttributesCount = (this._span as unknown as SdkSpan).droppedAttributesCount;\n this.droppedEventsCount = (this._span as unknown as SdkSpan).droppedEventsCount;\n this.droppedLinksCount = (this._span as unknown as SdkSpan).droppedLinksCount;\n this.makeOtelV2Compatible();\n LaminarContextManager.addActiveSpan(this.spanContext().spanId);\n }\n\n name: string;\n kind: SpanKind;\n parentSpanId?: string | undefined;\n startTime: HrTime;\n endTime: HrTime;\n status: SpanStatus;\n attributes: Attributes;\n links: Link[];\n events: TimedEvent[];\n duration: HrTime;\n ended: boolean;\n resource: any; // type IResource from `@opentelemetry/resources`\n instrumentationLibrary: any; // type InstrumentationLibrary from `@opentelemetry/core`\n droppedAttributesCount: number;\n droppedEventsCount: number;\n droppedLinksCount: number;\n\n public spanContext(): SpanContext {\n return this._span.spanContext();\n }\n\n public setAttribute(key: string, value: AttributeValue): this {\n this._span.setAttribute(key, value);\n return this;\n }\n\n public setAttributes(attributes: Attributes): this {\n this._span.setAttributes(attributes);\n return this;\n }\n\n public addEvent(\n name: string,\n attributesOrStartTime?: Attributes | TimeInput,\n startTime?: TimeInput,\n ): this {\n this._span.addEvent(name, attributesOrStartTime, startTime);\n return this;\n }\n\n public addLink(link: Link): this {\n this._span.addLink(link);\n return this;\n }\n\n public addLinks(links: Link[]): this {\n this._span.addLinks(links);\n return this;\n }\n\n public setStatus(status: SpanStatus): this {\n this._span.setStatus(status);\n return this;\n }\n\n public updateName(name: string): this {\n this._span.updateName(name);\n return this;\n }\n\n public end(endTime?: TimeInput): void {\n if (!this._span.isRecording()) {\n // This will log a warning and do nothing.\n return this._span.end(endTime);\n }\n\n // Remove from global registry on end\n LaminarContextManager.removeActiveSpan(this.spanContext().spanId);\n\n if (this._activated) {\n LaminarContextManager.popContext();\n }\n if (this._globalActiveContext !== undefined) {\n LaminarContextManager.popGlobalContext(this._globalActiveContext);\n this._globalActiveContext = undefined;\n }\n return this._span.end(endTime);\n }\n\n public setGlobalActiveContext(context: Context): void {\n this._globalActiveContext = context;\n }\n\n public set activated(activated: boolean) {\n this._activated = activated;\n }\n\n public isRecording(): boolean {\n return this._span.isRecording();\n }\n\n public recordException(exception: Exception, time?: TimeInput): void {\n return this._span.recordException(exception, time);\n }\n\n // ================================\n // Laminar specific methods\n // ================================\n\n public setTraceSessionId(sessionId: string): void {\n this._span.setAttribute(SESSION_ID, sessionId);\n }\n\n public setTraceUserId(userId: string): void {\n this._span.setAttribute(USER_ID, userId);\n }\n\n public setTraceRolloutSessionId(rolloutSessionId: string): void {\n this._span.setAttribute(\"lmnr.rollout.session_id\", rolloutSessionId);\n }\n\n public setTraceMetadata(metadata: Record<string, any>): void {\n this._span.setAttributes(metadataToAttributes(metadata));\n }\n\n public setInput(input: any): void {\n const finalInput = typeof input === 'string' ? input : JSON.stringify(input);\n this._span.setAttribute(SPAN_INPUT, finalInput);\n }\n\n public setOutput(output: any): void {\n const finalOutput = typeof output === 'string' ? output : JSON.stringify(output);\n this._span.setAttribute(SPAN_OUTPUT, finalOutput);\n }\n\n public setTags(tags: string[]): void {\n this._span.setAttribute(`${ASSOCIATION_PROPERTIES}.tags`, Array.from(new Set(tags)));\n }\n\n public addTags(tags: string[]): void {\n const currentTags = this.tags;\n this.setTags(Array.from(new Set([...currentTags, ...tags])));\n }\n\n public getLaminarSpanContext(): LaminarSpanContext {\n let spanPath: string[] = [];\n let spanIdsPath: StringUUID[] = [];\n let userId;\n let sessionId;\n let rolloutSessionId;\n let traceType;\n let tracingLevel = TracingLevel.ALL;\n const metadata: Record<string, AttributeValue> = {};\n\n if (this._span.attributes) {\n spanPath = this._span.attributes[SPAN_PATH] as string[];\n spanIdsPath = this._span.attributes[SPAN_IDS_PATH] as StringUUID[];\n userId = this._span.attributes[USER_ID] as string;\n sessionId = this._span.attributes[SESSION_ID] as string;\n rolloutSessionId = this._span.attributes[ROLLOUT_SESSION_ID] as string;\n traceType = this._span.attributes[TRACE_TYPE] as TraceType;\n tracingLevel = this._span.attributes[\n `${ASSOCIATION_PROPERTIES}.tracing_level`\n ] as TracingLevel ?? TracingLevel.ALL;\n for (const [key, rawValue] of Object.entries(this._span.attributes)) {\n if (key.startsWith(`${ASSOCIATION_PROPERTIES}.metadata.`)) {\n let value = rawValue!;\n try {\n value = JSON.parse(value as string);\n } catch {\n // Ignore\n }\n metadata[key.replace(`${ASSOCIATION_PROPERTIES}.metadata.`, '')] = value;\n }\n }\n } else {\n logger.warn(\n \"Attributes object is not available. Most likely the span is not a LaminarSpan \" +\n \"and not an OpenTelemetry default SDK Span. Span path and ids path will be empty.\",\n );\n }\n\n return {\n spanId: otelSpanIdToUUID(this._span.spanContext().spanId) as StringUUID,\n traceId: otelTraceIdToUUID(this._span.spanContext().traceId),\n isRemote: this._span.spanContext().isRemote ?? false,\n spanPath,\n spanIdsPath,\n userId,\n sessionId,\n rolloutSessionId,\n metadata,\n traceType,\n tracingLevel,\n };\n }\n\n public spanId(\n format: 'otel' | 'uuid' = 'otel',\n ): string {\n const spanId = this._span.spanContext().spanId;\n if (format === 'otel') {\n return spanId;\n }\n return otelSpanIdToUUID(spanId);\n }\n\n public traceId(\n format: 'otel' | 'uuid' = 'otel',\n ): string {\n const traceId = this._span.spanContext().traceId;\n if (format === 'otel') {\n return traceId;\n }\n return otelTraceIdToUUID(traceId);\n }\n\n public get tags(): string[] {\n if (!this._span.attributes) {\n logger.warn(\n \"[LaminarSpan.tags] WARNING. Current span does not have attributes object. \" +\n \"Possibly, the span was created with a custom OTel SDK. Returning an empty list. \" +\n \"Help: OpenTelemetry API does not guarantee reading attributes from a span, but OTel \" +\n \"SDK allows it by default. Laminar SDK allows to read attributes too.\",\n );\n return [];\n }\n return this._span.attributes[`${ASSOCIATION_PROPERTIES}.tags`] as string[] ?? [];\n }\n\n public get laminarAssociationProperties(): {\n metadata?: Record<string, any>;\n userId?: string;\n sessionId?: string;\n rolloutSessionId?: string;\n traceType?: TraceType;\n tracingLevel?: TracingLevel;\n } {\n if (!this._span.attributes) {\n logger.warn(\n \"[LaminarSpan.laminarAssociationProperties] WARNING. Current span does not have \" +\n \"attributes object. Possibly, the span was created with a custom OTel SDK. Returning an \" +\n \"empty object. Help: OpenTelemetry API does not guarantee reading attributes from a \" +\n \"span, but OTel SDK allows it by default. Laminar SDK allows to read attributes too.\",\n );\n return {};\n }\n try {\n const properties: Record<string, any> = {};\n const metadata: Record<string, any> = {};\n for (const [key, rawValue] of Object.entries(this._span.attributes)) {\n if (!key.startsWith(`${ASSOCIATION_PROPERTIES}.`)) {\n continue;\n }\n let value = rawValue!;\n if (key.startsWith(`${ASSOCIATION_PROPERTIES}.metadata.`)) {\n const metaKey = key.replace(`${ASSOCIATION_PROPERTIES}.metadata.`, '');\n try {\n value = JSON.parse(value as string);\n } catch {\n // Ignore\n }\n metadata[metaKey] = value;\n }\n }\n properties.tracingLevel = this._span.attributes[\n `${ASSOCIATION_PROPERTIES}.tracing_level`\n ] as TracingLevel ?? TracingLevel.ALL;\n properties.userId = this._span.attributes[USER_ID] as string ?? undefined;\n properties.sessionId = this._span.attributes[SESSION_ID] as string ?? undefined;\n properties.rolloutSessionId = this._span.attributes[ROLLOUT_SESSION_ID] as string\n ?? undefined;\n properties.traceType = this._span.attributes[TRACE_TYPE] as TraceType ?? undefined;\n return {\n metadata,\n ...properties,\n };\n } catch {\n return {};\n }\n }\n\n // ================================\n // OTel V2 compatibility\n // ================================\n\n public makeOtelV2Compatible(): void {\n makeSpanOtelV2Compatible(this._span);\n }\n\n public get instrumentationScope(): InstrumentationScope {\n return (this._span as any).instrumentationLibrary as unknown as InstrumentationScope;\n }\n\n public get parentSpanContext(): SpanContext | undefined {\n const parentSpanId = getParentSpanId(this._span);\n if (!parentSpanId) {\n return undefined;\n }\n return {\n spanId: parentSpanId,\n traceId: this.spanContext().traceId,\n // TODO: somehow get the traceFlags from the parent span\n traceFlags: this.spanContext().traceFlags,\n };\n }\n\n public getParentSpanId(): string | undefined {\n return getParentSpanId(this._span as unknown as SdkSpan);\n }\n\n public get isActivated(): boolean {\n return this._activated;\n }\n}\n","import { TraceType, TracingLevel } from \"@lmnr-ai/types\";\nimport {\n Context, context as contextApi,\n createContextKey, ROOT_CONTEXT, trace } from \"@opentelemetry/api\";\nimport { AsyncLocalStorage } from \"async_hooks\";\n\nimport { LaminarSpan } from \"./span\";\n\nexport const CONTEXT_SPAN_PATH_KEY = createContextKey(\"span_path\");\nexport const ASSOCIATION_PROPERTIES_KEY = createContextKey(\n \"association_properties\",\n);\nexport const CONTEXT_GLOBAL_METADATA_KEY = createContextKey(\n \"global_metadata\",\n);\n\nexport class LaminarContextManager {\n private static _asyncLocalStorage = new AsyncLocalStorage<Context[]>();\n private static _globalMetadata: Record<string, any> = {};\n private static _inheritGlobalContext: boolean = false;\n // Static registry for cross-async span management\n // We're keeping track of spans have started (and running) here for the cases when span\n // is started in one async context and ended in another\n // We use this registry to ignore the context of spans that were already ended in\n // another async context.\n // LaminarSpan adds and removes itself to and from this registry in start()\n // and end() methods respectively.\n private static _activeSpans: Set<string> = new Set();\n // Process-global stack of contexts marked globally active via\n // `Laminar.startActiveSpan({ global: true })`. Unlike the AsyncLocalStorage\n // stack, this one is visible from any async task in the process. We use it\n // as the fallback parent when the ALS stack is empty. Spans push onto this\n // stack when started globally and pop in `LaminarSpan.end()`.\n private static _globalActiveContexts: Context[] = [];\n\n private constructor() {\n throw new Error(\"LaminarContextManager is a static class and cannot be instantiated\");\n }\n\n private static isValidContext(context: Context): boolean {\n const span = trace.getSpan(context);\n if (!span) {\n return true;\n }\n if (!span.isRecording() && span.spanContext().isRemote) {\n return true;\n }\n if (!(span instanceof LaminarSpan)) {\n return true;\n }\n if (!span.isActivated) {\n return true;\n }\n try {\n return this._activeSpans.has(span.spanContext().spanId);\n } catch {\n return true;\n }\n }\n\n private static findLatestValidContext(contexts: Context[]): Context | undefined {\n // Walk through contexts from most recent to oldest and return the most\n // recent one that is still valid (has a live activated span, or has no\n // span at all).\n for (let i = contexts.length - 1; i >= 0; i--) {\n if (this.isValidContext(contexts[i])) {\n return contexts[i];\n }\n }\n return undefined;\n }\n\n public static getContext(): Context {\n // Prefer the per-async context stack so local control flow wins over any\n // globally-registered span. Fall back to the global stack so spans started\n // via `startActiveSpan({ global: true })` act as parents for descendants\n // that run in unrelated async tasks.\n const asyncContext = this.findLatestValidContext(this.getContextStack());\n if (asyncContext !== undefined) {\n return asyncContext;\n }\n const globalContext = this.findLatestValidContext(this._globalActiveContexts);\n if (globalContext !== undefined) {\n return globalContext;\n }\n return ROOT_CONTEXT;\n }\n\n public static pushContext(context: Context) {\n const contexts = this.getContextStack();\n const newContexts = [...contexts, context];\n this._asyncLocalStorage.enterWith(newContexts);\n }\n\n public static popContext() {\n const contexts = this.getContextStack();\n if (contexts.length > 0) {\n // Remove the last context and filter out any contexts with inactive spans\n const newContexts = contexts.slice(0, -1).filter(context => {\n const span = trace.getSpan(context);\n\n if (!span) {\n // No span in this context, it's valid\n return true;\n }\n\n // Check if the span in this context has been ended\n try {\n return this._activeSpans.has(span.spanContext().spanId);\n } catch {\n // If we can't check the span, assume it's valid\n return true;\n }\n });\n\n this._asyncLocalStorage.enterWith(newContexts);\n }\n }\n\n public static pushGlobalContext(context: Context) {\n this._globalActiveContexts.push(context);\n }\n\n // Remove a specific context reference from the ALS stack. Unlike\n // `popContext`, this does not assume LIFO order — it locates the most\n // recent entry `=== context` and splices it out. Used by callers (e.g. the\n // OpenAI Agents processor) that activate spans so nested instrumentation\n // inherits them, but whose spans can end in arbitrary order with respect to\n // other activated spans on the same async frame.\n public static removeContext(context: Context) {\n const contexts = this.getContextStack();\n if (contexts.length === 0) {\n return;\n }\n for (let i = contexts.length - 1; i >= 0; i--) {\n if (contexts[i] === context) {\n const newContexts = contexts.slice(0, i).concat(contexts.slice(i + 1));\n this._asyncLocalStorage.enterWith(newContexts);\n return;\n }\n }\n }\n\n public static popGlobalContext(context?: Context) {\n if (context !== undefined) {\n // Remove the specific context entry (most recent occurrence) to keep\n // the stack consistent when spans end out of order across async tasks.\n for (let i = this._globalActiveContexts.length - 1; i >= 0; i--) {\n if (this._globalActiveContexts[i] === context) {\n this._globalActiveContexts.splice(i, 1);\n return;\n }\n }\n return;\n }\n if (this._globalActiveContexts.length > 0) {\n this._globalActiveContexts.pop();\n }\n }\n\n public static clearContexts() {\n this._asyncLocalStorage.enterWith([]);\n this._globalActiveContexts = [];\n }\n\n public static clearActiveSpans() {\n this._activeSpans.clear();\n }\n\n public static getContextStack(): Context[] {\n return this._asyncLocalStorage.getStore()\n || (this._inheritGlobalContext ? [contextApi.active()] : []);\n }\n\n /**\n * Run a function with an isolated context stack.\n * This ensures that parallel executions don't interfere with each other.\n */\n public static runWithIsolatedContext<T>(initialStack: Context[], fn: () => T): T {\n return this._asyncLocalStorage.run(initialStack, fn);\n }\n\n public static addActiveSpan(spanId: string): void {\n this._activeSpans.add(spanId);\n }\n\n public static removeActiveSpan(spanId: string): void {\n this._activeSpans.delete(spanId);\n }\n\n public static setAssociationProperties(span: LaminarSpan, context: Context): Context {\n const properties = span.laminarAssociationProperties;\n\n return this.setRawAssociationProperties(properties, context);\n }\n\n public static setRawAssociationProperties(\n properties: Record<string, any>,\n context: Context,\n ): Context {\n let entityContext = context;\n const userId = properties.userId;\n const sessionId = properties.sessionId;\n const rolloutSessionId = properties.rolloutSessionId;\n const traceType = properties.traceType;\n const metadata = properties.metadata;\n const tracingLevel = properties.tracingLevel;\n entityContext = entityContext.setValue(ASSOCIATION_PROPERTIES_KEY, {\n userId,\n sessionId,\n traceType,\n metadata,\n tracingLevel,\n rolloutSessionId,\n });\n return entityContext;\n }\n\n public static setGlobalMetadata(globalMetadata: Record<string, any>) {\n this._globalMetadata = globalMetadata;\n }\n\n public static getGlobalMetadata(): Record<string, any> {\n return this._globalMetadata;\n }\n\n public static getAssociationProperties(): {\n userId?: string;\n sessionId?: string;\n rolloutSessionId?: string;\n traceType?: TraceType;\n tracingLevel?: TracingLevel;\n metadata?: Record<string, any>;\n } {\n const entityContext = this.getContext();\n return entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {};\n }\n\n public static set inheritGlobalContext(inheritGlobalContext: boolean) {\n this._inheritGlobalContext = inheritGlobalContext;\n }\n}\n","import { trace } from \"@opentelemetry/api\";\nimport type { ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\nimport * as fs from \"fs\";\nimport * as net from \"net\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nimport { Laminar } from \"../../../laminar\";\nimport { initializeLogger } from \"../../../utils\";\nimport { SPAN_IDS_PATH, SPAN_PATH } from \"../../tracing/attributes\";\nimport { LaminarContextManager } from \"../../tracing/context\";\n\nconst logger = initializeLogger();\n\nconst DEFAULT_ANTHROPIC_BASE_URL = \"https://api.anthropic.com\";\nconst DEFAULT_CC_PROXY_PORT = 45667;\nconst CC_PROXY_PORT_ATTEMPTS = 50;\n\n// Foundry configuration constants\nconst FOUNDRY_BASE_URL_ENV = \"ANTHROPIC_FOUNDRY_BASE_URL\";\nconst FOUNDRY_RESOURCE_ENV = \"ANTHROPIC_FOUNDRY_RESOURCE\";\nconst FOUNDRY_USE_ENV = \"CLAUDE_CODE_USE_FOUNDRY\";\n\n// Bedrock configuration constants\nconst BEDROCK_BASE_URL_ENV = \"ANTHROPIC_BEDROCK_BASE_URL\";\nconst BEDROCK_USE_ENV = \"CLAUDE_CODE_USE_BEDROCK\";\nconst BEDROCK_AWS_REGION_ENV = \"AWS_REGION\";\n\n// Vertex AI configuration constants\nconst VERTEX_BASE_URL_ENV = \"ANTHROPIC_VERTEX_BASE_URL\";\nconst VERTEX_USE_ENV = \"CLAUDE_CODE_USE_VERTEX\";\n\n// Track all active proxy instances for cleanup\nconst activeProxyServers = new Set<any>(); // Set<ProxyServer>\nlet globalShutdownRegistered = false;\n\n/**\n * Check if environment variable value is truthy (equals '1')\n */\nconst isTruthyEnv = (value: string | undefined): boolean => value === \"1\";\n\n/**\n * Read region for a given profile from ~/.aws/config.\n */\nconst getRegionFromAwsConfig = (profile: string): string | null => {\n const configPath = path.join(os.homedir(), \".aws\", \"config\");\n let content: string;\n try {\n content = fs.readFileSync(configPath, \"utf-8\");\n } catch {\n return null;\n }\n\n const profileHeader =\n profile === \"default\" ? \"default\" : `profile ${profile}`;\n const escapedHeader = profileHeader.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regex = new RegExp(\n `\\\\[${escapedHeader}\\\\][^\\\\[]*?^\\\\s*region\\\\s*=\\\\s*([^\\\\s\\\\n]+)`,\n \"ms\",\n );\n const match = content.match(regex);\n return match ? match[1] : null;\n};\n\n/**\n * Resolve target URL from environment dictionary with process.env fallback.\n *\n * This is the single source of truth for determining the target URL for the proxy.\n *\n * Resolution order (highest to lowest priority):\n * 1. HTTPS_PROXY - if set, use as target (our proxy will forward to it)\n * 2. HTTP_PROXY - if set, use as target (our proxy will forward to it)\n * 3. Third-party provider URLs (e.g., Foundry, Bedrock):\n * - If CLAUDE_CODE_USE_FOUNDRY is truthy:\n * - Use ANTHROPIC_FOUNDRY_BASE_URL, or\n * - Construct from ANTHROPIC_FOUNDRY_RESOURCE\n * - If CLAUDE_CODE_USE_BEDROCK is truthy:\n * - Use ANTHROPIC_BEDROCK_BASE_URL, or\n * - Construct from AWS_REGION env var, or\n * - Construct by reading region from ~/.aws/config via AWS_PROFILE\n * - If CLAUDE_CODE_USE_VERTEX is truthy:\n * - Use ANTHROPIC_VERTEX_BASE_URL, or\n * - Construct from CLOUD_ML_REGION and ANTHROPIC_VERTEX_PROJECT_ID\n * 4. ANTHROPIC_BASE_URL - standard Anthropic API base URL\n * 5. Fall back to default (https://api.anthropic.com)\n *\n * For each environment variable, checks envDict first, then process.env as fallback.\n *\n * @param envDict - Dictionary of environment variables (e.g., from options.env)\n * @param fallback - Fallback URL if no other source found (default: DEFAULT_ANTHROPIC_BASE_URL)\n * @returns Resolved target URL, or null if provider is misconfigured\n */\nexport const resolveTargetUrlFromEnv = (\n envDict: Record<string, string | undefined>,\n fallback: string = DEFAULT_ANTHROPIC_BASE_URL,\n): string | null => {\n // Helper to get value from envDict first, then process.env\n const getEnvValue = (key: string): string | undefined =>\n envDict[key] || process.env[key];\n\n // 1. Check for HTTPS_PROXY (highest priority)\n const httpsProxy = getEnvValue(\"HTTPS_PROXY\");\n if (httpsProxy) {\n return httpsProxy.replace(/\\/$/, \"\");\n }\n\n // 2. Check for HTTP_PROXY\n const httpProxy = getEnvValue(\"HTTP_PROXY\");\n if (httpProxy) {\n return httpProxy.replace(/\\/$/, \"\");\n }\n\n // 3. Check for third-party providers (Foundry)\n const foundryEnabled = isTruthyEnv(getEnvValue(FOUNDRY_USE_ENV));\n if (foundryEnabled) {\n // Try to get Foundry base URL first\n const foundryBaseUrl = getEnvValue(FOUNDRY_BASE_URL_ENV);\n if (foundryBaseUrl) {\n return foundryBaseUrl.replace(/\\/$/, \"\");\n }\n\n // Try to construct from resource\n const foundryResource = getEnvValue(FOUNDRY_RESOURCE_ENV);\n if (foundryResource) {\n return `https://${foundryResource}.services.ai.azure.com/anthropic`;\n }\n\n // Foundry is enabled but misconfigured\n logger.error(\n `${FOUNDRY_USE_ENV} is set but neither ${FOUNDRY_BASE_URL_ENV} ` +\n `nor ${FOUNDRY_RESOURCE_ENV} is configured. ` +\n `Microsoft Foundry requires one of these values.`,\n );\n return null;\n }\n\n // 3b. Check for Bedrock\n const bedrockEnabled = isTruthyEnv(getEnvValue(BEDROCK_USE_ENV));\n if (bedrockEnabled) {\n const bedrockBaseUrl = getEnvValue(BEDROCK_BASE_URL_ENV);\n if (bedrockBaseUrl) {\n return bedrockBaseUrl.replace(/\\/$/, \"\");\n }\n\n let region = getEnvValue(BEDROCK_AWS_REGION_ENV);\n if (!region) {\n const awsProfile = getEnvValue(\"AWS_PROFILE\") || \"default\";\n region = getRegionFromAwsConfig(awsProfile) ?? undefined;\n }\n\n if (region) {\n return `https://bedrock-runtime.${region}.amazonaws.com`;\n }\n\n logger.error(\n `${BEDROCK_USE_ENV} is set but could not determine AWS region. ` +\n `Set ${BEDROCK_AWS_REGION_ENV} or configure a region ` +\n \"in ~/.aws/config for the active profile.\",\n );\n return null;\n }\n\n // 3c. Check for Vertex AI\n const vertexEnabled = isTruthyEnv(getEnvValue(VERTEX_USE_ENV));\n if (vertexEnabled) {\n // unlike for Foundry or Bedrock, we don't parse the project or region config, because\n // they affect the URL path, not the base URL, so CC can handle this part internally\n const vertexBaseUrl = getEnvValue(VERTEX_BASE_URL_ENV);\n if (vertexBaseUrl) {\n return vertexBaseUrl.replace(/\\/$/, \"\");\n }\n return `https://aiplatform.googleapis.com/v1`;\n }\n\n // 4. Check for ANTHROPIC_BASE_URL\n const anthropicBaseUrl = getEnvValue(\"ANTHROPIC_BASE_URL\");\n if (anthropicBaseUrl) {\n return anthropicBaseUrl.replace(/\\/$/, \"\");\n }\n\n // 5. Use fallback\n return fallback;\n};\n\n/**\n * Get environment variables to remove from subprocess after resolving target URL.\n * These are variables that should not be passed to the subprocess because they\n * would interfere with our proxy setup.\n *\n * @param envDict - Dictionary of environment variables\n * @returns Array of environment variable keys to remove\n */\nexport const getEnvVarsToRemove = (\n envDict: Record<string, string | undefined>,\n): string[] => {\n const toRemove: string[] = [\"HTTPS_PROXY\", \"HTTP_PROXY\"];\n\n // Helper to get value from envDict first, then process.env\n const getEnvValue = (key: string): string | undefined =>\n envDict[key] || process.env[key];\n\n // Remove FOUNDRY_RESOURCE if Foundry is enabled\n // (it's mutually exclusive with ANTHROPIC_BASE_URL which we'll set)\n const foundryEnabled = isTruthyEnv(getEnvValue(FOUNDRY_USE_ENV));\n if (foundryEnabled) {\n toRemove.push(FOUNDRY_RESOURCE_ENV);\n }\n\n return toRemove;\n};\n\n/**\n * Find an available port starting from the given port\n */\nconst findAvailablePort = (\n startPort: number,\n attempts: number,\n): Promise<number | null> =>\n new Promise((resolve) => {\n let currentAttempt = 0;\n\n const tryPort = (port: number) => {\n const server = net.createServer();\n\n server.once(\"error\", () => {\n server.close();\n currentAttempt++;\n if (currentAttempt < attempts) {\n tryPort(startPort + currentAttempt);\n } else {\n resolve(null);\n }\n });\n\n server.once(\"listening\", () => {\n server.close(() => {\n resolve(port);\n });\n });\n\n server.listen(port, \"127.0.0.1\");\n };\n\n tryPort(startPort);\n });\n\n/**\n * Wait for a port to be available\n */\nconst waitForPort = (\n port: number,\n timeoutMs: number = 5000,\n): Promise<boolean> =>\n new Promise((resolve) => {\n const deadline = Date.now() + timeoutMs;\n\n const checkPort = () => {\n if (Date.now() >= deadline) {\n resolve(false);\n return;\n }\n\n const socket = new net.Socket();\n\n socket.setTimeout(200);\n\n socket.once(\"connect\", () => {\n socket.destroy();\n resolve(true);\n });\n\n socket.once(\"timeout\", () => {\n socket.destroy();\n setTimeout(checkPort, 100);\n });\n\n socket.once(\"error\", () => {\n socket.destroy();\n setTimeout(checkPort, 100);\n });\n\n socket.connect(port, \"127.0.0.1\");\n };\n\n checkPort();\n });\n\n/**\n * Register global cleanup on process exit for all active proxies\n */\nconst registerGlobalProxyShutdown = () => {\n if (!globalShutdownRegistered) {\n process.on(\"exit\", () => {\n logger.debug('process.on(\"exit\") called - stopping all active proxies');\n for (const proxyServer of activeProxyServers) {\n try {\n proxyServer.stopServer();\n } catch (e) {\n logger.debug(\n `Failed to stop proxy: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n }\n activeProxyServers.clear();\n });\n globalShutdownRegistered = true;\n }\n};\n\n/**\n * Interface for a proxy instance with its metadata\n */\nexport interface ProxyInstance {\n server: any; // ProxyServer\n baseUrl: string;\n port: number;\n targetUrl: string;\n}\n\n/**\n * Create and start a new claude-code proxy server instance\n * Each call creates an independent proxy on a unique port\n */\nexport const createProxyInstance = async ({\n env,\n}: {\n env: Record<string, string | undefined>;\n}): Promise<ProxyInstance | null> => {\n try {\n const port = await findAvailablePort(\n DEFAULT_CC_PROXY_PORT,\n CC_PROXY_PORT_ATTEMPTS,\n );\n if (port === null) {\n logger.warn(\"Unable to allocate port for cc-proxy.\");\n return null;\n }\n\n // Resolve target URL using the priority order\n const targetUrl = resolveTargetUrlFromEnv(env);\n if (!targetUrl) {\n logger.warn(\n \"Unable to resolve target URL for cc-proxy (provider misconfigured).\",\n );\n return null;\n }\n\n logger.debug(\n `Creating proxy instance on port ${port} targeting: ${targetUrl}`,\n );\n\n try {\n // Dynamically import ProxyServer class\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { ProxyServer } = require(\"@lmnr-ai/claude-code-proxy\");\n\n const proxyServer = new ProxyServer(port);\n proxyServer.runServer(targetUrl);\n\n const isReady = await waitForPort(port);\n if (!isReady) {\n logger.warn(`cc-proxy failed to start on port ${port}`);\n proxyServer.stopServer();\n return null;\n }\n\n const proxyBaseUrl = `http://127.0.0.1:${port}`;\n\n // Track this proxy for cleanup\n activeProxyServers.add(proxyServer);\n registerGlobalProxyShutdown();\n\n logger.info(`Started claude proxy server on: ${proxyBaseUrl}`);\n\n return {\n server: proxyServer,\n baseUrl: proxyBaseUrl,\n port,\n targetUrl,\n };\n } catch (e) {\n logger.warn(\n `Unable to start cc-proxy: ${e instanceof Error ? e.message : String(e)}`,\n );\n return null;\n }\n } catch (e) {\n logger.warn(\n `Failed to create proxy instance: ${e instanceof Error ? e.message : String(e)}`,\n );\n return null;\n }\n};\n\n/**\n * Stop a specific proxy instance\n */\nexport const stopProxyInstance = (instance: ProxyInstance | null): void => {\n if (!instance) {\n return;\n }\n\n try {\n logger.debug(`Stopping proxy instance on port ${instance.port}`);\n instance.server.stopServer();\n activeProxyServers.delete(instance.server);\n } catch (e) {\n logger.debug(\n `Failed to stop proxy instance: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n};\n\n/**\n * Force stop all active proxy servers\n * Used during shutdown to ensure cleanup\n */\nexport const forceReleaseProxy = (): void => {\n logger.debug(\n `Force stopping all ${activeProxyServers.size} active proxy servers`,\n );\n for (const proxyServer of activeProxyServers) {\n try {\n proxyServer.stopServer();\n } catch (e) {\n logger.debug(\n `Failed to stop proxy: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n }\n activeProxyServers.clear();\n};\n\n/**\n * Get the current span context payload for proxy\n */\nconst getSpanContextPayload = (): {\n trace_id: string;\n span_id: string;\n project_api_key: string;\n span_ids_path: string[];\n span_path: string[];\n laminar_url: string;\n} | null => {\n const currentSpan = trace.getSpan(LaminarContextManager.getContext());\n if (\n !currentSpan ||\n (!currentSpan.spanContext().isRemote && !currentSpan.isRecording())\n ) {\n return null;\n }\n\n const spanContext = currentSpan.spanContext();\n if (!spanContext || !spanContext.traceId) {\n return null;\n }\n\n let spanIdsPath: string[] = [];\n let spanPath: string[] = [];\n\n // Try to extract span path attributes from readable span\n try {\n const readableSpan = currentSpan as unknown as ReadableSpan;\n if (readableSpan.attributes) {\n const idsPath = readableSpan.attributes[SPAN_IDS_PATH];\n const path = readableSpan.attributes[SPAN_PATH];\n\n if (Array.isArray(idsPath)) {\n spanIdsPath = idsPath as string[];\n }\n if (Array.isArray(path)) {\n spanPath = path as string[];\n }\n }\n } catch {\n // If we can't access attributes, continue with empty arrays\n }\n\n const projectApiKey = Laminar.getProjectApiKey();\n const laminarUrl = Laminar.getHttpUrl();\n\n return {\n trace_id: spanContext.traceId,\n span_id: spanContext.spanId,\n project_api_key: projectApiKey || \"\",\n span_ids_path: spanIdsPath,\n span_path: spanPath,\n laminar_url: laminarUrl || \"https://api.lmnr.ai\",\n };\n};\n\n/**\n * Set the trace context for a specific proxy instance\n */\nexport const setTraceToProxyInstance = async (\n instance: ProxyInstance | null,\n): Promise<void> => {\n if (!instance) {\n return;\n }\n\n const payload = getSpanContextPayload();\n if (!payload) {\n return;\n }\n\n try {\n await instance.server.setCurrentTrace({\n traceId: payload.trace_id,\n spanId: payload.span_id,\n projectApiKey: payload.project_api_key,\n spanIdsPath: payload.span_ids_path,\n spanPath: payload.span_path,\n laminarUrl: payload.laminar_url,\n });\n logger.debug(`Set trace context to proxy on port ${instance.port}`);\n } catch (e: any) {\n logger.debug(\n `Unable to set trace context to proxy on port ${instance.port}: ` +\n (e instanceof Error ? e.message : String(e)),\n );\n }\n};\n","import { diag } from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\n\nimport { version as SDK_VERSION } from \"../../../../package.json\";\nimport { Laminar } from \"../../../laminar\";\nimport { initializeLogger } from \"../../../utils\";\nimport { SPAN_INPUT, SPAN_OUTPUT } from \"../../tracing/attributes\";\nimport {\n createProxyInstance,\n forceReleaseProxy,\n getEnvVarsToRemove,\n type ProxyInstance,\n resolveTargetUrlFromEnv,\n setTraceToProxyInstance,\n stopProxyInstance,\n} from \"./proxy\";\n\n// Re-export forceReleaseProxy for cleanup in Laminar.shutdown()\nexport { forceReleaseProxy };\n\nconst logger = initializeLogger();\n\n/**\n * Create an instrumented version of the claude-agent-sdk query function.\n * This can be used when importing the query function before Laminar initialization.\n *\n * @param originalQuery - The original query function from claude-agent-sdk\n * @returns The instrumented query function\n */\nexport function instrumentClaudeAgentQuery(\n originalQuery: any, // typeof ClaudeAgentSDK.query\n): any {\n // typeof ClaudeAgentSDK.Query\n return (params: {\n prompt: string | AsyncIterable<any>; // AsyncIterable<ClaudeAgentSDK.SDKUserMessage>\n options?: any; // ClaudeAgentSDK.Options\n }) => {\n const laminarActive =\n Laminar.initialized() || !!process.env.LMNR_PROJECT_API_KEY;\n\n if (!laminarActive) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return originalQuery(params);\n }\n\n const span = Laminar.startSpan({\n name: \"query\",\n spanType: \"DEFAULT\",\n });\n\n span.setAttribute(\n SPAN_INPUT,\n JSON.stringify({\n prompt: typeof params.prompt === \"string\" ? params.prompt : \"<stream>\",\n }),\n );\n\n const generator = async function* () {\n const collected: any[] = []; // ClaudeAgentSDK.SDKMessage[]\n let proxyInstance: ProxyInstance | null = null;\n\n try {\n // Merge environment variables: process.env + params.options.env\n // params.options.env takes precedence\n const mergedEnv = {\n ...process.env,\n ...(params.options?.env ?? {}),\n };\n\n // Resolve target URL before creating proxy\n const targetUrl = resolveTargetUrlFromEnv(mergedEnv);\n\n // Create a dedicated proxy instance for this request\n proxyInstance = await createProxyInstance({\n env: mergedEnv,\n });\n\n // Configure the request to use the proxy\n if (proxyInstance && targetUrl) {\n logger.debug(`Using proxy on port ${proxyInstance.port}`);\n\n // Set trace context for this specific proxy instance\n await Laminar.withSpan(span, async () => {\n logger.debug(\"Setting trace to proxy instance...\");\n await setTraceToProxyInstance(proxyInstance);\n });\n\n // Get environment variables that should be removed\n const varsToRemove = getEnvVarsToRemove(mergedEnv);\n\n // Update environment for subprocess\n if (!params.options) {\n params.options = {};\n }\n if (!params.options.env) {\n params.options.env = {};\n }\n\n // Start with merged env and update for proxy\n params.options.env = { ...mergedEnv };\n\n // Set proxy URL\n params.options.env.ANTHROPIC_BASE_URL = proxyInstance.baseUrl;\n\n // Store original target URL so proxy knows where to forward\n params.options.env.ANTHROPIC_ORIGINAL_BASE_URL = targetUrl;\n\n // Remove proxy-related variables that would interfere\n for (const varName of varsToRemove) {\n delete params.options.env[varName];\n }\n\n // If Foundry is enabled, update Foundry-specific env vars\n const foundryEnabled =\n params.options.env.CLAUDE_CODE_USE_FOUNDRY === \"1\";\n if (foundryEnabled) {\n params.options.env.ANTHROPIC_FOUNDRY_BASE_URL =\n proxyInstance.baseUrl;\n }\n\n // If Bedrock is enabled, update Bedrock-specific env vars\n const bedrockEnabled =\n params.options.env.CLAUDE_CODE_USE_BEDROCK === \"1\";\n if (bedrockEnabled) {\n params.options.env.ANTHROPIC_BEDROCK_BASE_URL =\n proxyInstance.baseUrl;\n }\n\n // If Vertex AI is enabled, update Vertex-specific env vars\n const vertexEnabled =\n params.options.env.CLAUDE_CODE_USE_VERTEX === \"1\";\n if (vertexEnabled) {\n params.options.env.ANTHROPIC_VERTEX_BASE_URL =\n proxyInstance.baseUrl;\n }\n } else {\n logger.debug(\n \"No claude proxy server available. Proceeding without proxy.\",\n );\n }\n\n // Call original and wrap the generator\n const originalGenerator = originalQuery(params);\n\n // Yield items and collect\n for await (const message of originalGenerator) {\n collected.push(message);\n yield message;\n }\n } catch (error) {\n Laminar.withSpan(span, () => {\n span.recordException(error as Error);\n });\n throw error;\n } finally {\n // Stop this proxy instance\n stopProxyInstance(proxyInstance);\n span.setAttribute(SPAN_OUTPUT, JSON.stringify(collected));\n span.end();\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return generator() as any; // ClaudeAgentSDK.Query\n };\n}\n\n/* eslint-disable\n @typescript-eslint/no-unsafe-function-type\n*/\nexport class ClaudeAgentSDKInstrumentation extends InstrumentationBase {\n constructor() {\n super(\"@lmnr/claude-agent-instrumentation\", SDK_VERSION, {\n enabled: true,\n });\n }\n\n protected init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(\n \"@anthropic-ai/claude-agent-sdk\",\n [\">=0.1.0\"],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return module;\n }\n\n // { query?: typeof ClaudeAgentSDK.query }\n public manuallyInstrument(claudeAgentModule: { query?: any }) {\n // Only instrument the query function if provided\n if (\n claudeAgentModule.query &&\n typeof claudeAgentModule.query === \"function\"\n ) {\n this._wrap(claudeAgentModule, \"query\", this.patchQuery());\n } else {\n logger.debug(\n \"query function not found in claudeAgentSDK module, skipping instrumentation\",\n );\n }\n }\n\n private patchQuery(): any {\n // casts to ClaudeAgentSDK.query\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return (original: Function) => instrumentClaudeAgentQuery(original as any);\n }\n\n private patch(moduleExports: any): any {\n // typeof ClaudeAgentSDK\n diag.debug(\"Patching @anthropic-ai/claude-agent-sdk\");\n\n // Wrap the query function for automatic instrumentation\n if (moduleExports.query && typeof moduleExports.query === \"function\") {\n this._wrap(moduleExports, \"query\", this.patchQuery());\n }\n\n return moduleExports;\n }\n\n private unpatch(moduleExports: any): void {\n // typeof ClaudeAgentSDK\n diag.debug(\"Unpatching @anthropic-ai/claude-agent-sdk\");\n\n // Unwrap the query function\n this._unwrap(moduleExports, \"query\");\n }\n}\n/* eslint-enable\n @typescript-eslint/no-unsafe-function-type\n*/\n","import {\n type LaminarSpanContext,\n type SessionRecordingOptions,\n type SpanType,\n type TraceType,\n TracingLevel,\n} from '@lmnr-ai/types';\nimport {\n AttributeValue,\n Context,\n context as contextApi,\n isSpanContextValid,\n type Span,\n TimeInput,\n trace,\n} from '@opentelemetry/api';\nimport { SpanProcessor } from '@opentelemetry/sdk-trace-base';\n\nimport { InitializeOptions, initializeTracing, LaminarSpanProcessor } from './opentelemetry-lib';\nimport { _resetConfiguration } from './opentelemetry-lib/configuration';\nimport {\n forceReleaseProxy as forceReleaseClaudeProxy,\n instrumentClaudeAgentQuery,\n} from './opentelemetry-lib/instrumentation/claude-agent-sdk';\nimport {\n forceFlush,\n getSpanProcessor,\n getTracer,\n patchModules,\n} from './opentelemetry-lib/tracing';\nimport {\n ASSOCIATION_PROPERTIES,\n LaminarAttributes,\n PARENT_SPAN_IDS_PATH,\n PARENT_SPAN_PATH,\n SESSION_ID,\n SPAN_TYPE,\n TRACE_TYPE,\n USER_ID,\n} from './opentelemetry-lib/tracing/attributes';\nimport { LaminarContextManager } from './opentelemetry-lib/tracing/context';\nimport { LaminarSpan } from './opentelemetry-lib/tracing/span';\nimport {\n deserializeLaminarSpanContext,\n initializeLogger,\n loadEnv,\n metadataToAttributes,\n type StringUUID,\n tryToOtelSpanContext,\n validateTracingConfig,\n} from './utils';\n\nloadEnv();\n\nconst logger = initializeLogger();\n\ninterface LaminarInitializeProps {\n projectApiKey?: string;\n baseUrl?: string;\n baseHttpUrl?: string;\n httpPort?: number;\n grpcPort?: number;\n instrumentModules?: InitializeOptions[\"instrumentModules\"];\n disableBatch?: boolean;\n traceExportTimeoutMillis?: number;\n logLevel?: \"debug\" | \"info\" | \"warn\" | \"error\";\n maxExportBatchSize?: number;\n forceHttp?: boolean;\n sessionRecordingOptions?: SessionRecordingOptions;\n metadata?: Record<string, any>;\n inheritGlobalContext?: boolean;\n spanProcessor?: SpanProcessor;\n}\n\ntype LaminarAttributesProp = Record<\n typeof LaminarAttributes[keyof typeof LaminarAttributes],\n AttributeValue\n>;\n\nexport class Laminar {\n private static baseHttpUrl: string;\n private static projectApiKey: string;\n private static isInitialized: boolean = false;\n private static globalMetadata: Record<string, any> = {};\n /**\n * Initialize Laminar context across the application.\n * This method must be called before using any other Laminar methods or decorators.\n *\n * @param {LaminarInitializeProps} props - Configuration object.\n * @param {string} props.projectApiKey - Laminar project api key. You can generate one by going\n * to the projects settings page on the Laminar dashboard.\n * If not specified, it will try to read from the LMNR_PROJECT_API_KEY environment variable.\n * @param {string} props.baseUrl - Laminar API url. Do not include the port, use\n * `httpPort` and `grpcPort` instead.\n * If not specified, defaults to https://api.lmnr.ai.\n * @param {string} props.baseHttpUrl - Laminar API http url. If not specified, defaults to\n * baseUrl. Only use this if you want to proxy HTTP requests through a different host.\n * @param {number} props.httpPort - Laminar API http port.\n * If not specified, defaults to 443.\n * @param {number} props.grpcPort - Laminar API grpc port.\n * If not specified, defaults to 8443.\n * @param {InitializeOptions[\"instrumentModules\"]} props.instrumentModules - Record\n * of modules to instrument.\n * If not specified, all auto-instrumentable modules will be instrumented, which include\n * LLM calls (OpenAI, Anthropic, etc), Langchain, VectorDB calls (Pinecone, Qdrant, etc).\n * Pass an empty object {} to disable any kind of automatic instrumentation.\n * If you only want to auto-instrument specific modules, then pass them in the object.\n * @param {boolean} props.disableBatch - Whether to disable batching of spans. Useful for debug\n * environments. If true, spans will be sent immediately using {@link SimpleSpanProcessor}\n * instead of {@link BatchSpanProcessor}.\n * @param {number} props.traceExportTimeoutMillis - Timeout for trace export.\n * Defaults to 30_000 (30 seconds),\n * which is over the default OTLP exporter timeout of 10_000 (10 seconds).\n * @param {string} props.logLevel - OTel log level. Defaults to \"error\".\n * @param {number} props.maxExportBatchSize - Maximum number of spans to export in a single batch.\n * Ignored when `disableBatch` is true.\n * @param {boolean} props.forceHttp - Whether to force HTTP export. Not recommended.\n * @param {SessionRecordingOptions} props.sessionRecordingOptions - Options for browser\n * session recording.\n * Currently supports 'maskInputOptions' to control whether input fields are masked during\n * recording. Defaults to undefined (uses default masking behavior).\n * @param {Record<string, any>} props.metadata - Global metadata to associate with all spans.\n * This metadata will be associated with all spans, and merged with any metadata passed to\n * each span. Must be JSON serializable.\n * @param {boolean} props.inheritGlobalContext - Whether to inherit the global OpenTelemetry\n * context. Defaults to false. This is useful if your library is instrumented with OpenTelemetry\n * and you want Laminar spans to be children of the existing spans.\n * @param {SpanProcessor} props.spanProcessor - The span processor to use. If passed, some of\n * the other options will be ignored.\n *\n * @example\n * import { Laminar } from '@lmnr-ai/lmnr';\n * import { OpenAI } from 'openai';\n * import * as ChainsModule from \"langchain/chains\";\n *\n * // Initialize Laminar while auto-instrumenting Langchain and OpenAI modules.\n * Laminar.initialize({\n * projectApiKey: \"<LMNR_PROJECT_API_KEY>\",\n * instrumentModules: {\n * langchain: {\n * chainsModule: ChainsModule\n * },\n * openAI: OpenAI\n * }\n * });\n *\n * @throws {Error} - If project API key is not set\n */\n public static initialize({\n projectApiKey,\n baseUrl,\n baseHttpUrl,\n httpPort,\n grpcPort,\n instrumentModules,\n disableBatch,\n traceExportTimeoutMillis,\n logLevel,\n maxExportBatchSize,\n forceHttp,\n sessionRecordingOptions,\n metadata,\n inheritGlobalContext,\n spanProcessor,\n }: LaminarInitializeProps = {}) {\n if (this.isInitialized) {\n logger.warn(\"Laminar has already been initialized. Skipping initialization.\");\n return;\n }\n const key = projectApiKey ?? process?.env?.LMNR_PROJECT_API_KEY;\n\n // Validate that either API key or OTEL configuration is present\n validateTracingConfig(key);\n\n this.projectApiKey = key ?? '';\n let url = baseUrl ?? process?.env?.LMNR_BASE_URL;\n\n // Only set default URL if we have an API key (traditional Laminar setup)\n if (key && !url) {\n url = 'https://api.lmnr.ai';\n }\n\n const httpUrl = baseHttpUrl ?? url;\n let port: number | undefined = httpPort;\n\n if (httpUrl) {\n if (!port) {\n const m = httpUrl.match(/:\\d{1,5}$/g);\n port = m\n ? parseInt(m[0].slice(1))\n : 443;\n }\n const httpUrlWithoutSlash = httpUrl.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '');\n this.baseHttpUrl = `${httpUrlWithoutSlash}:${port}`;\n } else {\n this.baseHttpUrl = '';\n }\n\n this.globalMetadata = metadata ?? {};\n LaminarContextManager.setGlobalMetadata(this.globalMetadata);\n if (inheritGlobalContext) {\n LaminarContextManager.inheritGlobalContext = true;\n }\n if (spanProcessor && !(spanProcessor instanceof LaminarSpanProcessor)) {\n logger.warn(\n \"Span processor is not a LaminarSpanProcessor. Some functionality may be impaired.\",\n );\n }\n this.isInitialized = true;\n\n const urlWithoutSlash = url?.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '');\n const httpUrlWithoutSlash = httpUrl?.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '');\n\n initializeTracing({\n baseUrl: urlWithoutSlash,\n baseHttpUrl: httpUrlWithoutSlash,\n apiKey: key,\n port: grpcPort,\n forceHttp,\n httpPort,\n silenceInitializationMessage: true,\n instrumentModules,\n logLevel: logLevel ?? \"error\",\n disableBatch,\n maxExportBatchSize,\n traceExportTimeoutMillis,\n sessionRecordingOptions,\n spanProcessor,\n });\n\n this._initializeContextFromEnv();\n }\n\n /**\n * Initialize Laminar context from the LMNR_SPAN_CONTEXT environment variable.\n * This allows continuing traces across process boundaries.\n * @private\n */\n private static _initializeContextFromEnv(): void {\n const envContext = process?.env?.LMNR_SPAN_CONTEXT;\n if (!envContext) {\n return;\n }\n\n try {\n const laminarContext = deserializeLaminarSpanContext(envContext);\n\n // Convert to OpenTelemetry span context\n const otelSpanContext = tryToOtelSpanContext(laminarContext);\n // If we've parsed the context from the environment variable, it's remote\n otelSpanContext.isRemote = true;\n\n // Set parent path info in the span processor\n const processor = getSpanProcessor();\n if (processor\n && processor instanceof LaminarSpanProcessor\n && laminarContext.spanPath\n && laminarContext.spanIdsPath\n ) {\n processor.setParentPathInfo(\n otelSpanContext.spanId,\n laminarContext.spanPath,\n laminarContext.spanIdsPath,\n );\n }\n\n // Create a non-recording span and push the context\n const baseContext = trace.setSpan(\n LaminarContextManager.getContext(),\n trace.wrapSpanContext(otelSpanContext),\n );\n const ctx = LaminarContextManager.setRawAssociationProperties(laminarContext, baseContext);\n LaminarContextManager.pushContext(ctx);\n\n logger.debug(\"Initialized Laminar parent context from LMNR_SPAN_CONTEXT.\");\n } catch (e) {\n logger.warn(\n \"LMNR_SPAN_CONTEXT is set but could not be used: \" +\n (e instanceof Error ? e.message : String(e)),\n );\n }\n }\n\n /**\n * Patch modules manually. Use this in setups where {@link Laminar.initialize()}\n * and in particular its `instrumentModules` option is not working, e.g. in\n * Next.js place Laminar initialize in `instrumentation.ts`, and then patch\n * the modules in server components or API routes.\n *\n * Make sure to call this after {@link Laminar.initialize()}.\n *\n * @param {InitializeOptions[\"instrumentModules\"]} modules - Record of modules to instrument.\n */\n public static patch(modules: InitializeOptions[\"instrumentModules\"]) {\n if (!this.isInitialized) {\n logger.warn(\"Laminar must be initialized before patching modules. Skipping patch.\");\n return;\n }\n if (!modules || Object.keys(modules).length === 0) {\n throw new Error(\"Pass at least one module to patch\");\n }\n patchModules(modules);\n }\n\n /**\n * Check if Laminar has been initialized. Utility to make sure other methods\n * are called after initialization.\n */\n public static initialized(): boolean {\n return this.isInitialized;\n }\n\n /**\n * Associates an event with the current span. If the event is created outside\n * of a span context, a new span is created and the event is associated with it.\n *\n * @param {object} options\n * @param {string} options.name - The name of the event.\n * @param {Record<string, AttributeValue>} options.attributes - The attributes of the event.\n * Values must be of a supported type.\n * @param {TimeInput} options.timestamp - The timestamp of the event. If not specified, relies on\n * the underlying OpenTelemetry implementation.\n * If specified as an integer, it must be epoch nanoseconds.\n * @param {string} options.sessionId - The session ID to associate with the event.\n * If not specified, the session ID of the current trace is used.\n * @param {string} options.userId - The user ID to associate with the event. If not specified,\n * the user ID of the current trace is used.\n */\n public static event({\n name,\n attributes,\n timestamp,\n sessionId,\n userId,\n }: {\n name: string,\n attributes?: Record<string, AttributeValue>,\n timestamp?: TimeInput,\n sessionId?: string,\n userId?: string,\n }) {\n if (!Laminar.initialized()) {\n return;\n }\n\n const allAttributes = {\n ...(attributes ?? {}),\n ...(sessionId ? { \"lmnr.event.session_id\": sessionId } : {}),\n ...(userId ? { \"lmnr.event.user_id\": userId } : {}),\n } as Record<string, AttributeValue>;\n\n const currentSpan = Laminar.getCurrentSpan();\n\n if (currentSpan === undefined) {\n const newSpan = Laminar.startSpan({ name });\n newSpan?.addEvent(name, allAttributes, timestamp);\n newSpan?.end();\n return;\n }\n\n currentSpan.addEvent(name, allAttributes, timestamp);\n }\n\n public static getCurrentSpan(\n context?: Context,\n ): LaminarSpan | undefined {\n const currentSpan = trace.getSpan(context ?? LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n if (currentSpan === undefined || !isSpanContextValid(currentSpan.spanContext())) {\n return undefined;\n }\n if (currentSpan instanceof LaminarSpan) {\n return currentSpan;\n }\n return new LaminarSpan(currentSpan);\n }\n\n /**\n * Set attributes for the current span. Useful for manual\n * instrumentation.\n * @param {LaminarAttributesProp} attributes - The attributes to set for the current span.\n *\n * @example\n * import { Laminar as L, observe } from '@lmnr-ai/laminar';\n * await observe({ name: 'mySpanName', spanType: 'LLM' }, async (msg: string) => {\n * const response = await myCustomCallToOpenAI(msg);\n * L.setSpanAttributes({\n * [LaminarAttributes.PROVIDER]: 'openai',\n * [LaminarAttributes.REQUEST_MODEL]: \"requested_model\",\n * [LaminarAttributes.RESPONSE_MODEL]: response.model,\n * [LaminarAttributes.INPUT_TOKEN_COUNT]: response.usage.prompt_tokens,\n * [LaminarAttributes.OUTPUT_TOKEN_COUNT]: response.usage.completion_tokens,\n * })\n * }, userMessage);\n */\n public static setSpanAttributes(\n attributes: LaminarAttributesProp,\n ) {\n const currentSpan = Laminar.getCurrentSpan();\n if (currentSpan) {\n for (const [key, value] of Object.entries(attributes)) {\n currentSpan.setAttribute(key, value);\n }\n }\n }\n\n /**\n * Set the output of the current span. Useful for manual instrumentation.\n * @param output - Output of the span. Will be sent as an attribute, so must\n * be serializable to JSON.\n */\n public static setSpanOutput(output: any) {\n if (output == null) {\n return;\n }\n const currentSpan = Laminar.getCurrentSpan();\n if (currentSpan) {\n (currentSpan).setOutput(output);\n }\n }\n\n public static setTraceMetadata(metadata: Record<string, any>) {\n const currentSpan = Laminar.getCurrentSpan();\n if (currentSpan) {\n (currentSpan).setTraceMetadata(metadata);\n }\n }\n\n public static setTraceSessionId(sessionId: string) {\n const currentSpan = Laminar.getCurrentSpan();\n if (currentSpan) {\n (currentSpan).setTraceSessionId(sessionId);\n }\n }\n\n public static setTraceUserId(userId: string) {\n const currentSpan = Laminar.getCurrentSpan();\n if (currentSpan) {\n (currentSpan).setTraceUserId(userId);\n }\n }\n\n public static setSpanTags(tags: string[]) {\n const currentSpan = Laminar.getCurrentSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n (currentSpan).setTags(tags);\n }\n }\n\n public static addSpanTags(tags: string[]) {\n const currentSpan = Laminar.getCurrentSpan();\n if (currentSpan !== undefined && isSpanContextValid(currentSpan.spanContext())) {\n (currentSpan).addTags(tags);\n }\n }\n\n /**\n * Start a new span, but don't set it as active. Useful for\n * manual instrumentation. If span type is 'LLM', you should report usage\n * manually. See {@link setSpanAttributes} for more information.\n *\n * @param {Object} options\n * @param {string} options.name - name of the span\n * @param {any} options.input - input to the span. Will be sent as an attribute, so must\n * be JSON serializable\n * @param {string} options.spanType - type of the span. Defaults to 'DEFAULT'\n * @param {Context} options.context - raw OpenTelemetry context to bind the span to.\n * @param {string | LaminarSpanContext} options.parentSpanContext - parent span context\n * to bind the span to.\n * @param {string[]} options.tags - tags to associate with the span.\n * @param {string} options.userId - user ID to associate with the span.\n * @param {string} options.sessionId - session ID to associate with the span.\n * @param {Record<string, any>} options.metadata - metadata to associate with the span.\n * @returns The started span.\n *\n * @example\n * import { Laminar, observe } from '@lmnr-ai/lmnr';\n * const foo = async (span: Span) => {\n * await Laminar.withSpan(span, async () => {\n * await observe({ name: 'foo' }, async () => {\n * // Your code here\n * })\n * })\n * };\n * const bar = async (span: Span) => {\n * await Laminar.withSpan(span, async () => {\n * await openai_client.chat.completions.create();\n * })\n * };\n *\n * const parentSpan = Laminar.startSpan({name: \"outer\"});\n * foo(parentSpan);\n * await bar(parentSpan);\n * // IMPORTANT: Don't forget to end the span!\n * parentSpan.end();\n *\n * // Results in:\n * // | outer\n * // | | foo\n * // | | | ...\n * // | | openai.chat\n */\n public static startSpan({\n name,\n input,\n spanType,\n context,\n parentSpanContext,\n tags,\n userId,\n sessionId,\n metadata,\n startTime,\n }: {\n name: string,\n input?: any,\n spanType?: SpanType,\n context?: Context,\n parentSpanContext?: string | LaminarSpanContext,\n tags?: string[],\n userId?: string,\n sessionId?: string,\n metadata?: Record<string, any>,\n startTime?: TimeInput,\n }): Span {\n return this._startSpan({\n name,\n input,\n spanType,\n context,\n parentSpanContext,\n tags,\n userId,\n sessionId,\n metadata,\n activated: false,\n startTime,\n });\n }\n\n /**\n * Start a new span, and set it as active. It is the caller's responsibility\n * to end the span. It is important to end the span, to avoid context mixing up.\n * We suggest ending the span in a finally block.\n * This is useful for manual instrumentation.\n * If span type is 'LLM', you should report usage manually.\n * See {@link setSpanAttributes} for more information.\n *\n * @param {Object} options\n * @param {string} options.name - name of the span\n * @param {any} options.input - input to the span. Will be sent as an attribute, so must\n * be JSON serializable\n * @param {string} options.spanType - type of the span. Defaults to 'DEFAULT'\n * @param {Context} options.context - raw OpenTelemetry context to bind the span to.\n * @param {string | LaminarSpanContext} options.parentSpanContext - parent span context\n * to bind the span to.\n * @param {string[]} options.tags - tags to associate with the span.\n * @param {string} options.userId - user ID to associate with the span.\n * @param {string} options.sessionId - session ID to associate with the span.\n * @param {Record<string, any>} options.metadata - metadata to associate with the span.\n * @param {boolean} options.global - when true, the span is registered on a\n * process-global context stack so that any subsequent `startSpan` /\n * `startActiveSpan` call (including from unrelated async tasks) uses it as\n * the parent. Use this for spans that span multiple disconnected async\n * callbacks — e.g. the root span of an OpenAI Agents trace, where child\n * spans are created from independent `TracingProcessor` callbacks that do\n * not share an async context. Defaults to false; the span still activates\n * within the current async context as usual.\n * @returns The started span.\n *\n * @example\n * import { Laminar, observe } from '@lmnr-ai/lmnr';\n * const foo = async () => {\n * await observe({ name: 'foo' }, async () => {\n * // Your code here\n * })\n * };\n * const bar = async (span: Span) => {\n * await observe({ name: 'bar' }, async () => {\n * await openai_client.chat.completions.create();\n * })\n * };\n *\n * try {\n * const parentSpan = Laminar.startActiveSpan({name: \"outer\"});\n * foo();\n * await bar();\n * } finally {\n * parentSpan.end();\n * }\n *\n * // Results in:\n * // | outer\n * // | | foo\n * // | | | ...\n * // | | bar\n * // | | | openai.chat\n */\n public static startActiveSpan({\n name,\n input,\n spanType,\n context,\n parentSpanContext,\n tags,\n userId,\n sessionId,\n metadata,\n startTime,\n global,\n }: {\n name: string,\n input?: any,\n spanType?: SpanType,\n context?: Context,\n parentSpanContext?: string | LaminarSpanContext,\n tags?: string[],\n userId?: string,\n sessionId?: string,\n metadata?: Record<string, any>,\n startTime?: TimeInput,\n global?: boolean,\n }): Span {\n return this._startSpan({\n name,\n input,\n spanType,\n context,\n parentSpanContext,\n tags,\n userId,\n sessionId,\n metadata,\n activated: true,\n startTime,\n global,\n });\n }\n\n private static _startSpan({\n name,\n input,\n spanType,\n context,\n parentSpanContext,\n tags,\n userId,\n sessionId,\n metadata,\n activated,\n startTime,\n global,\n }: {\n name: string,\n input?: any,\n spanType?: SpanType,\n context?: Context,\n parentSpanContext?: string | LaminarSpanContext,\n tags?: string[],\n userId?: string,\n sessionId?: string,\n metadata?: Record<string, any>,\n activated?: boolean,\n startTime?: TimeInput,\n global?: boolean,\n }): Span {\n let entityContext = context ?? LaminarContextManager.getContext();\n\n // Extract parent path information before converting to OpenTelemetry span context\n let parentPath: string[] | undefined;\n let parentIdsPath: string[] | undefined;\n let parentMetadata: Record<string, any> | undefined;\n let parentTraceType: TraceType | undefined;\n let parentTracingLevel: TracingLevel | undefined;\n let parentUserId: string | undefined;\n let parentSessionId: string | undefined;\n\n if (parentSpanContext) {\n try {\n const laminarContext = typeof parentSpanContext === 'string'\n ? deserializeLaminarSpanContext(parentSpanContext)\n : parentSpanContext;\n\n parentPath = laminarContext.spanPath;\n parentIdsPath = laminarContext.spanIdsPath;\n parentMetadata = laminarContext.metadata;\n parentTraceType = laminarContext.traceType;\n parentTracingLevel = laminarContext.tracingLevel;\n parentUserId = laminarContext.userId;\n parentSessionId = laminarContext.sessionId;\n\n const spanContext = tryToOtelSpanContext(laminarContext);\n entityContext = trace.setSpan(entityContext, trace.wrapSpanContext(spanContext));\n } catch (e) {\n logger.warn(\"Failed to parse parent span context: \" +\n (e instanceof Error ? e.message : String(e)),\n );\n }\n }\n const tagProperties = tags\n ? { [`${ASSOCIATION_PROPERTIES}.tags`]: Array.from(new Set(tags)) }\n : {};\n const ctxAssociationProperties = LaminarContextManager.getAssociationProperties();\n const userIdValue = userId\n ?? parentUserId\n ?? ctxAssociationProperties.userId;\n const sessionIdValue = sessionId\n ?? parentSessionId\n ?? ctxAssociationProperties.sessionId;\n const traceTypeValue = parentTraceType\n ?? ((spanType as string) === 'EVALUATION' ? 'EVALUATION' : undefined)\n ?? ctxAssociationProperties.traceType;\n const tracingLevelValue = parentTracingLevel\n ?? ctxAssociationProperties.tracingLevel;\n const ctxMetadata = ctxAssociationProperties.metadata;\n\n const userIdProperties = userIdValue ? { [USER_ID]: userIdValue } : {};\n const sessionIdProperties = sessionIdValue ? { [SESSION_ID]: sessionIdValue } : {};\n const traceTypeProperties = traceTypeValue ? { [TRACE_TYPE]: traceTypeValue } : {};\n const tracingLevelProperties = tracingLevelValue\n ? { [`${ASSOCIATION_PROPERTIES}.tracing_level`]: tracingLevelValue }\n : {};\n\n const mergedMetadata = {\n ...this.globalMetadata,\n ...ctxMetadata,\n ...parentMetadata,\n ...metadata,\n };\n\n const metadataProperties = metadataToAttributes(mergedMetadata);\n const attributes = {\n [SPAN_TYPE]: spanType ?? 'DEFAULT',\n ...tagProperties,\n ...userIdProperties,\n ...sessionIdProperties,\n ...metadataProperties,\n ...traceTypeProperties,\n ...tracingLevelProperties,\n ...(parentPath ? { [PARENT_SPAN_PATH]: parentPath } : {}),\n ...(parentIdsPath ? { [PARENT_SPAN_IDS_PATH]: parentIdsPath } : {}),\n };\n\n const span = new LaminarSpan(\n getTracer().startSpan(name, { attributes, startTime }, entityContext),\n );\n span.activated = activated ?? false;\n\n if (input) {\n span.setInput(input);\n }\n if (activated) {\n entityContext = LaminarContextManager.setAssociationProperties(\n span,\n entityContext,\n );\n entityContext = trace.setSpan(entityContext, span);\n LaminarContextManager.pushContext(entityContext);\n if (global) {\n LaminarContextManager.pushGlobalContext(entityContext);\n span.setGlobalActiveContext(entityContext);\n }\n }\n return span;\n }\n\n /**\n * A utility wrapper around OpenTelemetry's `context.with()`. Useful for\n * passing spans around in manual instrumentation:\n *\n * @param {Span} span - Parent span to bind the execution to.\n * @param {Function} fn - Function to execute within the span context.\n * @param {boolean} endOnExit - Whether to end the span after the function has\n * executed. Defaults to `false`. If `false`, you MUST manually call\n * `span.end()` at the end of the execution, so that spans are not lost.\n * @returns The result of the function execution.\n *\n * See {@link startSpan} docs for a usage example\n */\n public static withSpan<T>(span: Span, fn: () => T, endOnExit?: boolean): T {\n const ctx = LaminarContextManager.getContext();\n const laminarSpan = new LaminarSpan(span);\n const ctxWithAssociationProperties = LaminarContextManager.setAssociationProperties(\n laminarSpan,\n ctx,\n );\n const context = trace.setSpan(ctxWithAssociationProperties, span);\n return contextApi.with(context, () => LaminarContextManager.runWithIsolatedContext(\n [context],\n () => {\n try {\n const result = fn();\n if (result instanceof Promise) {\n return result.catch((err) => {\n span.recordException(err as Error);\n throw err;\n }).finally(() => {\n if (endOnExit !== undefined && endOnExit) {\n span.end();\n }\n }) as T;\n }\n if (endOnExit !== undefined && endOnExit) {\n span.end();\n }\n return result;\n }\n catch (error) {\n span.recordException(error as Error);\n if (endOnExit !== undefined && endOnExit) {\n span.end();\n }\n throw error;\n }\n },\n ));\n }\n\n public static serializeLaminarSpanContext(span?: Span): string | null {\n const laminarSpanContext = this.getLaminarSpanContext(span);\n if (laminarSpanContext === null) {\n return null;\n }\n return JSON.stringify(laminarSpanContext);\n };\n\n public static getLaminarSpanContext(span?: Span): LaminarSpanContext | null {\n let currentSpan = span ?? Laminar.getCurrentSpan();\n if (currentSpan === undefined || !isSpanContextValid(currentSpan.spanContext())) {\n return null;\n }\n if (!(currentSpan instanceof LaminarSpan)) {\n currentSpan = new LaminarSpan(currentSpan);\n }\n return (currentSpan as LaminarSpan).getLaminarSpanContext();\n }\n\n /**\n * Get the trace id of the current span. Returns null if there is no active span.\n * @returns {StringUUID | null} The trace id of the current span.\n */\n public static getTraceId(): StringUUID | null {\n return this.getLaminarSpanContext()?.traceId ?? null;\n }\n\n public static async flush() {\n if (this.isInitialized) {\n logger.debug(\"Flushing spans\");\n await forceFlush();\n }\n }\n\n public static async shutdown() {\n if (this.isInitialized) {\n logger.debug(\"Shutting down Laminar\");\n await forceFlush();\n // Unlike Python where asynchronous nature of `BatchSpanProcessor.forceFlush()`\n // forces us to actually use `SpanProcessor.shutdown()` and make any\n // further interactions with OTEL API impossible, here we call\n // SpanProcessor.forceFlush() (and safely await it). Thus, users can\n // call `shutdown()` and then `initialize()` again. This is why we\n // reset the keys, contexts, and configuration here.\n this.isInitialized = false;\n _resetConfiguration();\n LaminarContextManager.clearContexts();\n LaminarContextManager.clearActiveSpans();\n\n // Force release the claude-code proxy if it was started (ignores ref count)\n forceReleaseClaudeProxy();\n }\n }\n\n public static getHttpUrl(): string {\n return this.baseHttpUrl;\n }\n\n public static getProjectApiKey(): string {\n return this.projectApiKey;\n }\n\n /**\n * Instrument the claude-agent-sdk query function.\n * Use this when you need to import the query function before calling Laminar.initialize().\n *\n * @param originalQuery - The original query function from @anthropic-ai/claude-agent-sdk\n * @returns The instrumented query function\n *\n * @example\n * ```typescript\n * import { query as originalQuery } from \"@anthropic-ai/claude-agent-sdk\";\n * import { Laminar } from \"@lmnr-ai/lmnr\";\n *\n * Laminar.initialize({ projectApiKey: \"...\" });\n *\n * const query = Laminar.instrumentClaudeAgentQuery(originalQuery);\n *\n * // Now use the instrumented query function\n * const result = query({ prompt: \"Hello!\" });\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n public static wrapClaudeAgentQuery<T extends Function>(originalQuery: T): T {\n return instrumentClaudeAgentQuery(originalQuery as any) as unknown as T;\n }\n}\n","// If you want to update the content, make the following changes to minified source\n// 0. Make sure your editor is not formatting the file on save.\n// 1. Replace every \\ with \\\\ (important: this must come first)\n// 2. Replace every ` with a \\`\n// 3. Replace every ${ with a \\${\nexport const RECORDER = `(function (g, f) {\n if (\"object\" == typeof exports && \"object\" == typeof module) {\n module.exports = f();\n } else if (\"function\" == typeof define && define.amd) {\n define(\"lmnrRrweb\", [], f);\n } else if (\"object\" == typeof exports) {\n exports[\"lmnrRrweb\"] = f();\n } else {\n g[\"lmnrRrweb\"] = f();\n }\n }(this, () => {\nvar exports = {};\nvar module = { exports };\n\"use strict\";var Fo=Object.defineProperty,Uo=Object.defineProperties;var Bo=Object.getOwnPropertyDescriptors;var ft=Object.getOwnPropertySymbols;var zs=Object.prototype.hasOwnProperty,Ws=Object.prototype.propertyIsEnumerable;var Bs=(s,e,t)=>e in s?Fo(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t,x=(s,e)=>{for(var t in e||(e={}))zs.call(e,t)&&Bs(s,t,e[t]);if(ft)for(var t of ft(e))Ws.call(e,t)&&Bs(s,t,e[t]);return s},ee=(s,e)=>Uo(s,Bo(e));var xe=(s,e)=>{var t={};for(var r in s)zs.call(s,r)&&e.indexOf(r)<0&&(t[r]=s[r]);if(s!=null&&ft)for(var r of ft(s))e.indexOf(r)<0&&Ws.call(s,r)&&(t[r]=s[r]);return t};Object.defineProperty(exports,Symbol.toStringTag,{value:\"Module\"});var zo=Object.defineProperty,Wo=(s,e,t)=>e in s?zo(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t,w=(s,e,t)=>Wo(s,typeof e!=\"symbol\"?e+\"\":e,t),Gs,Go=Object.defineProperty,Vo=(s,e,t)=>e in s?Go(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t,Vs=(s,e,t)=>Vo(s,typeof e!=\"symbol\"?e+\"\":e,t),j=(s=>(s[s.Document=0]=\"Document\",s[s.DocumentType=1]=\"DocumentType\",s[s.Element=2]=\"Element\",s[s.Text=3]=\"Text\",s[s.CDATA=4]=\"CDATA\",s[s.Comment=5]=\"Comment\",s))(j||{});const js={Node:[\"childNodes\",\"parentNode\",\"parentElement\",\"textContent\"],ShadowRoot:[\"host\",\"styleSheets\"],Element:[\"shadowRoot\",\"querySelector\",\"querySelectorAll\"],MutationObserver:[]},Hs={Node:[\"contains\",\"getRootNode\"],ShadowRoot:[\"getSelection\"],Element:[],MutationObserver:[\"constructor\"]},pt={},jo=()=>!!globalThis.Zone;function cs(s){if(pt[s])return pt[s];const e=globalThis[s],t=e.prototype,r=s in js?js[s]:void 0,i=!!(r&&r.every(l=>{var a,u;return!!((u=(a=Object.getOwnPropertyDescriptor(t,l))==null?void 0:a.get)!=null&&u.toString().includes(\"[native code]\"))})),n=s in Hs?Hs[s]:void 0,o=!!(n&&n.every(l=>{var a;return typeof t[l]==\"function\"&&((a=t[l])==null?void 0:a.toString().includes(\"[native code]\"))}));if(i&&o&&!jo())return pt[s]=e.prototype,e.prototype;try{const l=document.createElement(\"iframe\");document.body.appendChild(l);const a=l.contentWindow;if(!a)return e.prototype;const u=a[s].prototype;return document.body.removeChild(l),u?pt[s]=u:t}catch(l){return t}}const mr={};function me(s,e,t){var r;const i=\\`\\${s}.\\${String(t)}\\`;if(mr[i])return mr[i].call(e);const n=cs(s),o=(r=Object.getOwnPropertyDescriptor(n,t))==null?void 0:r.get;return o?(mr[i]=o,o.call(e)):e[t]}const gr={};function Wi(s,e,t){const r=\\`\\${s}.\\${String(t)}\\`;if(gr[r])return gr[r].bind(e);const n=cs(s)[t];return typeof n!=\"function\"?e[t]:(gr[r]=n,n.bind(e))}function Ho(s){return me(\"Node\",s,\"childNodes\")}function Yo(s){return me(\"Node\",s,\"parentNode\")}function Zo(s){return me(\"Node\",s,\"parentElement\")}function Jo(s){return me(\"Node\",s,\"textContent\")}function Xo(s,e){return Wi(\"Node\",s,\"contains\")(e)}function Ko(s){return Wi(\"Node\",s,\"getRootNode\")()}function Qo(s){return!s||!(\"host\"in s)?null:me(\"ShadowRoot\",s,\"host\")}function qo(s){return s.styleSheets}function ea(s){return!s||!(\"shadowRoot\"in s)?null:me(\"Element\",s,\"shadowRoot\")}function ta(s,e){return me(\"Element\",s,\"querySelector\")(e)}function ra(s,e){return me(\"Element\",s,\"querySelectorAll\")(e)}function sa(){return cs(\"MutationObserver\").constructor}const Z={childNodes:Ho,parentNode:Yo,parentElement:Zo,textContent:Jo,contains:Xo,getRootNode:Ko,host:Qo,styleSheets:qo,shadowRoot:ea,querySelector:ta,querySelectorAll:ra,mutationObserver:sa};function Gi(s){return s.nodeType===s.ELEMENT_NODE}function je(s){const e=s&&\"host\"in s&&\"mode\"in s&&Z.host(s)||null;return!!(e&&\"shadowRoot\"in e&&Z.shadowRoot(e)===s)}function He(s){return Object.prototype.toString.call(s)===\"[object ShadowRoot]\"}function ia(s){return s.includes(\" background-clip: text;\")&&!s.includes(\" -webkit-background-clip: text;\")&&(s=s.replace(/\\\\sbackground-clip:\\\\s*text;/g,\" -webkit-background-clip: text; background-clip: text;\")),s}function na(s){const{cssText:e}=s;if(e.split('\"').length<3)return e;const t=[\"@import\",\\`url(\\${JSON.stringify(s.href)})\\`];return s.layerName===\"\"?t.push(\"layer\"):s.layerName&&t.push(\\`layer(\\${s.layerName})\\`),s.supportsText&&t.push(\\`supports(\\${s.supportsText})\\`),s.media.length&&t.push(s.media.mediaText),t.join(\" \")+\";\"}function $r(s){try{const e=s.rules||s.cssRules;if(!e)return null;let t=s.href;!t&&s.ownerNode&&s.ownerNode.ownerDocument&&(t=s.ownerNode.ownerDocument.location.href);const r=Array.from(e,i=>Vi(i,t)).join(\"\");return ia(r)}catch(e){return null}}function Vi(s,e){if(aa(s)){let t;try{t=$r(s.styleSheet)||na(s)}catch(r){t=s.cssText}return s.styleSheet.href?Wt(t,s.styleSheet.href):t}else{let t=s.cssText;return la(s)&&s.selectorText.includes(\":\")&&(t=oa(t)),e?Wt(t,e):t}}function oa(s){const e=/(\\\\[(?:[\\\\w-]+)[^\\\\\\\\])(:(?:[\\\\w-]+)\\\\])/gm;return s.replace(e,\"$1\\\\\\\\$2\")}function aa(s){return\"styleSheet\"in s}function la(s){return\"selectorText\"in s}class ji{constructor(){Vs(this,\"idNodeMap\",new Map),Vs(this,\"nodeMetaMap\",new WeakMap)}getId(e){var t;if(!e)return-1;const r=(t=this.getMeta(e))==null?void 0:t.id;return r!=null?r:-1}getNode(e){return this.idNodeMap.get(e)||null}getIds(){return Array.from(this.idNodeMap.keys())}getMeta(e){return this.nodeMetaMap.get(e)||null}removeNodeFromMap(e){const t=this.getId(e);this.idNodeMap.delete(t),e.childNodes&&e.childNodes.forEach(r=>this.removeNodeFromMap(r))}has(e){return this.idNodeMap.has(e)}hasNode(e){return this.nodeMetaMap.has(e)}add(e,t){const r=t.id;this.idNodeMap.set(r,e),this.nodeMetaMap.set(e,t)}replace(e,t){const r=this.getNode(e);if(r){const i=this.nodeMetaMap.get(r);i&&this.nodeMetaMap.set(t,i)}this.idNodeMap.set(e,t)}reset(){this.idNodeMap=new Map,this.nodeMetaMap=new WeakMap}}function ua(){return new ji}function hs({element:s,maskInputOptions:e,tagName:t,type:r,value:i,maskInputFn:n}){let o=i||\"\";const l=r&&Ce(r);return(e[t.toLowerCase()]||l&&e[l])&&(n?o=n(o,s):o=\"*\".repeat(o.length)),o}function Ce(s){return s.toLowerCase()}const Ys=\"__rrweb_original__\";function ca(s){const e=s.getContext(\"2d\");if(!e)return!0;const t=50;for(let r=0;r<s.width;r+=t)for(let i=0;i<s.height;i+=t){const n=e.getImageData,o=Ys in n?n[Ys]:n;if(new Uint32Array(o.call(e,r,i,Math.min(t,s.width-r),Math.min(t,s.height-i)).data.buffer).some(a=>a!==0))return!1}return!0}function fs(s){const e=s.type;return s.hasAttribute(\"data-rr-is-password\")?\"password\":e?Ce(e):null}function Hi(s,e){var n;let t;try{t=new URL(s,e!=null?e:window.location.href)}catch(o){return null}const r=/\\\\.([0-9a-z]+)(?:$)/i,i=t.pathname.match(r);return(n=i==null?void 0:i[1])!=null?n:null}function ha(s){let e=\"\";return s.indexOf(\"//\")>-1?e=s.split(\"/\").slice(0,3).join(\"/\"):e=s.split(\"/\")[0],e=e.split(\"?\")[0],e}const fa=/url\\\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\\\)/gm,pa=/^(?:[a-z+]+:)?\\\\/\\\\//i,da=/^www\\\\..*/i,ma=/^(data:)([^,]*),(.*)/i;function Wt(s,e){return(s||\"\").replace(fa,(t,r,i,n,o,l)=>{const a=i||o||l,u=r||n||\"\";if(!a)return t;if(pa.test(a)||da.test(a))return\\`url(\\${u}\\${a}\\${u})\\`;if(ma.test(a))return\\`url(\\${u}\\${a}\\${u})\\`;if(a[0]===\"/\")return\\`url(\\${u}\\${ha(e)+a}\\${u})\\`;const c=e.split(\"/\"),h=a.split(\"/\");c.pop();for(const d of h)d!==\".\"&&(d===\"..\"?c.pop():c.push(d));return\\`url(\\${u}\\${c.join(\"/\")}\\${u})\\`})}function yr(s){return s.replace(/(\\\\/\\\\*[^*]*\\\\*\\\\/)|[\\\\s;]/g,\"\")}function ga(s,e){const t=Array.from(e.childNodes),r=[];if(t.length>1&&s&&typeof s==\"string\"){const i=yr(s);for(let n=1;n<t.length;n++)if(t[n].textContent&&typeof t[n].textContent==\"string\"){const o=yr(t[n].textContent);for(let l=3;l<o.length;l++){const a=o.substring(0,l);if(i.split(a).length===2){const u=i.indexOf(a);for(let c=u;c<s.length;c++)if(yr(s.substring(0,c)).length===u){r.push(s.substring(0,c)),s=s.substring(c);break}break}}}}return r.push(s),r}function ya(s,e){return ga(s,e).join(\"/* rr_split */\")}let wa=1;const Sa=new RegExp(\"[^a-z0-9-_:]\"),Ze=-2;function Yi(){return wa++}function ba(s){if(s instanceof HTMLFormElement)return\"form\";const e=Ce(s.tagName);return Sa.test(e)?\"div\":e}let Oe,Zs;const Ca=/^[^ \\\\t\\\\n\\\\r\\\\u000c]+/,va=/^[, \\\\t\\\\n\\\\r\\\\u000c]+/;function Ia(s,e){if(e.trim()===\"\")return e;let t=0;function r(n){let o;const l=n.exec(e.substring(t));return l?(o=l[0],t+=o.length,o):\"\"}const i=[];for(;r(va),!(t>=e.length);){let n=r(Ca);if(n.slice(-1)===\",\")n=Me(s,n.substring(0,n.length-1)),i.push(n);else{let o=\"\";n=Me(s,n);let l=!1;for(;;){const a=e.charAt(t);if(a===\"\"){i.push((n+o).trim());break}else if(l)a===\")\"&&(l=!1);else if(a===\",\"){t+=1,i.push((n+o).trim());break}else a===\"(\"&&(l=!0);o+=a,t+=1}}}return i.join(\", \")}const Js=new WeakMap;function Me(s,e){return!e||e.trim()===\"\"?e:ps(s,e)}function xa(s){return!!(s.tagName===\"svg\"||s.ownerSVGElement)}function ps(s,e){let t=Js.get(s);if(t||(t=s.createElement(\"a\"),Js.set(s,t)),!e)e=\"\";else if(e.startsWith(\"blob:\")||e.startsWith(\"data:\"))return e;return t.setAttribute(\"href\",e),t.href}function Zi(s,e,t,r){return r&&(t===\"src\"||t===\"href\"&&!(e===\"use\"&&r[0]===\"#\")||t===\"xlink:href\"&&r[0]!==\"#\"||t===\"background\"&&(e===\"table\"||e===\"td\"||e===\"th\")?Me(s,r):t===\"srcset\"?Ia(s,r):t===\"style\"?Wt(r,ps(s)):e===\"object\"&&t===\"data\"?Me(s,r):r)}function Ji(s,e,t){return(s===\"video\"||s===\"audio\")&&e===\"autoplay\"}function Oa(s,e,t){try{if(typeof e==\"string\"){if(s.classList.contains(e))return!0}else for(let r=s.classList.length;r--;){const i=s.classList[r];if(e.test(i))return!0}if(t)return s.matches(t)}catch(r){}return!1}function Gt(s,e,t){if(!s)return!1;if(s.nodeType!==s.ELEMENT_NODE)return t?Gt(Z.parentNode(s),e,t):!1;for(let r=s.classList.length;r--;){const i=s.classList[r];if(e.test(i))return!0}return t?Gt(Z.parentNode(s),e,t):!1}function Xi(s,e,t,r){let i;if(Gi(s)){if(i=s,!Z.childNodes(i).length)return!1}else{if(Z.parentElement(s)===null)return!1;i=Z.parentElement(s)}try{if(typeof e==\"string\"){if(r){if(i.closest(\\`.\\${e}\\`))return!0}else if(i.classList.contains(e))return!0}else if(Gt(i,e,r))return!0;if(t){if(r){if(i.closest(t))return!0}else if(i.matches(t))return!0}}catch(n){}return!1}function Ra(s,e,t){const r=s.contentWindow;if(!r)return;let i=!1,n;try{n=r.document.readyState}catch(l){return}if(n!==\"complete\"){const l=setTimeout(()=>{i||(e(),i=!0)},t);s.addEventListener(\"load\",()=>{clearTimeout(l),i=!0,e()});return}const o=\"about:blank\";if(r.location.href!==o||s.src===o||s.src===\"\")return setTimeout(e,0),s.addEventListener(\"load\",e);s.addEventListener(\"load\",e)}function Aa(s,e,t){let r=!1,i;try{i=s.sheet}catch(o){return}if(i)return;const n=setTimeout(()=>{r||(e(),r=!0)},t);s.addEventListener(\"load\",()=>{clearTimeout(n),r=!0,e()})}function Ma(s,e){const{doc:t,mirror:r,blockClass:i,blockSelector:n,needsMask:o,inlineStylesheet:l,maskInputOptions:a={},maskTextFn:u,maskInputFn:c,dataURLOptions:h={},inlineImages:d,recordCanvas:m,keepIframeSrcFn:g,newlyAddedElement:p=!1,cssCaptured:f=!1}=e,S=Ea(t,r);switch(s.nodeType){case s.DOCUMENT_NODE:return s.compatMode!==\"CSS1Compat\"?{type:j.Document,childNodes:[],compatMode:s.compatMode}:{type:j.Document,childNodes:[]};case s.DOCUMENT_TYPE_NODE:return{type:j.DocumentType,name:s.name,publicId:s.publicId,systemId:s.systemId,rootId:S};case s.ELEMENT_NODE:return Na(s,{doc:t,blockClass:i,blockSelector:n,inlineStylesheet:l,maskInputOptions:a,maskInputFn:c,dataURLOptions:h,inlineImages:d,recordCanvas:m,keepIframeSrcFn:g,newlyAddedElement:p,rootId:S});case s.TEXT_NODE:return $a(s,{doc:t,needsMask:o,maskTextFn:u,rootId:S,cssCaptured:f});case s.CDATA_SECTION_NODE:return{type:j.CDATA,textContent:\"\",rootId:S};case s.COMMENT_NODE:return{type:j.Comment,textContent:Z.textContent(s)||\"\",rootId:S};default:return!1}}function Ea(s,e){if(!e.hasNode(s))return;const t=e.getId(s);return t===1?void 0:t}function $a(s,e){const{needsMask:t,maskTextFn:r,rootId:i,cssCaptured:n}=e,o=Z.parentNode(s),l=o&&o.tagName;let a=\"\";const u=l===\"STYLE\"?!0:void 0,c=l===\"SCRIPT\"?!0:void 0;return c?a=\"SCRIPT_PLACEHOLDER\":n||(a=Z.textContent(s),u&&a&&(a=Wt(a,ps(e.doc)))),!u&&!c&&a&&t&&(a=r?r(a,Z.parentElement(s)):a.replace(/[\\\\S]/g,\"*\")),{type:j.Text,textContent:a||\"\",rootId:i}}function Na(s,e){const{doc:t,blockClass:r,blockSelector:i,inlineStylesheet:n,maskInputOptions:o={},maskInputFn:l,dataURLOptions:a={},inlineImages:u,recordCanvas:c,keepIframeSrcFn:h,newlyAddedElement:d=!1,rootId:m}=e,g=Oa(s,r,i),p=ba(s);let f={};const S=s.attributes.length;for(let y=0;y<S;y++){const C=s.attributes[y];Ji(p,C.name,C.value)||(f[C.name]=Zi(t,p,Ce(C.name),C.value))}if(p===\"link\"&&n){const y=Array.from(t.styleSheets).find(N=>N.href===s.href);let C=null;y&&(C=$r(y)),C&&(delete f.rel,delete f.href,f._cssText=C)}if(p===\"style\"&&s.sheet){let y=$r(s.sheet);y&&(s.childNodes.length>1&&(y=ya(y,s)),f._cssText=y)}if(p===\"input\"||p===\"textarea\"||p===\"select\"){const y=s.value,C=s.checked;f.type!==\"radio\"&&f.type!==\"checkbox\"&&f.type!==\"submit\"&&f.type!==\"button\"&&y?f.value=hs({element:s,type:fs(s),tagName:p,value:y,maskInputOptions:o,maskInputFn:l}):C&&(f.checked=C)}if(p===\"option\"&&(s.selected&&!o.select?f.selected=!0:delete f.selected),p===\"dialog\"&&s.open&&(f.rr_open_mode=s.matches(\"dialog:modal\")?\"modal\":\"non-modal\"),p===\"canvas\"&&c){if(s.__context===\"2d\")ca(s)||(f.rr_dataURL=s.toDataURL(a.type,a.quality));else if(!(\"__context\"in s)){const y=s.toDataURL(a.type,a.quality),C=t.createElement(\"canvas\");C.width=s.width,C.height=s.height;const N=C.toDataURL(a.type,a.quality);y!==N&&(f.rr_dataURL=y)}}if(p===\"img\"&&u){Oe||(Oe=t.createElement(\"canvas\"),Zs=Oe.getContext(\"2d\"));const y=s,C=y.currentSrc||y.getAttribute(\"src\")||\"<unknown-src>\",N=y.crossOrigin,D=()=>{y.removeEventListener(\"load\",D);try{Oe.width=y.naturalWidth,Oe.height=y.naturalHeight,Zs.drawImage(y,0,0),f.rr_dataURL=Oe.toDataURL(a.type,a.quality)}catch(H){if(y.crossOrigin!==\"anonymous\"){y.crossOrigin=\"anonymous\",y.complete&&y.naturalWidth!==0?D():y.addEventListener(\"load\",D);return}else console.warn(\\`Cannot inline img src=\\${C}! Error: \\${H}\\`)}y.crossOrigin===\"anonymous\"&&(N?f.crossOrigin=N:y.removeAttribute(\"crossorigin\"))};y.complete&&y.naturalWidth!==0?D():y.addEventListener(\"load\",D)}if(p===\"audio\"||p===\"video\"){const y=f;y.rr_mediaState=s.paused?\"paused\":\"played\",y.rr_mediaCurrentTime=s.currentTime,y.rr_mediaPlaybackRate=s.playbackRate,y.rr_mediaMuted=s.muted,y.rr_mediaLoop=s.loop,y.rr_mediaVolume=s.volume}if(d||(s.scrollLeft&&(f.rr_scrollLeft=s.scrollLeft),s.scrollTop&&(f.rr_scrollTop=s.scrollTop)),g){const{width:y,height:C}=s.getBoundingClientRect();f={class:f.class,rr_width:\\`\\${y}px\\`,rr_height:\\`\\${C}px\\`}}p===\"iframe\"&&!h(f.src)&&(s.contentDocument||(f.rr_src=f.src),delete f.src);let b;try{customElements.get(p)&&(b=!0)}catch(y){}return{type:j.Element,tagName:p,attributes:f,childNodes:[],isSVG:xa(s)||void 0,needBlock:g,rootId:m,isCustom:b}}function P(s){return s==null?\"\":s.toLowerCase()}function ka(s,e){if(e.comment&&s.type===j.Comment)return!0;if(s.type===j.Element){if(e.script&&(s.tagName===\"script\"||s.tagName===\"link\"&&(s.attributes.rel===\"preload\"||s.attributes.rel===\"modulepreload\")&&s.attributes.as===\"script\"||s.tagName===\"link\"&&s.attributes.rel===\"prefetch\"&&typeof s.attributes.href==\"string\"&&Hi(s.attributes.href)===\"js\"))return!0;if(e.headFavicon&&(s.tagName===\"link\"&&s.attributes.rel===\"shortcut icon\"||s.tagName===\"meta\"&&(P(s.attributes.name).match(/^msapplication-tile(image|color)$/)||P(s.attributes.name)===\"application-name\"||P(s.attributes.rel)===\"icon\"||P(s.attributes.rel)===\"apple-touch-icon\"||P(s.attributes.rel)===\"shortcut icon\")))return!0;if(s.tagName===\"meta\"){if(e.headMetaDescKeywords&&P(s.attributes.name).match(/^description|keywords$/))return!0;if(e.headMetaSocial&&(P(s.attributes.property).match(/^(og|twitter|fb):/)||P(s.attributes.name).match(/^(og|twitter):/)||P(s.attributes.name)===\"pinterest\"))return!0;if(e.headMetaRobots&&(P(s.attributes.name)===\"robots\"||P(s.attributes.name)===\"googlebot\"||P(s.attributes.name)===\"bingbot\"))return!0;if(e.headMetaHttpEquiv&&s.attributes[\"http-equiv\"]!==void 0)return!0;if(e.headMetaAuthorship&&(P(s.attributes.name)===\"author\"||P(s.attributes.name)===\"generator\"||P(s.attributes.name)===\"framework\"||P(s.attributes.name)===\"publisher\"||P(s.attributes.name)===\"progid\"||P(s.attributes.property).match(/^article:/)||P(s.attributes.property).match(/^product:/)))return!0;if(e.headMetaVerification&&(P(s.attributes.name)===\"google-site-verification\"||P(s.attributes.name)===\"yandex-verification\"||P(s.attributes.name)===\"csrf-token\"||P(s.attributes.name)===\"p:domain_verify\"||P(s.attributes.name)===\"verify-v1\"||P(s.attributes.name)===\"verification\"||P(s.attributes.name)===\"shopify-checkout-api-token\"))return!0}}return!1}function Ee(s,e){const{doc:t,mirror:r,blockClass:i,blockSelector:n,maskTextClass:o,maskTextSelector:l,skipChild:a=!1,inlineStylesheet:u=!0,maskInputOptions:c={},maskTextFn:h,maskInputFn:d,slimDOMOptions:m,dataURLOptions:g={},inlineImages:p=!1,recordCanvas:f=!1,onSerialize:S,onIframeLoad:b,iframeLoadTimeout:y=5e3,onStylesheetLoad:C,stylesheetLoadTimeout:N=5e3,keepIframeSrcFn:D=()=>!1,newlyAddedElement:H=!1,cssCaptured:_=!1}=e;let{needsMask:G}=e,{preserveWhiteSpace:Y=!0}=e;G||(G=Xi(s,o,l,G===void 0));const Q=Ma(s,{doc:t,mirror:r,blockClass:i,blockSelector:n,needsMask:G,inlineStylesheet:u,maskInputOptions:c,maskTextFn:h,maskInputFn:d,dataURLOptions:g,inlineImages:p,recordCanvas:f,keepIframeSrcFn:D,newlyAddedElement:H,cssCaptured:_});if(!Q)return console.warn(s,\"not serialized\"),null;let oe;r.hasNode(s)?oe=r.getId(s):ka(Q,m)||!Y&&Q.type===j.Text&&!Q.textContent.replace(/^\\\\s+|\\\\s+$/gm,\"\").length?oe=Ze:oe=Yi();const A=Object.assign(Q,{id:oe});if(r.add(s,A),oe===Ze)return null;S&&S(s);let Ue=!a;if(A.type===j.Element){Ue=Ue&&!A.needBlock,delete A.needBlock;const V=Z.shadowRoot(s);V&&He(V)&&(A.isShadowHost=!0)}if((A.type===j.Document||A.type===j.Element)&&Ue){m.headWhitespace&&A.type===j.Element&&A.tagName===\"head\"&&(Y=!1);const V={doc:t,mirror:r,blockClass:i,blockSelector:n,needsMask:G,maskTextClass:o,maskTextSelector:l,skipChild:a,inlineStylesheet:u,maskInputOptions:c,maskTextFn:h,maskInputFn:d,slimDOMOptions:m,dataURLOptions:g,inlineImages:p,recordCanvas:f,preserveWhiteSpace:Y,onSerialize:S,onIframeLoad:b,iframeLoadTimeout:y,onStylesheetLoad:C,stylesheetLoadTimeout:N,keepIframeSrcFn:D,cssCaptured:!1};if(!(A.type===j.Element&&A.tagName===\"textarea\"&&A.attributes.value!==void 0)){A.type===j.Element&&A.attributes._cssText!==void 0&&typeof A.attributes._cssText==\"string\"&&(V.cssCaptured=!0);for(const ye of Array.from(Z.childNodes(s))){const ae=Ee(ye,V);ae&&A.childNodes.push(ae)}}let q=null;if(Gi(s)&&(q=Z.shadowRoot(s)))for(const ye of Array.from(Z.childNodes(q))){const ae=Ee(ye,V);ae&&(He(q)&&(ae.isShadow=!0),A.childNodes.push(ae))}}const Be=Z.parentNode(s);return Be&&je(Be)&&He(Be)&&(A.isShadow=!0),A.type===j.Element&&A.tagName===\"iframe\"&&Ra(s,()=>{const V=s.contentDocument;if(V&&b){const q=Ee(V,{doc:V,mirror:r,blockClass:i,blockSelector:n,needsMask:G,maskTextClass:o,maskTextSelector:l,skipChild:!1,inlineStylesheet:u,maskInputOptions:c,maskTextFn:h,maskInputFn:d,slimDOMOptions:m,dataURLOptions:g,inlineImages:p,recordCanvas:f,preserveWhiteSpace:Y,onSerialize:S,onIframeLoad:b,iframeLoadTimeout:y,onStylesheetLoad:C,stylesheetLoadTimeout:N,keepIframeSrcFn:D});q&&b(s,q)}},y),A.type===j.Element&&A.tagName===\"link\"&&typeof A.attributes.rel==\"string\"&&(A.attributes.rel===\"stylesheet\"||A.attributes.rel===\"preload\"&&typeof A.attributes.href==\"string\"&&Hi(A.attributes.href)===\"css\")&&Aa(s,()=>{if(C){const V=Ee(s,{doc:t,mirror:r,blockClass:i,blockSelector:n,needsMask:G,maskTextClass:o,maskTextSelector:l,skipChild:!1,inlineStylesheet:u,maskInputOptions:c,maskTextFn:h,maskInputFn:d,slimDOMOptions:m,dataURLOptions:g,inlineImages:p,recordCanvas:f,preserveWhiteSpace:Y,onSerialize:S,onIframeLoad:b,iframeLoadTimeout:y,onStylesheetLoad:C,stylesheetLoadTimeout:N,keepIframeSrcFn:D});V&&C(s,V)}},N),A}function Pa(s,e){const{mirror:t=new ji,blockClass:r=\"rr-block\",blockSelector:i=null,maskTextClass:n=\"rr-mask\",maskTextSelector:o=null,inlineStylesheet:l=!0,inlineImages:a=!1,recordCanvas:u=!1,maskAllInputs:c=!1,maskTextFn:h,maskInputFn:d,slimDOM:m=!1,dataURLOptions:g,preserveWhiteSpace:p,onSerialize:f,onIframeLoad:S,iframeLoadTimeout:b,onStylesheetLoad:y,stylesheetLoadTimeout:C,keepIframeSrcFn:N=()=>!1}=e||{};return Ee(s,{doc:s,mirror:t,blockClass:r,blockSelector:i,maskTextClass:n,maskTextSelector:o,skipChild:!1,inlineStylesheet:l,maskInputOptions:c===!0?{color:!0,date:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0,textarea:!0,select:!0,password:!0}:c===!1?{password:!0}:c,maskTextFn:h,maskInputFn:d,slimDOMOptions:m===!0||m===\"all\"?{script:!0,comment:!0,headFavicon:!0,headWhitespace:!0,headMetaDescKeywords:m===\"all\",headMetaSocial:!0,headMetaRobots:!0,headMetaHttpEquiv:!0,headMetaAuthorship:!0,headMetaVerification:!0}:m===!1?{}:m,dataURLOptions:g,inlineImages:a,recordCanvas:u,preserveWhiteSpace:p,onSerialize:f,onIframeLoad:S,iframeLoadTimeout:b,onStylesheetLoad:y,stylesheetLoadTimeout:C,keepIframeSrcFn:N,newlyAddedElement:!1})}function Da(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,\"default\")?s.default:s}function La(s){if(s.__esModule)return s;var e=s.default;if(typeof e==\"function\"){var t=function r(){return this instanceof r?Reflect.construct(e,arguments,this.constructor):e.apply(this,arguments)};t.prototype=e.prototype}else t={};return Object.defineProperty(t,\"__esModule\",{value:!0}),Object.keys(s).forEach(function(r){var i=Object.getOwnPropertyDescriptor(s,r);Object.defineProperty(t,r,i.get?i:{enumerable:!0,get:function(){return s[r]}})}),t}var ds={exports:{}},L=String,Ki=function(){return{isColorSupported:!1,reset:L,bold:L,dim:L,italic:L,underline:L,inverse:L,hidden:L,strikethrough:L,black:L,red:L,green:L,yellow:L,blue:L,magenta:L,cyan:L,white:L,gray:L,bgBlack:L,bgRed:L,bgGreen:L,bgYellow:L,bgBlue:L,bgMagenta:L,bgCyan:L,bgWhite:L}};ds.exports=Ki();ds.exports.createColors=Ki;var Ta=ds.exports;const _a={},Fa=Object.freeze(Object.defineProperty({__proto__:null,default:_a},Symbol.toStringTag,{value:\"Module\"})),ie=La(Fa);let Xs=Ta,Ks=ie,Nr=class Qi extends Error{constructor(e,t,r,i,n,o){super(e),this.name=\"CssSyntaxError\",this.reason=e,n&&(this.file=n),i&&(this.source=i),o&&(this.plugin=o),typeof t!=\"undefined\"&&typeof r!=\"undefined\"&&(typeof t==\"number\"?(this.line=t,this.column=r):(this.line=t.line,this.column=t.column,this.endLine=r.line,this.endColumn=r.column)),this.setMessage(),Error.captureStackTrace&&Error.captureStackTrace(this,Qi)}setMessage(){this.message=this.plugin?this.plugin+\": \":\"\",this.message+=this.file?this.file:\"<css input>\",typeof this.line!=\"undefined\"&&(this.message+=\":\"+this.line+\":\"+this.column),this.message+=\": \"+this.reason}showSourceCode(e){if(!this.source)return\"\";let t=this.source;e==null&&(e=Xs.isColorSupported),Ks&&e&&(t=Ks(t));let r=t.split(/\\\\r?\\\\n/),i=Math.max(this.line-3,0),n=Math.min(this.line+2,r.length),o=String(n).length,l,a;if(e){let{bold:u,gray:c,red:h}=Xs.createColors(!0);l=d=>u(h(d)),a=d=>c(d)}else l=a=u=>u;return r.slice(i,n).map((u,c)=>{let h=i+1+c,d=\" \"+(\" \"+h).slice(-o)+\" | \";if(h===this.line){let m=a(d.replace(/\\\\d/g,\" \"))+u.slice(0,this.column-1).replace(/[^\\\\t]/g,\" \");return l(\">\")+a(d)+u+\\`\n \\`+m+l(\"^\")}return\" \"+a(d)+u}).join(\\`\n\\`)}toString(){let e=this.showSourceCode();return e&&(e=\\`\n\n\\`+e+\\`\n\\`),this.name+\": \"+this.message+e}};var ms=Nr;Nr.default=Nr;var it={};it.isClean=Symbol(\"isClean\");it.my=Symbol(\"my\");const Qs={after:\\`\n\\`,beforeClose:\\`\n\\`,beforeComment:\\`\n\\`,beforeDecl:\\`\n\\`,beforeOpen:\" \",beforeRule:\\`\n\\`,colon:\": \",commentLeft:\" \",commentRight:\" \",emptyBody:\"\",indent:\" \",semicolon:!1};function Ua(s){return s[0].toUpperCase()+s.slice(1)}let kr=class{constructor(e){this.builder=e}atrule(e,t){let r=\"@\"+e.name,i=e.params?this.rawValue(e,\"params\"):\"\";if(typeof e.raws.afterName!=\"undefined\"?r+=e.raws.afterName:i&&(r+=\" \"),e.nodes)this.block(e,r+i);else{let n=(e.raws.between||\"\")+(t?\";\":\"\");this.builder(r+i+n,e)}}beforeAfter(e,t){let r;e.type===\"decl\"?r=this.raw(e,null,\"beforeDecl\"):e.type===\"comment\"?r=this.raw(e,null,\"beforeComment\"):t===\"before\"?r=this.raw(e,null,\"beforeRule\"):r=this.raw(e,null,\"beforeClose\");let i=e.parent,n=0;for(;i&&i.type!==\"root\";)n+=1,i=i.parent;if(r.includes(\\`\n\\`)){let o=this.raw(e,null,\"indent\");if(o.length)for(let l=0;l<n;l++)r+=o}return r}block(e,t){let r=this.raw(e,\"between\",\"beforeOpen\");this.builder(t+r+\"{\",e,\"start\");let i;e.nodes&&e.nodes.length?(this.body(e),i=this.raw(e,\"after\")):i=this.raw(e,\"after\",\"emptyBody\"),i&&this.builder(i),this.builder(\"}\",e,\"end\")}body(e){let t=e.nodes.length-1;for(;t>0&&e.nodes[t].type===\"comment\";)t-=1;let r=this.raw(e,\"semicolon\");for(let i=0;i<e.nodes.length;i++){let n=e.nodes[i],o=this.raw(n,\"before\");o&&this.builder(o),this.stringify(n,t!==i||r)}}comment(e){let t=this.raw(e,\"left\",\"commentLeft\"),r=this.raw(e,\"right\",\"commentRight\");this.builder(\"/*\"+t+e.text+r+\"*/\",e)}decl(e,t){let r=this.raw(e,\"between\",\"colon\"),i=e.prop+r+this.rawValue(e,\"value\");e.important&&(i+=e.raws.important||\" !important\"),t&&(i+=\";\"),this.builder(i,e)}document(e){this.body(e)}raw(e,t,r){let i;if(r||(r=t),t&&(i=e.raws[t],typeof i!=\"undefined\"))return i;let n=e.parent;if(r===\"before\"&&(!n||n.type===\"root\"&&n.first===e||n&&n.type===\"document\"))return\"\";if(!n)return Qs[r];let o=e.root();if(o.rawCache||(o.rawCache={}),typeof o.rawCache[r]!=\"undefined\")return o.rawCache[r];if(r===\"before\"||r===\"after\")return this.beforeAfter(e,r);{let l=\"raw\"+Ua(r);this[l]?i=this[l](o,e):o.walk(a=>{if(i=a.raws[t],typeof i!=\"undefined\")return!1})}return typeof i==\"undefined\"&&(i=Qs[r]),o.rawCache[r]=i,i}rawBeforeClose(e){let t;return e.walk(r=>{if(r.nodes&&r.nodes.length>0&&typeof r.raws.after!=\"undefined\")return t=r.raws.after,t.includes(\\`\n\\`)&&(t=t.replace(/[^\\\\n]+$/,\"\")),!1}),t&&(t=t.replace(/\\\\S/g,\"\")),t}rawBeforeComment(e,t){let r;return e.walkComments(i=>{if(typeof i.raws.before!=\"undefined\")return r=i.raws.before,r.includes(\\`\n\\`)&&(r=r.replace(/[^\\\\n]+$/,\"\")),!1}),typeof r==\"undefined\"?r=this.raw(t,null,\"beforeDecl\"):r&&(r=r.replace(/\\\\S/g,\"\")),r}rawBeforeDecl(e,t){let r;return e.walkDecls(i=>{if(typeof i.raws.before!=\"undefined\")return r=i.raws.before,r.includes(\\`\n\\`)&&(r=r.replace(/[^\\\\n]+$/,\"\")),!1}),typeof r==\"undefined\"?r=this.raw(t,null,\"beforeRule\"):r&&(r=r.replace(/\\\\S/g,\"\")),r}rawBeforeOpen(e){let t;return e.walk(r=>{if(r.type!==\"decl\"&&(t=r.raws.between,typeof t!=\"undefined\"))return!1}),t}rawBeforeRule(e){let t;return e.walk(r=>{if(r.nodes&&(r.parent!==e||e.first!==r)&&typeof r.raws.before!=\"undefined\")return t=r.raws.before,t.includes(\\`\n\\`)&&(t=t.replace(/[^\\\\n]+$/,\"\")),!1}),t&&(t=t.replace(/\\\\S/g,\"\")),t}rawColon(e){let t;return e.walkDecls(r=>{if(typeof r.raws.between!=\"undefined\")return t=r.raws.between.replace(/[^\\\\s:]/g,\"\"),!1}),t}rawEmptyBody(e){let t;return e.walk(r=>{if(r.nodes&&r.nodes.length===0&&(t=r.raws.after,typeof t!=\"undefined\"))return!1}),t}rawIndent(e){if(e.raws.indent)return e.raws.indent;let t;return e.walk(r=>{let i=r.parent;if(i&&i!==e&&i.parent&&i.parent===e&&typeof r.raws.before!=\"undefined\"){let n=r.raws.before.split(\\`\n\\`);return t=n[n.length-1],t=t.replace(/\\\\S/g,\"\"),!1}}),t}rawSemicolon(e){let t;return e.walk(r=>{if(r.nodes&&r.nodes.length&&r.last.type===\"decl\"&&(t=r.raws.semicolon,typeof t!=\"undefined\"))return!1}),t}rawValue(e,t){let r=e[t],i=e.raws[t];return i&&i.value===r?i.raw:r}root(e){this.body(e),e.raws.after&&this.builder(e.raws.after)}rule(e){this.block(e,this.rawValue(e,\"selector\")),e.raws.ownSemicolon&&this.builder(e.raws.ownSemicolon,e,\"end\")}stringify(e,t){if(!this[e.type])throw new Error(\"Unknown AST node type \"+e.type+\". Maybe you need to change PostCSS stringifier.\");this[e.type](e,t)}};var qi=kr;kr.default=kr;let Ba=qi;function Pr(s,e){new Ba(e).stringify(s)}var tr=Pr;Pr.default=Pr;let{isClean:dt,my:za}=it,Wa=ms,Ga=qi,Va=tr;function Dr(s,e){let t=new s.constructor;for(let r in s){if(!Object.prototype.hasOwnProperty.call(s,r)||r===\"proxyCache\")continue;let i=s[r],n=typeof i;r===\"parent\"&&n===\"object\"?e&&(t[r]=e):r===\"source\"?t[r]=i:Array.isArray(i)?t[r]=i.map(o=>Dr(o,t)):(n===\"object\"&&i!==null&&(i=Dr(i)),t[r]=i)}return t}let Lr=class{constructor(e={}){this.raws={},this[dt]=!1,this[za]=!0;for(let t in e)if(t===\"nodes\"){this.nodes=[];for(let r of e[t])typeof r.clone==\"function\"?this.append(r.clone()):this.append(r)}else this[t]=e[t]}addToError(e){if(e.postcssNode=this,e.stack&&this.source&&/\\\\n\\\\s{4}at /.test(e.stack)){let t=this.source;e.stack=e.stack.replace(/\\\\n\\\\s{4}at /,\\`$&\\${t.input.from}:\\${t.start.line}:\\${t.start.column}$&\\`)}return e}after(e){return this.parent.insertAfter(this,e),this}assign(e={}){for(let t in e)this[t]=e[t];return this}before(e){return this.parent.insertBefore(this,e),this}cleanRaws(e){delete this.raws.before,delete this.raws.after,e||delete this.raws.between}clone(e={}){let t=Dr(this);for(let r in e)t[r]=e[r];return t}cloneAfter(e={}){let t=this.clone(e);return this.parent.insertAfter(this,t),t}cloneBefore(e={}){let t=this.clone(e);return this.parent.insertBefore(this,t),t}error(e,t={}){if(this.source){let{end:r,start:i}=this.rangeBy(t);return this.source.input.error(e,{column:i.column,line:i.line},{column:r.column,line:r.line},t)}return new Wa(e)}getProxyProcessor(){return{get(e,t){return t===\"proxyOf\"?e:t===\"root\"?()=>e.root().toProxy():e[t]},set(e,t,r){return e[t]===r||(e[t]=r,(t===\"prop\"||t===\"value\"||t===\"name\"||t===\"params\"||t===\"important\"||t===\"text\")&&e.markDirty()),!0}}}markDirty(){if(this[dt]){this[dt]=!1;let e=this;for(;e=e.parent;)e[dt]=!1}}next(){if(!this.parent)return;let e=this.parent.index(this);return this.parent.nodes[e+1]}positionBy(e,t){let r=this.source.start;if(e.index)r=this.positionInside(e.index,t);else if(e.word){t=this.toString();let i=t.indexOf(e.word);i!==-1&&(r=this.positionInside(i,t))}return r}positionInside(e,t){let r=t||this.toString(),i=this.source.start.column,n=this.source.start.line;for(let o=0;o<e;o++)r[o]===\\`\n\\`?(i=1,n+=1):i+=1;return{column:i,line:n}}prev(){if(!this.parent)return;let e=this.parent.index(this);return this.parent.nodes[e-1]}rangeBy(e){let t={column:this.source.start.column,line:this.source.start.line},r=this.source.end?{column:this.source.end.column+1,line:this.source.end.line}:{column:t.column+1,line:t.line};if(e.word){let i=this.toString(),n=i.indexOf(e.word);n!==-1&&(t=this.positionInside(n,i),r=this.positionInside(n+e.word.length,i))}else e.start?t={column:e.start.column,line:e.start.line}:e.index&&(t=this.positionInside(e.index)),e.end?r={column:e.end.column,line:e.end.line}:typeof e.endIndex==\"number\"?r=this.positionInside(e.endIndex):e.index&&(r=this.positionInside(e.index+1));return(r.line<t.line||r.line===t.line&&r.column<=t.column)&&(r={column:t.column+1,line:t.line}),{end:r,start:t}}raw(e,t){return new Ga().raw(this,e,t)}remove(){return this.parent&&this.parent.removeChild(this),this.parent=void 0,this}replaceWith(...e){if(this.parent){let t=this,r=!1;for(let i of e)i===this?r=!0:r?(this.parent.insertAfter(t,i),t=i):this.parent.insertBefore(t,i);r||this.remove()}return this}root(){let e=this;for(;e.parent&&e.parent.type!==\"document\";)e=e.parent;return e}toJSON(e,t){let r={},i=t==null;t=t||new Map;let n=0;for(let o in this){if(!Object.prototype.hasOwnProperty.call(this,o)||o===\"parent\"||o===\"proxyCache\")continue;let l=this[o];if(Array.isArray(l))r[o]=l.map(a=>typeof a==\"object\"&&a.toJSON?a.toJSON(null,t):a);else if(typeof l==\"object\"&&l.toJSON)r[o]=l.toJSON(null,t);else if(o===\"source\"){let a=t.get(l.input);a==null&&(a=n,t.set(l.input,n),n++),r[o]={end:l.end,inputId:a,start:l.start}}else r[o]=l}return i&&(r.inputs=[...t.keys()].map(o=>o.toJSON())),r}toProxy(){return this.proxyCache||(this.proxyCache=new Proxy(this,this.getProxyProcessor())),this.proxyCache}toString(e=Va){e.stringify&&(e=e.stringify);let t=\"\";return e(this,r=>{t+=r}),t}warn(e,t,r){let i={node:this};for(let n in r)i[n]=r[n];return e.warn(t,i)}get proxyOf(){return this}};var rr=Lr;Lr.default=Lr;let ja=rr,Tr=class extends ja{constructor(e){e&&typeof e.value!=\"undefined\"&&typeof e.value!=\"string\"&&(e=ee(x({},e),{value:String(e.value)})),super(e),this.type=\"decl\"}get variable(){return this.prop.startsWith(\"--\")||this.prop[0]===\"$\"}};var sr=Tr;Tr.default=Tr;let Ha=\"useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict\",Ya=(s,e=21)=>(t=e)=>{let r=\"\",i=t;for(;i--;)r+=s[Math.random()*s.length|0];return r},Za=(s=21)=>{let e=\"\",t=s;for(;t--;)e+=Ha[Math.random()*64|0];return e};var Ja={nanoid:Za,customAlphabet:Ya};let{SourceMapConsumer:qs,SourceMapGenerator:ei}=ie,{existsSync:Xa,readFileSync:Ka}=ie,{dirname:wr,join:Qa}=ie;function qa(s){return Buffer?Buffer.from(s,\"base64\").toString():window.atob(s)}let _r=class{constructor(e,t){if(t.map===!1)return;this.loadAnnotation(e),this.inline=this.startWith(this.annotation,\"data:\");let r=t.map?t.map.prev:void 0,i=this.loadMap(t.from,r);!this.mapFile&&t.from&&(this.mapFile=t.from),this.mapFile&&(this.root=wr(this.mapFile)),i&&(this.text=i)}consumer(){return this.consumerCache||(this.consumerCache=new qs(this.text)),this.consumerCache}decodeInline(e){let t=/^data:application\\\\/json;charset=utf-?8;base64,/,r=/^data:application\\\\/json;base64,/,i=/^data:application\\\\/json;charset=utf-?8,/,n=/^data:application\\\\/json,/;if(i.test(e)||n.test(e))return decodeURIComponent(e.substr(RegExp.lastMatch.length));if(t.test(e)||r.test(e))return qa(e.substr(RegExp.lastMatch.length));let o=e.match(/data:application\\\\/json;([^,]+),/)[1];throw new Error(\"Unsupported source map encoding \"+o)}getAnnotationURL(e){return e.replace(/^\\\\/\\\\*\\\\s*# sourceMappingURL=/,\"\").trim()}isMap(e){return typeof e!=\"object\"?!1:typeof e.mappings==\"string\"||typeof e._mappings==\"string\"||Array.isArray(e.sections)}loadAnnotation(e){let t=e.match(/\\\\/\\\\*\\\\s*# sourceMappingURL=/gm);if(!t)return;let r=e.lastIndexOf(t.pop()),i=e.indexOf(\"*/\",r);r>-1&&i>-1&&(this.annotation=this.getAnnotationURL(e.substring(r,i)))}loadFile(e){if(this.root=wr(e),Xa(e))return this.mapFile=e,Ka(e,\"utf-8\").toString().trim()}loadMap(e,t){if(t===!1)return!1;if(t){if(typeof t==\"string\")return t;if(typeof t==\"function\"){let r=t(e);if(r){let i=this.loadFile(r);if(!i)throw new Error(\"Unable to load previous source map: \"+r.toString());return i}}else{if(t instanceof qs)return ei.fromSourceMap(t).toString();if(t instanceof ei)return t.toString();if(this.isMap(t))return JSON.stringify(t);throw new Error(\"Unsupported previous source map format: \"+t.toString())}}else{if(this.inline)return this.decodeInline(this.annotation);if(this.annotation){let r=this.annotation;return e&&(r=Qa(wr(e),r)),this.loadFile(r)}}}startWith(e,t){return e?e.substr(0,t.length)===t:!1}withContent(){return!!(this.consumer().sourcesContent&&this.consumer().sourcesContent.length>0)}};var en=_r;_r.default=_r;let{SourceMapConsumer:el,SourceMapGenerator:tl}=ie,{fileURLToPath:ti,pathToFileURL:mt}=ie,{isAbsolute:Fr,resolve:Ur}=ie,{nanoid:rl}=Ja,Sr=ie,ri=ms,sl=en,br=Symbol(\"fromOffsetCache\"),il=!!(el&&tl),si=!!(Ur&&Fr),Vt=class{constructor(e,t={}){if(e===null||typeof e==\"undefined\"||typeof e==\"object\"&&!e.toString)throw new Error(\\`PostCSS received \\${e} instead of CSS string\\`);if(this.css=e.toString(),this.css[0]===\"\\\\uFEFF\"||this.css[0]===\"\\\\uFFFE\"?(this.hasBOM=!0,this.css=this.css.slice(1)):this.hasBOM=!1,t.from&&(!si||/^\\\\w+:\\\\/\\\\//.test(t.from)||Fr(t.from)?this.file=t.from:this.file=Ur(t.from)),si&&il){let r=new sl(this.css,t);if(r.text){this.map=r;let i=r.consumer().file;!this.file&&i&&(this.file=this.mapResolve(i))}}this.file||(this.id=\"<input css \"+rl(6)+\">\"),this.map&&(this.map.file=this.from)}error(e,t,r,i={}){let n,o,l;if(t&&typeof t==\"object\"){let u=t,c=r;if(typeof u.offset==\"number\"){let h=this.fromOffset(u.offset);t=h.line,r=h.col}else t=u.line,r=u.column;if(typeof c.offset==\"number\"){let h=this.fromOffset(c.offset);o=h.line,l=h.col}else o=c.line,l=c.column}else if(!r){let u=this.fromOffset(t);t=u.line,r=u.col}let a=this.origin(t,r,o,l);return a?n=new ri(e,a.endLine===void 0?a.line:{column:a.column,line:a.line},a.endLine===void 0?a.column:{column:a.endColumn,line:a.endLine},a.source,a.file,i.plugin):n=new ri(e,o===void 0?t:{column:r,line:t},o===void 0?r:{column:l,line:o},this.css,this.file,i.plugin),n.input={column:r,endColumn:l,endLine:o,line:t,source:this.css},this.file&&(mt&&(n.input.url=mt(this.file).toString()),n.input.file=this.file),n}fromOffset(e){let t,r;if(this[br])r=this[br];else{let n=this.css.split(\\`\n\\`);r=new Array(n.length);let o=0;for(let l=0,a=n.length;l<a;l++)r[l]=o,o+=n[l].length+1;this[br]=r}t=r[r.length-1];let i=0;if(e>=t)i=r.length-1;else{let n=r.length-2,o;for(;i<n;)if(o=i+(n-i>>1),e<r[o])n=o-1;else if(e>=r[o+1])i=o+1;else{i=o;break}}return{col:e-r[i]+1,line:i+1}}mapResolve(e){return/^\\\\w+:\\\\/\\\\//.test(e)?e:Ur(this.map.consumer().sourceRoot||this.map.root||\".\",e)}origin(e,t,r,i){if(!this.map)return!1;let n=this.map.consumer(),o=n.originalPositionFor({column:t,line:e});if(!o.source)return!1;let l;typeof r==\"number\"&&(l=n.originalPositionFor({column:i,line:r}));let a;Fr(o.source)?a=mt(o.source):a=new URL(o.source,this.map.consumer().sourceRoot||mt(this.map.mapFile));let u={column:o.column,endColumn:l&&l.column,endLine:l&&l.line,line:o.line,url:a.toString()};if(a.protocol===\"file:\")if(ti)u.file=ti(a);else throw new Error(\"file: protocol is not available in this PostCSS build\");let c=n.sourceContentFor(o.source);return c&&(u.source=c),u}toJSON(){let e={};for(let t of[\"hasBOM\",\"css\",\"file\",\"id\"])this[t]!=null&&(e[t]=this[t]);return this.map&&(e.map=x({},this.map),e.map.consumerCache&&(e.map.consumerCache=void 0)),e}get from(){return this.file||this.id}};var ir=Vt;Vt.default=Vt;Sr&&Sr.registerInput&&Sr.registerInput(Vt);let{SourceMapConsumer:tn,SourceMapGenerator:Tt}=ie,{dirname:_t,relative:rn,resolve:sn,sep:nn}=ie,{pathToFileURL:ii}=ie,nl=ir,ol=!!(tn&&Tt),al=!!(_t&&sn&&rn&&nn),ll=class{constructor(e,t,r,i){this.stringify=e,this.mapOpts=r.map||{},this.root=t,this.opts=r,this.css=i,this.originalCSS=i,this.usesFileUrls=!this.mapOpts.from&&this.mapOpts.absolute,this.memoizedFileURLs=new Map,this.memoizedPaths=new Map,this.memoizedURLs=new Map}addAnnotation(){let e;this.isInline()?e=\"data:application/json;base64,\"+this.toBase64(this.map.toString()):typeof this.mapOpts.annotation==\"string\"?e=this.mapOpts.annotation:typeof this.mapOpts.annotation==\"function\"?e=this.mapOpts.annotation(this.opts.to,this.root):e=this.outputFile()+\".map\";let t=\\`\n\\`;this.css.includes(\\`\\\\r\n\\`)&&(t=\\`\\\\r\n\\`),this.css+=t+\"/*# sourceMappingURL=\"+e+\" */\"}applyPrevMaps(){for(let e of this.previous()){let t=this.toUrl(this.path(e.file)),r=e.root||_t(e.file),i;this.mapOpts.sourcesContent===!1?(i=new tn(e.text),i.sourcesContent&&(i.sourcesContent=null)):i=e.consumer(),this.map.applySourceMap(i,t,this.toUrl(this.path(r)))}}clearAnnotation(){if(this.mapOpts.annotation!==!1)if(this.root){let e;for(let t=this.root.nodes.length-1;t>=0;t--)e=this.root.nodes[t],e.type===\"comment\"&&e.text.indexOf(\"# sourceMappingURL=\")===0&&this.root.removeChild(t)}else this.css&&(this.css=this.css.replace(/\\\\n*?\\\\/\\\\*#[\\\\S\\\\s]*?\\\\*\\\\/$/gm,\"\"))}generate(){if(this.clearAnnotation(),al&&ol&&this.isMap())return this.generateMap();{let e=\"\";return this.stringify(this.root,t=>{e+=t}),[e]}}generateMap(){if(this.root)this.generateString();else if(this.previous().length===1){let e=this.previous()[0].consumer();e.file=this.outputFile(),this.map=Tt.fromSourceMap(e,{ignoreInvalidMapping:!0})}else this.map=new Tt({file:this.outputFile(),ignoreInvalidMapping:!0}),this.map.addMapping({generated:{column:0,line:1},original:{column:0,line:1},source:this.opts.from?this.toUrl(this.path(this.opts.from)):\"<no source>\"});return this.isSourcesContent()&&this.setSourcesContent(),this.root&&this.previous().length>0&&this.applyPrevMaps(),this.isAnnotation()&&this.addAnnotation(),this.isInline()?[this.css]:[this.css,this.map]}generateString(){this.css=\"\",this.map=new Tt({file:this.outputFile(),ignoreInvalidMapping:!0});let e=1,t=1,r=\"<no source>\",i={generated:{column:0,line:0},original:{column:0,line:0},source:\"\"},n,o;this.stringify(this.root,(l,a,u)=>{if(this.css+=l,a&&u!==\"end\"&&(i.generated.line=e,i.generated.column=t-1,a.source&&a.source.start?(i.source=this.sourcePath(a),i.original.line=a.source.start.line,i.original.column=a.source.start.column-1,this.map.addMapping(i)):(i.source=r,i.original.line=1,i.original.column=0,this.map.addMapping(i))),n=l.match(/\\\\n/g),n?(e+=n.length,o=l.lastIndexOf(\\`\n\\`),t=l.length-o):t+=l.length,a&&u!==\"start\"){let c=a.parent||{raws:{}};(!(a.type===\"decl\"||a.type===\"atrule\"&&!a.nodes)||a!==c.last||c.raws.semicolon)&&(a.source&&a.source.end?(i.source=this.sourcePath(a),i.original.line=a.source.end.line,i.original.column=a.source.end.column-1,i.generated.line=e,i.generated.column=t-2,this.map.addMapping(i)):(i.source=r,i.original.line=1,i.original.column=0,i.generated.line=e,i.generated.column=t-1,this.map.addMapping(i)))}})}isAnnotation(){return this.isInline()?!0:typeof this.mapOpts.annotation!=\"undefined\"?this.mapOpts.annotation:this.previous().length?this.previous().some(e=>e.annotation):!0}isInline(){if(typeof this.mapOpts.inline!=\"undefined\")return this.mapOpts.inline;let e=this.mapOpts.annotation;return typeof e!=\"undefined\"&&e!==!0?!1:this.previous().length?this.previous().some(t=>t.inline):!0}isMap(){return typeof this.opts.map!=\"undefined\"?!!this.opts.map:this.previous().length>0}isSourcesContent(){return typeof this.mapOpts.sourcesContent!=\"undefined\"?this.mapOpts.sourcesContent:this.previous().length?this.previous().some(e=>e.withContent()):!0}outputFile(){return this.opts.to?this.path(this.opts.to):this.opts.from?this.path(this.opts.from):\"to.css\"}path(e){if(this.mapOpts.absolute||e.charCodeAt(0)===60||/^\\\\w+:\\\\/\\\\//.test(e))return e;let t=this.memoizedPaths.get(e);if(t)return t;let r=this.opts.to?_t(this.opts.to):\".\";typeof this.mapOpts.annotation==\"string\"&&(r=_t(sn(r,this.mapOpts.annotation)));let i=rn(r,e);return this.memoizedPaths.set(e,i),i}previous(){if(!this.previousMaps)if(this.previousMaps=[],this.root)this.root.walk(e=>{if(e.source&&e.source.input.map){let t=e.source.input.map;this.previousMaps.includes(t)||this.previousMaps.push(t)}});else{let e=new nl(this.originalCSS,this.opts);e.map&&this.previousMaps.push(e.map)}return this.previousMaps}setSourcesContent(){let e={};if(this.root)this.root.walk(t=>{if(t.source){let r=t.source.input.from;if(r&&!e[r]){e[r]=!0;let i=this.usesFileUrls?this.toFileUrl(r):this.toUrl(this.path(r));this.map.setSourceContent(i,t.source.input.css)}}});else if(this.css){let t=this.opts.from?this.toUrl(this.path(this.opts.from)):\"<no source>\";this.map.setSourceContent(t,this.css)}}sourcePath(e){return this.mapOpts.from?this.toUrl(this.mapOpts.from):this.usesFileUrls?this.toFileUrl(e.source.input.from):this.toUrl(this.path(e.source.input.from))}toBase64(e){return Buffer?Buffer.from(e).toString(\"base64\"):window.btoa(unescape(encodeURIComponent(e)))}toFileUrl(e){let t=this.memoizedFileURLs.get(e);if(t)return t;if(ii){let r=ii(e).toString();return this.memoizedFileURLs.set(e,r),r}else throw new Error(\"\\`map.absolute\\` option is not available in this PostCSS build\")}toUrl(e){let t=this.memoizedURLs.get(e);if(t)return t;nn===\"\\\\\\\\\"&&(e=e.replace(/\\\\\\\\/g,\"/\"));let r=encodeURI(e).replace(/[#?]/g,encodeURIComponent);return this.memoizedURLs.set(e,r),r}};var on=ll;let ul=rr,Br=class extends ul{constructor(e){super(e),this.type=\"comment\"}};var nr=Br;Br.default=Br;let{isClean:an,my:ln}=it,un=sr,cn=nr,cl=rr,hn,gs,ys,fn;function pn(s){return s.map(e=>(e.nodes&&(e.nodes=pn(e.nodes)),delete e.source,e))}function dn(s){if(s[an]=!1,s.proxyOf.nodes)for(let e of s.proxyOf.nodes)dn(e)}let fe=class mn extends cl{append(...e){for(let t of e){let r=this.normalize(t,this.last);for(let i of r)this.proxyOf.nodes.push(i)}return this.markDirty(),this}cleanRaws(e){if(super.cleanRaws(e),this.nodes)for(let t of this.nodes)t.cleanRaws(e)}each(e){if(!this.proxyOf.nodes)return;let t=this.getIterator(),r,i;for(;this.indexes[t]<this.proxyOf.nodes.length&&(r=this.indexes[t],i=e(this.proxyOf.nodes[r],r),i!==!1);)this.indexes[t]+=1;return delete this.indexes[t],i}every(e){return this.nodes.every(e)}getIterator(){this.lastEach||(this.lastEach=0),this.indexes||(this.indexes={}),this.lastEach+=1;let e=this.lastEach;return this.indexes[e]=0,e}getProxyProcessor(){return{get(e,t){return t===\"proxyOf\"?e:e[t]?t===\"each\"||typeof t==\"string\"&&t.startsWith(\"walk\")?(...r)=>e[t](...r.map(i=>typeof i==\"function\"?(n,o)=>i(n.toProxy(),o):i)):t===\"every\"||t===\"some\"?r=>e[t]((i,...n)=>r(i.toProxy(),...n)):t===\"root\"?()=>e.root().toProxy():t===\"nodes\"?e.nodes.map(r=>r.toProxy()):t===\"first\"||t===\"last\"?e[t].toProxy():e[t]:e[t]},set(e,t,r){return e[t]===r||(e[t]=r,(t===\"name\"||t===\"params\"||t===\"selector\")&&e.markDirty()),!0}}}index(e){return typeof e==\"number\"?e:(e.proxyOf&&(e=e.proxyOf),this.proxyOf.nodes.indexOf(e))}insertAfter(e,t){let r=this.index(e),i=this.normalize(t,this.proxyOf.nodes[r]).reverse();r=this.index(e);for(let o of i)this.proxyOf.nodes.splice(r+1,0,o);let n;for(let o in this.indexes)n=this.indexes[o],r<n&&(this.indexes[o]=n+i.length);return this.markDirty(),this}insertBefore(e,t){let r=this.index(e),i=r===0?\"prepend\":!1,n=this.normalize(t,this.proxyOf.nodes[r],i).reverse();r=this.index(e);for(let l of n)this.proxyOf.nodes.splice(r,0,l);let o;for(let l in this.indexes)o=this.indexes[l],r<=o&&(this.indexes[l]=o+n.length);return this.markDirty(),this}normalize(e,t){if(typeof e==\"string\")e=pn(hn(e).nodes);else if(typeof e==\"undefined\")e=[];else if(Array.isArray(e)){e=e.slice(0);for(let i of e)i.parent&&i.parent.removeChild(i,\"ignore\")}else if(e.type===\"root\"&&this.type!==\"document\"){e=e.nodes.slice(0);for(let i of e)i.parent&&i.parent.removeChild(i,\"ignore\")}else if(e.type)e=[e];else if(e.prop){if(typeof e.value==\"undefined\")throw new Error(\"Value field is missed in node creation\");typeof e.value!=\"string\"&&(e.value=String(e.value)),e=[new un(e)]}else if(e.selector)e=[new gs(e)];else if(e.name)e=[new ys(e)];else if(e.text)e=[new cn(e)];else throw new Error(\"Unknown node type in node creation\");return e.map(i=>(i[ln]||mn.rebuild(i),i=i.proxyOf,i.parent&&i.parent.removeChild(i),i[an]&&dn(i),typeof i.raws.before==\"undefined\"&&t&&typeof t.raws.before!=\"undefined\"&&(i.raws.before=t.raws.before.replace(/\\\\S/g,\"\")),i.parent=this.proxyOf,i))}prepend(...e){e=e.reverse();for(let t of e){let r=this.normalize(t,this.first,\"prepend\").reverse();for(let i of r)this.proxyOf.nodes.unshift(i);for(let i in this.indexes)this.indexes[i]=this.indexes[i]+r.length}return this.markDirty(),this}push(e){return e.parent=this,this.proxyOf.nodes.push(e),this}removeAll(){for(let e of this.proxyOf.nodes)e.parent=void 0;return this.proxyOf.nodes=[],this.markDirty(),this}removeChild(e){e=this.index(e),this.proxyOf.nodes[e].parent=void 0,this.proxyOf.nodes.splice(e,1);let t;for(let r in this.indexes)t=this.indexes[r],t>=e&&(this.indexes[r]=t-1);return this.markDirty(),this}replaceValues(e,t,r){return r||(r=t,t={}),this.walkDecls(i=>{t.props&&!t.props.includes(i.prop)||t.fast&&!i.value.includes(t.fast)||(i.value=i.value.replace(e,r))}),this.markDirty(),this}some(e){return this.nodes.some(e)}walk(e){return this.each((t,r)=>{let i;try{i=e(t,r)}catch(n){throw t.addToError(n)}return i!==!1&&t.walk&&(i=t.walk(e)),i})}walkAtRules(e,t){return t?e instanceof RegExp?this.walk((r,i)=>{if(r.type===\"atrule\"&&e.test(r.name))return t(r,i)}):this.walk((r,i)=>{if(r.type===\"atrule\"&&r.name===e)return t(r,i)}):(t=e,this.walk((r,i)=>{if(r.type===\"atrule\")return t(r,i)}))}walkComments(e){return this.walk((t,r)=>{if(t.type===\"comment\")return e(t,r)})}walkDecls(e,t){return t?e instanceof RegExp?this.walk((r,i)=>{if(r.type===\"decl\"&&e.test(r.prop))return t(r,i)}):this.walk((r,i)=>{if(r.type===\"decl\"&&r.prop===e)return t(r,i)}):(t=e,this.walk((r,i)=>{if(r.type===\"decl\")return t(r,i)}))}walkRules(e,t){return t?e instanceof RegExp?this.walk((r,i)=>{if(r.type===\"rule\"&&e.test(r.selector))return t(r,i)}):this.walk((r,i)=>{if(r.type===\"rule\"&&r.selector===e)return t(r,i)}):(t=e,this.walk((r,i)=>{if(r.type===\"rule\")return t(r,i)}))}get first(){if(this.proxyOf.nodes)return this.proxyOf.nodes[0]}get last(){if(this.proxyOf.nodes)return this.proxyOf.nodes[this.proxyOf.nodes.length-1]}};fe.registerParse=s=>{hn=s};fe.registerRule=s=>{gs=s};fe.registerAtRule=s=>{ys=s};fe.registerRoot=s=>{fn=s};var ve=fe;fe.default=fe;fe.rebuild=s=>{s.type===\"atrule\"?Object.setPrototypeOf(s,ys.prototype):s.type===\"rule\"?Object.setPrototypeOf(s,gs.prototype):s.type===\"decl\"?Object.setPrototypeOf(s,un.prototype):s.type===\"comment\"?Object.setPrototypeOf(s,cn.prototype):s.type===\"root\"&&Object.setPrototypeOf(s,fn.prototype),s[ln]=!0,s.nodes&&s.nodes.forEach(e=>{fe.rebuild(e)})};let hl=ve,gn,yn,Je=class extends hl{constructor(e){super(x({type:\"document\"},e)),this.nodes||(this.nodes=[])}toResult(e={}){return new gn(new yn,this,e).stringify()}};Je.registerLazyResult=s=>{gn=s};Je.registerProcessor=s=>{yn=s};var ws=Je;Je.default=Je;let zr=class{constructor(e,t={}){if(this.type=\"warning\",this.text=e,t.node&&t.node.source){let r=t.node.rangeBy(t);this.line=r.start.line,this.column=r.start.column,this.endLine=r.end.line,this.endColumn=r.end.column}for(let r in t)this[r]=t[r]}toString(){return this.node?this.node.error(this.text,{index:this.index,plugin:this.plugin,word:this.word}).message:this.plugin?this.plugin+\": \"+this.text:this.text}};var wn=zr;zr.default=zr;let fl=wn,Wr=class{constructor(e,t,r){this.processor=e,this.messages=[],this.root=t,this.opts=r,this.css=void 0,this.map=void 0}toString(){return this.css}warn(e,t={}){t.plugin||this.lastPlugin&&this.lastPlugin.postcssPlugin&&(t.plugin=this.lastPlugin.postcssPlugin);let r=new fl(e,t);return this.messages.push(r),r}warnings(){return this.messages.filter(e=>e.type===\"warning\")}get content(){return this.css}};var Ss=Wr;Wr.default=Wr;const Cr=39,ni=34,gt=92,oi=47,yt=10,ze=32,wt=12,St=9,bt=13,pl=91,dl=93,ml=40,gl=41,yl=123,wl=125,Sl=59,bl=42,Cl=58,vl=64,Ct=/[\\\\t\\\\n\\\\f\\\\r \"#'()/;[\\\\\\\\\\\\]{}]/g,vt=/[\\\\t\\\\n\\\\f\\\\r !\"#'():;@[\\\\\\\\\\\\]{}]|\\\\/(?=\\\\*)/g,Il=/.[\\\\r\\\\n\"'(/\\\\\\\\]/,ai=/[\\\\da-f]/i;var xl=function(e,t={}){let r=e.css.valueOf(),i=t.ignoreErrors,n,o,l,a,u,c,h,d,m,g,p=r.length,f=0,S=[],b=[];function y(){return f}function C(_){throw e.error(\"Unclosed \"+_,f)}function N(){return b.length===0&&f>=p}function D(_){if(b.length)return b.pop();if(f>=p)return;let G=_?_.ignoreUnclosed:!1;switch(n=r.charCodeAt(f),n){case yt:case ze:case St:case bt:case wt:{o=f;do o+=1,n=r.charCodeAt(o);while(n===ze||n===yt||n===St||n===bt||n===wt);g=[\"space\",r.slice(f,o)],f=o-1;break}case pl:case dl:case yl:case wl:case Cl:case Sl:case gl:{let Y=String.fromCharCode(n);g=[Y,Y,f];break}case ml:{if(d=S.length?S.pop()[1]:\"\",m=r.charCodeAt(f+1),d===\"url\"&&m!==Cr&&m!==ni&&m!==ze&&m!==yt&&m!==St&&m!==wt&&m!==bt){o=f;do{if(c=!1,o=r.indexOf(\")\",o+1),o===-1)if(i||G){o=f;break}else C(\"bracket\");for(h=o;r.charCodeAt(h-1)===gt;)h-=1,c=!c}while(c);g=[\"brackets\",r.slice(f,o+1),f,o],f=o}else o=r.indexOf(\")\",f+1),a=r.slice(f,o+1),o===-1||Il.test(a)?g=[\"(\",\"(\",f]:(g=[\"brackets\",a,f,o],f=o);break}case Cr:case ni:{l=n===Cr?\"'\":'\"',o=f;do{if(c=!1,o=r.indexOf(l,o+1),o===-1)if(i||G){o=f+1;break}else C(\"string\");for(h=o;r.charCodeAt(h-1)===gt;)h-=1,c=!c}while(c);g=[\"string\",r.slice(f,o+1),f,o],f=o;break}case vl:{Ct.lastIndex=f+1,Ct.test(r),Ct.lastIndex===0?o=r.length-1:o=Ct.lastIndex-2,g=[\"at-word\",r.slice(f,o+1),f,o],f=o;break}case gt:{for(o=f,u=!0;r.charCodeAt(o+1)===gt;)o+=1,u=!u;if(n=r.charCodeAt(o+1),u&&n!==oi&&n!==ze&&n!==yt&&n!==St&&n!==bt&&n!==wt&&(o+=1,ai.test(r.charAt(o)))){for(;ai.test(r.charAt(o+1));)o+=1;r.charCodeAt(o+1)===ze&&(o+=1)}g=[\"word\",r.slice(f,o+1),f,o],f=o;break}default:{n===oi&&r.charCodeAt(f+1)===bl?(o=r.indexOf(\"*/\",f+2)+1,o===0&&(i||G?o=r.length:C(\"comment\")),g=[\"comment\",r.slice(f,o+1),f,o],f=o):(vt.lastIndex=f+1,vt.test(r),vt.lastIndex===0?o=r.length-1:o=vt.lastIndex-2,g=[\"word\",r.slice(f,o+1),f,o],S.push(g),f=o);break}}return f++,g}function H(_){b.push(_)}return{back:H,endOfFile:N,nextToken:D,position:y}};let Sn=ve,jt=class extends Sn{constructor(e){super(e),this.type=\"atrule\"}append(...e){return this.proxyOf.nodes||(this.nodes=[]),super.append(...e)}prepend(...e){return this.proxyOf.nodes||(this.nodes=[]),super.prepend(...e)}};var bs=jt;jt.default=jt;Sn.registerAtRule(jt);let bn=ve,Cn,vn,Ne=class extends bn{constructor(e){super(e),this.type=\"root\",this.nodes||(this.nodes=[])}normalize(e,t,r){let i=super.normalize(e);if(t){if(r===\"prepend\")this.nodes.length>1?t.raws.before=this.nodes[1].raws.before:delete t.raws.before;else if(this.first!==t)for(let n of i)n.raws.before=t.raws.before}return i}removeChild(e,t){let r=this.index(e);return!t&&r===0&&this.nodes.length>1&&(this.nodes[1].raws.before=this.nodes[r].raws.before),super.removeChild(e)}toResult(e={}){return new Cn(new vn,this,e).stringify()}};Ne.registerLazyResult=s=>{Cn=s};Ne.registerProcessor=s=>{vn=s};var nt=Ne;Ne.default=Ne;bn.registerRoot(Ne);let Xe={comma(s){return Xe.split(s,[\",\"],!0)},space(s){let e=[\" \",\\`\n\\`,\"\t\"];return Xe.split(s,e)},split(s,e,t){let r=[],i=\"\",n=!1,o=0,l=!1,a=\"\",u=!1;for(let c of s)u?u=!1:c===\"\\\\\\\\\"?u=!0:l?c===a&&(l=!1):c==='\"'||c===\"'\"?(l=!0,a=c):c===\"(\"?o+=1:c===\")\"?o>0&&(o-=1):o===0&&e.includes(c)&&(n=!0),n?(i!==\"\"&&r.push(i.trim()),i=\"\",n=!1):i+=c;return(t||i!==\"\")&&r.push(i.trim()),r}};var In=Xe;Xe.default=Xe;let xn=ve,Ol=In,Ht=class extends xn{constructor(e){super(e),this.type=\"rule\",this.nodes||(this.nodes=[])}get selectors(){return Ol.comma(this.selector)}set selectors(e){let t=this.selector?this.selector.match(/,\\\\s*/):null,r=t?t[0]:\",\"+this.raw(\"between\",\"beforeOpen\");this.selector=e.join(r)}};var Cs=Ht;Ht.default=Ht;xn.registerRule(Ht);let Rl=sr,Al=xl,Ml=nr,El=bs,$l=nt,li=Cs;const ui={empty:!0,space:!0};function Nl(s){for(let e=s.length-1;e>=0;e--){let t=s[e],r=t[3]||t[2];if(r)return r}}let kl=class{constructor(e){this.input=e,this.root=new $l,this.current=this.root,this.spaces=\"\",this.semicolon=!1,this.createTokenizer(),this.root.source={input:e,start:{column:1,line:1,offset:0}}}atrule(e){let t=new El;t.name=e[1].slice(1),t.name===\"\"&&this.unnamedAtrule(t,e),this.init(t,e[2]);let r,i,n,o=!1,l=!1,a=[],u=[];for(;!this.tokenizer.endOfFile();){if(e=this.tokenizer.nextToken(),r=e[0],r===\"(\"||r===\"[\"?u.push(r===\"(\"?\")\":\"]\"):r===\"{\"&&u.length>0?u.push(\"}\"):r===u[u.length-1]&&u.pop(),u.length===0)if(r===\";\"){t.source.end=this.getPosition(e[2]),t.source.end.offset++,this.semicolon=!0;break}else if(r===\"{\"){l=!0;break}else if(r===\"}\"){if(a.length>0){for(n=a.length-1,i=a[n];i&&i[0]===\"space\";)i=a[--n];i&&(t.source.end=this.getPosition(i[3]||i[2]),t.source.end.offset++)}this.end(e);break}else a.push(e);else a.push(e);if(this.tokenizer.endOfFile()){o=!0;break}}t.raws.between=this.spacesAndCommentsFromEnd(a),a.length?(t.raws.afterName=this.spacesAndCommentsFromStart(a),this.raw(t,\"params\",a),o&&(e=a[a.length-1],t.source.end=this.getPosition(e[3]||e[2]),t.source.end.offset++,this.spaces=t.raws.between,t.raws.between=\"\")):(t.raws.afterName=\"\",t.params=\"\"),l&&(t.nodes=[],this.current=t)}checkMissedSemicolon(e){let t=this.colon(e);if(t===!1)return;let r=0,i;for(let n=t-1;n>=0&&(i=e[n],!(i[0]!==\"space\"&&(r+=1,r===2)));n--);throw this.input.error(\"Missed semicolon\",i[0]===\"word\"?i[3]+1:i[2])}colon(e){let t=0,r,i,n;for(let[o,l]of e.entries()){if(r=l,i=r[0],i===\"(\"&&(t+=1),i===\")\"&&(t-=1),t===0&&i===\":\")if(!n)this.doubleColon(r);else{if(n[0]===\"word\"&&n[1]===\"progid\")continue;return o}n=r}return!1}comment(e){let t=new Ml;this.init(t,e[2]),t.source.end=this.getPosition(e[3]||e[2]),t.source.end.offset++;let r=e[1].slice(2,-2);if(/^\\\\s*$/.test(r))t.text=\"\",t.raws.left=r,t.raws.right=\"\";else{let i=r.match(/^(\\\\s*)([^]*\\\\S)(\\\\s*)$/);t.text=i[2],t.raws.left=i[1],t.raws.right=i[3]}}createTokenizer(){this.tokenizer=Al(this.input)}decl(e,t){let r=new Rl;this.init(r,e[0][2]);let i=e[e.length-1];for(i[0]===\";\"&&(this.semicolon=!0,e.pop()),r.source.end=this.getPosition(i[3]||i[2]||Nl(e)),r.source.end.offset++;e[0][0]!==\"word\";)e.length===1&&this.unknownWord(e),r.raws.before+=e.shift()[1];for(r.source.start=this.getPosition(e[0][2]),r.prop=\"\";e.length;){let u=e[0][0];if(u===\":\"||u===\"space\"||u===\"comment\")break;r.prop+=e.shift()[1]}r.raws.between=\"\";let n;for(;e.length;)if(n=e.shift(),n[0]===\":\"){r.raws.between+=n[1];break}else n[0]===\"word\"&&/\\\\w/.test(n[1])&&this.unknownWord([n]),r.raws.between+=n[1];(r.prop[0]===\"_\"||r.prop[0]===\"*\")&&(r.raws.before+=r.prop[0],r.prop=r.prop.slice(1));let o=[],l;for(;e.length&&(l=e[0][0],!(l!==\"space\"&&l!==\"comment\"));)o.push(e.shift());this.precheckMissedSemicolon(e);for(let u=e.length-1;u>=0;u--){if(n=e[u],n[1].toLowerCase()===\"!important\"){r.important=!0;let c=this.stringFrom(e,u);c=this.spacesFromEnd(e)+c,c!==\" !important\"&&(r.raws.important=c);break}else if(n[1].toLowerCase()===\"important\"){let c=e.slice(0),h=\"\";for(let d=u;d>0;d--){let m=c[d][0];if(h.trim().indexOf(\"!\")===0&&m!==\"space\")break;h=c.pop()[1]+h}h.trim().indexOf(\"!\")===0&&(r.important=!0,r.raws.important=h,e=c)}if(n[0]!==\"space\"&&n[0]!==\"comment\")break}e.some(u=>u[0]!==\"space\"&&u[0]!==\"comment\")&&(r.raws.between+=o.map(u=>u[1]).join(\"\"),o=[]),this.raw(r,\"value\",o.concat(e),t),r.value.includes(\":\")&&!t&&this.checkMissedSemicolon(e)}doubleColon(e){throw this.input.error(\"Double colon\",{offset:e[2]},{offset:e[2]+e[1].length})}emptyRule(e){let t=new li;this.init(t,e[2]),t.selector=\"\",t.raws.between=\"\",this.current=t}end(e){this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.semicolon=!1,this.current.raws.after=(this.current.raws.after||\"\")+this.spaces,this.spaces=\"\",this.current.parent?(this.current.source.end=this.getPosition(e[2]),this.current.source.end.offset++,this.current=this.current.parent):this.unexpectedClose(e)}endFile(){this.current.parent&&this.unclosedBlock(),this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.current.raws.after=(this.current.raws.after||\"\")+this.spaces,this.root.source.end=this.getPosition(this.tokenizer.position())}freeSemicolon(e){if(this.spaces+=e[1],this.current.nodes){let t=this.current.nodes[this.current.nodes.length-1];t&&t.type===\"rule\"&&!t.raws.ownSemicolon&&(t.raws.ownSemicolon=this.spaces,this.spaces=\"\")}}getPosition(e){let t=this.input.fromOffset(e);return{column:t.col,line:t.line,offset:e}}init(e,t){this.current.push(e),e.source={input:this.input,start:this.getPosition(t)},e.raws.before=this.spaces,this.spaces=\"\",e.type!==\"comment\"&&(this.semicolon=!1)}other(e){let t=!1,r=null,i=!1,n=null,o=[],l=e[1].startsWith(\"--\"),a=[],u=e;for(;u;){if(r=u[0],a.push(u),r===\"(\"||r===\"[\")n||(n=u),o.push(r===\"(\"?\")\":\"]\");else if(l&&i&&r===\"{\")n||(n=u),o.push(\"}\");else if(o.length===0)if(r===\";\")if(i){this.decl(a,l);return}else break;else if(r===\"{\"){this.rule(a);return}else if(r===\"}\"){this.tokenizer.back(a.pop()),t=!0;break}else r===\":\"&&(i=!0);else r===o[o.length-1]&&(o.pop(),o.length===0&&(n=null));u=this.tokenizer.nextToken()}if(this.tokenizer.endOfFile()&&(t=!0),o.length>0&&this.unclosedBracket(n),t&&i){if(!l)for(;a.length&&(u=a[a.length-1][0],!(u!==\"space\"&&u!==\"comment\"));)this.tokenizer.back(a.pop());this.decl(a,l)}else this.unknownWord(a)}parse(){let e;for(;!this.tokenizer.endOfFile();)switch(e=this.tokenizer.nextToken(),e[0]){case\"space\":this.spaces+=e[1];break;case\";\":this.freeSemicolon(e);break;case\"}\":this.end(e);break;case\"comment\":this.comment(e);break;case\"at-word\":this.atrule(e);break;case\"{\":this.emptyRule(e);break;default:this.other(e);break}this.endFile()}precheckMissedSemicolon(){}raw(e,t,r,i){let n,o,l=r.length,a=\"\",u=!0,c,h;for(let d=0;d<l;d+=1)n=r[d],o=n[0],o===\"space\"&&d===l-1&&!i?u=!1:o===\"comment\"?(h=r[d-1]?r[d-1][0]:\"empty\",c=r[d+1]?r[d+1][0]:\"empty\",!ui[h]&&!ui[c]?a.slice(-1)===\",\"?u=!1:a+=n[1]:u=!1):a+=n[1];if(!u){let d=r.reduce((m,g)=>m+g[1],\"\");e.raws[t]={raw:d,value:a}}e[t]=a}rule(e){e.pop();let t=new li;this.init(t,e[0][2]),t.raws.between=this.spacesAndCommentsFromEnd(e),this.raw(t,\"selector\",e),this.current=t}spacesAndCommentsFromEnd(e){let t,r=\"\";for(;e.length&&(t=e[e.length-1][0],!(t!==\"space\"&&t!==\"comment\"));)r=e.pop()[1]+r;return r}spacesAndCommentsFromStart(e){let t,r=\"\";for(;e.length&&(t=e[0][0],!(t!==\"space\"&&t!==\"comment\"));)r+=e.shift()[1];return r}spacesFromEnd(e){let t,r=\"\";for(;e.length&&(t=e[e.length-1][0],t===\"space\");)r=e.pop()[1]+r;return r}stringFrom(e,t){let r=\"\";for(let i=t;i<e.length;i++)r+=e[i][1];return e.splice(t,e.length-t),r}unclosedBlock(){let e=this.current.source.start;throw this.input.error(\"Unclosed block\",e.line,e.column)}unclosedBracket(e){throw this.input.error(\"Unclosed bracket\",{offset:e[2]},{offset:e[2]+1})}unexpectedClose(e){throw this.input.error(\"Unexpected }\",{offset:e[2]},{offset:e[2]+1})}unknownWord(e){throw this.input.error(\"Unknown word\",{offset:e[0][2]},{offset:e[0][2]+e[0][1].length})}unnamedAtrule(e,t){throw this.input.error(\"At-rule without name\",{offset:t[2]},{offset:t[2]+t[1].length})}};var Pl=kl;let Dl=ve,Ll=Pl,Tl=ir;function Yt(s,e){let t=new Tl(s,e),r=new Ll(t);try{r.parse()}catch(i){throw i}return r.root}var vs=Yt;Yt.default=Yt;Dl.registerParse(Yt);let{isClean:ue,my:_l}=it,Fl=on,Ul=tr,Bl=ve,zl=ws;let ci=Ss,Wl=vs,Gl=nt;const Vl={atrule:\"AtRule\",comment:\"Comment\",decl:\"Declaration\",document:\"Document\",root:\"Root\",rule:\"Rule\"},jl={AtRule:!0,AtRuleExit:!0,Comment:!0,CommentExit:!0,Declaration:!0,DeclarationExit:!0,Document:!0,DocumentExit:!0,Once:!0,OnceExit:!0,postcssPlugin:!0,prepare:!0,Root:!0,RootExit:!0,Rule:!0,RuleExit:!0},Hl={Once:!0,postcssPlugin:!0,prepare:!0},ke=0;function We(s){return typeof s==\"object\"&&typeof s.then==\"function\"}function On(s){let e=!1,t=Vl[s.type];return s.type===\"decl\"?e=s.prop.toLowerCase():s.type===\"atrule\"&&(e=s.name.toLowerCase()),e&&s.append?[t,t+\"-\"+e,ke,t+\"Exit\",t+\"Exit-\"+e]:e?[t,t+\"-\"+e,t+\"Exit\",t+\"Exit-\"+e]:s.append?[t,ke,t+\"Exit\"]:[t,t+\"Exit\"]}function hi(s){let e;return s.type===\"document\"?e=[\"Document\",ke,\"DocumentExit\"]:s.type===\"root\"?e=[\"Root\",ke,\"RootExit\"]:e=On(s),{eventIndex:0,events:e,iterator:0,node:s,visitorIndex:0,visitors:[]}}function Gr(s){return s[ue]=!1,s.nodes&&s.nodes.forEach(e=>Gr(e)),s}let Vr={},Pe=class Rn{constructor(e,t,r){this.stringified=!1,this.processed=!1;let i;if(typeof t==\"object\"&&t!==null&&(t.type===\"root\"||t.type===\"document\"))i=Gr(t);else if(t instanceof Rn||t instanceof ci)i=Gr(t.root),t.map&&(typeof r.map==\"undefined\"&&(r.map={}),r.map.inline||(r.map.inline=!1),r.map.prev=t.map);else{let n=Wl;r.syntax&&(n=r.syntax.parse),r.parser&&(n=r.parser),n.parse&&(n=n.parse);try{i=n(t,r)}catch(o){this.processed=!0,this.error=o}i&&!i[_l]&&Bl.rebuild(i)}this.result=new ci(e,i,r),this.helpers=ee(x({},Vr),{postcss:Vr,result:this.result}),this.plugins=this.processor.plugins.map(n=>typeof n==\"object\"&&n.prepare?x(x({},n),n.prepare(this.result)):n)}async(){return this.error?Promise.reject(this.error):this.processed?Promise.resolve(this.result):(this.processing||(this.processing=this.runAsync()),this.processing)}catch(e){return this.async().catch(e)}finally(e){return this.async().then(e,e)}getAsyncError(){throw new Error(\"Use process(css).then(cb) to work with async plugins\")}handleError(e,t){let r=this.result.lastPlugin;try{t&&t.addToError(e),this.error=e,e.name===\"CssSyntaxError\"&&!e.plugin?(e.plugin=r.postcssPlugin,e.setMessage()):r.postcssVersion}catch(i){console&&console.error&&console.error(i)}return e}prepareVisitors(){this.listeners={};let e=(t,r,i)=>{this.listeners[r]||(this.listeners[r]=[]),this.listeners[r].push([t,i])};for(let t of this.plugins)if(typeof t==\"object\")for(let r in t){if(!jl[r]&&/^[A-Z]/.test(r))throw new Error(\\`Unknown event \\${r} in \\${t.postcssPlugin}. Try to update PostCSS (\\${this.processor.version} now).\\`);if(!Hl[r])if(typeof t[r]==\"object\")for(let i in t[r])i===\"*\"?e(t,r,t[r][i]):e(t,r+\"-\"+i.toLowerCase(),t[r][i]);else typeof t[r]==\"function\"&&e(t,r,t[r])}this.hasListener=Object.keys(this.listeners).length>0}async runAsync(){this.plugin=0;for(let e=0;e<this.plugins.length;e++){let t=this.plugins[e],r=this.runOnRoot(t);if(We(r))try{await r}catch(i){throw this.handleError(i)}}if(this.prepareVisitors(),this.hasListener){let e=this.result.root;for(;!e[ue];){e[ue]=!0;let t=[hi(e)];for(;t.length>0;){let r=this.visitTick(t);if(We(r))try{await r}catch(i){let n=t[t.length-1].node;throw this.handleError(i,n)}}}if(this.listeners.OnceExit)for(let[t,r]of this.listeners.OnceExit){this.result.lastPlugin=t;try{if(e.type===\"document\"){let i=e.nodes.map(n=>r(n,this.helpers));await Promise.all(i)}else await r(e,this.helpers)}catch(i){throw this.handleError(i)}}}return this.processed=!0,this.stringify()}runOnRoot(e){this.result.lastPlugin=e;try{if(typeof e==\"object\"&&e.Once){if(this.result.root.type===\"document\"){let t=this.result.root.nodes.map(r=>e.Once(r,this.helpers));return We(t[0])?Promise.all(t):t}return e.Once(this.result.root,this.helpers)}else if(typeof e==\"function\")return e(this.result.root,this.result)}catch(t){throw this.handleError(t)}}stringify(){if(this.error)throw this.error;if(this.stringified)return this.result;this.stringified=!0,this.sync();let e=this.result.opts,t=Ul;e.syntax&&(t=e.syntax.stringify),e.stringifier&&(t=e.stringifier),t.stringify&&(t=t.stringify);let i=new Fl(t,this.result.root,this.result.opts).generate();return this.result.css=i[0],this.result.map=i[1],this.result}sync(){if(this.error)throw this.error;if(this.processed)return this.result;if(this.processed=!0,this.processing)throw this.getAsyncError();for(let e of this.plugins){let t=this.runOnRoot(e);if(We(t))throw this.getAsyncError()}if(this.prepareVisitors(),this.hasListener){let e=this.result.root;for(;!e[ue];)e[ue]=!0,this.walkSync(e);if(this.listeners.OnceExit)if(e.type===\"document\")for(let t of e.nodes)this.visitSync(this.listeners.OnceExit,t);else this.visitSync(this.listeners.OnceExit,e)}return this.result}then(e,t){return this.async().then(e,t)}toString(){return this.css}visitSync(e,t){for(let[r,i]of e){this.result.lastPlugin=r;let n;try{n=i(t,this.helpers)}catch(o){throw this.handleError(o,t.proxyOf)}if(t.type!==\"root\"&&t.type!==\"document\"&&!t.parent)return!0;if(We(n))throw this.getAsyncError()}}visitTick(e){let t=e[e.length-1],{node:r,visitors:i}=t;if(r.type!==\"root\"&&r.type!==\"document\"&&!r.parent){e.pop();return}if(i.length>0&&t.visitorIndex<i.length){let[o,l]=i[t.visitorIndex];t.visitorIndex+=1,t.visitorIndex===i.length&&(t.visitors=[],t.visitorIndex=0),this.result.lastPlugin=o;try{return l(r.toProxy(),this.helpers)}catch(a){throw this.handleError(a,r)}}if(t.iterator!==0){let o=t.iterator,l;for(;l=r.nodes[r.indexes[o]];)if(r.indexes[o]+=1,!l[ue]){l[ue]=!0,e.push(hi(l));return}t.iterator=0,delete r.indexes[o]}let n=t.events;for(;t.eventIndex<n.length;){let o=n[t.eventIndex];if(t.eventIndex+=1,o===ke){r.nodes&&r.nodes.length&&(r[ue]=!0,t.iterator=r.getIterator());return}else if(this.listeners[o]){t.visitors=this.listeners[o];return}}e.pop()}walkSync(e){e[ue]=!0;let t=On(e);for(let r of t)if(r===ke)e.nodes&&e.each(i=>{i[ue]||this.walkSync(i)});else{let i=this.listeners[r];if(i&&this.visitSync(i,e.toProxy()))return}}warnings(){return this.sync().warnings()}get content(){return this.stringify().content}get css(){return this.stringify().css}get map(){return this.stringify().map}get messages(){return this.sync().messages}get opts(){return this.result.opts}get processor(){return this.result.processor}get root(){return this.sync().root}get[Symbol.toStringTag](){return\"LazyResult\"}};Pe.registerPostcss=s=>{Vr=s};var An=Pe;Pe.default=Pe;Gl.registerLazyResult(Pe);zl.registerLazyResult(Pe);let Yl=on,Zl=tr;let Jl=vs;const Xl=Ss;let jr=class{constructor(e,t,r){t=t.toString(),this.stringified=!1,this._processor=e,this._css=t,this._opts=r,this._map=void 0;let i,n=Zl;this.result=new Xl(this._processor,i,this._opts),this.result.css=t;let o=this;Object.defineProperty(this.result,\"root\",{get(){return o.root}});let l=new Yl(n,i,this._opts,t);if(l.isMap()){let[a,u]=l.generate();a&&(this.result.css=a),u&&(this.result.map=u)}else l.clearAnnotation(),this.result.css=l.css}async(){return this.error?Promise.reject(this.error):Promise.resolve(this.result)}catch(e){return this.async().catch(e)}finally(e){return this.async().then(e,e)}sync(){if(this.error)throw this.error;return this.result}then(e,t){return this.async().then(e,t)}toString(){return this._css}warnings(){return[]}get content(){return this.result.css}get css(){return this.result.css}get map(){return this.result.map}get messages(){return[]}get opts(){return this.result.opts}get processor(){return this.result.processor}get root(){if(this._root)return this._root;let e,t=Jl;try{e=t(this._css,this._opts)}catch(r){this.error=r}if(this.error)throw this.error;return this._root=e,e}get[Symbol.toStringTag](){return\"NoWorkResult\"}};var Kl=jr;jr.default=jr;let Ql=Kl,ql=An,eu=ws,tu=nt,Ke=class{constructor(e=[]){this.version=\"8.4.38\",this.plugins=this.normalize(e)}normalize(e){let t=[];for(let r of e)if(r.postcss===!0?r=r():r.postcss&&(r=r.postcss),typeof r==\"object\"&&Array.isArray(r.plugins))t=t.concat(r.plugins);else if(typeof r==\"object\"&&r.postcssPlugin)t.push(r);else if(typeof r==\"function\")t.push(r);else if(!(typeof r==\"object\"&&(r.parse||r.stringify)))throw new Error(r+\" is not a PostCSS plugin\");return t}process(e,t={}){return!this.plugins.length&&!t.parser&&!t.stringifier&&!t.syntax?new Ql(this,e,t):new ql(this,e,t)}use(e){return this.plugins=this.plugins.concat(this.normalize([e])),this}};var ru=Ke;Ke.default=Ke;tu.registerProcessor(Ke);eu.registerProcessor(Ke);let su=sr,iu=en,nu=nr,ou=bs,au=ir,lu=nt,uu=Cs;function Qe(s,e){if(Array.isArray(s))return s.map(o=>Qe(o));let i=s,{inputs:t}=i,r=xe(i,[\"inputs\"]);if(t){e=[];for(let o of t){let l=ee(x({},o),{__proto__:au.prototype});l.map&&(l.map=ee(x({},l.map),{__proto__:iu.prototype})),e.push(l)}}if(r.nodes&&(r.nodes=s.nodes.map(o=>Qe(o,e))),r.source){let n=r.source,{inputId:o}=n,l=xe(n,[\"inputId\"]);r.source=l,o!=null&&(r.source.input=e[o])}if(r.type===\"root\")return new lu(r);if(r.type===\"decl\")return new su(r);if(r.type===\"rule\")return new uu(r);if(r.type===\"comment\")return new nu(r);if(r.type===\"atrule\")return new ou(r);throw new Error(\"Unknown node type: \"+s.type)}var cu=Qe;Qe.default=Qe;let hu=ms,Mn=sr,fu=An,pu=ve,Is=ru,du=tr,mu=cu,En=ws,gu=wn,$n=nr,Nn=bs,yu=Ss,wu=ir,Su=vs,bu=In,kn=Cs,Pn=nt,Cu=rr;function E(...s){return s.length===1&&Array.isArray(s[0])&&(s=s[0]),new Is(s)}E.plugin=function(e,t){let r=!1;function i(...o){console&&console.warn&&!r&&(r=!0,console.warn(e+\\`: postcss.plugin was deprecated. Migration guide:\nhttps://evilmartians.com/chronicles/postcss-8-plugin-migration\\`),process.env.LANG&&process.env.LANG.startsWith(\"cn\")&&console.warn(e+\\`: \\\\u91CC\\\\u9762 postcss.plugin \\\\u88AB\\\\u5F03\\\\u7528. \\\\u8FC1\\\\u79FB\\\\u6307\\\\u5357:\nhttps://www.w3ctech.com/topic/2226\\`));let l=t(...o);return l.postcssPlugin=e,l.postcssVersion=new Is().version,l}let n;return Object.defineProperty(i,\"postcss\",{get(){return n||(n=i()),n}}),i.process=function(o,l,a){return E([i(a)]).process(o,l)},i};E.stringify=du;E.parse=Su;E.fromJSON=mu;E.list=bu;E.comment=s=>new $n(s);E.atRule=s=>new Nn(s);E.decl=s=>new Mn(s);E.rule=s=>new kn(s);E.root=s=>new Pn(s);E.document=s=>new En(s);E.CssSyntaxError=hu;E.Declaration=Mn;E.Container=pu;E.Processor=Is;E.Document=En;E.Comment=$n;E.Warning=gu;E.AtRule=Nn;E.Result=yu;E.Input=wu;E.Rule=kn;E.Root=Pn;E.Node=Cu;fu.registerPostcss(E);var vu=E;E.default=E;const F=Da(vu);F.stringify;F.fromJSON;F.plugin;F.parse;F.list;F.document;F.comment;F.atRule;F.rule;F.decl;F.root;F.CssSyntaxError;F.Declaration;F.Container;F.Processor;F.Document;F.Comment;F.Warning;F.AtRule;F.Result;F.Input;F.Rule;F.Root;F.Node;var Iu=Object.defineProperty,xu=(s,e,t)=>e in s?Iu(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t,te=(s,e,t)=>xu(s,typeof e!=\"symbol\"?e+\"\":e,t);function Ou(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,\"default\")?s.default:s}function Ru(s){if(s.__esModule)return s;var e=s.default;if(typeof e==\"function\"){var t=function r(){return this instanceof r?Reflect.construct(e,arguments,this.constructor):e.apply(this,arguments)};t.prototype=e.prototype}else t={};return Object.defineProperty(t,\"__esModule\",{value:!0}),Object.keys(s).forEach(function(r){var i=Object.getOwnPropertyDescriptor(s,r);Object.defineProperty(t,r,i.get?i:{enumerable:!0,get:function(){return s[r]}})}),t}var xs={exports:{}},T=String,Dn=function(){return{isColorSupported:!1,reset:T,bold:T,dim:T,italic:T,underline:T,inverse:T,hidden:T,strikethrough:T,black:T,red:T,green:T,yellow:T,blue:T,magenta:T,cyan:T,white:T,gray:T,bgBlack:T,bgRed:T,bgGreen:T,bgYellow:T,bgBlue:T,bgMagenta:T,bgCyan:T,bgWhite:T}};xs.exports=Dn();xs.exports.createColors=Dn;var Au=xs.exports;const Mu={},Eu=Object.freeze(Object.defineProperty({__proto__:null,default:Mu},Symbol.toStringTag,{value:\"Module\"})),ne=Ru(Eu);let fi=Au,pi=ne,Hr=class Ln extends Error{constructor(e,t,r,i,n,o){super(e),this.name=\"CssSyntaxError\",this.reason=e,n&&(this.file=n),i&&(this.source=i),o&&(this.plugin=o),typeof t!=\"undefined\"&&typeof r!=\"undefined\"&&(typeof t==\"number\"?(this.line=t,this.column=r):(this.line=t.line,this.column=t.column,this.endLine=r.line,this.endColumn=r.column)),this.setMessage(),Error.captureStackTrace&&Error.captureStackTrace(this,Ln)}setMessage(){this.message=this.plugin?this.plugin+\": \":\"\",this.message+=this.file?this.file:\"<css input>\",typeof this.line!=\"undefined\"&&(this.message+=\":\"+this.line+\":\"+this.column),this.message+=\": \"+this.reason}showSourceCode(e){if(!this.source)return\"\";let t=this.source;e==null&&(e=fi.isColorSupported),pi&&e&&(t=pi(t));let r=t.split(/\\\\r?\\\\n/),i=Math.max(this.line-3,0),n=Math.min(this.line+2,r.length),o=String(n).length,l,a;if(e){let{bold:u,gray:c,red:h}=fi.createColors(!0);l=d=>u(h(d)),a=d=>c(d)}else l=a=u=>u;return r.slice(i,n).map((u,c)=>{let h=i+1+c,d=\" \"+(\" \"+h).slice(-o)+\" | \";if(h===this.line){let m=a(d.replace(/\\\\d/g,\" \"))+u.slice(0,this.column-1).replace(/[^\\\\t]/g,\" \");return l(\">\")+a(d)+u+\\`\n \\`+m+l(\"^\")}return\" \"+a(d)+u}).join(\\`\n\\`)}toString(){let e=this.showSourceCode();return e&&(e=\\`\n\n\\`+e+\\`\n\\`),this.name+\": \"+this.message+e}};var Os=Hr;Hr.default=Hr;var ot={};ot.isClean=Symbol(\"isClean\");ot.my=Symbol(\"my\");const di={after:\\`\n\\`,beforeClose:\\`\n\\`,beforeComment:\\`\n\\`,beforeDecl:\\`\n\\`,beforeOpen:\" \",beforeRule:\\`\n\\`,colon:\": \",commentLeft:\" \",commentRight:\" \",emptyBody:\"\",indent:\" \",semicolon:!1};function $u(s){return s[0].toUpperCase()+s.slice(1)}let Yr=class{constructor(e){this.builder=e}atrule(e,t){let r=\"@\"+e.name,i=e.params?this.rawValue(e,\"params\"):\"\";if(typeof e.raws.afterName!=\"undefined\"?r+=e.raws.afterName:i&&(r+=\" \"),e.nodes)this.block(e,r+i);else{let n=(e.raws.between||\"\")+(t?\";\":\"\");this.builder(r+i+n,e)}}beforeAfter(e,t){let r;e.type===\"decl\"?r=this.raw(e,null,\"beforeDecl\"):e.type===\"comment\"?r=this.raw(e,null,\"beforeComment\"):t===\"before\"?r=this.raw(e,null,\"beforeRule\"):r=this.raw(e,null,\"beforeClose\");let i=e.parent,n=0;for(;i&&i.type!==\"root\";)n+=1,i=i.parent;if(r.includes(\\`\n\\`)){let o=this.raw(e,null,\"indent\");if(o.length)for(let l=0;l<n;l++)r+=o}return r}block(e,t){let r=this.raw(e,\"between\",\"beforeOpen\");this.builder(t+r+\"{\",e,\"start\");let i;e.nodes&&e.nodes.length?(this.body(e),i=this.raw(e,\"after\")):i=this.raw(e,\"after\",\"emptyBody\"),i&&this.builder(i),this.builder(\"}\",e,\"end\")}body(e){let t=e.nodes.length-1;for(;t>0&&e.nodes[t].type===\"comment\";)t-=1;let r=this.raw(e,\"semicolon\");for(let i=0;i<e.nodes.length;i++){let n=e.nodes[i],o=this.raw(n,\"before\");o&&this.builder(o),this.stringify(n,t!==i||r)}}comment(e){let t=this.raw(e,\"left\",\"commentLeft\"),r=this.raw(e,\"right\",\"commentRight\");this.builder(\"/*\"+t+e.text+r+\"*/\",e)}decl(e,t){let r=this.raw(e,\"between\",\"colon\"),i=e.prop+r+this.rawValue(e,\"value\");e.important&&(i+=e.raws.important||\" !important\"),t&&(i+=\";\"),this.builder(i,e)}document(e){this.body(e)}raw(e,t,r){let i;if(r||(r=t),t&&(i=e.raws[t],typeof i!=\"undefined\"))return i;let n=e.parent;if(r===\"before\"&&(!n||n.type===\"root\"&&n.first===e||n&&n.type===\"document\"))return\"\";if(!n)return di[r];let o=e.root();if(o.rawCache||(o.rawCache={}),typeof o.rawCache[r]!=\"undefined\")return o.rawCache[r];if(r===\"before\"||r===\"after\")return this.beforeAfter(e,r);{let l=\"raw\"+$u(r);this[l]?i=this[l](o,e):o.walk(a=>{if(i=a.raws[t],typeof i!=\"undefined\")return!1})}return typeof i==\"undefined\"&&(i=di[r]),o.rawCache[r]=i,i}rawBeforeClose(e){let t;return e.walk(r=>{if(r.nodes&&r.nodes.length>0&&typeof r.raws.after!=\"undefined\")return t=r.raws.after,t.includes(\\`\n\\`)&&(t=t.replace(/[^\\\\n]+$/,\"\")),!1}),t&&(t=t.replace(/\\\\S/g,\"\")),t}rawBeforeComment(e,t){let r;return e.walkComments(i=>{if(typeof i.raws.before!=\"undefined\")return r=i.raws.before,r.includes(\\`\n\\`)&&(r=r.replace(/[^\\\\n]+$/,\"\")),!1}),typeof r==\"undefined\"?r=this.raw(t,null,\"beforeDecl\"):r&&(r=r.replace(/\\\\S/g,\"\")),r}rawBeforeDecl(e,t){let r;return e.walkDecls(i=>{if(typeof i.raws.before!=\"undefined\")return r=i.raws.before,r.includes(\\`\n\\`)&&(r=r.replace(/[^\\\\n]+$/,\"\")),!1}),typeof r==\"undefined\"?r=this.raw(t,null,\"beforeRule\"):r&&(r=r.replace(/\\\\S/g,\"\")),r}rawBeforeOpen(e){let t;return e.walk(r=>{if(r.type!==\"decl\"&&(t=r.raws.between,typeof t!=\"undefined\"))return!1}),t}rawBeforeRule(e){let t;return e.walk(r=>{if(r.nodes&&(r.parent!==e||e.first!==r)&&typeof r.raws.before!=\"undefined\")return t=r.raws.before,t.includes(\\`\n\\`)&&(t=t.replace(/[^\\\\n]+$/,\"\")),!1}),t&&(t=t.replace(/\\\\S/g,\"\")),t}rawColon(e){let t;return e.walkDecls(r=>{if(typeof r.raws.between!=\"undefined\")return t=r.raws.between.replace(/[^\\\\s:]/g,\"\"),!1}),t}rawEmptyBody(e){let t;return e.walk(r=>{if(r.nodes&&r.nodes.length===0&&(t=r.raws.after,typeof t!=\"undefined\"))return!1}),t}rawIndent(e){if(e.raws.indent)return e.raws.indent;let t;return e.walk(r=>{let i=r.parent;if(i&&i!==e&&i.parent&&i.parent===e&&typeof r.raws.before!=\"undefined\"){let n=r.raws.before.split(\\`\n\\`);return t=n[n.length-1],t=t.replace(/\\\\S/g,\"\"),!1}}),t}rawSemicolon(e){let t;return e.walk(r=>{if(r.nodes&&r.nodes.length&&r.last.type===\"decl\"&&(t=r.raws.semicolon,typeof t!=\"undefined\"))return!1}),t}rawValue(e,t){let r=e[t],i=e.raws[t];return i&&i.value===r?i.raw:r}root(e){this.body(e),e.raws.after&&this.builder(e.raws.after)}rule(e){this.block(e,this.rawValue(e,\"selector\")),e.raws.ownSemicolon&&this.builder(e.raws.ownSemicolon,e,\"end\")}stringify(e,t){if(!this[e.type])throw new Error(\"Unknown AST node type \"+e.type+\". Maybe you need to change PostCSS stringifier.\");this[e.type](e,t)}};var Tn=Yr;Yr.default=Yr;let Nu=Tn;function Zr(s,e){new Nu(e).stringify(s)}var or=Zr;Zr.default=Zr;let{isClean:It,my:ku}=ot,Pu=Os,Du=Tn,Lu=or;function Jr(s,e){let t=new s.constructor;for(let r in s){if(!Object.prototype.hasOwnProperty.call(s,r)||r===\"proxyCache\")continue;let i=s[r],n=typeof i;r===\"parent\"&&n===\"object\"?e&&(t[r]=e):r===\"source\"?t[r]=i:Array.isArray(i)?t[r]=i.map(o=>Jr(o,t)):(n===\"object\"&&i!==null&&(i=Jr(i)),t[r]=i)}return t}let Xr=class{constructor(e={}){this.raws={},this[It]=!1,this[ku]=!0;for(let t in e)if(t===\"nodes\"){this.nodes=[];for(let r of e[t])typeof r.clone==\"function\"?this.append(r.clone()):this.append(r)}else this[t]=e[t]}addToError(e){if(e.postcssNode=this,e.stack&&this.source&&/\\\\n\\\\s{4}at /.test(e.stack)){let t=this.source;e.stack=e.stack.replace(/\\\\n\\\\s{4}at /,\\`$&\\${t.input.from}:\\${t.start.line}:\\${t.start.column}$&\\`)}return e}after(e){return this.parent.insertAfter(this,e),this}assign(e={}){for(let t in e)this[t]=e[t];return this}before(e){return this.parent.insertBefore(this,e),this}cleanRaws(e){delete this.raws.before,delete this.raws.after,e||delete this.raws.between}clone(e={}){let t=Jr(this);for(let r in e)t[r]=e[r];return t}cloneAfter(e={}){let t=this.clone(e);return this.parent.insertAfter(this,t),t}cloneBefore(e={}){let t=this.clone(e);return this.parent.insertBefore(this,t),t}error(e,t={}){if(this.source){let{end:r,start:i}=this.rangeBy(t);return this.source.input.error(e,{column:i.column,line:i.line},{column:r.column,line:r.line},t)}return new Pu(e)}getProxyProcessor(){return{get(e,t){return t===\"proxyOf\"?e:t===\"root\"?()=>e.root().toProxy():e[t]},set(e,t,r){return e[t]===r||(e[t]=r,(t===\"prop\"||t===\"value\"||t===\"name\"||t===\"params\"||t===\"important\"||t===\"text\")&&e.markDirty()),!0}}}markDirty(){if(this[It]){this[It]=!1;let e=this;for(;e=e.parent;)e[It]=!1}}next(){if(!this.parent)return;let e=this.parent.index(this);return this.parent.nodes[e+1]}positionBy(e,t){let r=this.source.start;if(e.index)r=this.positionInside(e.index,t);else if(e.word){t=this.toString();let i=t.indexOf(e.word);i!==-1&&(r=this.positionInside(i,t))}return r}positionInside(e,t){let r=t||this.toString(),i=this.source.start.column,n=this.source.start.line;for(let o=0;o<e;o++)r[o]===\\`\n\\`?(i=1,n+=1):i+=1;return{column:i,line:n}}prev(){if(!this.parent)return;let e=this.parent.index(this);return this.parent.nodes[e-1]}rangeBy(e){let t={column:this.source.start.column,line:this.source.start.line},r=this.source.end?{column:this.source.end.column+1,line:this.source.end.line}:{column:t.column+1,line:t.line};if(e.word){let i=this.toString(),n=i.indexOf(e.word);n!==-1&&(t=this.positionInside(n,i),r=this.positionInside(n+e.word.length,i))}else e.start?t={column:e.start.column,line:e.start.line}:e.index&&(t=this.positionInside(e.index)),e.end?r={column:e.end.column,line:e.end.line}:typeof e.endIndex==\"number\"?r=this.positionInside(e.endIndex):e.index&&(r=this.positionInside(e.index+1));return(r.line<t.line||r.line===t.line&&r.column<=t.column)&&(r={column:t.column+1,line:t.line}),{end:r,start:t}}raw(e,t){return new Du().raw(this,e,t)}remove(){return this.parent&&this.parent.removeChild(this),this.parent=void 0,this}replaceWith(...e){if(this.parent){let t=this,r=!1;for(let i of e)i===this?r=!0:r?(this.parent.insertAfter(t,i),t=i):this.parent.insertBefore(t,i);r||this.remove()}return this}root(){let e=this;for(;e.parent&&e.parent.type!==\"document\";)e=e.parent;return e}toJSON(e,t){let r={},i=t==null;t=t||new Map;let n=0;for(let o in this){if(!Object.prototype.hasOwnProperty.call(this,o)||o===\"parent\"||o===\"proxyCache\")continue;let l=this[o];if(Array.isArray(l))r[o]=l.map(a=>typeof a==\"object\"&&a.toJSON?a.toJSON(null,t):a);else if(typeof l==\"object\"&&l.toJSON)r[o]=l.toJSON(null,t);else if(o===\"source\"){let a=t.get(l.input);a==null&&(a=n,t.set(l.input,n),n++),r[o]={end:l.end,inputId:a,start:l.start}}else r[o]=l}return i&&(r.inputs=[...t.keys()].map(o=>o.toJSON())),r}toProxy(){return this.proxyCache||(this.proxyCache=new Proxy(this,this.getProxyProcessor())),this.proxyCache}toString(e=Lu){e.stringify&&(e=e.stringify);let t=\"\";return e(this,r=>{t+=r}),t}warn(e,t,r){let i={node:this};for(let n in r)i[n]=r[n];return e.warn(t,i)}get proxyOf(){return this}};var ar=Xr;Xr.default=Xr;let Tu=ar,Kr=class extends Tu{constructor(e){e&&typeof e.value!=\"undefined\"&&typeof e.value!=\"string\"&&(e=ee(x({},e),{value:String(e.value)})),super(e),this.type=\"decl\"}get variable(){return this.prop.startsWith(\"--\")||this.prop[0]===\"$\"}};var lr=Kr;Kr.default=Kr;let _u=\"useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict\",Fu=(s,e=21)=>(t=e)=>{let r=\"\",i=t;for(;i--;)r+=s[Math.random()*s.length|0];return r},Uu=(s=21)=>{let e=\"\",t=s;for(;t--;)e+=_u[Math.random()*64|0];return e};var Bu={nanoid:Uu,customAlphabet:Fu};let{SourceMapConsumer:mi,SourceMapGenerator:gi}=ne,{existsSync:zu,readFileSync:Wu}=ne,{dirname:vr,join:Gu}=ne;function Vu(s){return Buffer?Buffer.from(s,\"base64\").toString():window.atob(s)}let Qr=class{constructor(e,t){if(t.map===!1)return;this.loadAnnotation(e),this.inline=this.startWith(this.annotation,\"data:\");let r=t.map?t.map.prev:void 0,i=this.loadMap(t.from,r);!this.mapFile&&t.from&&(this.mapFile=t.from),this.mapFile&&(this.root=vr(this.mapFile)),i&&(this.text=i)}consumer(){return this.consumerCache||(this.consumerCache=new mi(this.text)),this.consumerCache}decodeInline(e){let t=/^data:application\\\\/json;charset=utf-?8;base64,/,r=/^data:application\\\\/json;base64,/,i=/^data:application\\\\/json;charset=utf-?8,/,n=/^data:application\\\\/json,/;if(i.test(e)||n.test(e))return decodeURIComponent(e.substr(RegExp.lastMatch.length));if(t.test(e)||r.test(e))return Vu(e.substr(RegExp.lastMatch.length));let o=e.match(/data:application\\\\/json;([^,]+),/)[1];throw new Error(\"Unsupported source map encoding \"+o)}getAnnotationURL(e){return e.replace(/^\\\\/\\\\*\\\\s*# sourceMappingURL=/,\"\").trim()}isMap(e){return typeof e!=\"object\"?!1:typeof e.mappings==\"string\"||typeof e._mappings==\"string\"||Array.isArray(e.sections)}loadAnnotation(e){let t=e.match(/\\\\/\\\\*\\\\s*# sourceMappingURL=/gm);if(!t)return;let r=e.lastIndexOf(t.pop()),i=e.indexOf(\"*/\",r);r>-1&&i>-1&&(this.annotation=this.getAnnotationURL(e.substring(r,i)))}loadFile(e){if(this.root=vr(e),zu(e))return this.mapFile=e,Wu(e,\"utf-8\").toString().trim()}loadMap(e,t){if(t===!1)return!1;if(t){if(typeof t==\"string\")return t;if(typeof t==\"function\"){let r=t(e);if(r){let i=this.loadFile(r);if(!i)throw new Error(\"Unable to load previous source map: \"+r.toString());return i}}else{if(t instanceof mi)return gi.fromSourceMap(t).toString();if(t instanceof gi)return t.toString();if(this.isMap(t))return JSON.stringify(t);throw new Error(\"Unsupported previous source map format: \"+t.toString())}}else{if(this.inline)return this.decodeInline(this.annotation);if(this.annotation){let r=this.annotation;return e&&(r=Gu(vr(e),r)),this.loadFile(r)}}}startWith(e,t){return e?e.substr(0,t.length)===t:!1}withContent(){return!!(this.consumer().sourcesContent&&this.consumer().sourcesContent.length>0)}};var _n=Qr;Qr.default=Qr;let{SourceMapConsumer:ju,SourceMapGenerator:Hu}=ne,{fileURLToPath:yi,pathToFileURL:xt}=ne,{isAbsolute:qr,resolve:es}=ne,{nanoid:Yu}=Bu,Ir=ne,wi=Os,Zu=_n,xr=Symbol(\"fromOffsetCache\"),Ju=!!(ju&&Hu),Si=!!(es&&qr),Zt=class{constructor(e,t={}){if(e===null||typeof e==\"undefined\"||typeof e==\"object\"&&!e.toString)throw new Error(\\`PostCSS received \\${e} instead of CSS string\\`);if(this.css=e.toString(),this.css[0]===\"\\\\uFEFF\"||this.css[0]===\"\\\\uFFFE\"?(this.hasBOM=!0,this.css=this.css.slice(1)):this.hasBOM=!1,t.from&&(!Si||/^\\\\w+:\\\\/\\\\//.test(t.from)||qr(t.from)?this.file=t.from:this.file=es(t.from)),Si&&Ju){let r=new Zu(this.css,t);if(r.text){this.map=r;let i=r.consumer().file;!this.file&&i&&(this.file=this.mapResolve(i))}}this.file||(this.id=\"<input css \"+Yu(6)+\">\"),this.map&&(this.map.file=this.from)}error(e,t,r,i={}){let n,o,l;if(t&&typeof t==\"object\"){let u=t,c=r;if(typeof u.offset==\"number\"){let h=this.fromOffset(u.offset);t=h.line,r=h.col}else t=u.line,r=u.column;if(typeof c.offset==\"number\"){let h=this.fromOffset(c.offset);o=h.line,l=h.col}else o=c.line,l=c.column}else if(!r){let u=this.fromOffset(t);t=u.line,r=u.col}let a=this.origin(t,r,o,l);return a?n=new wi(e,a.endLine===void 0?a.line:{column:a.column,line:a.line},a.endLine===void 0?a.column:{column:a.endColumn,line:a.endLine},a.source,a.file,i.plugin):n=new wi(e,o===void 0?t:{column:r,line:t},o===void 0?r:{column:l,line:o},this.css,this.file,i.plugin),n.input={column:r,endColumn:l,endLine:o,line:t,source:this.css},this.file&&(xt&&(n.input.url=xt(this.file).toString()),n.input.file=this.file),n}fromOffset(e){let t,r;if(this[xr])r=this[xr];else{let n=this.css.split(\\`\n\\`);r=new Array(n.length);let o=0;for(let l=0,a=n.length;l<a;l++)r[l]=o,o+=n[l].length+1;this[xr]=r}t=r[r.length-1];let i=0;if(e>=t)i=r.length-1;else{let n=r.length-2,o;for(;i<n;)if(o=i+(n-i>>1),e<r[o])n=o-1;else if(e>=r[o+1])i=o+1;else{i=o;break}}return{col:e-r[i]+1,line:i+1}}mapResolve(e){return/^\\\\w+:\\\\/\\\\//.test(e)?e:es(this.map.consumer().sourceRoot||this.map.root||\".\",e)}origin(e,t,r,i){if(!this.map)return!1;let n=this.map.consumer(),o=n.originalPositionFor({column:t,line:e});if(!o.source)return!1;let l;typeof r==\"number\"&&(l=n.originalPositionFor({column:i,line:r}));let a;qr(o.source)?a=xt(o.source):a=new URL(o.source,this.map.consumer().sourceRoot||xt(this.map.mapFile));let u={column:o.column,endColumn:l&&l.column,endLine:l&&l.line,line:o.line,url:a.toString()};if(a.protocol===\"file:\")if(yi)u.file=yi(a);else throw new Error(\"file: protocol is not available in this PostCSS build\");let c=n.sourceContentFor(o.source);return c&&(u.source=c),u}toJSON(){let e={};for(let t of[\"hasBOM\",\"css\",\"file\",\"id\"])this[t]!=null&&(e[t]=this[t]);return this.map&&(e.map=x({},this.map),e.map.consumerCache&&(e.map.consumerCache=void 0)),e}get from(){return this.file||this.id}};var ur=Zt;Zt.default=Zt;Ir&&Ir.registerInput&&Ir.registerInput(Zt);let{SourceMapConsumer:Fn,SourceMapGenerator:Ft}=ne,{dirname:Ut,relative:Un,resolve:Bn,sep:zn}=ne,{pathToFileURL:bi}=ne,Xu=ur,Ku=!!(Fn&&Ft),Qu=!!(Ut&&Bn&&Un&&zn),qu=class{constructor(e,t,r,i){this.stringify=e,this.mapOpts=r.map||{},this.root=t,this.opts=r,this.css=i,this.originalCSS=i,this.usesFileUrls=!this.mapOpts.from&&this.mapOpts.absolute,this.memoizedFileURLs=new Map,this.memoizedPaths=new Map,this.memoizedURLs=new Map}addAnnotation(){let e;this.isInline()?e=\"data:application/json;base64,\"+this.toBase64(this.map.toString()):typeof this.mapOpts.annotation==\"string\"?e=this.mapOpts.annotation:typeof this.mapOpts.annotation==\"function\"?e=this.mapOpts.annotation(this.opts.to,this.root):e=this.outputFile()+\".map\";let t=\\`\n\\`;this.css.includes(\\`\\\\r\n\\`)&&(t=\\`\\\\r\n\\`),this.css+=t+\"/*# sourceMappingURL=\"+e+\" */\"}applyPrevMaps(){for(let e of this.previous()){let t=this.toUrl(this.path(e.file)),r=e.root||Ut(e.file),i;this.mapOpts.sourcesContent===!1?(i=new Fn(e.text),i.sourcesContent&&(i.sourcesContent=null)):i=e.consumer(),this.map.applySourceMap(i,t,this.toUrl(this.path(r)))}}clearAnnotation(){if(this.mapOpts.annotation!==!1)if(this.root){let e;for(let t=this.root.nodes.length-1;t>=0;t--)e=this.root.nodes[t],e.type===\"comment\"&&e.text.indexOf(\"# sourceMappingURL=\")===0&&this.root.removeChild(t)}else this.css&&(this.css=this.css.replace(/\\\\n*?\\\\/\\\\*#[\\\\S\\\\s]*?\\\\*\\\\/$/gm,\"\"))}generate(){if(this.clearAnnotation(),Qu&&Ku&&this.isMap())return this.generateMap();{let e=\"\";return this.stringify(this.root,t=>{e+=t}),[e]}}generateMap(){if(this.root)this.generateString();else if(this.previous().length===1){let e=this.previous()[0].consumer();e.file=this.outputFile(),this.map=Ft.fromSourceMap(e,{ignoreInvalidMapping:!0})}else this.map=new Ft({file:this.outputFile(),ignoreInvalidMapping:!0}),this.map.addMapping({generated:{column:0,line:1},original:{column:0,line:1},source:this.opts.from?this.toUrl(this.path(this.opts.from)):\"<no source>\"});return this.isSourcesContent()&&this.setSourcesContent(),this.root&&this.previous().length>0&&this.applyPrevMaps(),this.isAnnotation()&&this.addAnnotation(),this.isInline()?[this.css]:[this.css,this.map]}generateString(){this.css=\"\",this.map=new Ft({file:this.outputFile(),ignoreInvalidMapping:!0});let e=1,t=1,r=\"<no source>\",i={generated:{column:0,line:0},original:{column:0,line:0},source:\"\"},n,o;this.stringify(this.root,(l,a,u)=>{if(this.css+=l,a&&u!==\"end\"&&(i.generated.line=e,i.generated.column=t-1,a.source&&a.source.start?(i.source=this.sourcePath(a),i.original.line=a.source.start.line,i.original.column=a.source.start.column-1,this.map.addMapping(i)):(i.source=r,i.original.line=1,i.original.column=0,this.map.addMapping(i))),n=l.match(/\\\\n/g),n?(e+=n.length,o=l.lastIndexOf(\\`\n\\`),t=l.length-o):t+=l.length,a&&u!==\"start\"){let c=a.parent||{raws:{}};(!(a.type===\"decl\"||a.type===\"atrule\"&&!a.nodes)||a!==c.last||c.raws.semicolon)&&(a.source&&a.source.end?(i.source=this.sourcePath(a),i.original.line=a.source.end.line,i.original.column=a.source.end.column-1,i.generated.line=e,i.generated.column=t-2,this.map.addMapping(i)):(i.source=r,i.original.line=1,i.original.column=0,i.generated.line=e,i.generated.column=t-1,this.map.addMapping(i)))}})}isAnnotation(){return this.isInline()?!0:typeof this.mapOpts.annotation!=\"undefined\"?this.mapOpts.annotation:this.previous().length?this.previous().some(e=>e.annotation):!0}isInline(){if(typeof this.mapOpts.inline!=\"undefined\")return this.mapOpts.inline;let e=this.mapOpts.annotation;return typeof e!=\"undefined\"&&e!==!0?!1:this.previous().length?this.previous().some(t=>t.inline):!0}isMap(){return typeof this.opts.map!=\"undefined\"?!!this.opts.map:this.previous().length>0}isSourcesContent(){return typeof this.mapOpts.sourcesContent!=\"undefined\"?this.mapOpts.sourcesContent:this.previous().length?this.previous().some(e=>e.withContent()):!0}outputFile(){return this.opts.to?this.path(this.opts.to):this.opts.from?this.path(this.opts.from):\"to.css\"}path(e){if(this.mapOpts.absolute||e.charCodeAt(0)===60||/^\\\\w+:\\\\/\\\\//.test(e))return e;let t=this.memoizedPaths.get(e);if(t)return t;let r=this.opts.to?Ut(this.opts.to):\".\";typeof this.mapOpts.annotation==\"string\"&&(r=Ut(Bn(r,this.mapOpts.annotation)));let i=Un(r,e);return this.memoizedPaths.set(e,i),i}previous(){if(!this.previousMaps)if(this.previousMaps=[],this.root)this.root.walk(e=>{if(e.source&&e.source.input.map){let t=e.source.input.map;this.previousMaps.includes(t)||this.previousMaps.push(t)}});else{let e=new Xu(this.originalCSS,this.opts);e.map&&this.previousMaps.push(e.map)}return this.previousMaps}setSourcesContent(){let e={};if(this.root)this.root.walk(t=>{if(t.source){let r=t.source.input.from;if(r&&!e[r]){e[r]=!0;let i=this.usesFileUrls?this.toFileUrl(r):this.toUrl(this.path(r));this.map.setSourceContent(i,t.source.input.css)}}});else if(this.css){let t=this.opts.from?this.toUrl(this.path(this.opts.from)):\"<no source>\";this.map.setSourceContent(t,this.css)}}sourcePath(e){return this.mapOpts.from?this.toUrl(this.mapOpts.from):this.usesFileUrls?this.toFileUrl(e.source.input.from):this.toUrl(this.path(e.source.input.from))}toBase64(e){return Buffer?Buffer.from(e).toString(\"base64\"):window.btoa(unescape(encodeURIComponent(e)))}toFileUrl(e){let t=this.memoizedFileURLs.get(e);if(t)return t;if(bi){let r=bi(e).toString();return this.memoizedFileURLs.set(e,r),r}else throw new Error(\"\\`map.absolute\\` option is not available in this PostCSS build\")}toUrl(e){let t=this.memoizedURLs.get(e);if(t)return t;zn===\"\\\\\\\\\"&&(e=e.replace(/\\\\\\\\/g,\"/\"));let r=encodeURI(e).replace(/[#?]/g,encodeURIComponent);return this.memoizedURLs.set(e,r),r}};var Wn=qu;let ec=ar,ts=class extends ec{constructor(e){super(e),this.type=\"comment\"}};var cr=ts;ts.default=ts;let{isClean:Gn,my:Vn}=ot,jn=lr,Hn=cr,tc=ar,Yn,Rs,As,Zn;function Jn(s){return s.map(e=>(e.nodes&&(e.nodes=Jn(e.nodes)),delete e.source,e))}function Xn(s){if(s[Gn]=!1,s.proxyOf.nodes)for(let e of s.proxyOf.nodes)Xn(e)}let pe=class Kn extends tc{append(...e){for(let t of e){let r=this.normalize(t,this.last);for(let i of r)this.proxyOf.nodes.push(i)}return this.markDirty(),this}cleanRaws(e){if(super.cleanRaws(e),this.nodes)for(let t of this.nodes)t.cleanRaws(e)}each(e){if(!this.proxyOf.nodes)return;let t=this.getIterator(),r,i;for(;this.indexes[t]<this.proxyOf.nodes.length&&(r=this.indexes[t],i=e(this.proxyOf.nodes[r],r),i!==!1);)this.indexes[t]+=1;return delete this.indexes[t],i}every(e){return this.nodes.every(e)}getIterator(){this.lastEach||(this.lastEach=0),this.indexes||(this.indexes={}),this.lastEach+=1;let e=this.lastEach;return this.indexes[e]=0,e}getProxyProcessor(){return{get(e,t){return t===\"proxyOf\"?e:e[t]?t===\"each\"||typeof t==\"string\"&&t.startsWith(\"walk\")?(...r)=>e[t](...r.map(i=>typeof i==\"function\"?(n,o)=>i(n.toProxy(),o):i)):t===\"every\"||t===\"some\"?r=>e[t]((i,...n)=>r(i.toProxy(),...n)):t===\"root\"?()=>e.root().toProxy():t===\"nodes\"?e.nodes.map(r=>r.toProxy()):t===\"first\"||t===\"last\"?e[t].toProxy():e[t]:e[t]},set(e,t,r){return e[t]===r||(e[t]=r,(t===\"name\"||t===\"params\"||t===\"selector\")&&e.markDirty()),!0}}}index(e){return typeof e==\"number\"?e:(e.proxyOf&&(e=e.proxyOf),this.proxyOf.nodes.indexOf(e))}insertAfter(e,t){let r=this.index(e),i=this.normalize(t,this.proxyOf.nodes[r]).reverse();r=this.index(e);for(let o of i)this.proxyOf.nodes.splice(r+1,0,o);let n;for(let o in this.indexes)n=this.indexes[o],r<n&&(this.indexes[o]=n+i.length);return this.markDirty(),this}insertBefore(e,t){let r=this.index(e),i=r===0?\"prepend\":!1,n=this.normalize(t,this.proxyOf.nodes[r],i).reverse();r=this.index(e);for(let l of n)this.proxyOf.nodes.splice(r,0,l);let o;for(let l in this.indexes)o=this.indexes[l],r<=o&&(this.indexes[l]=o+n.length);return this.markDirty(),this}normalize(e,t){if(typeof e==\"string\")e=Jn(Yn(e).nodes);else if(typeof e==\"undefined\")e=[];else if(Array.isArray(e)){e=e.slice(0);for(let i of e)i.parent&&i.parent.removeChild(i,\"ignore\")}else if(e.type===\"root\"&&this.type!==\"document\"){e=e.nodes.slice(0);for(let i of e)i.parent&&i.parent.removeChild(i,\"ignore\")}else if(e.type)e=[e];else if(e.prop){if(typeof e.value==\"undefined\")throw new Error(\"Value field is missed in node creation\");typeof e.value!=\"string\"&&(e.value=String(e.value)),e=[new jn(e)]}else if(e.selector)e=[new Rs(e)];else if(e.name)e=[new As(e)];else if(e.text)e=[new Hn(e)];else throw new Error(\"Unknown node type in node creation\");return e.map(i=>(i[Vn]||Kn.rebuild(i),i=i.proxyOf,i.parent&&i.parent.removeChild(i),i[Gn]&&Xn(i),typeof i.raws.before==\"undefined\"&&t&&typeof t.raws.before!=\"undefined\"&&(i.raws.before=t.raws.before.replace(/\\\\S/g,\"\")),i.parent=this.proxyOf,i))}prepend(...e){e=e.reverse();for(let t of e){let r=this.normalize(t,this.first,\"prepend\").reverse();for(let i of r)this.proxyOf.nodes.unshift(i);for(let i in this.indexes)this.indexes[i]=this.indexes[i]+r.length}return this.markDirty(),this}push(e){return e.parent=this,this.proxyOf.nodes.push(e),this}removeAll(){for(let e of this.proxyOf.nodes)e.parent=void 0;return this.proxyOf.nodes=[],this.markDirty(),this}removeChild(e){e=this.index(e),this.proxyOf.nodes[e].parent=void 0,this.proxyOf.nodes.splice(e,1);let t;for(let r in this.indexes)t=this.indexes[r],t>=e&&(this.indexes[r]=t-1);return this.markDirty(),this}replaceValues(e,t,r){return r||(r=t,t={}),this.walkDecls(i=>{t.props&&!t.props.includes(i.prop)||t.fast&&!i.value.includes(t.fast)||(i.value=i.value.replace(e,r))}),this.markDirty(),this}some(e){return this.nodes.some(e)}walk(e){return this.each((t,r)=>{let i;try{i=e(t,r)}catch(n){throw t.addToError(n)}return i!==!1&&t.walk&&(i=t.walk(e)),i})}walkAtRules(e,t){return t?e instanceof RegExp?this.walk((r,i)=>{if(r.type===\"atrule\"&&e.test(r.name))return t(r,i)}):this.walk((r,i)=>{if(r.type===\"atrule\"&&r.name===e)return t(r,i)}):(t=e,this.walk((r,i)=>{if(r.type===\"atrule\")return t(r,i)}))}walkComments(e){return this.walk((t,r)=>{if(t.type===\"comment\")return e(t,r)})}walkDecls(e,t){return t?e instanceof RegExp?this.walk((r,i)=>{if(r.type===\"decl\"&&e.test(r.prop))return t(r,i)}):this.walk((r,i)=>{if(r.type===\"decl\"&&r.prop===e)return t(r,i)}):(t=e,this.walk((r,i)=>{if(r.type===\"decl\")return t(r,i)}))}walkRules(e,t){return t?e instanceof RegExp?this.walk((r,i)=>{if(r.type===\"rule\"&&e.test(r.selector))return t(r,i)}):this.walk((r,i)=>{if(r.type===\"rule\"&&r.selector===e)return t(r,i)}):(t=e,this.walk((r,i)=>{if(r.type===\"rule\")return t(r,i)}))}get first(){if(this.proxyOf.nodes)return this.proxyOf.nodes[0]}get last(){if(this.proxyOf.nodes)return this.proxyOf.nodes[this.proxyOf.nodes.length-1]}};pe.registerParse=s=>{Yn=s};pe.registerRule=s=>{Rs=s};pe.registerAtRule=s=>{As=s};pe.registerRoot=s=>{Zn=s};var Ie=pe;pe.default=pe;pe.rebuild=s=>{s.type===\"atrule\"?Object.setPrototypeOf(s,As.prototype):s.type===\"rule\"?Object.setPrototypeOf(s,Rs.prototype):s.type===\"decl\"?Object.setPrototypeOf(s,jn.prototype):s.type===\"comment\"?Object.setPrototypeOf(s,Hn.prototype):s.type===\"root\"&&Object.setPrototypeOf(s,Zn.prototype),s[Vn]=!0,s.nodes&&s.nodes.forEach(e=>{pe.rebuild(e)})};let rc=Ie,Qn,qn,qe=class extends rc{constructor(e){super(x({type:\"document\"},e)),this.nodes||(this.nodes=[])}toResult(e={}){return new Qn(new qn,this,e).stringify()}};qe.registerLazyResult=s=>{Qn=s};qe.registerProcessor=s=>{qn=s};var Ms=qe;qe.default=qe;let rs=class{constructor(e,t={}){if(this.type=\"warning\",this.text=e,t.node&&t.node.source){let r=t.node.rangeBy(t);this.line=r.start.line,this.column=r.start.column,this.endLine=r.end.line,this.endColumn=r.end.column}for(let r in t)this[r]=t[r]}toString(){return this.node?this.node.error(this.text,{index:this.index,plugin:this.plugin,word:this.word}).message:this.plugin?this.plugin+\": \"+this.text:this.text}};var eo=rs;rs.default=rs;let sc=eo,ss=class{constructor(e,t,r){this.processor=e,this.messages=[],this.root=t,this.opts=r,this.css=void 0,this.map=void 0}toString(){return this.css}warn(e,t={}){t.plugin||this.lastPlugin&&this.lastPlugin.postcssPlugin&&(t.plugin=this.lastPlugin.postcssPlugin);let r=new sc(e,t);return this.messages.push(r),r}warnings(){return this.messages.filter(e=>e.type===\"warning\")}get content(){return this.css}};var Es=ss;ss.default=ss;const Or=39,Ci=34,Ot=92,vi=47,Rt=10,Ge=32,At=12,Mt=9,Et=13,ic=91,nc=93,oc=40,ac=41,lc=123,uc=125,cc=59,hc=42,fc=58,pc=64,$t=/[\\\\t\\\\n\\\\f\\\\r \"#'()/;[\\\\\\\\\\\\]{}]/g,Nt=/[\\\\t\\\\n\\\\f\\\\r !\"#'():;@[\\\\\\\\\\\\]{}]|\\\\/(?=\\\\*)/g,dc=/.[\\\\r\\\\n\"'(/\\\\\\\\]/,Ii=/[\\\\da-f]/i;var mc=function(e,t={}){let r=e.css.valueOf(),i=t.ignoreErrors,n,o,l,a,u,c,h,d,m,g,p=r.length,f=0,S=[],b=[];function y(){return f}function C(_){throw e.error(\"Unclosed \"+_,f)}function N(){return b.length===0&&f>=p}function D(_){if(b.length)return b.pop();if(f>=p)return;let G=_?_.ignoreUnclosed:!1;switch(n=r.charCodeAt(f),n){case Rt:case Ge:case Mt:case Et:case At:{o=f;do o+=1,n=r.charCodeAt(o);while(n===Ge||n===Rt||n===Mt||n===Et||n===At);g=[\"space\",r.slice(f,o)],f=o-1;break}case ic:case nc:case lc:case uc:case fc:case cc:case ac:{let Y=String.fromCharCode(n);g=[Y,Y,f];break}case oc:{if(d=S.length?S.pop()[1]:\"\",m=r.charCodeAt(f+1),d===\"url\"&&m!==Or&&m!==Ci&&m!==Ge&&m!==Rt&&m!==Mt&&m!==At&&m!==Et){o=f;do{if(c=!1,o=r.indexOf(\")\",o+1),o===-1)if(i||G){o=f;break}else C(\"bracket\");for(h=o;r.charCodeAt(h-1)===Ot;)h-=1,c=!c}while(c);g=[\"brackets\",r.slice(f,o+1),f,o],f=o}else o=r.indexOf(\")\",f+1),a=r.slice(f,o+1),o===-1||dc.test(a)?g=[\"(\",\"(\",f]:(g=[\"brackets\",a,f,o],f=o);break}case Or:case Ci:{l=n===Or?\"'\":'\"',o=f;do{if(c=!1,o=r.indexOf(l,o+1),o===-1)if(i||G){o=f+1;break}else C(\"string\");for(h=o;r.charCodeAt(h-1)===Ot;)h-=1,c=!c}while(c);g=[\"string\",r.slice(f,o+1),f,o],f=o;break}case pc:{$t.lastIndex=f+1,$t.test(r),$t.lastIndex===0?o=r.length-1:o=$t.lastIndex-2,g=[\"at-word\",r.slice(f,o+1),f,o],f=o;break}case Ot:{for(o=f,u=!0;r.charCodeAt(o+1)===Ot;)o+=1,u=!u;if(n=r.charCodeAt(o+1),u&&n!==vi&&n!==Ge&&n!==Rt&&n!==Mt&&n!==Et&&n!==At&&(o+=1,Ii.test(r.charAt(o)))){for(;Ii.test(r.charAt(o+1));)o+=1;r.charCodeAt(o+1)===Ge&&(o+=1)}g=[\"word\",r.slice(f,o+1),f,o],f=o;break}default:{n===vi&&r.charCodeAt(f+1)===hc?(o=r.indexOf(\"*/\",f+2)+1,o===0&&(i||G?o=r.length:C(\"comment\")),g=[\"comment\",r.slice(f,o+1),f,o],f=o):(Nt.lastIndex=f+1,Nt.test(r),Nt.lastIndex===0?o=r.length-1:o=Nt.lastIndex-2,g=[\"word\",r.slice(f,o+1),f,o],S.push(g),f=o);break}}return f++,g}function H(_){b.push(_)}return{back:H,endOfFile:N,nextToken:D,position:y}};let to=Ie,Jt=class extends to{constructor(e){super(e),this.type=\"atrule\"}append(...e){return this.proxyOf.nodes||(this.nodes=[]),super.append(...e)}prepend(...e){return this.proxyOf.nodes||(this.nodes=[]),super.prepend(...e)}};var $s=Jt;Jt.default=Jt;to.registerAtRule(Jt);let ro=Ie,so,io,De=class extends ro{constructor(e){super(e),this.type=\"root\",this.nodes||(this.nodes=[])}normalize(e,t,r){let i=super.normalize(e);if(t){if(r===\"prepend\")this.nodes.length>1?t.raws.before=this.nodes[1].raws.before:delete t.raws.before;else if(this.first!==t)for(let n of i)n.raws.before=t.raws.before}return i}removeChild(e,t){let r=this.index(e);return!t&&r===0&&this.nodes.length>1&&(this.nodes[1].raws.before=this.nodes[r].raws.before),super.removeChild(e)}toResult(e={}){return new so(new io,this,e).stringify()}};De.registerLazyResult=s=>{so=s};De.registerProcessor=s=>{io=s};var at=De;De.default=De;ro.registerRoot(De);let et={comma(s){return et.split(s,[\",\"],!0)},space(s){let e=[\" \",\\`\n\\`,\"\t\"];return et.split(s,e)},split(s,e,t){let r=[],i=\"\",n=!1,o=0,l=!1,a=\"\",u=!1;for(let c of s)u?u=!1:c===\"\\\\\\\\\"?u=!0:l?c===a&&(l=!1):c==='\"'||c===\"'\"?(l=!0,a=c):c===\"(\"?o+=1:c===\")\"?o>0&&(o-=1):o===0&&e.includes(c)&&(n=!0),n?(i!==\"\"&&r.push(i.trim()),i=\"\",n=!1):i+=c;return(t||i!==\"\")&&r.push(i.trim()),r}};var no=et;et.default=et;let oo=Ie,gc=no,Xt=class extends oo{constructor(e){super(e),this.type=\"rule\",this.nodes||(this.nodes=[])}get selectors(){return gc.comma(this.selector)}set selectors(e){let t=this.selector?this.selector.match(/,\\\\s*/):null,r=t?t[0]:\",\"+this.raw(\"between\",\"beforeOpen\");this.selector=e.join(r)}};var Ns=Xt;Xt.default=Xt;oo.registerRule(Xt);let yc=lr,wc=mc,Sc=cr,bc=$s,Cc=at,xi=Ns;const Oi={empty:!0,space:!0};function vc(s){for(let e=s.length-1;e>=0;e--){let t=s[e],r=t[3]||t[2];if(r)return r}}let Ic=class{constructor(e){this.input=e,this.root=new Cc,this.current=this.root,this.spaces=\"\",this.semicolon=!1,this.createTokenizer(),this.root.source={input:e,start:{column:1,line:1,offset:0}}}atrule(e){let t=new bc;t.name=e[1].slice(1),t.name===\"\"&&this.unnamedAtrule(t,e),this.init(t,e[2]);let r,i,n,o=!1,l=!1,a=[],u=[];for(;!this.tokenizer.endOfFile();){if(e=this.tokenizer.nextToken(),r=e[0],r===\"(\"||r===\"[\"?u.push(r===\"(\"?\")\":\"]\"):r===\"{\"&&u.length>0?u.push(\"}\"):r===u[u.length-1]&&u.pop(),u.length===0)if(r===\";\"){t.source.end=this.getPosition(e[2]),t.source.end.offset++,this.semicolon=!0;break}else if(r===\"{\"){l=!0;break}else if(r===\"}\"){if(a.length>0){for(n=a.length-1,i=a[n];i&&i[0]===\"space\";)i=a[--n];i&&(t.source.end=this.getPosition(i[3]||i[2]),t.source.end.offset++)}this.end(e);break}else a.push(e);else a.push(e);if(this.tokenizer.endOfFile()){o=!0;break}}t.raws.between=this.spacesAndCommentsFromEnd(a),a.length?(t.raws.afterName=this.spacesAndCommentsFromStart(a),this.raw(t,\"params\",a),o&&(e=a[a.length-1],t.source.end=this.getPosition(e[3]||e[2]),t.source.end.offset++,this.spaces=t.raws.between,t.raws.between=\"\")):(t.raws.afterName=\"\",t.params=\"\"),l&&(t.nodes=[],this.current=t)}checkMissedSemicolon(e){let t=this.colon(e);if(t===!1)return;let r=0,i;for(let n=t-1;n>=0&&(i=e[n],!(i[0]!==\"space\"&&(r+=1,r===2)));n--);throw this.input.error(\"Missed semicolon\",i[0]===\"word\"?i[3]+1:i[2])}colon(e){let t=0,r,i,n;for(let[o,l]of e.entries()){if(r=l,i=r[0],i===\"(\"&&(t+=1),i===\")\"&&(t-=1),t===0&&i===\":\")if(!n)this.doubleColon(r);else{if(n[0]===\"word\"&&n[1]===\"progid\")continue;return o}n=r}return!1}comment(e){let t=new Sc;this.init(t,e[2]),t.source.end=this.getPosition(e[3]||e[2]),t.source.end.offset++;let r=e[1].slice(2,-2);if(/^\\\\s*$/.test(r))t.text=\"\",t.raws.left=r,t.raws.right=\"\";else{let i=r.match(/^(\\\\s*)([^]*\\\\S)(\\\\s*)$/);t.text=i[2],t.raws.left=i[1],t.raws.right=i[3]}}createTokenizer(){this.tokenizer=wc(this.input)}decl(e,t){let r=new yc;this.init(r,e[0][2]);let i=e[e.length-1];for(i[0]===\";\"&&(this.semicolon=!0,e.pop()),r.source.end=this.getPosition(i[3]||i[2]||vc(e)),r.source.end.offset++;e[0][0]!==\"word\";)e.length===1&&this.unknownWord(e),r.raws.before+=e.shift()[1];for(r.source.start=this.getPosition(e[0][2]),r.prop=\"\";e.length;){let u=e[0][0];if(u===\":\"||u===\"space\"||u===\"comment\")break;r.prop+=e.shift()[1]}r.raws.between=\"\";let n;for(;e.length;)if(n=e.shift(),n[0]===\":\"){r.raws.between+=n[1];break}else n[0]===\"word\"&&/\\\\w/.test(n[1])&&this.unknownWord([n]),r.raws.between+=n[1];(r.prop[0]===\"_\"||r.prop[0]===\"*\")&&(r.raws.before+=r.prop[0],r.prop=r.prop.slice(1));let o=[],l;for(;e.length&&(l=e[0][0],!(l!==\"space\"&&l!==\"comment\"));)o.push(e.shift());this.precheckMissedSemicolon(e);for(let u=e.length-1;u>=0;u--){if(n=e[u],n[1].toLowerCase()===\"!important\"){r.important=!0;let c=this.stringFrom(e,u);c=this.spacesFromEnd(e)+c,c!==\" !important\"&&(r.raws.important=c);break}else if(n[1].toLowerCase()===\"important\"){let c=e.slice(0),h=\"\";for(let d=u;d>0;d--){let m=c[d][0];if(h.trim().indexOf(\"!\")===0&&m!==\"space\")break;h=c.pop()[1]+h}h.trim().indexOf(\"!\")===0&&(r.important=!0,r.raws.important=h,e=c)}if(n[0]!==\"space\"&&n[0]!==\"comment\")break}e.some(u=>u[0]!==\"space\"&&u[0]!==\"comment\")&&(r.raws.between+=o.map(u=>u[1]).join(\"\"),o=[]),this.raw(r,\"value\",o.concat(e),t),r.value.includes(\":\")&&!t&&this.checkMissedSemicolon(e)}doubleColon(e){throw this.input.error(\"Double colon\",{offset:e[2]},{offset:e[2]+e[1].length})}emptyRule(e){let t=new xi;this.init(t,e[2]),t.selector=\"\",t.raws.between=\"\",this.current=t}end(e){this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.semicolon=!1,this.current.raws.after=(this.current.raws.after||\"\")+this.spaces,this.spaces=\"\",this.current.parent?(this.current.source.end=this.getPosition(e[2]),this.current.source.end.offset++,this.current=this.current.parent):this.unexpectedClose(e)}endFile(){this.current.parent&&this.unclosedBlock(),this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.current.raws.after=(this.current.raws.after||\"\")+this.spaces,this.root.source.end=this.getPosition(this.tokenizer.position())}freeSemicolon(e){if(this.spaces+=e[1],this.current.nodes){let t=this.current.nodes[this.current.nodes.length-1];t&&t.type===\"rule\"&&!t.raws.ownSemicolon&&(t.raws.ownSemicolon=this.spaces,this.spaces=\"\")}}getPosition(e){let t=this.input.fromOffset(e);return{column:t.col,line:t.line,offset:e}}init(e,t){this.current.push(e),e.source={input:this.input,start:this.getPosition(t)},e.raws.before=this.spaces,this.spaces=\"\",e.type!==\"comment\"&&(this.semicolon=!1)}other(e){let t=!1,r=null,i=!1,n=null,o=[],l=e[1].startsWith(\"--\"),a=[],u=e;for(;u;){if(r=u[0],a.push(u),r===\"(\"||r===\"[\")n||(n=u),o.push(r===\"(\"?\")\":\"]\");else if(l&&i&&r===\"{\")n||(n=u),o.push(\"}\");else if(o.length===0)if(r===\";\")if(i){this.decl(a,l);return}else break;else if(r===\"{\"){this.rule(a);return}else if(r===\"}\"){this.tokenizer.back(a.pop()),t=!0;break}else r===\":\"&&(i=!0);else r===o[o.length-1]&&(o.pop(),o.length===0&&(n=null));u=this.tokenizer.nextToken()}if(this.tokenizer.endOfFile()&&(t=!0),o.length>0&&this.unclosedBracket(n),t&&i){if(!l)for(;a.length&&(u=a[a.length-1][0],!(u!==\"space\"&&u!==\"comment\"));)this.tokenizer.back(a.pop());this.decl(a,l)}else this.unknownWord(a)}parse(){let e;for(;!this.tokenizer.endOfFile();)switch(e=this.tokenizer.nextToken(),e[0]){case\"space\":this.spaces+=e[1];break;case\";\":this.freeSemicolon(e);break;case\"}\":this.end(e);break;case\"comment\":this.comment(e);break;case\"at-word\":this.atrule(e);break;case\"{\":this.emptyRule(e);break;default:this.other(e);break}this.endFile()}precheckMissedSemicolon(){}raw(e,t,r,i){let n,o,l=r.length,a=\"\",u=!0,c,h;for(let d=0;d<l;d+=1)n=r[d],o=n[0],o===\"space\"&&d===l-1&&!i?u=!1:o===\"comment\"?(h=r[d-1]?r[d-1][0]:\"empty\",c=r[d+1]?r[d+1][0]:\"empty\",!Oi[h]&&!Oi[c]?a.slice(-1)===\",\"?u=!1:a+=n[1]:u=!1):a+=n[1];if(!u){let d=r.reduce((m,g)=>m+g[1],\"\");e.raws[t]={raw:d,value:a}}e[t]=a}rule(e){e.pop();let t=new xi;this.init(t,e[0][2]),t.raws.between=this.spacesAndCommentsFromEnd(e),this.raw(t,\"selector\",e),this.current=t}spacesAndCommentsFromEnd(e){let t,r=\"\";for(;e.length&&(t=e[e.length-1][0],!(t!==\"space\"&&t!==\"comment\"));)r=e.pop()[1]+r;return r}spacesAndCommentsFromStart(e){let t,r=\"\";for(;e.length&&(t=e[0][0],!(t!==\"space\"&&t!==\"comment\"));)r+=e.shift()[1];return r}spacesFromEnd(e){let t,r=\"\";for(;e.length&&(t=e[e.length-1][0],t===\"space\");)r=e.pop()[1]+r;return r}stringFrom(e,t){let r=\"\";for(let i=t;i<e.length;i++)r+=e[i][1];return e.splice(t,e.length-t),r}unclosedBlock(){let e=this.current.source.start;throw this.input.error(\"Unclosed block\",e.line,e.column)}unclosedBracket(e){throw this.input.error(\"Unclosed bracket\",{offset:e[2]},{offset:e[2]+1})}unexpectedClose(e){throw this.input.error(\"Unexpected }\",{offset:e[2]},{offset:e[2]+1})}unknownWord(e){throw this.input.error(\"Unknown word\",{offset:e[0][2]},{offset:e[0][2]+e[0][1].length})}unnamedAtrule(e,t){throw this.input.error(\"At-rule without name\",{offset:t[2]},{offset:t[2]+t[1].length})}};var xc=Ic;let Oc=Ie,Rc=xc,Ac=ur;function Kt(s,e){let t=new Ac(s,e),r=new Rc(t);try{r.parse()}catch(i){throw i}return r.root}var ks=Kt;Kt.default=Kt;Oc.registerParse(Kt);let{isClean:ce,my:Mc}=ot,Ec=Wn,$c=or,Nc=Ie,kc=Ms;let Ri=Es,Pc=ks,Dc=at;const Lc={atrule:\"AtRule\",comment:\"Comment\",decl:\"Declaration\",document:\"Document\",root:\"Root\",rule:\"Rule\"},Tc={AtRule:!0,AtRuleExit:!0,Comment:!0,CommentExit:!0,Declaration:!0,DeclarationExit:!0,Document:!0,DocumentExit:!0,Once:!0,OnceExit:!0,postcssPlugin:!0,prepare:!0,Root:!0,RootExit:!0,Rule:!0,RuleExit:!0},_c={Once:!0,postcssPlugin:!0,prepare:!0},Le=0;function Ve(s){return typeof s==\"object\"&&typeof s.then==\"function\"}function ao(s){let e=!1,t=Lc[s.type];return s.type===\"decl\"?e=s.prop.toLowerCase():s.type===\"atrule\"&&(e=s.name.toLowerCase()),e&&s.append?[t,t+\"-\"+e,Le,t+\"Exit\",t+\"Exit-\"+e]:e?[t,t+\"-\"+e,t+\"Exit\",t+\"Exit-\"+e]:s.append?[t,Le,t+\"Exit\"]:[t,t+\"Exit\"]}function Ai(s){let e;return s.type===\"document\"?e=[\"Document\",Le,\"DocumentExit\"]:s.type===\"root\"?e=[\"Root\",Le,\"RootExit\"]:e=ao(s),{eventIndex:0,events:e,iterator:0,node:s,visitorIndex:0,visitors:[]}}function is(s){return s[ce]=!1,s.nodes&&s.nodes.forEach(e=>is(e)),s}let ns={},Te=class lo{constructor(e,t,r){this.stringified=!1,this.processed=!1;let i;if(typeof t==\"object\"&&t!==null&&(t.type===\"root\"||t.type===\"document\"))i=is(t);else if(t instanceof lo||t instanceof Ri)i=is(t.root),t.map&&(typeof r.map==\"undefined\"&&(r.map={}),r.map.inline||(r.map.inline=!1),r.map.prev=t.map);else{let n=Pc;r.syntax&&(n=r.syntax.parse),r.parser&&(n=r.parser),n.parse&&(n=n.parse);try{i=n(t,r)}catch(o){this.processed=!0,this.error=o}i&&!i[Mc]&&Nc.rebuild(i)}this.result=new Ri(e,i,r),this.helpers=ee(x({},ns),{postcss:ns,result:this.result}),this.plugins=this.processor.plugins.map(n=>typeof n==\"object\"&&n.prepare?x(x({},n),n.prepare(this.result)):n)}async(){return this.error?Promise.reject(this.error):this.processed?Promise.resolve(this.result):(this.processing||(this.processing=this.runAsync()),this.processing)}catch(e){return this.async().catch(e)}finally(e){return this.async().then(e,e)}getAsyncError(){throw new Error(\"Use process(css).then(cb) to work with async plugins\")}handleError(e,t){let r=this.result.lastPlugin;try{t&&t.addToError(e),this.error=e,e.name===\"CssSyntaxError\"&&!e.plugin?(e.plugin=r.postcssPlugin,e.setMessage()):r.postcssVersion}catch(i){console&&console.error&&console.error(i)}return e}prepareVisitors(){this.listeners={};let e=(t,r,i)=>{this.listeners[r]||(this.listeners[r]=[]),this.listeners[r].push([t,i])};for(let t of this.plugins)if(typeof t==\"object\")for(let r in t){if(!Tc[r]&&/^[A-Z]/.test(r))throw new Error(\\`Unknown event \\${r} in \\${t.postcssPlugin}. Try to update PostCSS (\\${this.processor.version} now).\\`);if(!_c[r])if(typeof t[r]==\"object\")for(let i in t[r])i===\"*\"?e(t,r,t[r][i]):e(t,r+\"-\"+i.toLowerCase(),t[r][i]);else typeof t[r]==\"function\"&&e(t,r,t[r])}this.hasListener=Object.keys(this.listeners).length>0}async runAsync(){this.plugin=0;for(let e=0;e<this.plugins.length;e++){let t=this.plugins[e],r=this.runOnRoot(t);if(Ve(r))try{await r}catch(i){throw this.handleError(i)}}if(this.prepareVisitors(),this.hasListener){let e=this.result.root;for(;!e[ce];){e[ce]=!0;let t=[Ai(e)];for(;t.length>0;){let r=this.visitTick(t);if(Ve(r))try{await r}catch(i){let n=t[t.length-1].node;throw this.handleError(i,n)}}}if(this.listeners.OnceExit)for(let[t,r]of this.listeners.OnceExit){this.result.lastPlugin=t;try{if(e.type===\"document\"){let i=e.nodes.map(n=>r(n,this.helpers));await Promise.all(i)}else await r(e,this.helpers)}catch(i){throw this.handleError(i)}}}return this.processed=!0,this.stringify()}runOnRoot(e){this.result.lastPlugin=e;try{if(typeof e==\"object\"&&e.Once){if(this.result.root.type===\"document\"){let t=this.result.root.nodes.map(r=>e.Once(r,this.helpers));return Ve(t[0])?Promise.all(t):t}return e.Once(this.result.root,this.helpers)}else if(typeof e==\"function\")return e(this.result.root,this.result)}catch(t){throw this.handleError(t)}}stringify(){if(this.error)throw this.error;if(this.stringified)return this.result;this.stringified=!0,this.sync();let e=this.result.opts,t=$c;e.syntax&&(t=e.syntax.stringify),e.stringifier&&(t=e.stringifier),t.stringify&&(t=t.stringify);let i=new Ec(t,this.result.root,this.result.opts).generate();return this.result.css=i[0],this.result.map=i[1],this.result}sync(){if(this.error)throw this.error;if(this.processed)return this.result;if(this.processed=!0,this.processing)throw this.getAsyncError();for(let e of this.plugins){let t=this.runOnRoot(e);if(Ve(t))throw this.getAsyncError()}if(this.prepareVisitors(),this.hasListener){let e=this.result.root;for(;!e[ce];)e[ce]=!0,this.walkSync(e);if(this.listeners.OnceExit)if(e.type===\"document\")for(let t of e.nodes)this.visitSync(this.listeners.OnceExit,t);else this.visitSync(this.listeners.OnceExit,e)}return this.result}then(e,t){return this.async().then(e,t)}toString(){return this.css}visitSync(e,t){for(let[r,i]of e){this.result.lastPlugin=r;let n;try{n=i(t,this.helpers)}catch(o){throw this.handleError(o,t.proxyOf)}if(t.type!==\"root\"&&t.type!==\"document\"&&!t.parent)return!0;if(Ve(n))throw this.getAsyncError()}}visitTick(e){let t=e[e.length-1],{node:r,visitors:i}=t;if(r.type!==\"root\"&&r.type!==\"document\"&&!r.parent){e.pop();return}if(i.length>0&&t.visitorIndex<i.length){let[o,l]=i[t.visitorIndex];t.visitorIndex+=1,t.visitorIndex===i.length&&(t.visitors=[],t.visitorIndex=0),this.result.lastPlugin=o;try{return l(r.toProxy(),this.helpers)}catch(a){throw this.handleError(a,r)}}if(t.iterator!==0){let o=t.iterator,l;for(;l=r.nodes[r.indexes[o]];)if(r.indexes[o]+=1,!l[ce]){l[ce]=!0,e.push(Ai(l));return}t.iterator=0,delete r.indexes[o]}let n=t.events;for(;t.eventIndex<n.length;){let o=n[t.eventIndex];if(t.eventIndex+=1,o===Le){r.nodes&&r.nodes.length&&(r[ce]=!0,t.iterator=r.getIterator());return}else if(this.listeners[o]){t.visitors=this.listeners[o];return}}e.pop()}walkSync(e){e[ce]=!0;let t=ao(e);for(let r of t)if(r===Le)e.nodes&&e.each(i=>{i[ce]||this.walkSync(i)});else{let i=this.listeners[r];if(i&&this.visitSync(i,e.toProxy()))return}}warnings(){return this.sync().warnings()}get content(){return this.stringify().content}get css(){return this.stringify().css}get map(){return this.stringify().map}get messages(){return this.sync().messages}get opts(){return this.result.opts}get processor(){return this.result.processor}get root(){return this.sync().root}get[Symbol.toStringTag](){return\"LazyResult\"}};Te.registerPostcss=s=>{ns=s};var uo=Te;Te.default=Te;Dc.registerLazyResult(Te);kc.registerLazyResult(Te);let Fc=Wn,Uc=or;let Bc=ks;const zc=Es;let os=class{constructor(e,t,r){t=t.toString(),this.stringified=!1,this._processor=e,this._css=t,this._opts=r,this._map=void 0;let i,n=Uc;this.result=new zc(this._processor,i,this._opts),this.result.css=t;let o=this;Object.defineProperty(this.result,\"root\",{get(){return o.root}});let l=new Fc(n,i,this._opts,t);if(l.isMap()){let[a,u]=l.generate();a&&(this.result.css=a),u&&(this.result.map=u)}else l.clearAnnotation(),this.result.css=l.css}async(){return this.error?Promise.reject(this.error):Promise.resolve(this.result)}catch(e){return this.async().catch(e)}finally(e){return this.async().then(e,e)}sync(){if(this.error)throw this.error;return this.result}then(e,t){return this.async().then(e,t)}toString(){return this._css}warnings(){return[]}get content(){return this.result.css}get css(){return this.result.css}get map(){return this.result.map}get messages(){return[]}get opts(){return this.result.opts}get processor(){return this.result.processor}get root(){if(this._root)return this._root;let e,t=Bc;try{e=t(this._css,this._opts)}catch(r){this.error=r}if(this.error)throw this.error;return this._root=e,e}get[Symbol.toStringTag](){return\"NoWorkResult\"}};var Wc=os;os.default=os;let Gc=Wc,Vc=uo,jc=Ms,Hc=at,tt=class{constructor(e=[]){this.version=\"8.4.38\",this.plugins=this.normalize(e)}normalize(e){let t=[];for(let r of e)if(r.postcss===!0?r=r():r.postcss&&(r=r.postcss),typeof r==\"object\"&&Array.isArray(r.plugins))t=t.concat(r.plugins);else if(typeof r==\"object\"&&r.postcssPlugin)t.push(r);else if(typeof r==\"function\")t.push(r);else if(!(typeof r==\"object\"&&(r.parse||r.stringify)))throw new Error(r+\" is not a PostCSS plugin\");return t}process(e,t={}){return!this.plugins.length&&!t.parser&&!t.stringifier&&!t.syntax?new Gc(this,e,t):new Vc(this,e,t)}use(e){return this.plugins=this.plugins.concat(this.normalize([e])),this}};var Yc=tt;tt.default=tt;Hc.registerProcessor(tt);jc.registerProcessor(tt);let Zc=lr,Jc=_n,Xc=cr,Kc=$s,Qc=ur,qc=at,eh=Ns;function rt(s,e){if(Array.isArray(s))return s.map(o=>rt(o));let i=s,{inputs:t}=i,r=xe(i,[\"inputs\"]);if(t){e=[];for(let o of t){let l=ee(x({},o),{__proto__:Qc.prototype});l.map&&(l.map=ee(x({},l.map),{__proto__:Jc.prototype})),e.push(l)}}if(r.nodes&&(r.nodes=s.nodes.map(o=>rt(o,e))),r.source){let n=r.source,{inputId:o}=n,l=xe(n,[\"inputId\"]);r.source=l,o!=null&&(r.source.input=e[o])}if(r.type===\"root\")return new qc(r);if(r.type===\"decl\")return new Zc(r);if(r.type===\"rule\")return new eh(r);if(r.type===\"comment\")return new Xc(r);if(r.type===\"atrule\")return new Kc(r);throw new Error(\"Unknown node type: \"+s.type)}var th=rt;rt.default=rt;let rh=Os,co=lr,sh=uo,ih=Ie,Ps=Yc,nh=or,oh=th,ho=Ms,ah=eo,fo=cr,po=$s,lh=Es,uh=ur,ch=ks,hh=no,mo=Ns,go=at,fh=ar;function $(...s){return s.length===1&&Array.isArray(s[0])&&(s=s[0]),new Ps(s)}$.plugin=function(e,t){let r=!1;function i(...o){console&&console.warn&&!r&&(r=!0,console.warn(e+\\`: postcss.plugin was deprecated. Migration guide:\nhttps://evilmartians.com/chronicles/postcss-8-plugin-migration\\`),process.env.LANG&&process.env.LANG.startsWith(\"cn\")&&console.warn(e+\\`: \\\\u91CC\\\\u9762 postcss.plugin \\\\u88AB\\\\u5F03\\\\u7528. \\\\u8FC1\\\\u79FB\\\\u6307\\\\u5357:\nhttps://www.w3ctech.com/topic/2226\\`));let l=t(...o);return l.postcssPlugin=e,l.postcssVersion=new Ps().version,l}let n;return Object.defineProperty(i,\"postcss\",{get(){return n||(n=i()),n}}),i.process=function(o,l,a){return $([i(a)]).process(o,l)},i};$.stringify=nh;$.parse=ch;$.fromJSON=oh;$.list=hh;$.comment=s=>new fo(s);$.atRule=s=>new po(s);$.decl=s=>new co(s);$.rule=s=>new mo(s);$.root=s=>new go(s);$.document=s=>new ho(s);$.CssSyntaxError=rh;$.Declaration=co;$.Container=ih;$.Processor=Ps;$.Document=ho;$.Comment=fo;$.Warning=ah;$.AtRule=po;$.Result=lh;$.Input=uh;$.Rule=mo;$.Root=go;$.Node=fh;sh.registerPostcss($);var ph=$;$.default=$;const U=Ou(ph);U.stringify;U.fromJSON;U.plugin;U.parse;U.list;U.document;U.comment;U.atRule;U.rule;U.decl;U.root;U.CssSyntaxError;U.Declaration;U.Container;U.Processor;U.Document;U.Comment;U.Warning;U.AtRule;U.Result;U.Input;U.Rule;U.Root;U.Node;class Ds{constructor(...e){te(this,\"parentElement\",null),te(this,\"parentNode\",null),te(this,\"ownerDocument\"),te(this,\"firstChild\",null),te(this,\"lastChild\",null),te(this,\"previousSibling\",null),te(this,\"nextSibling\",null),te(this,\"ELEMENT_NODE\",1),te(this,\"TEXT_NODE\",3),te(this,\"nodeType\"),te(this,\"nodeName\"),te(this,\"RRNodeType\")}get childNodes(){const e=[];let t=this.firstChild;for(;t;)e.push(t),t=t.nextSibling;return e}contains(e){if(e instanceof Ds){if(e.ownerDocument!==this.ownerDocument)return!1;if(e===this)return!0}else return!1;for(;e.parentNode;){if(e.parentNode===this)return!0;e=e.parentNode}return!1}appendChild(e){throw new Error(\"RRDomException: Failed to execute 'appendChild' on 'RRNode': This RRNode type does not support this method.\")}insertBefore(e,t){throw new Error(\"RRDomException: Failed to execute 'insertBefore' on 'RRNode': This RRNode type does not support this method.\")}removeChild(e){throw new Error(\"RRDomException: Failed to execute 'removeChild' on 'RRNode': This RRNode type does not support this method.\")}toString(){return\"RRNode\"}}const Mi={Node:[\"childNodes\",\"parentNode\",\"parentElement\",\"textContent\"],ShadowRoot:[\"host\",\"styleSheets\"],Element:[\"shadowRoot\",\"querySelector\",\"querySelectorAll\"],MutationObserver:[]},Ei={Node:[\"contains\",\"getRootNode\"],ShadowRoot:[\"getSelection\"],Element:[],MutationObserver:[\"constructor\"]},kt={},dh=()=>!!globalThis.Zone;function Ls(s){if(kt[s])return kt[s];const e=globalThis[s],t=e.prototype,r=s in Mi?Mi[s]:void 0,i=!!(r&&r.every(l=>{var a,u;return!!((u=(a=Object.getOwnPropertyDescriptor(t,l))==null?void 0:a.get)!=null&&u.toString().includes(\"[native code]\"))})),n=s in Ei?Ei[s]:void 0,o=!!(n&&n.every(l=>{var a;return typeof t[l]==\"function\"&&((a=t[l])==null?void 0:a.toString().includes(\"[native code]\"))}));if(i&&o&&!dh())return kt[s]=e.prototype,e.prototype;try{const l=document.createElement(\"iframe\");document.body.appendChild(l);const a=l.contentWindow;if(!a)return e.prototype;const u=a[s].prototype;return document.body.removeChild(l),u?kt[s]=u:t}catch(l){return t}}const Rr={};function ge(s,e,t){var r;const i=\\`\\${s}.\\${String(t)}\\`;if(Rr[i])return Rr[i].call(e);const n=Ls(s),o=(r=Object.getOwnPropertyDescriptor(n,t))==null?void 0:r.get;return o?(Rr[i]=o,o.call(e)):e[t]}const Ar={};function yo(s,e,t){const r=\\`\\${s}.\\${String(t)}\\`;if(Ar[r])return Ar[r].bind(e);const n=Ls(s)[t];return typeof n!=\"function\"?e[t]:(Ar[r]=n,n.bind(e))}function mh(s){return ge(\"Node\",s,\"childNodes\")}function gh(s){return ge(\"Node\",s,\"parentNode\")}function yh(s){return ge(\"Node\",s,\"parentElement\")}function wh(s){return ge(\"Node\",s,\"textContent\")}function Sh(s,e){return yo(\"Node\",s,\"contains\")(e)}function bh(s){return yo(\"Node\",s,\"getRootNode\")()}function Ch(s){return!s||!(\"host\"in s)?null:ge(\"ShadowRoot\",s,\"host\")}function vh(s){return s.styleSheets}function Ih(s){return!s||!(\"shadowRoot\"in s)?null:ge(\"Element\",s,\"shadowRoot\")}function xh(s,e){return ge(\"Element\",s,\"querySelector\")(e)}function Oh(s,e){return ge(\"Element\",s,\"querySelectorAll\")(e)}function wo(){return Ls(\"MutationObserver\").constructor}const v={childNodes:mh,parentNode:gh,parentElement:yh,textContent:wh,contains:Sh,getRootNode:bh,host:Ch,styleSheets:vh,shadowRoot:Ih,querySelector:xh,querySelectorAll:Oh,mutationObserver:wo};function J(s,e,t=document){const r={capture:!0,passive:!0};return t.addEventListener(s,e,r),()=>t.removeEventListener(s,e,r)}const Re=\\`Please stop import mirror directly. Instead of that,\\\\r\nnow you can use replayer.getMirror() to access the mirror instance of a replayer,\\\\r\nor you can use record.mirror to access the mirror instance during recording.\\`;let $i={map:{},getId(){return console.error(Re),-1},getNode(){return console.error(Re),null},removeNodeFromMap(){console.error(Re)},has(){return console.error(Re),!1},reset(){console.error(Re)}};typeof window!=\"undefined\"&&window.Proxy&&window.Reflect&&($i=new Proxy($i,{get(s,e,t){return e===\"map\"&&console.error(Re),Reflect.get(s,e,t)}}));function st(s,e,t={}){let r=null,i=0;return function(...n){const o=Date.now();!i&&t.leading===!1&&(i=o);const l=e-(o-i),a=this;l<=0||l>e?(r&&(clearTimeout(r),r=null),i=o,s.apply(a,n)):!r&&t.trailing!==!1&&(r=setTimeout(()=>{i=t.leading===!1?0:Date.now(),r=null,s.apply(a,n)},l))}}function hr(s,e,t,r,i=window){const n=i.Object.getOwnPropertyDescriptor(s,e);return i.Object.defineProperty(s,e,r?t:{set(o){setTimeout(()=>{t.set.call(this,o)},0),n&&n.set&&n.set.call(this,o)}}),()=>hr(s,e,n||{},!0)}function Fe(s,e,t){try{if(!(e in s))return()=>{};const r=s[e],i=t(r);return typeof i==\"function\"&&(i.prototype=i.prototype||{},Object.defineProperties(i,{__rrweb_original__:{enumerable:!1,value:r}})),s[e]=i,()=>{s[e]=r}}catch(r){return()=>{}}}let Qt=Date.now;/[1-9][0-9]{12}/.test(Date.now().toString())||(Qt=()=>new Date().getTime());function So(s){var e,t,r,i;const n=s.document;return{left:n.scrollingElement?n.scrollingElement.scrollLeft:s.pageXOffset!==void 0?s.pageXOffset:n.documentElement.scrollLeft||(n==null?void 0:n.body)&&((e=v.parentElement(n.body))==null?void 0:e.scrollLeft)||((t=n==null?void 0:n.body)==null?void 0:t.scrollLeft)||0,top:n.scrollingElement?n.scrollingElement.scrollTop:s.pageYOffset!==void 0?s.pageYOffset:(n==null?void 0:n.documentElement.scrollTop)||(n==null?void 0:n.body)&&((r=v.parentElement(n.body))==null?void 0:r.scrollTop)||((i=n==null?void 0:n.body)==null?void 0:i.scrollTop)||0}}function bo(){return window.innerHeight||document.documentElement&&document.documentElement.clientHeight||document.body&&document.body.clientHeight}function Co(){return window.innerWidth||document.documentElement&&document.documentElement.clientWidth||document.body&&document.body.clientWidth}function vo(s){return s?s.nodeType===s.ELEMENT_NODE?s:v.parentElement(s):null}function X(s,e,t,r){if(!s)return!1;const i=vo(s);if(!i)return!1;try{if(typeof e==\"string\"){if(i.classList.contains(e)||r&&i.closest(\".\"+e)!==null)return!0}else if(Gt(i,e,r))return!0}catch(n){}return!!(t&&(i.matches(t)||r&&i.closest(t)!==null))}function Rh(s,e){return e.getId(s)!==-1}function Mr(s,e,t){return s.tagName===\"TITLE\"&&t.headTitleMutations?!0:e.getId(s)===Ze}function Io(s,e){if(je(s))return!1;const t=e.getId(s);if(!e.has(t))return!0;const r=v.parentNode(s);return r&&r.nodeType===s.DOCUMENT_NODE?!1:r?Io(r,e):!0}function as(s){return!!s.changedTouches}function Ah(s=window){\"NodeList\"in s&&!s.NodeList.prototype.forEach&&(s.NodeList.prototype.forEach=Array.prototype.forEach),\"DOMTokenList\"in s&&!s.DOMTokenList.prototype.forEach&&(s.DOMTokenList.prototype.forEach=Array.prototype.forEach)}function xo(s,e){return!!(s.nodeName===\"IFRAME\"&&e.getMeta(s))}function Oo(s,e){return!!(s.nodeName===\"LINK\"&&s.nodeType===s.ELEMENT_NODE&&s.getAttribute&&s.getAttribute(\"rel\")===\"stylesheet\"&&e.getMeta(s))}function ls(s){return s?s instanceof Ds&&\"shadowRoot\"in s?!!s.shadowRoot:!!v.shadowRoot(s):!1}class Mh{constructor(){w(this,\"id\",1),w(this,\"styleIDMap\",new WeakMap),w(this,\"idStyleMap\",new Map)}getId(e){var t;return(t=this.styleIDMap.get(e))!=null?t:-1}has(e){return this.styleIDMap.has(e)}add(e,t){if(this.has(e))return this.getId(e);let r;return t===void 0?r=this.id++:r=t,this.styleIDMap.set(e,r),this.idStyleMap.set(r,e),r}getStyle(e){return this.idStyleMap.get(e)||null}reset(){this.styleIDMap=new WeakMap,this.idStyleMap=new Map,this.id=1}generateId(){return this.id++}}function Ro(s){var e;let t=null;return\"getRootNode\"in s&&((e=v.getRootNode(s))==null?void 0:e.nodeType)===Node.DOCUMENT_FRAGMENT_NODE&&v.host(v.getRootNode(s))&&(t=v.host(v.getRootNode(s))),t}function Eh(s){let e=s,t;for(;t=Ro(e);)e=t;return e}function $h(s){const e=s.ownerDocument;if(!e)return!1;const t=Eh(s);return v.contains(e,t)}function Ao(s){const e=s.ownerDocument;return e?v.contains(e,s)||$h(s):!1}var R=(s=>(s[s.DomContentLoaded=0]=\"DomContentLoaded\",s[s.Load=1]=\"Load\",s[s.FullSnapshot=2]=\"FullSnapshot\",s[s.IncrementalSnapshot=3]=\"IncrementalSnapshot\",s[s.Meta=4]=\"Meta\",s[s.Custom=5]=\"Custom\",s[s.Plugin=6]=\"Plugin\",s))(R||{}),I=(s=>(s[s.Mutation=0]=\"Mutation\",s[s.MouseMove=1]=\"MouseMove\",s[s.MouseInteraction=2]=\"MouseInteraction\",s[s.Scroll=3]=\"Scroll\",s[s.ViewportResize=4]=\"ViewportResize\",s[s.Input=5]=\"Input\",s[s.TouchMove=6]=\"TouchMove\",s[s.MediaInteraction=7]=\"MediaInteraction\",s[s.StyleSheetRule=8]=\"StyleSheetRule\",s[s.CanvasMutation=9]=\"CanvasMutation\",s[s.Font=10]=\"Font\",s[s.Log=11]=\"Log\",s[s.Drag=12]=\"Drag\",s[s.StyleDeclaration=13]=\"StyleDeclaration\",s[s.Selection=14]=\"Selection\",s[s.AdoptedStyleSheet=15]=\"AdoptedStyleSheet\",s[s.CustomElement=16]=\"CustomElement\",s))(I||{}),K=(s=>(s[s.MouseUp=0]=\"MouseUp\",s[s.MouseDown=1]=\"MouseDown\",s[s.Click=2]=\"Click\",s[s.ContextMenu=3]=\"ContextMenu\",s[s.DblClick=4]=\"DblClick\",s[s.Focus=5]=\"Focus\",s[s.Blur=6]=\"Blur\",s[s.TouchStart=7]=\"TouchStart\",s[s.TouchMove_Departed=8]=\"TouchMove_Departed\",s[s.TouchEnd=9]=\"TouchEnd\",s[s.TouchCancel=10]=\"TouchCancel\",s))(K||{}),he=(s=>(s[s.Mouse=0]=\"Mouse\",s[s.Pen=1]=\"Pen\",s[s.Touch=2]=\"Touch\",s))(he||{}),_e=(s=>(s[s[\"2D\"]=0]=\"2D\",s[s.WebGL=1]=\"WebGL\",s[s.WebGL2=2]=\"WebGL2\",s))(_e||{}),Ae=(s=>(s[s.Play=0]=\"Play\",s[s.Pause=1]=\"Pause\",s[s.Seeked=2]=\"Seeked\",s[s.VolumeChange=3]=\"VolumeChange\",s[s.RateChange=4]=\"RateChange\",s))(Ae||{}),Mo=(s=>(s[s.Document=0]=\"Document\",s[s.DocumentType=1]=\"DocumentType\",s[s.Element=2]=\"Element\",s[s.Text=3]=\"Text\",s[s.CDATA=4]=\"CDATA\",s[s.Comment=5]=\"Comment\",s))(Mo||{});function Ni(s){return\"__ln\"in s}class Nh{constructor(){w(this,\"length\",0),w(this,\"head\",null),w(this,\"tail\",null)}get(e){if(e>=this.length)throw new Error(\"Position outside of list range\");let t=this.head;for(let r=0;r<e;r++)t=(t==null?void 0:t.next)||null;return t}addNode(e){const t={value:e,previous:null,next:null};if(e.__ln=t,e.previousSibling&&Ni(e.previousSibling)){const r=e.previousSibling.__ln.next;t.next=r,t.previous=e.previousSibling.__ln,e.previousSibling.__ln.next=t,r&&(r.previous=t)}else if(e.nextSibling&&Ni(e.nextSibling)&&e.nextSibling.__ln.previous){const r=e.nextSibling.__ln.previous;t.previous=r,t.next=e.nextSibling.__ln,e.nextSibling.__ln.previous=t,r&&(r.next=t)}else this.head&&(this.head.previous=t),t.next=this.head,this.head=t;t.next===null&&(this.tail=t),this.length++}removeNode(e){const t=e.__ln;this.head&&(t.previous?(t.previous.next=t.next,t.next?t.next.previous=t.previous:this.tail=t.previous):(this.head=t.next,this.head?this.head.previous=null:this.tail=null),e.__ln&&delete e.__ln,this.length--)}}const ki=(s,e)=>\\`\\${s}@\\${e}\\`;class kh{constructor(){w(this,\"frozen\",!1),w(this,\"locked\",!1),w(this,\"texts\",[]),w(this,\"attributes\",[]),w(this,\"attributeMap\",new WeakMap),w(this,\"removes\",[]),w(this,\"mapRemoves\",[]),w(this,\"movedMap\",{}),w(this,\"addedSet\",new Set),w(this,\"movedSet\",new Set),w(this,\"droppedSet\",new Set),w(this,\"removesSubTreeCache\",new Set),w(this,\"mutationCb\"),w(this,\"blockClass\"),w(this,\"blockSelector\"),w(this,\"maskTextClass\"),w(this,\"maskTextSelector\"),w(this,\"inlineStylesheet\"),w(this,\"maskInputOptions\"),w(this,\"maskTextFn\"),w(this,\"maskInputFn\"),w(this,\"keepIframeSrcFn\"),w(this,\"recordCanvas\"),w(this,\"inlineImages\"),w(this,\"slimDOMOptions\"),w(this,\"dataURLOptions\"),w(this,\"doc\"),w(this,\"mirror\"),w(this,\"iframeManager\"),w(this,\"stylesheetManager\"),w(this,\"shadowDomManager\"),w(this,\"canvasManager\"),w(this,\"processedNodeManager\"),w(this,\"unattachedDoc\"),w(this,\"processMutations\",e=>{e.forEach(this.processMutation),this.emit()}),w(this,\"emit\",()=>{if(this.frozen||this.locked)return;const e=[],t=new Set,r=new Nh,i=a=>{let u=a,c=Ze;for(;c===Ze;)u=u&&u.nextSibling,c=u&&this.mirror.getId(u);return c},n=a=>{const u=v.parentNode(a);if(!u||!Ao(a))return;let c=!1;if(a.nodeType===Node.TEXT_NODE){const g=u.tagName;if(g===\"TEXTAREA\")return;g===\"STYLE\"&&this.addedSet.has(u)&&(c=!0)}const h=je(u)?this.mirror.getId(Ro(a)):this.mirror.getId(u),d=i(a);if(h===-1||d===-1)return r.addNode(a);const m=Ee(a,{doc:this.doc,mirror:this.mirror,blockClass:this.blockClass,blockSelector:this.blockSelector,maskTextClass:this.maskTextClass,maskTextSelector:this.maskTextSelector,skipChild:!0,newlyAddedElement:!0,inlineStylesheet:this.inlineStylesheet,maskInputOptions:this.maskInputOptions,maskTextFn:this.maskTextFn,maskInputFn:this.maskInputFn,slimDOMOptions:this.slimDOMOptions,dataURLOptions:this.dataURLOptions,recordCanvas:this.recordCanvas,inlineImages:this.inlineImages,onSerialize:g=>{xo(g,this.mirror)&&this.iframeManager.addIframe(g),Oo(g,this.mirror)&&this.stylesheetManager.trackLinkElement(g),ls(a)&&this.shadowDomManager.addShadowRoot(v.shadowRoot(a),this.doc)},onIframeLoad:(g,p)=>{this.iframeManager.attachIframe(g,p),this.shadowDomManager.observeAttachShadow(g)},onStylesheetLoad:(g,p)=>{this.stylesheetManager.attachLinkElement(g,p)},cssCaptured:c});m&&(e.push({parentId:h,nextId:d,node:m}),t.add(m.id))};for(;this.mapRemoves.length;)this.mirror.removeNodeFromMap(this.mapRemoves.shift());for(const a of this.movedSet)Pi(this.removesSubTreeCache,a,this.mirror)&&!this.movedSet.has(v.parentNode(a))||n(a);for(const a of this.addedSet)!Di(this.droppedSet,a)&&!Pi(this.removesSubTreeCache,a,this.mirror)||Di(this.movedSet,a)?n(a):this.droppedSet.add(a);let o=null;for(;r.length;){let a=null;if(o){const u=this.mirror.getId(v.parentNode(o.value)),c=i(o.value);u!==-1&&c!==-1&&(a=o)}if(!a){let u=r.tail;for(;u;){const c=u;if(u=u.previous,c){const h=this.mirror.getId(v.parentNode(c.value));if(i(c.value)===-1)continue;if(h!==-1){a=c;break}else{const m=c.value,g=v.parentNode(m);if(g&&g.nodeType===Node.DOCUMENT_FRAGMENT_NODE){const p=v.host(g);if(this.mirror.getId(p)!==-1){a=c;break}}}}}}if(!a){for(;r.head;)r.removeNode(r.head.value);break}o=a.previous,r.removeNode(a.value),n(a.value)}const l={texts:this.texts.map(a=>{const u=a.node,c=v.parentNode(u);return c&&c.tagName===\"TEXTAREA\"&&this.genTextAreaValueMutation(c),{id:this.mirror.getId(u),value:a.value}}).filter(a=>!t.has(a.id)).filter(a=>this.mirror.has(a.id)),attributes:this.attributes.map(a=>{const{attributes:u}=a;if(typeof u.style==\"string\"){const c=JSON.stringify(a.styleDiff),h=JSON.stringify(a._unchangedStyles);c.length<u.style.length&&(c+h).split(\"var(\").length===u.style.split(\"var(\").length&&(u.style=a.styleDiff)}return{id:this.mirror.getId(a.node),attributes:u}}).filter(a=>!t.has(a.id)).filter(a=>this.mirror.has(a.id)),removes:this.removes,adds:e};!l.texts.length&&!l.attributes.length&&!l.removes.length&&!l.adds.length||(this.texts=[],this.attributes=[],this.attributeMap=new WeakMap,this.removes=[],this.addedSet=new Set,this.movedSet=new Set,this.droppedSet=new Set,this.removesSubTreeCache=new Set,this.movedMap={},this.mutationCb(l))}),w(this,\"genTextAreaValueMutation\",e=>{let t=this.attributeMap.get(e);t||(t={node:e,attributes:{},styleDiff:{},_unchangedStyles:{}},this.attributes.push(t),this.attributeMap.set(e,t)),t.attributes.value=Array.from(v.childNodes(e),r=>v.textContent(r)||\"\").join(\"\")}),w(this,\"processMutation\",e=>{if(!Mr(e.target,this.mirror,this.slimDOMOptions))switch(e.type){case\"characterData\":{const t=v.textContent(e.target);!X(e.target,this.blockClass,this.blockSelector,!1)&&t!==e.oldValue&&this.texts.push({value:Xi(e.target,this.maskTextClass,this.maskTextSelector,!0)&&t?this.maskTextFn?this.maskTextFn(t,vo(e.target)):t.replace(/[\\\\S]/g,\"*\"):t,node:e.target});break}case\"attributes\":{const t=e.target;let r=e.attributeName,i=e.target.getAttribute(r);if(r===\"value\"){const o=fs(t);i=hs({element:t,maskInputOptions:this.maskInputOptions,tagName:t.tagName,type:o,value:i,maskInputFn:this.maskInputFn})}if(X(e.target,this.blockClass,this.blockSelector,!1)||i===e.oldValue)return;let n=this.attributeMap.get(e.target);if(t.tagName===\"IFRAME\"&&r===\"src\"&&!this.keepIframeSrcFn(i))if(!t.contentDocument)r=\"rr_src\";else return;if(n||(n={node:e.target,attributes:{},styleDiff:{},_unchangedStyles:{}},this.attributes.push(n),this.attributeMap.set(e.target,n)),r===\"type\"&&t.tagName===\"INPUT\"&&(e.oldValue||\"\").toLowerCase()===\"password\"&&t.setAttribute(\"data-rr-is-password\",\"true\"),!Ji(t.tagName,r))if(n.attributes[r]=Zi(this.doc,Ce(t.tagName),Ce(r),i),r===\"style\"){if(!this.unattachedDoc)try{this.unattachedDoc=document.implementation.createHTMLDocument()}catch(l){this.unattachedDoc=this.doc}const o=this.unattachedDoc.createElement(\"span\");e.oldValue&&o.setAttribute(\"style\",e.oldValue);for(const l of Array.from(t.style)){const a=t.style.getPropertyValue(l),u=t.style.getPropertyPriority(l);a!==o.style.getPropertyValue(l)||u!==o.style.getPropertyPriority(l)?u===\"\"?n.styleDiff[l]=a:n.styleDiff[l]=[a,u]:n._unchangedStyles[l]=[a,u]}for(const l of Array.from(o.style))t.style.getPropertyValue(l)===\"\"&&(n.styleDiff[l]=!1)}else r===\"open\"&&t.tagName===\"DIALOG\"&&(t.matches(\"dialog:modal\")?n.attributes.rr_open_mode=\"modal\":n.attributes.rr_open_mode=\"non-modal\");break}case\"childList\":{if(X(e.target,this.blockClass,this.blockSelector,!0))return;if(e.target.tagName===\"TEXTAREA\"){this.genTextAreaValueMutation(e.target);return}e.addedNodes.forEach(t=>this.genAdds(t,e.target)),e.removedNodes.forEach(t=>{const r=this.mirror.getId(t),i=je(e.target)?this.mirror.getId(v.host(e.target)):this.mirror.getId(e.target);X(e.target,this.blockClass,this.blockSelector,!1)||Mr(t,this.mirror,this.slimDOMOptions)||!Rh(t,this.mirror)||(this.addedSet.has(t)?(us(this.addedSet,t),this.droppedSet.add(t)):this.addedSet.has(e.target)&&r===-1||Io(e.target,this.mirror)||(this.movedSet.has(t)&&this.movedMap[ki(r,i)]?us(this.movedSet,t):(this.removes.push({parentId:i,id:r,isShadow:je(e.target)&&He(e.target)?!0:void 0}),Ph(t,this.removesSubTreeCache))),this.mapRemoves.push(t))});break}}}),w(this,\"genAdds\",(e,t)=>{if(!this.processedNodeManager.inOtherBuffer(e,this)&&!(this.addedSet.has(e)||this.movedSet.has(e))){if(this.mirror.hasNode(e)){if(Mr(e,this.mirror,this.slimDOMOptions))return;this.movedSet.add(e);let r=null;t&&this.mirror.hasNode(t)&&(r=this.mirror.getId(t)),r&&r!==-1&&(this.movedMap[ki(this.mirror.getId(e),r)]=!0)}else this.addedSet.add(e),this.droppedSet.delete(e);X(e,this.blockClass,this.blockSelector,!1)||(v.childNodes(e).forEach(r=>this.genAdds(r)),ls(e)&&v.childNodes(v.shadowRoot(e)).forEach(r=>{this.processedNodeManager.add(r,this),this.genAdds(r,e)}))}})}init(e){[\"mutationCb\",\"blockClass\",\"blockSelector\",\"maskTextClass\",\"maskTextSelector\",\"inlineStylesheet\",\"maskInputOptions\",\"maskTextFn\",\"maskInputFn\",\"keepIframeSrcFn\",\"recordCanvas\",\"inlineImages\",\"slimDOMOptions\",\"dataURLOptions\",\"doc\",\"mirror\",\"iframeManager\",\"stylesheetManager\",\"shadowDomManager\",\"canvasManager\",\"processedNodeManager\"].forEach(t=>{this[t]=e[t]})}freeze(){this.frozen=!0,this.canvasManager.freeze()}unfreeze(){this.frozen=!1,this.canvasManager.unfreeze(),this.emit()}isFrozen(){return this.frozen}lock(){this.locked=!0,this.canvasManager.lock()}unlock(){this.locked=!1,this.canvasManager.unlock(),this.emit()}reset(){this.shadowDomManager.reset(),this.canvasManager.reset()}}function us(s,e){s.delete(e),v.childNodes(e).forEach(t=>us(s,t))}function Ph(s,e){const t=[s];for(;t.length;){const r=t.pop();e.has(r)||(e.add(r),v.childNodes(r).forEach(i=>t.push(i)))}}function Pi(s,e,t){return s.size===0?!1:Dh(s,e)}function Dh(s,e,t){const r=v.parentNode(e);return r?s.has(r):!1}function Di(s,e){return s.size===0?!1:Eo(s,e)}function Eo(s,e){const t=v.parentNode(e);return t?s.has(t)?!0:Eo(s,t):!1}let Ye;function Lh(s){Ye=s}function Th(){Ye=void 0}const O=s=>Ye?(...t)=>{try{return s(...t)}catch(r){if(Ye&&Ye(r)===!0)return;throw r}}:s,be=[];function lt(s){try{if(\"composedPath\"in s){const e=s.composedPath();if(e.length)return e[0]}else if(\"path\"in s&&s.path.length)return s.path[0]}catch(e){}return s&&s.target}function $o(s,e){const t=new kh;be.push(t),t.init(s);const r=new(wo())(O(t.processMutations.bind(t)));return r.observe(e,{attributes:!0,attributeOldValue:!0,characterData:!0,characterDataOldValue:!0,childList:!0,subtree:!0}),r}function _h({mousemoveCb:s,sampling:e,doc:t,mirror:r}){if(e.mousemove===!1)return()=>{};const i=typeof e.mousemove==\"number\"?e.mousemove:50,n=typeof e.mousemoveCallback==\"number\"?e.mousemoveCallback:500;let o=[],l;const a=st(O(h=>{const d=Date.now()-l;s(o.map(m=>(m.timeOffset-=d,m)),h),o=[],l=null}),n),u=O(st(O(h=>{const d=lt(h),{clientX:m,clientY:g}=as(h)?h.changedTouches[0]:h;l||(l=Qt()),o.push({x:m,y:g,id:r.getId(d),timeOffset:Qt()-l}),a(typeof DragEvent!=\"undefined\"&&h instanceof DragEvent?I.Drag:h instanceof MouseEvent?I.MouseMove:I.TouchMove)}),i,{trailing:!1})),c=[J(\"mousemove\",u,t),J(\"touchmove\",u,t),J(\"drag\",u,t)];return O(()=>{c.forEach(h=>h())})}function Fh({mouseInteractionCb:s,doc:e,mirror:t,blockClass:r,blockSelector:i,sampling:n}){if(n.mouseInteraction===!1)return()=>{};const o=n.mouseInteraction===!0||n.mouseInteraction===void 0?{}:n.mouseInteraction,l=[];let a=null;const u=c=>h=>{const d=lt(h);if(X(d,r,i,!0))return;let m=null,g=c;if(\"pointerType\"in h){switch(h.pointerType){case\"mouse\":m=he.Mouse;break;case\"touch\":m=he.Touch;break;case\"pen\":m=he.Pen;break}m===he.Touch?K[c]===K.MouseDown?g=\"TouchStart\":K[c]===K.MouseUp&&(g=\"TouchEnd\"):he.Pen}else as(h)&&(m=he.Touch);m!==null?(a=m,(g.startsWith(\"Touch\")&&m===he.Touch||g.startsWith(\"Mouse\")&&m===he.Mouse)&&(m=null)):K[c]===K.Click&&(m=a,a=null);const p=as(h)?h.changedTouches[0]:h;if(!p)return;const f=t.getId(d),{clientX:S,clientY:b}=p;O(s)(x({type:K[g],id:f,x:S,y:b},m!==null&&{pointerType:m}))};return Object.keys(K).filter(c=>Number.isNaN(Number(c))&&!c.endsWith(\"_Departed\")&&o[c]!==!1).forEach(c=>{let h=Ce(c);const d=u(c);if(window.PointerEvent)switch(K[c]){case K.MouseDown:case K.MouseUp:h=h.replace(\"mouse\",\"pointer\");break;case K.TouchStart:case K.TouchEnd:return}l.push(J(h,d,e))}),O(()=>{l.forEach(c=>c())})}function No({scrollCb:s,doc:e,mirror:t,blockClass:r,blockSelector:i,sampling:n}){const o=O(st(O(l=>{const a=lt(l);if(!a||X(a,r,i,!0))return;const u=t.getId(a);if(a===e&&e.defaultView){const c=So(e.defaultView);s({id:u,x:c.left,y:c.top})}else s({id:u,x:a.scrollLeft,y:a.scrollTop})}),n.scroll||100));return J(\"scroll\",o,e)}function Uh({viewportResizeCb:s},{win:e}){let t=-1,r=-1;const i=O(st(O(()=>{const n=bo(),o=Co();(t!==n||r!==o)&&(s({width:Number(o),height:Number(n)}),t=n,r=o)}),200));return J(\"resize\",i,e)}const Bh=[\"INPUT\",\"TEXTAREA\",\"SELECT\"],Li=new WeakMap;function zh({inputCb:s,doc:e,mirror:t,blockClass:r,blockSelector:i,ignoreClass:n,ignoreSelector:o,maskInputOptions:l,maskInputFn:a,sampling:u,userTriggeredOnInput:c}){function h(b){let y=lt(b);const C=b.isTrusted,N=y&&y.tagName;if(y&&N===\"OPTION\"&&(y=v.parentElement(y)),!y||!N||Bh.indexOf(N)<0||X(y,r,i,!0)||y.classList.contains(n)||o&&y.matches(o))return;let D=y.value,H=!1;const _=fs(y)||\"\";_===\"radio\"||_===\"checkbox\"?H=y.checked:(l[N.toLowerCase()]||l[_])&&(D=hs({element:y,maskInputOptions:l,tagName:N,type:_,value:D,maskInputFn:a})),d(y,c?{text:D,isChecked:H,userTriggered:C}:{text:D,isChecked:H});const G=y.name;_===\"radio\"&&G&&H&&e.querySelectorAll(\\`input[type=\"radio\"][name=\"\\${G}\"]\\`).forEach(Y=>{if(Y!==y){const Q=Y.value;d(Y,c?{text:Q,isChecked:!H,userTriggered:!1}:{text:Q,isChecked:!H})}})}function d(b,y){const C=Li.get(b);if(!C||C.text!==y.text||C.isChecked!==y.isChecked){Li.set(b,y);const N=t.getId(b);O(s)(ee(x({},y),{id:N}))}}const g=(u.input===\"last\"?[\"change\"]:[\"input\",\"change\"]).map(b=>J(b,O(h),e)),p=e.defaultView;if(!p)return()=>{g.forEach(b=>b())};const f=p.Object.getOwnPropertyDescriptor(p.HTMLInputElement.prototype,\"value\"),S=[[p.HTMLInputElement.prototype,\"value\"],[p.HTMLInputElement.prototype,\"checked\"],[p.HTMLSelectElement.prototype,\"value\"],[p.HTMLTextAreaElement.prototype,\"value\"],[p.HTMLSelectElement.prototype,\"selectedIndex\"],[p.HTMLOptionElement.prototype,\"selected\"]];return f&&f.set&&g.push(...S.map(b=>hr(b[0],b[1],{set(){O(h)({target:this,isTrusted:!1})}},!1,p))),O(()=>{g.forEach(b=>b())})}function qt(s){const e=[];function t(r,i){if(Pt(\"CSSGroupingRule\")&&r.parentRule instanceof CSSGroupingRule||Pt(\"CSSMediaRule\")&&r.parentRule instanceof CSSMediaRule||Pt(\"CSSSupportsRule\")&&r.parentRule instanceof CSSSupportsRule||Pt(\"CSSConditionRule\")&&r.parentRule instanceof CSSConditionRule){const o=Array.from(r.parentRule.cssRules).indexOf(r);i.unshift(o)}else if(r.parentStyleSheet){const o=Array.from(r.parentStyleSheet.cssRules).indexOf(r);i.unshift(o)}return i}return t(s,e)}function de(s,e,t){let r,i;return s?(s.ownerNode?r=e.getId(s.ownerNode):i=t.getId(s),{styleId:i,id:r}):{}}function Wh({styleSheetRuleCb:s,mirror:e,stylesheetManager:t},{win:r}){if(!r.CSSStyleSheet||!r.CSSStyleSheet.prototype)return()=>{};const i=r.CSSStyleSheet.prototype.insertRule;r.CSSStyleSheet.prototype.insertRule=new Proxy(i,{apply:O((c,h,d)=>{const[m,g]=d,{id:p,styleId:f}=de(h,e,t.styleMirror);return(p&&p!==-1||f&&f!==-1)&&s({id:p,styleId:f,adds:[{rule:m,index:g}]}),c.apply(h,d)})}),r.CSSStyleSheet.prototype.addRule=function(c,h,d=this.cssRules.length){const m=\\`\\${c} { \\${h} }\\`;return r.CSSStyleSheet.prototype.insertRule.apply(this,[m,d])};const n=r.CSSStyleSheet.prototype.deleteRule;r.CSSStyleSheet.prototype.deleteRule=new Proxy(n,{apply:O((c,h,d)=>{const[m]=d,{id:g,styleId:p}=de(h,e,t.styleMirror);return(g&&g!==-1||p&&p!==-1)&&s({id:g,styleId:p,removes:[{index:m}]}),c.apply(h,d)})}),r.CSSStyleSheet.prototype.removeRule=function(c){return r.CSSStyleSheet.prototype.deleteRule.apply(this,[c])};let o;r.CSSStyleSheet.prototype.replace&&(o=r.CSSStyleSheet.prototype.replace,r.CSSStyleSheet.prototype.replace=new Proxy(o,{apply:O((c,h,d)=>{const[m]=d,{id:g,styleId:p}=de(h,e,t.styleMirror);return(g&&g!==-1||p&&p!==-1)&&s({id:g,styleId:p,replace:m}),c.apply(h,d)})}));let l;r.CSSStyleSheet.prototype.replaceSync&&(l=r.CSSStyleSheet.prototype.replaceSync,r.CSSStyleSheet.prototype.replaceSync=new Proxy(l,{apply:O((c,h,d)=>{const[m]=d,{id:g,styleId:p}=de(h,e,t.styleMirror);return(g&&g!==-1||p&&p!==-1)&&s({id:g,styleId:p,replaceSync:m}),c.apply(h,d)})}));const a={};Dt(\"CSSGroupingRule\")?a.CSSGroupingRule=r.CSSGroupingRule:(Dt(\"CSSMediaRule\")&&(a.CSSMediaRule=r.CSSMediaRule),Dt(\"CSSConditionRule\")&&(a.CSSConditionRule=r.CSSConditionRule),Dt(\"CSSSupportsRule\")&&(a.CSSSupportsRule=r.CSSSupportsRule));const u={};return Object.entries(a).forEach(([c,h])=>{u[c]={insertRule:h.prototype.insertRule,deleteRule:h.prototype.deleteRule},h.prototype.insertRule=new Proxy(u[c].insertRule,{apply:O((d,m,g)=>{const[p,f]=g,{id:S,styleId:b}=de(m.parentStyleSheet,e,t.styleMirror);return(S&&S!==-1||b&&b!==-1)&&s({id:S,styleId:b,adds:[{rule:p,index:[...qt(m),f||0]}]}),d.apply(m,g)})}),h.prototype.deleteRule=new Proxy(u[c].deleteRule,{apply:O((d,m,g)=>{const[p]=g,{id:f,styleId:S}=de(m.parentStyleSheet,e,t.styleMirror);return(f&&f!==-1||S&&S!==-1)&&s({id:f,styleId:S,removes:[{index:[...qt(m),p]}]}),d.apply(m,g)})})}),O(()=>{r.CSSStyleSheet.prototype.insertRule=i,r.CSSStyleSheet.prototype.deleteRule=n,o&&(r.CSSStyleSheet.prototype.replace=o),l&&(r.CSSStyleSheet.prototype.replaceSync=l),Object.entries(a).forEach(([c,h])=>{h.prototype.insertRule=u[c].insertRule,h.prototype.deleteRule=u[c].deleteRule})})}function ko({mirror:s,stylesheetManager:e},t){var r,i,n;let o=null;t.nodeName===\"#document\"?o=s.getId(t):o=s.getId(v.host(t));const l=t.nodeName===\"#document\"?(r=t.defaultView)==null?void 0:r.Document:(n=(i=t.ownerDocument)==null?void 0:i.defaultView)==null?void 0:n.ShadowRoot,a=l!=null&&l.prototype?Object.getOwnPropertyDescriptor(l==null?void 0:l.prototype,\"adoptedStyleSheets\"):void 0;return o===null||o===-1||!l||!a?()=>{}:(Object.defineProperty(t,\"adoptedStyleSheets\",{configurable:a.configurable,enumerable:a.enumerable,get(){var u;return(u=a.get)==null?void 0:u.call(this)},set(u){var c;const h=(c=a.set)==null?void 0:c.call(this,u);if(o!==null&&o!==-1)try{e.adoptStyleSheets(u,o)}catch(d){}return h}}),O(()=>{Object.defineProperty(t,\"adoptedStyleSheets\",{configurable:a.configurable,enumerable:a.enumerable,get:a.get,set:a.set})}))}function Gh({styleDeclarationCb:s,mirror:e,ignoreCSSAttributes:t,stylesheetManager:r},{win:i}){const n=i.CSSStyleDeclaration.prototype.setProperty;i.CSSStyleDeclaration.prototype.setProperty=new Proxy(n,{apply:O((l,a,u)=>{var c;const[h,d,m]=u;if(t.has(h))return n.apply(a,[h,d,m]);const{id:g,styleId:p}=de((c=a.parentRule)==null?void 0:c.parentStyleSheet,e,r.styleMirror);return(g&&g!==-1||p&&p!==-1)&&s({id:g,styleId:p,set:{property:h,value:d,priority:m},index:qt(a.parentRule)}),l.apply(a,u)})});const o=i.CSSStyleDeclaration.prototype.removeProperty;return i.CSSStyleDeclaration.prototype.removeProperty=new Proxy(o,{apply:O((l,a,u)=>{var c;const[h]=u;if(t.has(h))return o.apply(a,[h]);const{id:d,styleId:m}=de((c=a.parentRule)==null?void 0:c.parentStyleSheet,e,r.styleMirror);return(d&&d!==-1||m&&m!==-1)&&s({id:d,styleId:m,remove:{property:h},index:qt(a.parentRule)}),l.apply(a,u)})}),O(()=>{i.CSSStyleDeclaration.prototype.setProperty=n,i.CSSStyleDeclaration.prototype.removeProperty=o})}function Vh({mediaInteractionCb:s,blockClass:e,blockSelector:t,mirror:r,sampling:i,doc:n}){const o=O(a=>st(O(u=>{const c=lt(u);if(!c||X(c,e,t,!0))return;const{currentTime:h,volume:d,muted:m,playbackRate:g,loop:p}=c;s({type:a,id:r.getId(c),currentTime:h,volume:d,muted:m,playbackRate:g,loop:p})}),i.media||500)),l=[J(\"play\",o(Ae.Play),n),J(\"pause\",o(Ae.Pause),n),J(\"seeked\",o(Ae.Seeked),n),J(\"volumechange\",o(Ae.VolumeChange),n),J(\"ratechange\",o(Ae.RateChange),n)];return O(()=>{l.forEach(a=>a())})}function jh({fontCb:s,doc:e}){const t=e.defaultView;if(!t)return()=>{};const r=[],i=new WeakMap,n=t.FontFace;t.FontFace=function(a,u,c){const h=new n(a,u,c);return i.set(h,{family:a,buffer:typeof u!=\"string\",descriptors:c,fontSource:typeof u==\"string\"?u:JSON.stringify(Array.from(new Uint8Array(u)))}),h};const o=Fe(e.fonts,\"add\",function(l){return function(a){return setTimeout(O(()=>{const u=i.get(a);u&&(s(u),i.delete(a))}),0),l.apply(this,[a])}});return r.push(()=>{t.FontFace=n}),r.push(o),O(()=>{r.forEach(l=>l())})}function Hh(s){const{doc:e,mirror:t,blockClass:r,blockSelector:i,selectionCb:n}=s;let o=!0;const l=O(()=>{const a=e.getSelection();if(!a||o&&(a!=null&&a.isCollapsed))return;o=a.isCollapsed||!1;const u=[],c=a.rangeCount||0;for(let h=0;h<c;h++){const d=a.getRangeAt(h),{startContainer:m,startOffset:g,endContainer:p,endOffset:f}=d;X(m,r,i,!0)||X(p,r,i,!0)||u.push({start:t.getId(m),startOffset:g,end:t.getId(p),endOffset:f})}n({ranges:u})});return l(),J(\"selectionchange\",l)}function Yh({doc:s,customElementCb:e}){const t=s.defaultView;return!t||!t.customElements?()=>{}:Fe(t.customElements,\"define\",function(i){return function(n,o,l){try{e({define:{name:n}})}catch(a){console.warn(\\`Custom element callback failed for \\${n}\\`)}return i.apply(this,[n,o,l])}})}function Zh(s,e){const{mutationCb:t,mousemoveCb:r,mouseInteractionCb:i,scrollCb:n,viewportResizeCb:o,inputCb:l,mediaInteractionCb:a,styleSheetRuleCb:u,styleDeclarationCb:c,canvasMutationCb:h,fontCb:d,selectionCb:m,customElementCb:g}=s;s.mutationCb=(...p)=>{e.mutation&&e.mutation(...p),t(...p)},s.mousemoveCb=(...p)=>{e.mousemove&&e.mousemove(...p),r(...p)},s.mouseInteractionCb=(...p)=>{e.mouseInteraction&&e.mouseInteraction(...p),i(...p)},s.scrollCb=(...p)=>{e.scroll&&e.scroll(...p),n(...p)},s.viewportResizeCb=(...p)=>{e.viewportResize&&e.viewportResize(...p),o(...p)},s.inputCb=(...p)=>{e.input&&e.input(...p),l(...p)},s.mediaInteractionCb=(...p)=>{e.mediaInteaction&&e.mediaInteaction(...p),a(...p)},s.styleSheetRuleCb=(...p)=>{e.styleSheetRule&&e.styleSheetRule(...p),u(...p)},s.styleDeclarationCb=(...p)=>{e.styleDeclaration&&e.styleDeclaration(...p),c(...p)},s.canvasMutationCb=(...p)=>{e.canvasMutation&&e.canvasMutation(...p),h(...p)},s.fontCb=(...p)=>{e.font&&e.font(...p),d(...p)},s.selectionCb=(...p)=>{e.selection&&e.selection(...p),m(...p)},s.customElementCb=(...p)=>{e.customElement&&e.customElement(...p),g(...p)}}function Jh(s,e={}){const t=s.doc.defaultView;if(!t)return()=>{};Zh(s,e);let r;s.recordDOM&&(r=$o(s,s.doc));const i=_h(s),n=Fh(s),o=No(s),l=Uh(s,{win:t}),a=zh(s),u=Vh(s);let c=()=>{},h=()=>{},d=()=>{},m=()=>{};s.recordDOM&&(c=Wh(s,{win:t}),h=ko(s,s.doc),d=Gh(s,{win:t}),s.collectFonts&&(m=jh(s)));const g=Hh(s),p=Yh(s),f=[];for(const S of s.plugins)f.push(S.observer(S.callback,t,S.options));return O(()=>{be.forEach(S=>S.reset()),r==null||r.disconnect(),i(),n(),o(),l(),a(),u(),c(),h(),d(),m(),g(),p(),f.forEach(S=>S())})}function Pt(s){return typeof window[s]!=\"undefined\"}function Dt(s){return!!(typeof window[s]!=\"undefined\"&&window[s].prototype&&\"insertRule\"in window[s].prototype&&\"deleteRule\"in window[s].prototype)}class Ti{constructor(e){w(this,\"iframeIdToRemoteIdMap\",new WeakMap),w(this,\"iframeRemoteIdToIdMap\",new WeakMap),this.generateIdFn=e}getId(e,t,r,i){const n=r||this.getIdToRemoteIdMap(e),o=i||this.getRemoteIdToIdMap(e);let l=n.get(t);return l||(l=this.generateIdFn(),n.set(t,l),o.set(l,t)),l}getIds(e,t){const r=this.getIdToRemoteIdMap(e),i=this.getRemoteIdToIdMap(e);return t.map(n=>this.getId(e,n,r,i))}getRemoteId(e,t,r){const i=r||this.getRemoteIdToIdMap(e);if(typeof t!=\"number\")return t;const n=i.get(t);return n||-1}getRemoteIds(e,t){const r=this.getRemoteIdToIdMap(e);return t.map(i=>this.getRemoteId(e,i,r))}reset(e){if(!e){this.iframeIdToRemoteIdMap=new WeakMap,this.iframeRemoteIdToIdMap=new WeakMap;return}this.iframeIdToRemoteIdMap.delete(e),this.iframeRemoteIdToIdMap.delete(e)}getIdToRemoteIdMap(e){let t=this.iframeIdToRemoteIdMap.get(e);return t||(t=new Map,this.iframeIdToRemoteIdMap.set(e,t)),t}getRemoteIdToIdMap(e){let t=this.iframeRemoteIdToIdMap.get(e);return t||(t=new Map,this.iframeRemoteIdToIdMap.set(e,t)),t}}class Xh{constructor(e){w(this,\"iframes\",new WeakMap),w(this,\"crossOriginIframeMap\",new WeakMap),w(this,\"crossOriginIframeMirror\",new Ti(Yi)),w(this,\"crossOriginIframeStyleMirror\"),w(this,\"crossOriginIframeRootIdMap\",new WeakMap),w(this,\"mirror\"),w(this,\"mutationCb\"),w(this,\"wrappedEmit\"),w(this,\"loadListener\"),w(this,\"stylesheetManager\"),w(this,\"recordCrossOriginIframes\"),this.mutationCb=e.mutationCb,this.wrappedEmit=e.wrappedEmit,this.stylesheetManager=e.stylesheetManager,this.recordCrossOriginIframes=e.recordCrossOriginIframes,this.crossOriginIframeStyleMirror=new Ti(this.stylesheetManager.styleMirror.generateId.bind(this.stylesheetManager.styleMirror)),this.mirror=e.mirror,this.recordCrossOriginIframes&&window.addEventListener(\"message\",this.handleMessage.bind(this))}addIframe(e){this.iframes.set(e,!0),e.contentWindow&&this.crossOriginIframeMap.set(e.contentWindow,e)}addLoadListener(e){this.loadListener=e}attachIframe(e,t){var r,i;this.mutationCb({adds:[{parentId:this.mirror.getId(e),nextId:null,node:t}],removes:[],texts:[],attributes:[],isAttachIframe:!0}),this.recordCrossOriginIframes&&((r=e.contentWindow)==null||r.addEventListener(\"message\",this.handleMessage.bind(this))),(i=this.loadListener)==null||i.call(this,e),e.contentDocument&&e.contentDocument.adoptedStyleSheets&&e.contentDocument.adoptedStyleSheets.length>0&&this.stylesheetManager.adoptStyleSheets(e.contentDocument.adoptedStyleSheets,this.mirror.getId(e.contentDocument))}handleMessage(e){const t=e;if(t.data.type!==\"rrweb\"||t.origin!==t.data.origin||!e.source)return;const i=this.crossOriginIframeMap.get(e.source);if(!i)return;const n=this.transformCrossOriginEvent(i,t.data.event);n&&this.wrappedEmit(n,t.data.isCheckout)}transformCrossOriginEvent(e,t){var r;switch(t.type){case R.FullSnapshot:{this.crossOriginIframeMirror.reset(e),this.crossOriginIframeStyleMirror.reset(e),this.replaceIdOnNode(t.data.node,e);const i=t.data.node.id;return this.crossOriginIframeRootIdMap.set(e,i),this.patchRootIdOnNode(t.data.node,i),{timestamp:t.timestamp,type:R.IncrementalSnapshot,data:{source:I.Mutation,adds:[{parentId:this.mirror.getId(e),nextId:null,node:t.data.node}],removes:[],texts:[],attributes:[],isAttachIframe:!0}}}case R.Meta:case R.Load:case R.DomContentLoaded:return!1;case R.Plugin:return t;case R.Custom:return this.replaceIds(t.data.payload,e,[\"id\",\"parentId\",\"previousId\",\"nextId\"]),t;case R.IncrementalSnapshot:switch(t.data.source){case I.Mutation:return t.data.adds.forEach(i=>{this.replaceIds(i,e,[\"parentId\",\"nextId\",\"previousId\"]),this.replaceIdOnNode(i.node,e);const n=this.crossOriginIframeRootIdMap.get(e);n&&this.patchRootIdOnNode(i.node,n)}),t.data.removes.forEach(i=>{this.replaceIds(i,e,[\"parentId\",\"id\"])}),t.data.attributes.forEach(i=>{this.replaceIds(i,e,[\"id\"])}),t.data.texts.forEach(i=>{this.replaceIds(i,e,[\"id\"])}),t;case I.Drag:case I.TouchMove:case I.MouseMove:return t.data.positions.forEach(i=>{this.replaceIds(i,e,[\"id\"])}),t;case I.ViewportResize:return!1;case I.MediaInteraction:case I.MouseInteraction:case I.Scroll:case I.CanvasMutation:case I.Input:return this.replaceIds(t.data,e,[\"id\"]),t;case I.StyleSheetRule:case I.StyleDeclaration:return this.replaceIds(t.data,e,[\"id\"]),this.replaceStyleIds(t.data,e,[\"styleId\"]),t;case I.Font:return t;case I.Selection:return t.data.ranges.forEach(i=>{this.replaceIds(i,e,[\"start\",\"end\"])}),t;case I.AdoptedStyleSheet:return this.replaceIds(t.data,e,[\"id\"]),this.replaceStyleIds(t.data,e,[\"styleIds\"]),(r=t.data.styles)==null||r.forEach(i=>{this.replaceStyleIds(i,e,[\"styleId\"])}),t}}return!1}replace(e,t,r,i){for(const n of i)!Array.isArray(t[n])&&typeof t[n]!=\"number\"||(Array.isArray(t[n])?t[n]=e.getIds(r,t[n]):t[n]=e.getId(r,t[n]));return t}replaceIds(e,t,r){return this.replace(this.crossOriginIframeMirror,e,t,r)}replaceStyleIds(e,t,r){return this.replace(this.crossOriginIframeStyleMirror,e,t,r)}replaceIdOnNode(e,t){this.replaceIds(e,t,[\"id\",\"rootId\"]),\"childNodes\"in e&&e.childNodes.forEach(r=>{this.replaceIdOnNode(r,t)})}patchRootIdOnNode(e,t){e.type!==Mo.Document&&!e.rootId&&(e.rootId=t),\"childNodes\"in e&&e.childNodes.forEach(r=>{this.patchRootIdOnNode(r,t)})}}class Kh{constructor(e){w(this,\"shadowDoms\",new WeakSet),w(this,\"mutationCb\"),w(this,\"scrollCb\"),w(this,\"bypassOptions\"),w(this,\"mirror\"),w(this,\"restoreHandlers\",[]),this.mutationCb=e.mutationCb,this.scrollCb=e.scrollCb,this.bypassOptions=e.bypassOptions,this.mirror=e.mirror,this.init()}init(){this.reset(),this.patchAttachShadow(Element,document)}addShadowRoot(e,t){if(!He(e)||this.shadowDoms.has(e))return;this.shadowDoms.add(e);const r=$o(ee(x({},this.bypassOptions),{doc:t,mutationCb:this.mutationCb,mirror:this.mirror,shadowDomManager:this}),e);this.restoreHandlers.push(()=>r.disconnect()),this.restoreHandlers.push(No(ee(x({},this.bypassOptions),{scrollCb:this.scrollCb,doc:e,mirror:this.mirror}))),setTimeout(()=>{e.adoptedStyleSheets&&e.adoptedStyleSheets.length>0&&this.bypassOptions.stylesheetManager.adoptStyleSheets(e.adoptedStyleSheets,this.mirror.getId(v.host(e))),this.restoreHandlers.push(ko({mirror:this.mirror,stylesheetManager:this.bypassOptions.stylesheetManager},e))},0)}observeAttachShadow(e){!e.contentWindow||!e.contentDocument||this.patchAttachShadow(e.contentWindow.Element,e.contentDocument)}patchAttachShadow(e,t){const r=this;this.restoreHandlers.push(Fe(e.prototype,\"attachShadow\",function(i){return function(n){const o=i.call(this,n),l=v.shadowRoot(this);return l&&Ao(this)&&r.addShadowRoot(l,t),o}}))}reset(){this.restoreHandlers.forEach(e=>{try{e()}catch(t){}}),this.restoreHandlers=[],this.shadowDoms=new WeakSet}}var $e=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",Qh=typeof Uint8Array==\"undefined\"?[]:new Uint8Array(256);for(var Lt=0;Lt<$e.length;Lt++)Qh[$e.charCodeAt(Lt)]=Lt;var qh=function(s){var e=new Uint8Array(s),t,r=e.length,i=\"\";for(t=0;t<r;t+=3)i+=$e[e[t]>>2],i+=$e[(e[t]&3)<<4|e[t+1]>>4],i+=$e[(e[t+1]&15)<<2|e[t+2]>>6],i+=$e[e[t+2]&63];return r%3===2?i=i.substring(0,i.length-1)+\"=\":r%3===1&&(i=i.substring(0,i.length-2)+\"==\"),i};const _i=new Map;function ef(s,e){let t=_i.get(s);return t||(t=new Map,_i.set(s,t)),t.has(e)||t.set(e,[]),t.get(e)}const Po=(s,e,t)=>{if(!s||!(Lo(s,e)||typeof s==\"object\"))return;const r=s.constructor.name,i=ef(t,r);let n=i.indexOf(s);return n===-1&&(n=i.length,i.push(s)),n};function Bt(s,e,t){if(s instanceof Array)return s.map(r=>Bt(r,e,t));if(s===null)return s;if(s instanceof Float32Array||s instanceof Float64Array||s instanceof Int32Array||s instanceof Uint32Array||s instanceof Uint8Array||s instanceof Uint16Array||s instanceof Int16Array||s instanceof Int8Array||s instanceof Uint8ClampedArray)return{rr_type:s.constructor.name,args:[Object.values(s)]};if(s instanceof ArrayBuffer){const r=s.constructor.name,i=qh(s);return{rr_type:r,base64:i}}else{if(s instanceof DataView)return{rr_type:s.constructor.name,args:[Bt(s.buffer,e,t),s.byteOffset,s.byteLength]};if(s instanceof HTMLImageElement){const r=s.constructor.name,{src:i}=s;return{rr_type:r,src:i}}else if(s instanceof HTMLCanvasElement){const r=\"HTMLImageElement\",i=s.toDataURL();return{rr_type:r,src:i}}else{if(s instanceof ImageData)return{rr_type:s.constructor.name,args:[Bt(s.data,e,t),s.width,s.height]};if(Lo(s,e)||typeof s==\"object\"){const r=s.constructor.name,i=Po(s,e,t);return{rr_type:r,index:i}}}}return s}const Do=(s,e,t)=>s.map(r=>Bt(r,e,t)),Lo=(s,e)=>!![\"WebGLActiveInfo\",\"WebGLBuffer\",\"WebGLFramebuffer\",\"WebGLProgram\",\"WebGLRenderbuffer\",\"WebGLShader\",\"WebGLShaderPrecisionFormat\",\"WebGLTexture\",\"WebGLUniformLocation\",\"WebGLVertexArrayObject\",\"WebGLVertexArrayObjectOES\"].filter(i=>typeof e[i]==\"function\").find(i=>s instanceof e[i]);function tf(s,e,t,r){const i=[],n=Object.getOwnPropertyNames(e.CanvasRenderingContext2D.prototype);for(const o of n)try{if(typeof e.CanvasRenderingContext2D.prototype[o]!=\"function\")continue;const l=Fe(e.CanvasRenderingContext2D.prototype,o,function(a){return function(...u){return X(this.canvas,t,r,!0)||setTimeout(()=>{const c=Do(u,e,this);s(this.canvas,{type:_e[\"2D\"],property:o,args:c})},0),a.apply(this,u)}});i.push(l)}catch(l){const a=hr(e.CanvasRenderingContext2D.prototype,o,{set(u){s(this.canvas,{type:_e[\"2D\"],property:o,args:[u],setter:!0})}});i.push(a)}return()=>{i.forEach(o=>o())}}function rf(s){return s===\"experimental-webgl\"?\"webgl\":s}function Fi(s,e,t,r){const i=[];try{const n=Fe(s.HTMLCanvasElement.prototype,\"getContext\",function(o){return function(l,...a){if(!X(this,e,t,!0)){const u=rf(l);if(\"__context\"in this||(this.__context=u),r&&[\"webgl\",\"webgl2\"].includes(u))if(a[0]&&typeof a[0]==\"object\"){const c=a[0];c.preserveDrawingBuffer||(c.preserveDrawingBuffer=!0)}else a.splice(0,1,{preserveDrawingBuffer:!0})}return o.apply(this,[l,...a])}});i.push(n)}catch(n){console.error(\"failed to patch HTMLCanvasElement.prototype.getContext\")}return()=>{i.forEach(n=>n())}}function Ui(s,e,t,r,i,n){const o=[],l=Object.getOwnPropertyNames(s);for(const a of l)if(![\"isContextLost\",\"canvas\",\"drawingBufferWidth\",\"drawingBufferHeight\"].includes(a))try{if(typeof s[a]!=\"function\")continue;const u=Fe(s,a,function(c){return function(...h){const d=c.apply(this,h);if(Po(d,n,this),\"tagName\"in this.canvas&&!X(this.canvas,r,i,!0)){const m=Do(h,n,this),g={type:e,property:a,args:m};t(this.canvas,g)}return d}});o.push(u)}catch(u){const c=hr(s,a,{set(h){t(this.canvas,{type:e,property:a,args:[h],setter:!0})}});o.push(c)}return o}function sf(s,e,t,r){const i=[];return i.push(...Ui(e.WebGLRenderingContext.prototype,_e.WebGL,s,t,r,e)),typeof e.WebGL2RenderingContext!=\"undefined\"&&i.push(...Ui(e.WebGL2RenderingContext.prototype,_e.WebGL2,s,t,r,e)),()=>{i.forEach(n=>n())}}const To=\"KGZ1bmN0aW9uKCkgewogICJ1c2Ugc3RyaWN0IjsKICB2YXIgY2hhcnMgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CiAgdmFyIGxvb2t1cCA9IHR5cGVvZiBVaW50OEFycmF5ID09PSAidW5kZWZpbmVkIiA/IFtdIDogbmV3IFVpbnQ4QXJyYXkoMjU2KTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7CiAgICBsb29rdXBbY2hhcnMuY2hhckNvZGVBdChpKV0gPSBpOwogIH0KICB2YXIgZW5jb2RlID0gZnVuY3Rpb24oYXJyYXlidWZmZXIpIHsKICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGFycmF5YnVmZmVyKSwgaTIsIGxlbiA9IGJ5dGVzLmxlbmd0aCwgYmFzZTY0ID0gIiI7CiAgICBmb3IgKGkyID0gMDsgaTIgPCBsZW47IGkyICs9IDMpIHsKICAgICAgYmFzZTY0ICs9IGNoYXJzW2J5dGVzW2kyXSA+PiAyXTsKICAgICAgYmFzZTY0ICs9IGNoYXJzWyhieXRlc1tpMl0gJiAzKSA8PCA0IHwgYnl0ZXNbaTIgKyAxXSA+PiA0XTsKICAgICAgYmFzZTY0ICs9IGNoYXJzWyhieXRlc1tpMiArIDFdICYgMTUpIDw8IDIgfCBieXRlc1tpMiArIDJdID4+IDZdOwogICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaTIgKyAyXSAmIDYzXTsKICAgIH0KICAgIGlmIChsZW4gJSAzID09PSAyKSB7CiAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgIj0iOwogICAgfSBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7CiAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgIj09IjsKICAgIH0KICAgIHJldHVybiBiYXNlNjQ7CiAgfTsKICBjb25zdCBsYXN0QmxvYk1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgY29uc3QgdHJhbnNwYXJlbnRCbG9iTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBhc3luYyBmdW5jdGlvbiBnZXRUcmFuc3BhcmVudEJsb2JGb3Iod2lkdGgsIGhlaWdodCwgZGF0YVVSTE9wdGlvbnMpIHsKICAgIGNvbnN0IGlkID0gYCR7d2lkdGh9LSR7aGVpZ2h0fWA7CiAgICBpZiAoIk9mZnNjcmVlbkNhbnZhcyIgaW4gZ2xvYmFsVGhpcykgewogICAgICBpZiAodHJhbnNwYXJlbnRCbG9iTWFwLmhhcyhpZCkpIHJldHVybiB0cmFuc3BhcmVudEJsb2JNYXAuZ2V0KGlkKTsKICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsKICAgICAgb2Zmc2NyZWVuLmdldENvbnRleHQoIjJkIik7CiAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBvZmZzY3JlZW4uY29udmVydFRvQmxvYihkYXRhVVJMT3B0aW9ucyk7CiAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpOwogICAgICBjb25zdCBiYXNlNjQgPSBlbmNvZGUoYXJyYXlCdWZmZXIpOwogICAgICB0cmFuc3BhcmVudEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgICByZXR1cm4gYmFzZTY0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogIH0KICBjb25zdCB3b3JrZXIgPSBzZWxmOwogIHdvcmtlci5vbm1lc3NhZ2UgPSBhc3luYyBmdW5jdGlvbihlKSB7CiAgICBpZiAoIk9mZnNjcmVlbkNhbnZhcyIgaW4gZ2xvYmFsVGhpcykgewogICAgICBjb25zdCB7IGlkLCBiaXRtYXAsIHdpZHRoLCBoZWlnaHQsIGRhdGFVUkxPcHRpb25zIH0gPSBlLmRhdGE7CiAgICAgIGNvbnN0IHRyYW5zcGFyZW50QmFzZTY0ID0gZ2V0VHJhbnNwYXJlbnRCbG9iRm9yKAogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodCwKICAgICAgICBkYXRhVVJMT3B0aW9ucwogICAgICApOwogICAgICBjb25zdCBvZmZzY3JlZW4gPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOwogICAgICBjb25zdCBjdHggPSBvZmZzY3JlZW4uZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDApOwogICAgICBiaXRtYXAuY2xvc2UoKTsKICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IG9mZnNjcmVlbi5jb252ZXJ0VG9CbG9iKGRhdGFVUkxPcHRpb25zKTsKICAgICAgY29uc3QgdHlwZSA9IGJsb2IudHlwZTsKICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBibG9iLmFycmF5QnVmZmVyKCk7CiAgICAgIGNvbnN0IGJhc2U2NCA9IGVuY29kZShhcnJheUJ1ZmZlcik7CiAgICAgIGlmICghbGFzdEJsb2JNYXAuaGFzKGlkKSAmJiBhd2FpdCB0cmFuc3BhcmVudEJhc2U2NCA9PT0gYmFzZTY0KSB7CiAgICAgICAgbGFzdEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgICAgIHJldHVybiB3b3JrZXIucG9zdE1lc3NhZ2UoeyBpZCB9KTsKICAgICAgfQogICAgICBpZiAobGFzdEJsb2JNYXAuZ2V0KGlkKSA9PT0gYmFzZTY0KSByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQgfSk7CiAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7CiAgICAgICAgaWQsCiAgICAgICAgdHlwZSwKICAgICAgICBiYXNlNjQsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0CiAgICAgIH0pOwogICAgICBsYXN0QmxvYk1hcC5zZXQoaWQsIGJhc2U2NCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQ6IGUuZGF0YS5pZCB9KTsKICAgIH0KICB9Owp9KSgpOwovLyMgc291cmNlTWFwcGluZ1VSTD1pbWFnZS1iaXRtYXAtZGF0YS11cmwtd29ya2VyLUlKcEM3Z19iLmpzLm1hcAo=\",nf=s=>Uint8Array.from(atob(s),e=>e.charCodeAt(0)),Bi=typeof window!=\"undefined\"&&window.Blob&&new Blob([nf(To)],{type:\"text/javascript;charset=utf-8\"});function of(s){let e;try{if(e=Bi&&(window.URL||window.webkitURL).createObjectURL(Bi),!e)throw\"\";const t=new Worker(e,{name:s==null?void 0:s.name});return t.addEventListener(\"error\",()=>{(window.URL||window.webkitURL).revokeObjectURL(e)}),t}catch(t){return new Worker(\"data:text/javascript;base64,\"+To,{name:s==null?void 0:s.name})}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}class af{constructor(e){w(this,\"pendingCanvasMutations\",new Map),w(this,\"rafStamps\",{latestId:0,invokeId:null}),w(this,\"mirror\"),w(this,\"mutationCb\"),w(this,\"resetObservers\"),w(this,\"frozen\",!1),w(this,\"locked\",!1),w(this,\"processMutation\",(a,u)=>{(this.rafStamps.invokeId&&this.rafStamps.latestId!==this.rafStamps.invokeId||!this.rafStamps.invokeId)&&(this.rafStamps.invokeId=this.rafStamps.latestId),this.pendingCanvasMutations.has(a)||this.pendingCanvasMutations.set(a,[]),this.pendingCanvasMutations.get(a).push(u)});const{sampling:t=\"all\",win:r,blockClass:i,blockSelector:n,recordCanvas:o,dataURLOptions:l}=e;this.mutationCb=e.mutationCb,this.mirror=e.mirror,o&&t===\"all\"&&this.initCanvasMutationObserver(r,i,n),o&&typeof t==\"number\"&&this.initCanvasFPSObserver(t,r,i,n,{dataURLOptions:l})}reset(){this.pendingCanvasMutations.clear(),this.resetObservers&&this.resetObservers()}freeze(){this.frozen=!0}unfreeze(){this.frozen=!1}lock(){this.locked=!0}unlock(){this.locked=!1}initCanvasFPSObserver(e,t,r,i,n){const o=Fi(t,r,i,!0),l=new Map,a=new of;a.onmessage=g=>{const{id:p}=g.data;if(l.set(p,!1),!(\"base64\"in g.data))return;const{base64:f,type:S,width:b,height:y}=g.data;this.mutationCb({id:p,type:_e[\"2D\"],commands:[{property:\"clearRect\",args:[0,0,b,y]},{property:\"drawImage\",args:[{rr_type:\"ImageBitmap\",args:[{rr_type:\"Blob\",data:[{rr_type:\"ArrayBuffer\",base64:f}],type:S}]},0,0]}]})};const u=1e3/e;let c=0,h;const d=()=>{const g=[];return t.document.querySelectorAll(\"canvas\").forEach(p=>{X(p,r,i,!0)||g.push(p)}),g},m=g=>{if(c&&g-c<u){h=requestAnimationFrame(m);return}c=g,d().forEach(async p=>{var f;const S=this.mirror.getId(p);if(l.get(S)||p.width===0||p.height===0)return;if(l.set(S,!0),[\"webgl\",\"webgl2\"].includes(p.__context)){const y=p.getContext(p.__context);((f=y==null?void 0:y.getContextAttributes())==null?void 0:f.preserveDrawingBuffer)===!1&&y.clear(y.COLOR_BUFFER_BIT)}const b=await createImageBitmap(p);a.postMessage({id:S,bitmap:b,width:p.width,height:p.height,dataURLOptions:n.dataURLOptions},[b])}),h=requestAnimationFrame(m)};h=requestAnimationFrame(m),this.resetObservers=()=>{o(),cancelAnimationFrame(h)}}initCanvasMutationObserver(e,t,r){this.startRAFTimestamping(),this.startPendingCanvasMutationFlusher();const i=Fi(e,t,r,!1),n=tf(this.processMutation.bind(this),e,t,r),o=sf(this.processMutation.bind(this),e,t,r);this.resetObservers=()=>{i(),n(),o()}}startPendingCanvasMutationFlusher(){requestAnimationFrame(()=>this.flushPendingCanvasMutations())}startRAFTimestamping(){const e=t=>{this.rafStamps.latestId=t,requestAnimationFrame(e)};requestAnimationFrame(e)}flushPendingCanvasMutations(){this.pendingCanvasMutations.forEach((e,t)=>{const r=this.mirror.getId(t);this.flushPendingCanvasMutationFor(t,r)}),requestAnimationFrame(()=>this.flushPendingCanvasMutations())}flushPendingCanvasMutationFor(e,t){if(this.frozen||this.locked)return;const r=this.pendingCanvasMutations.get(e);if(!r||t===-1)return;const i=r.map(o=>{const u=o,{type:l}=u;return xe(u,[\"type\"])}),{type:n}=r[0];this.mutationCb({id:t,type:n,commands:i}),this.pendingCanvasMutations.delete(e)}}class lf{constructor(e){w(this,\"trackedLinkElements\",new WeakSet),w(this,\"mutationCb\"),w(this,\"adoptedStyleSheetCb\"),w(this,\"styleMirror\",new Mh),this.mutationCb=e.mutationCb,this.adoptedStyleSheetCb=e.adoptedStyleSheetCb}attachLinkElement(e,t){\"_cssText\"in t.attributes&&this.mutationCb({adds:[],removes:[],texts:[],attributes:[{id:t.id,attributes:t.attributes}]}),this.trackLinkElement(e)}trackLinkElement(e){this.trackedLinkElements.has(e)||(this.trackedLinkElements.add(e),this.trackStylesheetInLinkElement(e))}adoptStyleSheets(e,t){if(e.length===0)return;const r={id:t,styleIds:[]},i=[];for(const n of e){let o;this.styleMirror.has(n)?o=this.styleMirror.getId(n):(o=this.styleMirror.add(n),i.push({styleId:o,rules:Array.from(n.rules||CSSRule,(l,a)=>({rule:Vi(l,n.href),index:a}))})),r.styleIds.push(o)}i.length>0&&(r.styles=i),this.adoptedStyleSheetCb(r)}reset(){this.styleMirror.reset(),this.trackedLinkElements=new WeakSet}trackStylesheetInLinkElement(e){}}class uf{constructor(){w(this,\"nodeMap\",new WeakMap),w(this,\"active\",!1)}inOtherBuffer(e,t){const r=this.nodeMap.get(e);return r&&Array.from(r).some(i=>i!==t)}add(e,t){this.active||(this.active=!0,requestAnimationFrame(()=>{this.nodeMap=new WeakMap,this.active=!1})),this.nodeMap.set(e,(this.nodeMap.get(e)||new Set).add(t))}destroy(){}}let W,zt,Er,er=!1;try{if(Array.from([1],s=>s*2)[0]!==2){const s=document.createElement(\"iframe\");document.body.appendChild(s),Array.from=((Gs=s.contentWindow)==null?void 0:Gs.Array.from)||Array.from,document.body.removeChild(s)}}catch(s){console.debug(\"Unable to override Array.from\",s)}const se=ua();function ut(s={}){const{emit:e,checkoutEveryNms:t,checkoutEveryNth:r,blockClass:i=\"rr-block\",blockSelector:n=null,ignoreClass:o=\"rr-ignore\",ignoreSelector:l=null,maskTextClass:a=\"rr-mask\",maskTextSelector:u=null,inlineStylesheet:c=!0,maskAllInputs:h,maskInputOptions:d,slimDOMOptions:m,maskInputFn:g,maskTextFn:p,hooks:f,packFn:S,sampling:b={},dataURLOptions:y={},mousemoveWait:C,recordDOM:N=!0,recordCanvas:D=!1,recordCrossOriginIframes:H=!1,recordAfter:_=s.recordAfter===\"DOMContentLoaded\"?s.recordAfter:\"load\",userTriggeredOnInput:G=!1,collectFonts:Y=!1,inlineImages:Q=!1,plugins:oe,keepIframeSrcFn:A=()=>!1,ignoreCSSAttributes:Ue=new Set([]),errorHandler:Be}=s;Lh(Be);const V=H?window.parent===window:!0;let q=!1;if(!V)try{window.parent.document&&(q=!1)}catch(M){q=!0}if(V&&!e)throw new Error(\"emit function is required\");if(!V&&!q)return()=>{};C!==void 0&&b.mousemove===void 0&&(b.mousemove=C),se.reset();const ye=h===!0?{color:!0,date:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0,textarea:!0,select:!0,password:!0}:d!==void 0?d:{password:!0},ae=m===!0||m===\"all\"?{script:!0,comment:!0,headFavicon:!0,headWhitespace:!0,headMetaSocial:!0,headMetaRobots:!0,headMetaHttpEquiv:!0,headMetaVerification:!0,headMetaAuthorship:m===\"all\",headMetaDescKeywords:m===\"all\",headTitleMutations:m===\"all\"}:m||{};Ah();let Ts,fr=0;const _s=M=>{for(const re of oe||[])re.eventProcessor&&(M=re.eventProcessor(M));return S&&!q&&(M=S(M)),M};W=(M,re)=>{var B;const z=M;if(z.timestamp=Qt(),(B=be[0])!=null&&B.isFrozen()&&z.type!==R.FullSnapshot&&!(z.type===R.IncrementalSnapshot&&z.data.source===I.Mutation)&&be.forEach(le=>le.unfreeze()),V)e==null||e(_s(z),re);else if(q){const le={type:\"rrweb\",event:_s(z),origin:window.location.origin,isCheckout:re};window.parent.postMessage(le,\"*\")}if(z.type===R.FullSnapshot)Ts=z,fr=0;else if(z.type===R.IncrementalSnapshot){if(z.data.source===I.Mutation&&z.data.isAttachIframe)return;fr++;const le=r&&fr>=r,k=t&&z.timestamp-Ts.timestamp>t;(le||k)&&zt(!0)}};const ct=M=>{W({type:R.IncrementalSnapshot,data:x({source:I.Mutation},M)})},Fs=M=>W({type:R.IncrementalSnapshot,data:x({source:I.Scroll},M)}),Us=M=>W({type:R.IncrementalSnapshot,data:x({source:I.CanvasMutation},M)}),_o=M=>W({type:R.IncrementalSnapshot,data:x({source:I.AdoptedStyleSheet},M)}),we=new lf({mutationCb:ct,adoptedStyleSheetCb:_o}),Se=new Xh({mirror:se,mutationCb:ct,stylesheetManager:we,recordCrossOriginIframes:H,wrappedEmit:W});for(const M of oe||[])M.getMirror&&M.getMirror({nodeMirror:se,crossOriginIframeMirror:Se.crossOriginIframeMirror,crossOriginIframeStyleMirror:Se.crossOriginIframeStyleMirror});const pr=new uf;Er=new af({recordCanvas:D,mutationCb:Us,win:window,blockClass:i,blockSelector:n,mirror:se,sampling:b.canvas,dataURLOptions:y});const ht=new Kh({mutationCb:ct,scrollCb:Fs,bypassOptions:{blockClass:i,blockSelector:n,maskTextClass:a,maskTextSelector:u,inlineStylesheet:c,maskInputOptions:ye,dataURLOptions:y,maskTextFn:p,maskInputFn:g,recordCanvas:D,inlineImages:Q,sampling:b,slimDOMOptions:ae,iframeManager:Se,stylesheetManager:we,canvasManager:Er,keepIframeSrcFn:A,processedNodeManager:pr},mirror:se});zt=(M=!1)=>{if(!N)return;W({type:R.Meta,data:{href:window.location.href,width:Co(),height:bo()}},M),we.reset(),ht.init(),be.forEach(B=>B.lock());const re=Pa(document,{mirror:se,blockClass:i,blockSelector:n,maskTextClass:a,maskTextSelector:u,inlineStylesheet:c,maskAllInputs:ye,maskTextFn:p,maskInputFn:g,slimDOM:ae,dataURLOptions:y,recordCanvas:D,inlineImages:Q,onSerialize:B=>{xo(B,se)&&Se.addIframe(B),Oo(B,se)&&we.trackLinkElement(B),ls(B)&&ht.addShadowRoot(v.shadowRoot(B),document)},onIframeLoad:(B,z)=>{Se.attachIframe(B,z),ht.observeAttachShadow(B)},onStylesheetLoad:(B,z)=>{we.attachLinkElement(B,z)},keepIframeSrcFn:A});if(!re)return console.warn(\"Failed to snapshot the document\");W({type:R.FullSnapshot,data:{node:re,initialOffset:So(window)}},M),be.forEach(B=>B.unlock()),document.adoptedStyleSheets&&document.adoptedStyleSheets.length>0&&we.adoptStyleSheets(document.adoptedStyleSheets,se.getId(document))};try{const M=[],re=z=>{var le;return O(Jh)({mutationCb:ct,mousemoveCb:(k,dr)=>W({type:R.IncrementalSnapshot,data:{source:dr,positions:k}}),mouseInteractionCb:k=>W({type:R.IncrementalSnapshot,data:x({source:I.MouseInteraction},k)}),scrollCb:Fs,viewportResizeCb:k=>W({type:R.IncrementalSnapshot,data:x({source:I.ViewportResize},k)}),inputCb:k=>W({type:R.IncrementalSnapshot,data:x({source:I.Input},k)}),mediaInteractionCb:k=>W({type:R.IncrementalSnapshot,data:x({source:I.MediaInteraction},k)}),styleSheetRuleCb:k=>W({type:R.IncrementalSnapshot,data:x({source:I.StyleSheetRule},k)}),styleDeclarationCb:k=>W({type:R.IncrementalSnapshot,data:x({source:I.StyleDeclaration},k)}),canvasMutationCb:Us,fontCb:k=>W({type:R.IncrementalSnapshot,data:x({source:I.Font},k)}),selectionCb:k=>{W({type:R.IncrementalSnapshot,data:x({source:I.Selection},k)})},customElementCb:k=>{W({type:R.IncrementalSnapshot,data:x({source:I.CustomElement},k)})},blockClass:i,ignoreClass:o,ignoreSelector:l,maskTextClass:a,maskTextSelector:u,maskInputOptions:ye,inlineStylesheet:c,sampling:b,recordDOM:N,recordCanvas:D,inlineImages:Q,userTriggeredOnInput:G,collectFonts:Y,doc:z,maskInputFn:g,maskTextFn:p,keepIframeSrcFn:A,blockSelector:n,slimDOMOptions:ae,dataURLOptions:y,mirror:se,iframeManager:Se,stylesheetManager:we,shadowDomManager:ht,processedNodeManager:pr,canvasManager:Er,ignoreCSSAttributes:Ue,plugins:((le=oe==null?void 0:oe.filter(k=>k.observer))==null?void 0:le.map(k=>({observer:k.observer,options:k.options,callback:dr=>W({type:R.Plugin,data:{plugin:k.name,payload:dr}})})))||[]},f)};Se.addLoadListener(z=>{try{M.push(re(z.contentDocument))}catch(le){console.warn(le)}});const B=()=>{zt(),M.push(re(document)),er=!0};return document.readyState===\"interactive\"||document.readyState===\"complete\"?B():(M.push(J(\"DOMContentLoaded\",()=>{W({type:R.DomContentLoaded,data:{}}),_===\"DOMContentLoaded\"&&B()})),M.push(J(\"load\",()=>{W({type:R.Load,data:{}}),_===\"load\"&&B()},window))),()=>{M.forEach(z=>z()),pr.destroy(),er=!1,Th()}}catch(M){console.warn(M)}}ut.addCustomEvent=(s,e)=>{if(!er)throw new Error(\"please add custom event after start recording\");W({type:R.Custom,data:{tag:s,payload:e}})};ut.freezePage=()=>{be.forEach(s=>s.freeze())};ut.takeFullSnapshot=s=>{if(!er)throw new Error(\"please take full snapshot after start recording\");zt(s)};ut.mirror=se;var zi;(function(s){s[s.NotStarted=0]=\"NotStarted\",s[s.Running=1]=\"Running\",s[s.Stopped=2]=\"Stopped\"})(zi||(zi={}));exports.record=ut;\nif (typeof module.exports == \"object\" && typeof exports == \"object\") {\n var __cp = (to, from, except, desc) => {\n if ((from && typeof from === \"object\") || typeof from === \"function\") {\n for (let key of Object.getOwnPropertyNames(from)) {\n if (!Object.prototype.hasOwnProperty.call(to, key) && key !== except)\n Object.defineProperty(to, key, {\n get: () => from[key],\n enumerable: !(desc = Object.getOwnPropertyDescriptor(from, key)) || desc.enumerable,\n });\n }\n }\n return to;\n };\n module.exports = __cp(module.exports, exports);\n}\nreturn module.exports;\n}))\n//# sourceMappingURL=record.umd.min.cjs.map`;\n","import { type SessionRecordingOptions, type StringUUID } from \"@lmnr-ai/types\";\nimport { Page as PlaywrightPage } from \"playwright\";\nimport { Page as PuppeteerPage } from \"puppeteer\";\n\nimport { LaminarClient } from \"..\";\nimport { initializeLogger } from \"../utils\";\nimport { RECORDER } from \"./recorder\";\n\nexport const LMNR_SEND_EVENTS_FUNCTION_NAME = 'lmnrSendEvents';\n\nconst logger = initializeLogger();\n\ninterface LmnrWindow extends Window {\n lmnrRrwebEventsBatch: any[];\n lmnrChunkSequence: number;\n lmnrSendInProgress: boolean;\n lmnrStartedRecordingEvents: boolean;\n lmnrRrweb: any;\n lmnrSendEvents: (chunk: any) => void;\n}\n\n/**\n * If the first argument is a string, return an object with the name of the method\n * and the argument as the value.\n * Otherwise, return the shallow copy of the arguments.\n *\n * This is useful for Stagehand, where the first argument is often a string, but is named\n * 'instruction', so we add a name to it on the spans.\n *\n * @param args - Args of a function.\n * @param name - The name to add on the first argument if it is a string.\n * @returns The arguments as an object with the name of the method and the argument\n * as the value, or the arguments as is.\n */\nexport const nameArgsOrCopy = (args: any[], name: string = \"instruction\") => {\n if (args.length === 1 && typeof args[0] === 'string') {\n return { [name]: args[0] };\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return [...args];\n};\n\n\nexport interface EventChunk {\n batchId: string;\n chunkIndex: number;\n totalChunks: number;\n data: string;\n isFinal: boolean;\n}\n\nexport const takeFullSnapshot = async (\n page: PlaywrightPage | PuppeteerPage,\n): Promise<boolean> => await (page as PlaywrightPage).evaluate(() => {\n if ((window as unknown as LmnrWindow).lmnrRrweb) {\n try {\n (window as unknown as LmnrWindow).lmnrRrweb.record.takeFullSnapshot();\n return true;\n } catch (error) {\n logger.error(\"Error taking full snapshot: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n return false;\n }\n }\n return false;\n});\n\nexport const injectSessionRecorder = async (\n page: PlaywrightPage | PuppeteerPage,\n sessionRecordingOptions?: SessionRecordingOptions,\n) => {\n const tryRunScript = async <R>(\n script: (...args: any[]) => Promise<R>,\n maxAttempts: number = 5,\n ): Promise<R | undefined> => {\n for (let i = 0; i < maxAttempts; i++) {\n try {\n return await script();\n } catch (error) {\n logger.error(\"Operation \" + script.name + \" failed: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n await new Promise(resolve => setTimeout(resolve, 500));\n }\n };\n\n // Both Puppeteer and Playwright have a evaluate method, but the types are different\n // and TypeScript is not liking that the signature is different.\n\n const castedPage = page as PlaywrightPage;\n\n let isRrwebPresent = false;\n try {\n isRrwebPresent = await castedPage.evaluate(() =>\n typeof (window as unknown as LmnrWindow).lmnrRrweb !== 'undefined',\n );\n } catch (error) {\n logger.debug(\"ailed to check if session recorder is loaded: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n\n // Load rrweb and set up recording\n if (!isRrwebPresent) {\n const result = await tryRunScript(async function injectSessionRecorder() {\n await castedPage.evaluate(RECORDER);\n return true;\n });\n if (!result) {\n logger.error(\"Failed to load session recorder\");\n return;\n }\n try {\n await castedPage.evaluate(injectScript, sessionRecordingOptions);\n } catch (error) {\n logger.debug(\"Failed to inject session recorder: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n};\n\n\n// Removes the heavy client prop and the apiKey to avoid security issues\nexport const cleanStagehandLLMClient = (llmClient: object): object =>\n Object.fromEntries(\n Object.entries(llmClient)\n .filter(([key]) => key !== \"client\")\n .map(([key, value]) =>\n key === \"clientOptions\"\n ? [\n key,\n Object.fromEntries(\n Object.entries(value).filter(([key]) => key !== \"apiKey\"),\n ),\n ]\n : [key, value],\n ),\n );\n\n\n// Stagehand uses zod 3.x or 4.x, so we need to support both versions via duck-typing\nexport const prettyPrintZodSchema = (schema: any, indent = 2): string => {\n // Use duck-typing instead of instanceof to support both Zod v3 and v4\n const def = schema?._def;\n if (!def || def.typeName !== 'ZodObject') {\n throw new Error('Not a Zod object schema');\n }\n\n const indentString = ' '.repeat(indent);\n\n const shape = schema.shape;\n const entries = Object.entries(shape);\n\n const reconstructed: string[] = entries.map(([key, value]) => {\n // Base type detection function using duck-typing\n const getBaseType = (val: any): string => {\n const valDef = val?._def;\n if (!valDef) return 'z.unknown()';\n\n const typeName = valDef.typeName;\n\n if (typeName === 'ZodString') {\n return 'z.string()';\n }\n if (typeName === 'ZodNumber') {\n return 'z.number()';\n }\n if (typeName === 'ZodBoolean') {\n return 'z.boolean()';\n }\n if (typeName === 'ZodArray') {\n const elementType = valDef.type;\n if (elementType?._def?.typeName === 'ZodObject') {\n return `z.array(${prettyPrintZodSchema(elementType)})`;\n } else {\n return `z.array(${getBaseType(elementType)})`;\n }\n }\n if (typeName === 'ZodObject') {\n return prettyPrintZodSchema(val);\n }\n if (typeName === 'ZodEnum') {\n const enumValues = valDef.values;\n if (Array.isArray(enumValues)) {\n return `z.enum([${enumValues.map(v => `'${v}'`).join(', ')}])`;\n }\n return 'z.enum([...])';\n }\n if (typeName === 'ZodLiteral') {\n const literalValue = valDef.value;\n if (typeof literalValue === 'string') {\n return `z.literal('${literalValue}')`;\n }\n return `z.literal(${literalValue})`;\n }\n if (typeName === 'ZodUnion') {\n const options = valDef.options;\n if (Array.isArray(options)) {\n return `z.union([${options.map(getBaseType).join(', ')}])`;\n }\n return 'z.union([...])';\n }\n if (typeName === 'ZodDate') {\n return 'z.date()';\n }\n if (typeName === 'ZodRecord') {\n const keyType = valDef.keyType;\n const valueType = valDef.valueType;\n\n let keyTypeStr = 'z.string()';\n if (keyType && keyType._def?.typeName !== 'ZodString') {\n keyTypeStr = getBaseType(keyType);\n }\n\n let valueTypeStr = 'z.any()';\n if (valueType) {\n valueTypeStr = getBaseType(valueType);\n }\n\n return `z.record(${keyTypeStr}, ${valueTypeStr})`;\n }\n if (typeName === 'ZodMap') {\n const keyType = valDef.keyType;\n const valueType = valDef.valueType;\n\n let keyTypeStr = 'z.any()';\n if (keyType) {\n keyTypeStr = getBaseType(keyType);\n }\n\n let valueTypeStr = 'z.any()';\n if (valueType) {\n valueTypeStr = getBaseType(valueType);\n }\n\n return `z.map(${keyTypeStr}, ${valueTypeStr})`;\n }\n if (typeName === 'ZodTuple') {\n const items = valDef.items;\n\n if (Array.isArray(items)) {\n const itemsTypeStr = items.map(item => getBaseType(item)).join(', ');\n return `z.tuple([${itemsTypeStr}])`;\n }\n return 'z.tuple([])';\n }\n if (typeName === 'ZodNullable') {\n return `${getBaseType(valDef.innerType)}.nullable()`;\n }\n if (typeName === 'ZodOptional') {\n return `${getBaseType(valDef.innerType)}.optional()`;\n }\n // Add more type checks as needed\n return 'z.any()';\n };\n\n // Check for modifiers and description\n const applyModifiers = (val: any, baseType: string): string => {\n let result = baseType;\n let currentVal = val;\n\n // Check for .nullable() modifier using duck-typing\n if (currentVal?._def?.typeName === 'ZodNullable') {\n result = `${getBaseType(currentVal._def.innerType)}.nullable()`;\n currentVal = currentVal._def.innerType;\n }\n\n // Check for .optional() modifier using duck-typing\n if (currentVal?._def?.typeName === 'ZodOptional') {\n if (!result.endsWith('.nullable()')) {\n result = `${getBaseType(currentVal._def.innerType)}.optional()`;\n }\n }\n\n // Check for description\n const description = val?._def?.description;\n if (typeof description === 'string') {\n result += `.describe('${description.replace(/'/g, \"\\\\'\")}')`;\n }\n\n return result;\n };\n\n const baseType = getBaseType(value);\n const finalType = applyModifiers(value, baseType);\n\n return `${indentString}${key}: ${finalType},`;\n });\n\n return `z.object({\\n${reconstructed.join('\\n')}\\n})`;\n};\n\n\n// copied from https://github.com/browserbase/stagehand/blob/main/lib/llm/LLMProvider.ts#L62\nconst modelToProviderMap: Record<string, string> = {\n \"gpt-4.1\": \"openai\",\n \"gpt-4.1-mini\": \"openai\",\n \"gpt-4.1-nano\": \"openai\",\n \"o4-mini\": \"openai\",\n //prettier-ignore\n \"o3\": \"openai\",\n \"o3-mini\": \"openai\",\n //prettier-ignore\n \"o1\": \"openai\",\n \"o1-mini\": \"openai\",\n \"gpt-4o\": \"openai\",\n \"gpt-4o-mini\": \"openai\",\n \"gpt-4o-2024-08-06\": \"openai\",\n \"gpt-4.5-preview\": \"openai\",\n \"o1-preview\": \"openai\",\n \"claude-3-5-sonnet-latest\": \"anthropic\",\n \"claude-3-5-sonnet-20240620\": \"anthropic\",\n \"claude-3-5-sonnet-20241022\": \"anthropic\",\n \"claude-3-7-sonnet-20250219\": \"anthropic\",\n \"claude-3-7-sonnet-latest\": \"anthropic\",\n \"cerebras-llama-3.3-70b\": \"cerebras\",\n \"cerebras-llama-3.1-8b\": \"cerebras\",\n \"groq-llama-3.3-70b-versatile\": \"groq\",\n \"groq-llama-3.3-70b-specdec\": \"groq\",\n \"moonshotai/kimi-k2-instruct\": \"groq\",\n \"gemini-1.5-flash\": \"google\",\n \"gemini-1.5-pro\": \"google\",\n \"gemini-1.5-flash-8b\": \"google\",\n \"gemini-2.0-flash-lite\": \"google\",\n \"gemini-2.0-flash\": \"google\",\n \"gemini-2.5-flash-preview-04-17\": \"google\",\n \"gemini-2.5-pro-preview-03-25\": \"google\",\n};\n\nexport const modelToProvider = (model: string): string | undefined => {\n const clean = model.toLowerCase().trim();\n if (clean.startsWith(\"gpt-\") || clean.match(/^o\\d-/)) {\n return \"openai\";\n }\n if (clean.startsWith(\"claude-\")) {\n return \"anthropic\";\n }\n if (clean.startsWith(\"gemini-\")) {\n return \"google\";\n }\n if (clean.startsWith(\"cerebras-\")) {\n return \"cerebras\";\n }\n if (clean.startsWith(\"groq-\")) {\n return \"groq\";\n }\n return modelToProviderMap[clean];\n};\n\n/**\n * The session recording inject script function.\n * This function runs in the browser context and sets up rrweb recording.\n * Exported so it can be converted to a string for CDP Runtime.evaluate.\n * @param {SessionRecordingOptions} sessionRecordingOptions - Optional recording options\n * for masking inputs\n * @param {boolean} stringifyCallbackArgs - If true, stringify arguments when calling\n * lmnrSendEvents (for raw CDP bindings).\n */\nexport const injectScript = (\n sessionRecordingOptions?: SessionRecordingOptions,\n stringifyCallbackArgs?: boolean,\n) => {\n const BATCH_TIMEOUT = 2000; // Send events every 2 seconds\n const HEARTBEAT_INTERVAL = 1000;\n const CHUNK_SIZE = 256 * 1024; // 256KB chunks for CDP message limits\n\n (window as unknown as LmnrWindow).lmnrRrwebEventsBatch = [];\n (window as unknown as LmnrWindow).lmnrChunkSequence = 0;\n (window as unknown as LmnrWindow).lmnrSendInProgress = false;\n\n // Define a wrapper function that handles stringification based on the parameter\n const sendEvent = stringifyCallbackArgs\n ? (chunk: any) => (window as unknown as LmnrWindow).lmnrSendEvents(JSON.stringify(chunk))\n : (chunk: any) => (window as unknown as LmnrWindow).lmnrSendEvents(chunk);\n\n // Gzip compress a string using CompressionStream API (main thread, no workers)\n const gzipCompress = async (str: string): Promise<Uint8Array<ArrayBuffer>> => {\n const encoder = new TextEncoder();\n const inputBytes = encoder.encode(str);\n\n const cs = new CompressionStream('gzip');\n const writer = cs.writable.getWriter();\n const reader = cs.readable.getReader();\n\n // TODO: investigate why the events are not sent if we await the write and close\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n writer.write(inputBytes);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n writer.close();\n\n const parts = [];\n let totalLength = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n parts.push(value);\n totalLength += value.length;\n }\n\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n };\n\n // Convert a Uint8Array to base64 string\n const bufferToBase64 = async (buffer: Uint8Array<ArrayBuffer>): Promise<string> => {\n const base64url = await new Promise<string>((r) => {\n const reader = new FileReader();\n reader.onload = () => r(reader.result as string);\n reader.readAsDataURL(new Blob([buffer]));\n });\n return base64url.slice(base64url.indexOf(',') + 1);\n };\n\n // Create chunks from a string with metadata\n const createChunks = (str: string, batchId: string): EventChunk[] => {\n const chunks = [];\n const totalChunks = Math.ceil(str.length / CHUNK_SIZE);\n\n for (let i = 0; i < str.length; i += CHUNK_SIZE) {\n const chunk = str.slice(i, i + CHUNK_SIZE);\n chunks.push({\n batchId: batchId,\n chunkIndex: chunks.length,\n totalChunks: totalChunks,\n data: chunk,\n isFinal: chunks.length === totalChunks - 1,\n });\n }\n\n return chunks;\n };\n\n const sendBatchIfReady = async () => {\n if ((window as unknown as LmnrWindow).lmnrRrwebEventsBatch.length === 0) {\n return;\n }\n if (typeof (window as unknown as LmnrWindow).lmnrSendEvents !== 'function') {\n return;\n }\n // Prevent overlapping sends - if previous send is still in progress,\n // events stay in the batch and will be picked up next interval\n if ((window as unknown as LmnrWindow).lmnrSendInProgress) {\n return;\n }\n\n (window as unknown as LmnrWindow).lmnrSendInProgress = true;\n const events = (window as unknown as LmnrWindow).lmnrRrwebEventsBatch;\n (window as unknown as LmnrWindow).lmnrRrwebEventsBatch = [];\n\n try {\n // Compress each event's data field individually\n const compressedEvents = [];\n for (const event of events) {\n try {\n const dataString = JSON.stringify(event.data);\n const compressed = await gzipCompress(dataString);\n const base64Data = await bufferToBase64(compressed);\n compressedEvents.push({\n ...event,\n data: base64Data,\n });\n } catch (e) {\n console.error('Failed to compress event:', e);\n }\n }\n\n const batchId = `${Date.now()}_${(window as unknown as LmnrWindow).lmnrChunkSequence++}`;\n const batchString = JSON.stringify(compressedEvents);\n\n if (batchString.length <= CHUNK_SIZE) {\n sendEvent({\n batchId: batchId,\n chunkIndex: 0,\n totalChunks: 1,\n data: batchString,\n isFinal: true,\n });\n } else {\n const chunks = createChunks(batchString, batchId);\n for (const chunk of chunks) {\n sendEvent(chunk);\n }\n }\n } catch (error) {\n console.error('Failed to send events:', error);\n } finally {\n (window as unknown as LmnrWindow).lmnrSendInProgress = false;\n }\n };\n\n if (!(window as unknown as LmnrWindow).lmnrStartedRecordingEvents) {\n // It's fine to retrigger the interval even if the original function\n // is async and still running.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n setInterval(sendBatchIfReady, BATCH_TIMEOUT);\n\n (window as unknown as LmnrWindow).lmnrRrweb.record({\n emit(event: any) {\n // Synchronous emit - just push to batch, no async processing.\n // Compression happens later in sendBatchIfReady.\n (window as unknown as LmnrWindow).lmnrRrwebEventsBatch.push(event);\n },\n recordCanvas: true,\n collectFonts: true,\n recordCrossOriginIframes: true,\n maskInputOptions: {\n password: true,\n textarea: sessionRecordingOptions?.maskInputOptions?.textarea || false,\n text: sessionRecordingOptions?.maskInputOptions?.text || false,\n number: sessionRecordingOptions?.maskInputOptions?.number || false,\n select: sessionRecordingOptions?.maskInputOptions?.select || false,\n email: sessionRecordingOptions?.maskInputOptions?.email || false,\n tel: sessionRecordingOptions?.maskInputOptions?.tel || false,\n },\n });\n\n // Heartbeat events to indicate the session is still alive\n setInterval(\n () => {\n (window as unknown as LmnrWindow).lmnrRrweb.record.addCustomEvent('heartbeat', {\n title: document.title,\n url: document.URL,\n });\n },\n HEARTBEAT_INTERVAL,\n );\n\n (window as unknown as LmnrWindow).lmnrStartedRecordingEvents = true;\n }\n};\n\n\n// Buffer for storing incomplete chunk batches\nexport interface ChunkBuffer {\n chunks: Map<number, string>;\n total: number;\n timestamp: number;\n}\n\nconst OLD_BUFFER_TIMEOUT = 60000; // 60 seconds in milliseconds\n\nexport async function sendEvents(\n chunk: EventChunk,\n client: LaminarClient,\n chunkBuffers: Map<string, ChunkBuffer>,\n sessionId: StringUUID,\n traceId: StringUUID,\n): Promise<void> {\n try {\n // Handle chunked data\n const { batchId, chunkIndex, totalChunks, data } = chunk;\n\n // Validate required fields\n if (!sessionId || !traceId) {\n logger.debug(\"Missing sessionId or traceId in chunk\");\n return;\n }\n\n // Initialize buffer for this batch if needed\n if (!chunkBuffers.has(batchId)) {\n chunkBuffers.set(batchId, {\n chunks: new Map(),\n total: totalChunks,\n timestamp: Date.now(),\n });\n }\n\n const buffer = chunkBuffers.get(batchId)!;\n\n // Store chunk\n buffer.chunks.set(chunkIndex, data);\n\n // Check if we have all chunks\n if (buffer.chunks.size === totalChunks) {\n // Reassemble the full message\n let fullData = \"\";\n for (let i = 0; i < totalChunks; i++) {\n fullData += buffer.chunks.get(i);\n }\n\n // Parse the JSON\n const events = JSON.parse(fullData) as Record<string, any>[];\n\n // Send to server\n if (events && events.length > 0) {\n // Fire and forget - don't await to avoid blocking\n await client.browserEvents.send({ sessionId, traceId, events }).catch((error) => {\n logger.debug(\"Failed to send events: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }\n\n // Clean up buffer\n chunkBuffers.delete(batchId);\n }\n\n // Clean up old incomplete buffers\n const currentTime = Date.now();\n const toDelete: string[] = [];\n\n for (const [bid, buffer] of chunkBuffers.entries()) {\n if (currentTime - buffer.timestamp > OLD_BUFFER_TIMEOUT) {\n toDelete.push(bid);\n }\n }\n\n for (const bid of toDelete) {\n logger.debug(`Cleaning up incomplete chunk buffer: ${bid}`);\n chunkBuffers.delete(bid);\n }\n } catch (error) {\n logger.debug(\"Could not send events: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n}\n","import { LaminarClient } from '@lmnr-ai/client';\nimport { SessionRecordingOptions } from '@lmnr-ai/types';\nimport { diag, type Span, trace } from '@opentelemetry/api';\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\nimport type * as PlaywrightLib from \"playwright\";\nimport type { Browser, BrowserContext, Page } from 'playwright';\n\nimport { version as SDK_VERSION } from \"../../package.json\";\nimport { observe } from '../decorators';\nimport { Laminar } from '../laminar';\nimport { TRACE_HAS_BROWSER_SESSION } from '../opentelemetry-lib/tracing/attributes';\nimport { LaminarContextManager } from '../opentelemetry-lib/tracing/context';\nimport { initializeLogger, newUUID, NIL_UUID, otelTraceIdToUUID, StringUUID } from '../utils';\nimport {\n ChunkBuffer,\n EventChunk,\n injectSessionRecorder,\n LMNR_SEND_EVENTS_FUNCTION_NAME,\n sendEvents,\n takeFullSnapshot,\n} from \"./utils\";\n\nconst logger = initializeLogger();\n\n/* eslint-disable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type\n*/\nexport class PlaywrightInstrumentation extends InstrumentationBase {\n private _patchedBrowsers: Set<Browser> = new Set();\n private _parentSpans: Map<StringUUID, Span> = new Map();\n private _client: LaminarClient;\n private _sessionRecordingOptions?: SessionRecordingOptions;\n\n constructor(client: LaminarClient, sessionRecordingOptions?: SessionRecordingOptions) {\n super(\n \"@lmnr/playwright-instrumentation\",\n SDK_VERSION,\n {\n enabled: true,\n },\n );\n this._client = client;\n this._sessionRecordingOptions = sessionRecordingOptions;\n }\n\n // It's the caller's responsibility to ensure the span is ended\n public setParentSpanForSession(sessionId: StringUUID, span: Span) {\n this._parentSpans.set(sessionId, span);\n }\n\n public removeAndEndParentSpanForSession(sessionId: StringUUID) {\n const span = this._parentSpans.get(sessionId);\n if (span && span.isRecording()) {\n span.end();\n }\n this._parentSpans.delete(sessionId);\n }\n\n public getParentSpanForSession(sessionId: StringUUID): Span | undefined {\n return this._parentSpans.get(sessionId);\n }\n\n protected init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(\n \"playwright\",\n // TODO: test if the older versions work\n ['>=1.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return module;\n }\n\n public manuallyInstrument(pwModule: {\n chromium?: typeof PlaywrightLib.chromium,\n firefox?: typeof PlaywrightLib.firefox,\n webkit?: typeof PlaywrightLib.webkit,\n }) {\n const browsers = [pwModule.chromium, pwModule.firefox, pwModule.webkit] as const;\n\n for (const browserType of browsers) {\n if (browserType) {\n this._wrap(\n browserType,\n 'launch',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n browserType,\n 'connect',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n browserType,\n 'connectOverCDP',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n browserType,\n 'launchPersistentContext',\n this.patchBrowserNewContext(),\n );\n }\n }\n\n return pwModule;\n }\n\n private patch(moduleExports: typeof PlaywrightLib, moduleVersion?: string) {\n diag.debug(`patching playwright ${moduleVersion}`);\n const browsers = ['chromium', 'firefox', 'webkit'] as const;\n\n for (const browserType of browsers) {\n if (moduleExports[browserType]) {\n // First we need to patch the browser launch to get access to the Page class\n this._wrap(\n moduleExports[browserType],\n `launch`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports[browserType],\n `connect`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports[browserType],\n 'connectOverCDP',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports[browserType],\n 'launchPersistentContext',\n this.patchBrowserNewContext(),\n );\n }\n }\n\n return moduleExports;\n }\n\n private unpatch(moduleExports: typeof PlaywrightLib, moduleVersion?: string) {\n diag.debug(`unpatching playwright ${moduleVersion}`);\n const browsers = ['chromium', 'firefox', 'webkit'] as const;\n\n for (const browserType of browsers) {\n if (moduleExports[browserType]) {\n // First we need to patch the browser launch to get access to the Page class\n this._wrap(\n moduleExports[browserType],\n `launch`,\n this.patchNewBrowser(),\n );\n }\n }\n\n for (const browser of this._patchedBrowsers) {\n this._unwrap(browser, 'newContext');\n }\n }\n\n private patchNewBrowser() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: any[]) {\n const browser: Browser = await original.call(this, ...args);\n const sessionId = newUUID();\n\n for (const context of browser.contexts()) {\n context.on('page', (page: Page) => plugin.patchPage(page, sessionId));\n for (const page of context.pages()) {\n await plugin.patchPage(page, sessionId);\n }\n }\n\n plugin._wrap(\n browser,\n 'newContext',\n plugin.patchBrowserNewContext(),\n );\n\n plugin._patchedBrowsers.add(browser);\n return browser;\n };\n }\n\n private patchBrowserNewContext() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: unknown[]) {\n const context: BrowserContext = await original.bind(this).apply(this, args);\n const sessionId = newUUID();\n // Patch pages created by browser, e.g. new tab\n context.on('page', async (page) => plugin.patchPage(page, sessionId));\n\n // Patch pages that are already created\n for (const page of context.pages()) {\n await plugin.patchPage(page, sessionId);\n }\n\n return context;\n };\n }\n\n public async patchPage(page: Page, sessionId: StringUUID) {\n const wrapped = async () => {\n // Note: be careful with await here, if the await is removed,\n // this creates a race condition, and playwright fails.\n await observe({ name: 'playwright.page' }, async () => {\n await this._patchPage(page, sessionId);\n });\n };\n\n const parentSpan = this.getParentSpanForSession(sessionId);\n if (parentSpan) {\n return await Laminar.withSpan(\n parentSpan,\n wrapped,\n );\n }\n\n return await wrapped();\n }\n\n private async _patchPage(page: Page, sessionId: StringUUID) {\n const originalBringToFront = page.bringToFront.bind(page);\n page.bringToFront = async () => {\n await originalBringToFront();\n await takeFullSnapshot(page);\n };\n\n const currentSpan = trace.getSpan(LaminarContextManager.getContext()) ?? trace.getActiveSpan();\n currentSpan?.setAttribute(TRACE_HAS_BROWSER_SESSION, true);\n const otelTraceId = currentSpan?.spanContext().traceId;\n const traceId = otelTraceId ? otelTraceIdToUUID(otelTraceId) : NIL_UUID;\n\n page.on('domcontentloaded', async () => {\n try {\n await injectSessionRecorder(page, this._sessionRecordingOptions);\n } catch (error) {\n logger.error(\"Error in onLoad handler: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n });\n\n const chunkBuffers = new Map<string, ChunkBuffer>();\n\n await injectSessionRecorder(page, this._sessionRecordingOptions);\n try {\n await page.exposeFunction(LMNR_SEND_EVENTS_FUNCTION_NAME, async (chunk: EventChunk) => {\n await sendEvents(chunk, this._client, chunkBuffers, sessionId, traceId);\n });\n } catch (error) {\n logger.debug(\"Could not expose function \" + LMNR_SEND_EVENTS_FUNCTION_NAME + \": \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}\n/* eslint-enable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type\n*/\n","import { trace } from \"@opentelemetry/api\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\n\nimport { observe as laminarObserve } from \"../../decorators\";\nimport { SPAN_TYPE } from \"../../opentelemetry-lib/tracing/attributes\";\nimport { LaminarContextManager } from \"../../opentelemetry-lib/tracing/context\";\nimport { modelToProvider } from \"../utils\";\n\nexport interface GlobalLLMClientOptions {\n provider: \"openai\" | \"anthropic\" | \"cerebras\" | \"groq\" | (string & {})\n model: string\n}\n\ninterface CreateChatCompletionOptions {\n options: {\n messages?: any[];\n temperature?: number;\n top_p?: number;\n frequency_penalty?: number;\n presence_penalty?: number;\n maxTokens?: number;\n maxOutputTokens?: number;\n response_model?: {\n name: string;\n schema: any;\n };\n tools?: any[];\n };\n logger?: (message: any) => void;\n retries?: number;\n}\n\ninterface LLMResponse {\n id: string;\n object: string;\n created: number;\n model: string;\n choices?: {\n index: number;\n message: {\n role: string;\n content: string | null;\n tool_calls?: {\n id: string;\n type: string;\n function: {\n name: string;\n arguments: string;\n };\n }[];\n };\n finish_reason: string;\n }[];\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\n/**\n * Creates a wrapper function for LLM client's createChatCompletion method\n * that adds OpenTelemetry tracing with detailed span attributes.\n *\n * This wrapper is shared between Stagehand v2 and v3 instrumentations.\n *\n * @param globalLLMClientOptions - WeakMap to track LLM client options (provider and model)\n * @returns A wrapper function compatible with OpenTelemetry's _wrap method\n */\nexport const createLLMClientCreateChatCompletionWrapper = (\n globalLLMClientOptions: WeakMap<any, GlobalLLMClientOptions | undefined>,\n) => (original: (...args: any[]) => Promise<any>) =>\n async function createChatCompletion(this: any, ...args: any[]) {\n const options = args[0] as CreateChatCompletionOptions;\n return await laminarObserve({\n name: \"createChatCompletion\",\n // input and output are set as gen_ai.prompt and gen_ai.completion\n ignoreInput: true,\n ignoreOutput: true,\n }, async () => {\n const currentSpan = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n const span = currentSpan!;\n const innerOptions = options.options;\n const recordedProvider = globalLLMClientOptions.get(this)?.provider;\n const provider = (\n recordedProvider === \"aisdk\"\n && globalLLMClientOptions.get(this)?.model\n )\n ? (\n modelToProvider(globalLLMClientOptions.get(this)!.model)\n ?? \"aisdk\"\n )\n : recordedProvider;\n\n // Set request attributes\n span.setAttributes({\n [SPAN_TYPE]: \"LLM\",\n ...(innerOptions.temperature ? {\n \"gen_ai.request.temperature\": innerOptions.temperature,\n } : {}),\n ...(innerOptions.top_p ? {\n \"gen_ai.request.top_p\": innerOptions.top_p,\n } : {}),\n ...(innerOptions.frequency_penalty ? {\n \"gen_ai.request.frequency_penalty\": innerOptions.frequency_penalty,\n } : {}),\n ...(innerOptions.presence_penalty ? {\n \"gen_ai.request.presence_penalty\": innerOptions.presence_penalty,\n } : {}),\n ...((innerOptions.maxTokens !== undefined || innerOptions.maxOutputTokens !== undefined) ? {\n \"gen_ai.request.max_tokens\": innerOptions.maxTokens ?? innerOptions.maxOutputTokens,\n } : {}),\n ...(globalLLMClientOptions.get(this) ? {\n \"gen_ai.request.model\": globalLLMClientOptions.get(this)?.model,\n \"gen_ai.system\": provider,\n } : {}),\n });\n\n // Set message attributes\n innerOptions.messages?.forEach((message, index) => {\n span.setAttributes({\n [`gen_ai.prompt.${index}.role`]: message.role,\n [`gen_ai.prompt.${index}.content`]: JSON.stringify(message.content),\n });\n });\n\n // Set tool/function attributes\n innerOptions.tools?.forEach((tool, index) => {\n span.setAttributes({\n [`llm.request.functions.${index}.name`]: tool.name,\n [`llm.request.functions.${index}.description`]: tool.description,\n [`llm.request.functions.${index}.parameters`]: JSON.stringify(tool.parameters),\n });\n });\n\n // Set structured output schema if present\n if (innerOptions.response_model?.schema) {\n const schema = zodToJsonSchema(innerOptions.response_model.schema);\n if (schema) {\n span.setAttributes({\n [`gen_ai.request.structured_output_schema`]: JSON.stringify(schema),\n });\n }\n }\n\n // Execute the original method\n const result = await original.bind(this).apply(this, args) as LLMResponse;\n\n // Set response attributes\n span.setAttributes({\n \"gen_ai.response.model\": result.model,\n \"gen_ai.usage.input_tokens\": result.usage?.prompt_tokens ?? 0,\n \"gen_ai.usage.output_tokens\": result.usage?.completion_tokens ?? 0,\n \"llm.usage.total_tokens\": result.usage?.total_tokens ?? 0,\n });\n\n // Set completion attributes\n result.choices?.forEach(choice => {\n const index = choice.index;\n span.setAttributes({\n [`gen_ai.completion.${index}.finish_reason`]: choice.finish_reason,\n [`gen_ai.completion.${index}.role`]: choice.message.role,\n });\n if (choice.message.content) {\n span.setAttribute(\n `gen_ai.completion.${index}.content`,\n JSON.stringify(choice.message.content),\n );\n }\n choice.message.tool_calls?.forEach((toolCall, toolCallIndex) => {\n span.setAttributes({\n [`gen_ai.completion.${index}.message.tool_calls.${toolCallIndex}.id`]: toolCall.id,\n [`gen_ai.completion.${index}.message.tool_calls.${toolCallIndex}.name`]:\n toolCall.function.name,\n [`gen_ai.completion.${index}.message.tool_calls.${toolCallIndex}.arguments`]:\n JSON.stringify(toolCall.function.arguments),\n });\n });\n });\n\n // Handle special case when choices is empty (structured output mode)\n if (!result.choices || result.choices.length === 0) {\n const data = (result as any).data;\n if (data) {\n span.setAttributes({\n \"gen_ai.completion.0.role\": \"assistant\",\n \"gen_ai.completion.0.content\": typeof data === \"string\"\n ? data\n : JSON.stringify(data),\n });\n }\n }\n\n return result;\n });\n };\n","import { diag, trace } from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\nimport { z } from \"zod/v3\";\n\nimport { version as SDK_VERSION } from \"../../../package.json\";\nimport { observe as laminarObserve } from \"../../decorators\";\nimport { Laminar } from \"../../laminar\";\nimport { LaminarContextManager } from \"../../opentelemetry-lib/tracing/context\";\nimport { newUUID, StringUUID } from \"../../utils\";\nimport { PlaywrightInstrumentation } from \"../playwright\";\nimport {\n cleanStagehandLLMClient,\n nameArgsOrCopy,\n prettyPrintZodSchema,\n} from \"../utils\";\nimport { createLLMClientCreateChatCompletionWrapper } from \"./shared-llm-wrapper\";\n\n// Stagehand interfaces:\ntype AvailableModel = string;\n\ninterface ActOptions {\n action: string;\n modelName?: AvailableModel;\n modelClientOptions?: any; // ClientOptions\n variables?: Record<string, string>;\n domSettleTimeoutMs?: number;\n timeoutMs?: number;\n iframes?: boolean;\n frameId?: string;\n}\ntype LLMResponse = {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: {\n index: number;\n message: {\n role: string;\n content: string | null;\n tool_calls: {\n id: string;\n type: string;\n function: {\n name: string;\n arguments: string;\n };\n }[];\n };\n finish_reason: string;\n }[];\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n};\n\ninterface ChatCompletionInnerOptions {\n messages: any[]; // ChatMessage[]\n temperature?: number;\n top_p?: number;\n frequency_penalty?: number;\n presence_penalty?: number;\n image?: {\n buffer: Buffer;\n description?: string;\n };\n response_model?: {\n name: string;\n schema: any; // ZodType\n };\n tools?: any[]; // LLMTool[]\n tool_choice?: \"auto\" | \"none\" | \"required\";\n maxTokens?: number;\n requestId?: string;\n};\n\ninterface CreateChatCompletionOptions {\n options: ChatCompletionInnerOptions;\n logger: (message: any) => void;\n retries?: number;\n}\n\ndeclare abstract class LLMClient {\n type: \"openai\" | \"anthropic\" | \"cerebras\" | \"groq\" | (string & {});\n modelName: AvailableModel | (string & {});\n hasVision: boolean;\n clientOptions: any; // ClientOptions\n userProvidedInstructions?: string;\n constructor(modelName: AvailableModel, userProvidedInstructions?: string);\n abstract createChatCompletion<T = LLMResponse>(\n options: CreateChatCompletionOptions\n ): Promise<T>;\n generateText: (args: any) => Promise<any>;\n streamText: (args: any) => any;\n streamObject: (args: any) => any;\n generateImage: (args: any) => Promise<any>;\n embed: (args: any) => Promise<any>;\n embedMany: (args: any) => Promise<any>;\n transcribe: (args: any) => Promise<any>;\n generateSpeech: (args: any) => Promise<any>;\n};\n\ninterface StagehandPage {\n act: (args: any) => Promise<any>;\n extract: (args: any) => Promise<any>;\n observe: (args: any) => Promise<any>;\n on: (args: any) => any;\n}\n// ================================\n\n\ninterface GlobalLLMClientOptions {\n // named `type` in Stagehand\n provider: \"openai\" | \"anthropic\" | \"cerebras\" | \"groq\" | (string & {})\n model: string\n}\n\ntype AgentClient = {\n execute: (\n instructionOrOptions: string | object,\n ) => Promise<object>;\n};\n\n/* eslint-disable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return\n*/\nexport class StagehandV2Instrumentation extends InstrumentationBase {\n private playwrightInstrumentation: PlaywrightInstrumentation;\n private globalLLMClientOptions: WeakMap<\n LLMClient,\n GlobalLLMClientOptions | undefined\n > = new WeakMap();\n private globalAgentOptions: WeakMap<\n object,\n Record<string, any> | undefined\n > = new WeakMap();\n private stagehandInstanceToSessionId: WeakMap<object, StringUUID> = new WeakMap();\n\n constructor(playwrightInstrumentation: PlaywrightInstrumentation) {\n super(\n \"@lmnr/browserbase-stagehand-instrumentation\",\n SDK_VERSION,\n {\n enabled: true,\n },\n );\n this.playwrightInstrumentation = playwrightInstrumentation;\n }\n\n protected init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(\n \"@browserbasehq/stagehand\",\n ['>=1.0.0 <3.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return module;\n }\n\n private patch(moduleExports: any, moduleVersion?: string) {\n diag.debug(`patching stagehand ${moduleVersion}`);\n // Check if Stagehand is non-configurable\n const descriptor = Object.getOwnPropertyDescriptor(moduleExports, 'Stagehand');\n if (descriptor && !descriptor.configurable) {\n // Create a proxy for the entire module exports\n const originalStagehand = moduleExports.Stagehand;\n const patchedConstructor = this.patchStagehandConstructor()(originalStagehand);\n\n // Create a proxy for the module exports\n return new Proxy(moduleExports, {\n get: (target, prop) => {\n if (prop === 'Stagehand') {\n return patchedConstructor;\n }\n return target[prop as keyof typeof target];\n },\n });\n } else {\n // If it's configurable, use the standard _wrap method\n this._wrap(\n moduleExports,\n 'Stagehand',\n this.patchStagehandConstructor(),\n );\n\n return moduleExports;\n }\n }\n\n public manuallyInstrument(Stagehand: any) {\n diag.debug('manually instrumenting stagehand');\n\n // Since we can't replace the Stagehand constructor directly due to non-configurable property,\n // we'll patch the prototype methods of the existing constructor\n\n // First, patch the init method on the prototype\n if (Stagehand && Stagehand.prototype) {\n this._wrap(\n Stagehand.prototype,\n 'init',\n this.patchStagehandInit(),\n );\n this._wrap(\n Stagehand.prototype,\n 'close',\n this.patchStagehandClose(),\n );\n }\n }\n\n private unpatch(moduleExports: any, moduleVersion?: string) {\n diag.debug(`unpatching stagehand ${moduleVersion}`);\n this._unwrap(moduleExports, 'Stagehand');\n\n if (moduleExports.Stagehand) {\n this._unwrap(moduleExports.Stagehand.prototype, 'init');\n this._unwrap(moduleExports.Stagehand.prototype, 'close');\n if (moduleExports.Stagehand.prototype?.page) {\n this._unwrap(moduleExports.Stagehand.prototype.page, 'act');\n this._unwrap(moduleExports.Stagehand.prototype.page, 'extract');\n this._unwrap(moduleExports.Stagehand.prototype.page, 'observe');\n const observeHandler = (moduleExports.Stagehand.prototype.page).observeHandler;\n if (observeHandler) {\n this._unwrap(observeHandler, 'observe');\n }\n const extractHandler = (moduleExports.Stagehand.prototype.page).extractHandler;\n if (extractHandler) {\n this._unwrap(extractHandler, 'textExtract');\n this._unwrap(extractHandler, 'domExtract');\n }\n const actHandler = (moduleExports.Stagehand.prototype.page).actHandler;\n if (actHandler) {\n this._unwrap(actHandler, 'act');\n }\n }\n }\n\n return moduleExports;\n }\n\n private patchStagehandConstructor() {\n const instrumentation = this;\n\n return (Original: any) => {\n // Create a constructor function that maintains the same signature\n const Stagehand = function (this: InstanceType<typeof Original>, ...args: any[]) {\n // Only apply if this is a new instance\n if (!(this instanceof Stagehand)) {\n return new (Stagehand)(...args);\n }\n\n const instance = new Original(args.length > 0 ? args[0] : undefined);\n Object.assign(this, instance);\n\n instrumentation._wrap(\n this,\n 'init',\n instrumentation.patchStagehandInit(),\n );\n\n instrumentation._wrap(\n this,\n 'close',\n instrumentation.patchStagehandClose(),\n );\n\n return this;\n } as unknown as typeof Original;\n\n // Copy static properties\n Object.setPrototypeOf(Stagehand, Original);\n // Copy prototype properties\n Stagehand.prototype = Object.create(Original.prototype);\n Stagehand.prototype.constructor = Stagehand;\n\n return Stagehand;\n };\n }\n\n private patchStagehandInit() {\n const instrumentation = this;\n\n return (original: any) => async function method(this: any) {\n const sessionId = newUUID();\n\n // Make sure the parent span is set before calling the original init method\n // so that playwright instrumentation does not set its default parent span\n const parentSpan = Laminar.startSpan({\n name: 'Stagehand',\n });\n instrumentation.playwrightInstrumentation.setParentSpanForSession(sessionId, parentSpan);\n\n const result = await original.bind(this).apply(this);\n for (const page of this.context.pages()) {\n await instrumentation.playwrightInstrumentation.patchPage(page, sessionId);\n }\n await instrumentation.playwrightInstrumentation.patchPage(this.page, sessionId);\n\n instrumentation._wrap(\n this,\n 'agent',\n instrumentation.patchStagehandAgentInitializer(sessionId),\n );\n\n // when new playwright page opens, we need to add playwright instrumentation\n // to it and instrument the stagehand page stored on the stagehand instance\n this.context.on('page', async (page: any) => {\n await instrumentation.playwrightInstrumentation.patchPage(page, sessionId);\n instrumentation.patchStagehandPage(this.stagehandPage, sessionId);\n });\n\n instrumentation.patchStagehandPage(this.stagehandPage, sessionId);\n if (this.llmClient) {\n instrumentation.globalLLMClientOptions.set(this.llmClient, {\n provider: this.llmClient.type,\n model: this.llmClient.modelName,\n });\n instrumentation._wrap(\n this.llmClient,\n 'createChatCompletion',\n instrumentation.patchStagehandLLMClientCreateChatCompletion(),\n );\n }\n\n instrumentation.stagehandInstanceToSessionId.set(this, sessionId);\n return result;\n };\n }\n\n private patchStagehandClose() {\n const instrumentation = this;\n return (original: Function) => async function method(this: any, ...args: any[]) {\n // Clean up the session from the registry\n const sessionId = instrumentation.stagehandInstanceToSessionId.get(this);\n if (sessionId) {\n instrumentation.playwrightInstrumentation.removeAndEndParentSpanForSession(sessionId);\n instrumentation.stagehandInstanceToSessionId.delete(this);\n }\n\n await original.bind(this).apply(this, args);\n };\n }\n\n private patchStagehandPage(page: StagehandPage, sessionId: StringUUID) {\n const actHandler = (page as any).actHandler;\n if (actHandler) {\n if (actHandler.act) {\n this._wrap(\n actHandler,\n 'act',\n this.patchStagehandV1ActHandlerAct(),\n );\n }\n if (actHandler.actFromObserveResult) {\n this._wrap(\n actHandler,\n 'actFromObserveResult',\n this.patchStagehandV2ActHandlerActFromObserveResult(),\n );\n }\n if (actHandler.observeAct) {\n this._wrap(\n actHandler,\n 'observeAct',\n this.patchStagehandV2ActHandlerObserveAct(),\n );\n }\n }\n\n const observeHandler = (page as any).observeHandler;\n if (observeHandler) {\n this._wrap(\n observeHandler,\n 'observe',\n this.patchStagehandObserveHandler(),\n );\n }\n\n const extractHandler = (page as any).extractHandler;\n if (extractHandler) {\n if (extractHandler.textExtract) {\n this._wrap(\n extractHandler,\n 'textExtract',\n this.patchStagehandExtractHandlerTextExtract(),\n );\n }\n\n if (extractHandler.domExtract) {\n this._wrap(\n extractHandler,\n 'domExtract',\n this.patchStagehandExtractHandlerDomExtract(),\n );\n }\n }\n\n this._wrap(\n page,\n 'act',\n this.patchStagehandGlobalMethod('act', sessionId),\n );\n\n this._wrap(\n page,\n 'extract',\n this.patchStagehandGlobalMethod('extract', sessionId),\n );\n\n this._wrap(\n page,\n 'observe',\n this.patchStagehandGlobalMethod('observe', sessionId),\n );\n }\n\n private patchStagehandGlobalMethod(methodName: string, sessionId: StringUUID) {\n const instrumentation = this;\n return (original: (...args: any[]) => Promise<any>) =>\n async function method(this: any, ...args: any[]) {\n const input = nameArgsOrCopy(args);\n if (methodName === \"extract\"\n && Array.isArray(input)\n && input.length > 0 && (input[0])?.schema\n ) {\n // We need to clone the input object to avoid mutating the original object\n // because the original object is passed to the LLM client\n const { schema, ...rest } = input[0];\n let prettySchema = schema?.shape;\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n input[0] = { ...rest, schema: prettySchema };\n }\n return await Laminar.withSpan(\n instrumentation.playwrightInstrumentation.getParentSpanForSession(sessionId)!,\n async () => await laminarObserve(\n {\n name: `stagehand.${methodName}`,\n input,\n },\n async (thisArg: any, rest: any[]) => await original.apply(thisArg, rest),\n this, args,\n ),\n );\n };\n }\n\n private patchStagehandV1ActHandlerAct() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function act(this: any, ...args: any[]) {\n return await laminarObserve(\n {\n name: 'stagehand.actHandler.act',\n input: {\n action: args[0].action,\n llmClient: cleanStagehandLLMClient(args[0].llmClient ?? {}),\n chunksSeen: args[0].chunksSeen,\n steps: args[0].steps,\n requestId: args[0].requestId,\n schema: args[0].schema,\n retries: args[0].retries,\n variables: args[0].variables,\n previousSelectors: args[0].previousSelectors,\n skipActionCacheForThisStep: args[0].skipActionCacheForThisStep,\n domSettleTimeoutMs: args[0].domSettleTimeoutMs,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandV2ActHandlerActFromObserveResult() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function act(this: any, ...args: any[]) {\n return await laminarObserve(\n {\n name: 'stagehand.actHandler.actFromObserveResult',\n input: {\n observe: args?.[0] ?? null,\n domSettleTimeoutMs: args?.[1] ?? null,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandV2ActHandlerObserveAct() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function act(this: any, ...args: any[]) {\n const actOptions = args?.[0] as ActOptions | undefined;\n const llmClient = args.filter((arg) =>\n Object.keys(arg).includes('modelName'),\n )[0] as LLMClient | undefined;\n const requestId = typeof args?.[3] === 'string' ? args?.[3] : null;\n return await laminarObserve(\n {\n name: 'stagehand.actHandler.observeAct',\n input: {\n action: actOptions?.action,\n modelName: actOptions?.modelName,\n variables: actOptions?.variables,\n domSettleTimeoutMs: actOptions?.domSettleTimeoutMs,\n timeoutMs: actOptions?.timeoutMs,\n llmClient: cleanStagehandLLMClient(llmClient ?? {}),\n requestId: requestId,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n // Stagehand uses zod 3.x, so we need to use the v3 version of zod\n private patchStagehandExtractHandlerTextExtract() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function textExtract(this: any, ...args: any[]) {\n const schema = (args[0].schema as z.AnyZodObject);\n let prettySchema = schema?.shape;\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n return await laminarObserve(\n {\n name: 'stagehand.extractHandler.textExtract',\n input: {\n instruction: args[0].instruction,\n llmClient: cleanStagehandLLMClient(args[0].llmClient ?? {}),\n requestId: args[0].requestId,\n schema: prettySchema,\n content: args[0].content,\n domSettleTimeoutMs: args[0].domSettleTimeoutMs,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandExtractHandlerDomExtract() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function domExtract(this: any, ...args: any[]) {\n const schema = (args[0].schema as z.AnyZodObject);\n let prettySchema = schema?.shape;\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n\n return await laminarObserve(\n {\n name: 'stagehand.extractHandler.domExtract',\n input: {\n instruction: args[0].instruction,\n llmClient: cleanStagehandLLMClient(args[0].llmClient ?? {}),\n requestId: args[0].requestId,\n schema: prettySchema,\n content: args[0].content,\n chunksSeen: args[0].chunksSeen,\n domSettleTimeoutMs: args[0].domSettleTimeoutMs,\n },\n },\n async () => await original.apply(this, args),\n );\n };\n }\n\n private patchStagehandObserveHandler() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function observe(this: any, ...args: any[]) {\n\n return await laminarObserve(\n {\n name: 'stagehand.observeHandler.observe',\n input: {\n instruction: args[0].instruction,\n llmClient: cleanStagehandLLMClient(args[0].llmClient ?? {}),\n requestId: args[0].requestId,\n returnAction: args[0].returnAction,\n onlyVisible: args[0].onlyVisible,\n drawOverlay: args[0].drawOverlay,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandLLMClientCreateChatCompletion() {\n return createLLMClientCreateChatCompletionWrapper(this.globalLLMClientOptions);\n }\n\n private patchStagehandAgentInitializer(sessionId: StringUUID) {\n const instrumentation = this;\n return (original: (...args: any[]) => any) =>\n function agent(this: any, ...args: any[]) {\n if (args.length > 0 && typeof args[0] === 'object') {\n instrumentation.globalAgentOptions.set(this, args[0]);\n }\n const agent = original.bind(this).apply(this, args);\n instrumentation.patchStagehandAgent(agent, sessionId);\n return agent;\n };\n }\n\n private patchStagehandAgent(agent: AgentClient, sessionId: StringUUID) {\n this._wrap(\n agent,\n 'execute',\n this.patchStagehandAgentExecute(sessionId),\n );\n }\n\n private patchStagehandAgentExecute(sessionId: StringUUID) {\n const instrumentation = this;\n return (original: (this: any, ...args: any[]) => Promise<any>) =>\n async function execute(this: any, ...args: any[]) {\n const input = nameArgsOrCopy(args);\n\n return await Laminar.withSpan(\n instrumentation.playwrightInstrumentation.getParentSpanForSession(sessionId)!,\n async () => await laminarObserve(\n {\n name: 'stagehand.agent.execute',\n input,\n },\n async () => await laminarObserve(\n {\n name: 'execute',\n // input and output are set as gen_ai.prompt and gen_ai.completion\n ignoreInput: true,\n ignoreOutput: true,\n spanType: \"LLM\",\n },\n async () => {\n const span = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n\n const provider = instrumentation.globalAgentOptions.get(this)?.provider\n ?? instrumentation.globalLLMClientOptions.get(this)?.provider;\n const model = instrumentation.globalAgentOptions.get(this)?.model\n ?? instrumentation.globalLLMClientOptions.get(this)?.model;\n span?.setAttributes({\n ...(provider ? { \"gen_ai.system\": provider } : {}),\n ...(model ? { \"gen_ai.request.model\": model } : {}),\n });\n\n let promptIndex = 0;\n if (instrumentation.globalAgentOptions.get(this)?.instructions) {\n span?.setAttributes({\n \"gen_ai.prompt.0.content\":\n instrumentation.globalAgentOptions.get(this)?.instructions,\n \"gen_ai.prompt.0.role\": \"system\",\n });\n promptIndex++;\n }\n\n const instruction = typeof input === 'string' ? input : (input as any).instruction;\n if (instruction) {\n span?.setAttributes({\n [`gen_ai.prompt.${promptIndex}.content`]: instruction,\n [`gen_ai.prompt.${promptIndex}.role`]: \"user\",\n });\n }\n\n const result = await original\n .bind(this)\n .apply(this, args);\n\n if (result.completed && result.success && result.message) {\n const content = [{ type: \"text\", text: result.message }];\n if (result.actions && result.actions.length > 0) {\n content.push({\n type: \"text\",\n text: JSON.stringify({ actions: result.actions }),\n });\n }\n span?.setAttributes({\n \"gen_ai.completion.0.content\": JSON.stringify(content),\n \"gen_ai.completion.0.role\": \"assistant\",\n });\n } else if (result.completed && !result.success) {\n span?.recordException(new Error(result.message));\n }\n if (result.usage) {\n span?.setAttributes({\n \"gen_ai.usage.input_tokens\": result.usage.input_tokens,\n \"gen_ai.usage.output_tokens\": result.usage.output_tokens,\n \"llm.usage.total_tokens\":\n result.usage.input_tokens + result.usage.output_tokens,\n });\n }\n return result;\n },\n ),\n ),\n );\n };\n }\n}\n/* eslint-enable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return\n*/\n","import { LaminarClient } from '@lmnr-ai/client';\nimport { SessionRecordingOptions } from '@lmnr-ai/types';\nimport { diag, trace } from '@opentelemetry/api';\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\nimport type * as PuppeteerLib from \"puppeteer\";\nimport type { Browser, BrowserContext, Page } from 'puppeteer';\nimport type * as PuppeteerCoreLib from \"puppeteer-core\";\n\nimport { version as SDK_VERSION } from \"../../package.json\";\nimport { observe } from '../decorators';\nimport { TRACE_HAS_BROWSER_SESSION } from '../opentelemetry-lib/tracing/attributes';\nimport { LaminarContextManager } from '../opentelemetry-lib/tracing/context';\nimport { initializeLogger, newUUID, NIL_UUID, otelTraceIdToUUID, StringUUID } from '../utils';\nimport {\n ChunkBuffer,\n EventChunk,\n injectSessionRecorder,\n LMNR_SEND_EVENTS_FUNCTION_NAME,\n sendEvents,\n takeFullSnapshot,\n} from \"./utils\";\n\nconst logger = initializeLogger();\n\n\n/* eslint-disable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type\n*/\nexport class PuppeteerInstrumentation extends InstrumentationBase {\n private _patchedBrowsers: Set<Browser> = new Set();\n private _client: LaminarClient;\n private _sessionRecordingOptions?: SessionRecordingOptions;\n\n constructor(client: LaminarClient, sessionRecordingOptions?: SessionRecordingOptions) {\n super(\n \"@lmnr/puppeteer-instrumentation\",\n SDK_VERSION,\n {\n enabled: true,\n },\n );\n this._client = client;\n this._sessionRecordingOptions = sessionRecordingOptions;\n }\n\n protected init(): InstrumentationModuleDefinition[] {\n const puppeteerInstrumentation = new InstrumentationNodeModuleDefinition(\n \"puppeteer\",\n // About two years before first writing this instrumentation\n // and apparently no big breaking changes afterwards\n // https://github.com/puppeteer/puppeteer/releases\n ['>=19.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n const puppeteerCoreInstrumentation = new InstrumentationNodeModuleDefinition(\n \"puppeteer-core\",\n ['>=19.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return [puppeteerInstrumentation, puppeteerCoreInstrumentation];\n }\n\n public manuallyInstrument(puppeteerModule: typeof PuppeteerLib | typeof PuppeteerCoreLib) {\n this._wrap(\n puppeteerModule,\n 'launch',\n this.patchNewBrowser(),\n );\n\n this._wrap(\n puppeteerModule,\n 'connect',\n this.patchNewBrowser(),\n );\n\n return puppeteerModule;\n }\n\n private patch(\n moduleExports: typeof PuppeteerLib | typeof PuppeteerCoreLib,\n moduleVersion?: string,\n ) {\n diag.debug(`patching puppeteer ${moduleVersion}`);\n this._wrap(\n moduleExports,\n `launch`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports.PuppeteerNode.prototype,\n `launch`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports,\n `connect`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports.Puppeteer.prototype,\n `connect`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports.default,\n `launch`,\n this.patchNewBrowser(),\n );\n\n this._wrap(\n moduleExports.default,\n `connect`,\n this.patchNewBrowser(),\n );\n\n return moduleExports;\n }\n\n private unpatch(moduleExports: typeof PuppeteerLib, moduleVersion?: string) {\n diag.debug(`unpatching puppeteer ${moduleVersion}`);\n this._unwrap(\n moduleExports,\n `launch`,\n );\n\n this._unwrap(\n moduleExports,\n `connect`,\n );\n\n this._unwrap(\n moduleExports.PuppeteerNode.prototype,\n `launch`,\n );\n\n this._unwrap(\n moduleExports.Puppeteer.prototype,\n `connect`,\n );\n\n this._unwrap(\n moduleExports.default,\n `connect`,\n );\n\n this._unwrap(\n moduleExports.default,\n `launch`,\n );\n\n for (const browser of this._patchedBrowsers) {\n this._unwrap(browser, 'createBrowserContext');\n }\n }\n\n private patchNewBrowser() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: any[]) {\n const browser: Browser = await original.call(this, ...args);\n const sessionId = newUUID();\n\n for (const context of browser.browserContexts()) {\n context.on('targetcreated', (target) => {\n target.page().then(page => {\n if (page) {\n plugin.patchPage(page, sessionId).catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }\n })\n .catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n await Promise.all((await context.pages()).map(page => plugin.patchPage(page, sessionId)));\n }\n\n plugin._wrap(\n browser,\n 'createBrowserContext',\n plugin.patchBrowserNewContext(),\n );\n\n plugin._patchedBrowsers.add(browser);\n return browser;\n };\n }\n\n private patchBrowserNewContext() {\n const plugin = this;\n return (original: Function) => async function method(this: Browser, ...args: unknown[]) {\n const context: BrowserContext = await original.bind(this).apply(this, args);\n const sessionId = newUUID();\n // Patch pages created by browser, e.g. new tab\n context.on('targetcreated', (target) => {\n target.page().then(page => {\n if (page) {\n plugin.patchPage(page, sessionId).catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }\n })\n .catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n context.on('targetchanged', (target) => {\n target.page().then(page => {\n if (page) {\n plugin.patchPage(page, sessionId).catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n }\n })\n .catch(error => {\n logger.error(\"Failed to patch page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n\n // Patch pages that are already created\n for (const page of await context.pages()) {\n await plugin.patchPage(page, sessionId);\n }\n\n return context;\n };\n }\n\n public async patchPage(page: Page, sessionId: StringUUID) {\n return await observe({ name: 'puppeteer.page' }, async () => {\n await this._patchPage(page, sessionId);\n });\n }\n\n private async _patchPage(page: Page, sessionId: StringUUID) {\n const originalBringToFront = page.bringToFront.bind(page);\n\n page.bringToFront = async () => {\n await originalBringToFront();\n await takeFullSnapshot(page);\n };\n\n const currentSpan = trace.getSpan(LaminarContextManager.getContext()) ?? trace.getActiveSpan();\n currentSpan?.setAttribute(TRACE_HAS_BROWSER_SESSION, true);\n const otelTraceId = currentSpan?.spanContext().traceId;\n const traceId = otelTraceId ? otelTraceIdToUUID(otelTraceId) : NIL_UUID;\n\n page.on('domcontentloaded', () => {\n injectSessionRecorder(page, this._sessionRecordingOptions).catch(error => {\n logger.error(\"Error in onLoad handler: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n });\n });\n\n await injectSessionRecorder(page, this._sessionRecordingOptions);\n\n const chunkBuffers = new Map<string, ChunkBuffer>();\n\n try {\n await page.exposeFunction(LMNR_SEND_EVENTS_FUNCTION_NAME, async (chunk: EventChunk) => {\n await sendEvents(chunk, this._client, chunkBuffers, sessionId, traceId);\n });\n } catch (error) {\n logger.debug(\"Could not expose function \" + LMNR_SEND_EVENTS_FUNCTION_NAME + \": \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}\n/* eslint-enable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type\n*/\n","import { initializeLogger } from \"../../../utils\";\n\nexport const logger = initializeLogger();\n\n// CDP timeout for operations\nexport const CDP_OPERATION_TIMEOUT_MS = 10000;\n\n// URLs that should be skipped for recording\nexport const SKIP_URL_PATTERNS = [\n \"about:blank\",\n \"chrome-error://\",\n \"chrome://\",\n \"edge-error://\",\n \"edge://\",\n \"about:neterror\",\n \"about:certerror\",\n \"devtools://\",\n];\n","import { SessionRecordingOptions } from \"@lmnr-ai/types\";\n\nimport { RECORDER } from \"../../recorder\";\nimport { injectScript } from \"../../utils\";\nimport {\n CDP_OPERATION_TIMEOUT_MS,\n logger,\n SKIP_URL_PATTERNS,\n} from \"./constants\";\nimport {\n type FrameTree,\n type RuntimeBindingCalledEvent,\n type RuntimeEvaluateResult,\n type StagehandCdpConnection,\n type StagehandV3Page,\n type V3RecorderState,\n} from \"./types\";\n\n/**\n * Check if a URL should be skipped for recording (error pages, blank pages, etc.)\n */\nexport function shouldSkipUrl(url: string): boolean {\n if (!url) return true;\n return SKIP_URL_PATTERNS.some(pattern => url.startsWith(pattern));\n}\n\n/**\n * Create an isolated world for a page and return the execution context ID\n */\nexport async function getOrCreateIsolatedWorld(\n page: StagehandV3Page,\n): Promise<{ contextId: number; frameId: string } | null> {\n try {\n // Get the frame tree to find the main frame\n const frameTreeResult = await Promise.race([\n page.sendCDP<{ frameTree: FrameTree }>(\"Page.getFrameTree\"),\n new Promise<null>((_, reject) =>\n setTimeout(() => reject(new Error(\"Timeout getting frame tree\")), CDP_OPERATION_TIMEOUT_MS),\n ),\n ]);\n\n if (!frameTreeResult) return null;\n\n const frameId = frameTreeResult.frameTree.frame.id;\n\n // Create isolated world\n const isolatedWorldResult = await Promise.race([\n page.sendCDP<{ executionContextId: number }>(\"Page.createIsolatedWorld\", {\n frameId,\n worldName: \"laminar-recorder\",\n }),\n new Promise<null>((_, reject) =>\n setTimeout(() => reject(\n new Error(\"Timeout creating isolated world\")), CDP_OPERATION_TIMEOUT_MS,\n ),\n ),\n ]);\n\n if (!isolatedWorldResult) return null;\n\n return {\n contextId: isolatedWorldResult.executionContextId,\n frameId,\n };\n } catch (error) {\n logger.debug(\"Failed to create isolated world: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n}\n\n/**\n * Check if the session recorder is already present in the page\n */\nexport async function isRecorderPresent(\n page: StagehandV3Page,\n contextId: number,\n): Promise<boolean> {\n try {\n const result = await Promise.race([\n page.sendCDP<RuntimeEvaluateResult>(\"Runtime.evaluate\", {\n expression: \"typeof window.lmnrRrweb !== 'undefined'\",\n contextId,\n returnByValue: true,\n }),\n new Promise<null>((_, reject) =>\n setTimeout(() => reject(new Error(\"Timeout checking recorder\")), CDP_OPERATION_TIMEOUT_MS),\n ),\n ]);\n\n if (!result) return true; // On timeout, assume present to avoid double injection\n return result.result?.value === true;\n } catch (error) {\n logger.debug(\"Failed to check if recorder is present: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n return true; // On error, assume present to be safe\n }\n}\n\n/**\n * Inject the session recorder into a page using CDP\n */\nexport async function injectRecorderViaCDP(\n page: StagehandV3Page,\n state: V3RecorderState,\n conn: StagehandCdpConnection,\n sessionRecordingOptions?: SessionRecordingOptions,\n bindingHandler?: (event: RuntimeBindingCalledEvent) => void,\n): Promise<number | null> {\n try {\n // Check if we should skip this page\n let url: string;\n try {\n url = page.url();\n } catch (error) {\n logger.debug(\"Failed to get page URL, page might be closed: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n\n if (shouldSkipUrl(url)) {\n logger.debug(`Skipping recorder injection for URL: ${url}`);\n return null;\n }\n\n // Get or create isolated world\n const worldResult = await getOrCreateIsolatedWorld(page);\n if (!worldResult) {\n logger.debug(\"Failed to get isolated world for page\");\n return null;\n }\n\n const { contextId, frameId } = worldResult;\n\n // Check if already injected\n if (await isRecorderPresent(page, contextId)) {\n logger.debug(\"Recorder already present, skipping injection\");\n // Still register the context mapping\n state.contextIdToSession.set(contextId, {\n sessionId: state.sessionId,\n traceId: state.traceId,\n });\n return contextId;\n }\n\n // Inject rrweb base\n try {\n await page.sendCDP(\"Runtime.evaluate\", {\n expression: RECORDER,\n contextId,\n });\n } catch (error) {\n logger.debug(\"Failed to inject rrweb: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n\n // Inject recording setup script using the existing injectScript function\n // Convert function to string and create an IIFE with options\n // Pass true for stringifyCallbackArgs since CDP bindings require stringified arguments\n const optionsJson = JSON.stringify(sessionRecordingOptions ?? {});\n const injectExpression = `(${injectScript.toString()})(${optionsJson}, true);`;\n try {\n await page.sendCDP(\"Runtime.evaluate\", {\n expression: injectExpression,\n contextId,\n });\n } catch (error) {\n logger.debug(\"Failed to inject recording setup: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n\n // Add binding globally (not scoped to execution context)\n // The Runtime.bindingCalled event will include the executionContextId\n try {\n await page.sendCDP(\"Runtime.addBinding\", {\n name: \"lmnrSendEvents\",\n });\n logger.debug(`Added binding 'lmnrSendEvents' for page ${frameId}, context ${contextId}`);\n } catch (error) {\n // Binding might already exist, that's ok\n logger.debug(\"Binding may already exist: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n\n // Set up binding handler on this page using the internal Stagehand CDP session\n // The page.sendCDP method goes through the page's mainSession, so we need to listen there\n // We can access the session through the connection's internal structure\n if (bindingHandler) {\n try {\n const pageTargetId = page.targetId();\n if (!state.pageSessionHandlers.has(pageTargetId)) {\n // Access the connection's sessions map to find the session for this page\n const connInternal = conn as unknown as {\n getSession(sessionId: string): {\n on<P>(event: string, handler: (params: P) => void): void\n } | undefined;\n sessions: Map<string, unknown>;\n };\n\n // In Stagehand v3, each page has a corresponding session\n // We need to find the session that owns this page/target\n // The session for a page target is tracked in the context\n // We can iterate sessions and try to set up the listener\n if (connInternal.sessions) {\n for (const [sessionId, session] of connInternal.sessions.entries()) {\n try {\n // Set up the handler on each session (the correct one will receive the events)\n const sessionTyped = session as {\n on<P>(event: string, handler: (params: P) => void): void\n };\n if (sessionTyped.on) {\n sessionTyped.on<RuntimeBindingCalledEvent>(\n \"Runtime.bindingCalled\",\n bindingHandler,\n );\n logger.debug(`Set up binding handler on session ${sessionId}`);\n }\n } catch (error) {\n // Session might be closed, continue with next session\n logger.debug(`Failed to set up binding handler on session ${sessionId}: ` +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n state.pageSessionHandlers.set(pageTargetId, bindingHandler);\n }\n } catch (error) {\n logger.debug(\"Failed to set up binding handler: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // Register context mapping\n state.contextIdToSession.set(contextId, {\n sessionId: state.sessionId,\n traceId: state.traceId,\n });\n logger.debug(\n `Registered context mapping: contextId=${contextId}, sessionId=${state.sessionId}`,\n );\n\n // Mark page as instrumented\n state.instrumentedPageIds.add(frameId);\n\n logger.debug(`Successfully injected recorder into page ${frameId}`);\n return contextId;\n } catch (error) {\n logger.debug(\"Error injecting recorder: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n}\n","import { type SessionRecordingOptions, type StringUUID } from \"@lmnr-ai/types\";\n\nimport { EventChunk, sendEvents } from \"../../utils\";\nimport { injectRecorderViaCDP, shouldSkipUrl } from \"./cdp-helpers\";\nimport { logger } from \"./constants\";\nimport {\n RuntimeBindingCalledEvent,\n StagehandV3Context,\n TargetCreatedEvent,\n TargetInfoChangedEvent,\n V3RecorderState,\n} from \"./types\";\n\n/**\n * Handle Runtime.bindingCalled events\n */\nexport function createBindingHandler(\n state: V3RecorderState,\n): (event: RuntimeBindingCalledEvent) => void {\n return (event: RuntimeBindingCalledEvent) => {\n if (event.name !== \"lmnrSendEvents\") return;\n const sessionInfo = state.contextIdToSession.get(event.executionContextId);\n if (!sessionInfo) {\n logger.debug(\"No session info found for context ID: \" + event.executionContextId);\n // Try to find any matching session (for cases where context ID changed)\n // This is a fallback - normally the context should be mapped\n if (state.contextIdToSession.size > 0) {\n // Use the first available session info as fallback\n const [, fallbackInfo] = state.contextIdToSession.entries().next().value as\n [number, { sessionId: StringUUID; traceId: StringUUID }];\n if (fallbackInfo) {\n try {\n const chunk = JSON.parse(event.payload) as EventChunk;\n void sendEvents(\n chunk,\n state.client,\n state.chunkBuffers,\n fallbackInfo.sessionId,\n fallbackInfo.traceId,\n );\n } catch (error) {\n logger.debug(\"Failed to parse binding payload: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n return;\n }\n\n try {\n const chunk = JSON.parse(event.payload) as EventChunk;\n void sendEvents(\n chunk,\n state.client,\n state.chunkBuffers,\n sessionInfo.sessionId,\n sessionInfo.traceId,\n );\n } catch (error) {\n logger.debug(\"Failed to handle binding event: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n };\n}\n\n/**\n * Handle Target.targetCreated events for new pages\n */\nexport function createTargetCreatedHandler(\n context: StagehandV3Context,\n state: V3RecorderState,\n sessionRecordingOptions?: SessionRecordingOptions,\n): (event: TargetCreatedEvent) => Promise<void> {\n return async (event: TargetCreatedEvent) => {\n try {\n if (event.targetInfo.type !== \"page\") return;\n\n // Wait a bit for the page to be available in the context\n await new Promise(resolve => setTimeout(resolve, 200));\n // Try to inject into all uninstrumented pages\n for (const page of context.pages()) {\n try {\n const pageId = page.mainFrameId();\n if (!state.instrumentedPageIds.has(pageId)) {\n await injectRecorderViaCDP(\n page,\n state,\n context.conn,\n sessionRecordingOptions,\n state.bindingHandler ?? undefined,\n );\n }\n } catch (error) {\n // Page might have been closed or CDP session lost, continue with next page\n logger.debug(\"Error injecting recorder into new page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n } catch (error) {\n logger.debug(\"Error handling target created event: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n };\n}\n\n/**\n * Handle Target.targetInfoChanged events for URL changes/navigation\n */\nexport function createTargetInfoChangedHandler(\n context: StagehandV3Context,\n state: V3RecorderState,\n sessionRecordingOptions?: SessionRecordingOptions,\n): (event: TargetInfoChangedEvent) => Promise<void> {\n return async (event: TargetInfoChangedEvent) => {\n // Only handle page targets\n if (event.targetInfo.type !== \"page\") return;\n\n const url = event.targetInfo.url;\n\n if (shouldSkipUrl(url)) return;\n\n logger.debug(`Target URL changed to ${url}, checking if recorder injection needed`);\n\n await new Promise(resolve => setTimeout(resolve, 150));\n\n try {\n for (const page of context.pages()) {\n // Try to match by target ID\n const targetId = page.targetId();\n if (targetId === event.targetInfo.targetId) {\n await injectRecorderViaCDP(\n page, state, context.conn, sessionRecordingOptions, state.bindingHandler ?? undefined,\n );\n break;\n }\n }\n } catch (error) {\n logger.debug(\"Error handling target info change: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n };\n}\n","import { LaminarClient } from \"@lmnr-ai/client\";\nimport { type SessionRecordingOptions } from \"@lmnr-ai/types\";\nimport { diag, type Span, trace } from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\n\nimport { version as SDK_VERSION } from \"../../../../package.json\";\nimport { observe as laminarObserve } from \"../../../decorators\";\nimport { Laminar } from \"../../../laminar\";\nimport { TRACE_HAS_BROWSER_SESSION } from \"../../../opentelemetry-lib/tracing/attributes\";\nimport { LaminarContextManager } from \"../../../opentelemetry-lib/tracing/context\";\nimport { newUUID, otelTraceIdToUUID, StringUUID } from \"../../../utils\";\nimport { nameArgsOrCopy, prettyPrintZodSchema } from \"../../utils\";\nimport {\n createLLMClientCreateChatCompletionWrapper,\n GlobalLLMClientOptions,\n} from \"../shared-llm-wrapper\";\nimport { injectRecorderViaCDP } from \"./cdp-helpers\";\nimport { logger } from \"./constants\";\nimport {\n createBindingHandler,\n createTargetCreatedHandler,\n createTargetInfoChangedHandler,\n} from \"./event-handlers\";\nimport {\n StagehandV3Context,\n TargetCreatedEvent,\n TargetInfoChangedEvent,\n V3RecorderState,\n} from \"./types\";\n\n/* eslint-disable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return,\n @typescript-eslint/no-misused-promises\n*/\nexport class StagehandInstrumentation extends InstrumentationBase {\n private stagehandInstanceToSessionId: WeakMap<object, StringUUID> = new WeakMap();\n private globalLLMClientOptions: WeakMap<\n any,\n GlobalLLMClientOptions | undefined\n > = new WeakMap();\n private globalAgentOptions: WeakMap<\n object,\n Record<string, any> | undefined\n > = new WeakMap();\n private sessionIdToParentSpan: Map<StringUUID, Span> = new Map();\n\n // Session recording state per Stagehand instance\n private stagehandInstanceToRecorderState: WeakMap<object, V3RecorderState> = new WeakMap();\n\n // LaminarClient for sending events (set externally)\n private _client: LaminarClient | null = null;\n\n // Session recording options\n private _sessionRecordingOptions?: SessionRecordingOptions;\n\n constructor(sessionRecordingOptions?: SessionRecordingOptions) {\n super(\n \"@lmnr/browserbase-stagehand-instrumentation\",\n SDK_VERSION,\n {\n enabled: true,\n },\n );\n this._sessionRecordingOptions = sessionRecordingOptions;\n }\n\n /**\n * Set the LaminarClient to use for sending browser events.\n * This must be called before Stagehand.init() to enable session recording.\n */\n public setClient(client: LaminarClient): void {\n this._client = client;\n }\n\n /**\n * Get the LaminarClient instance\n */\n public get client(): LaminarClient | null {\n return this._client;\n }\n\n protected init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(\n \"@browserbasehq/stagehand\",\n ['>=3.0.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return module;\n }\n\n private patch(moduleExports: any, moduleVersion?: string) {\n diag.debug(`patching stagehand ${moduleVersion}`);\n\n // Check if Stagehand is non-configurable\n const descriptor = Object.getOwnPropertyDescriptor(moduleExports, 'Stagehand');\n if (descriptor && !descriptor.configurable) {\n // Create a proxy for the entire module exports\n const originalStagehand = moduleExports.Stagehand;\n const patchedConstructor = this.patchStagehandConstructor()(originalStagehand);\n\n // Create a proxy for the module exports\n return new Proxy(moduleExports, {\n get: (target, prop) => {\n if (prop === 'Stagehand') {\n return patchedConstructor;\n }\n return target[prop as keyof typeof target];\n },\n });\n } else {\n // If it's configurable, use the standard _wrap method\n this._wrap(\n moduleExports,\n 'Stagehand',\n this.patchStagehandConstructor(),\n );\n\n return moduleExports;\n }\n }\n\n public manuallyInstrument(Stagehand: any) {\n diag.debug('manually instrumenting stagehand');\n\n // Patch the prototype methods of the existing constructor\n if (Stagehand && Stagehand.prototype) {\n this._wrap(\n Stagehand.prototype,\n 'init',\n this.patchStagehandInit(),\n );\n this._wrap(\n Stagehand.prototype,\n 'close',\n this.patchStagehandClose(),\n );\n }\n }\n\n private unpatch(moduleExports: any, moduleVersion?: string) {\n diag.debug(`unpatching stagehand ${moduleVersion}`);\n this._unwrap(moduleExports, 'Stagehand');\n\n if (moduleExports.Stagehand && moduleExports.Stagehand.prototype) {\n this._unwrap(moduleExports.Stagehand.prototype, 'init');\n this._unwrap(moduleExports.Stagehand.prototype, 'close');\n this._unwrap(moduleExports.Stagehand.prototype, 'act');\n this._unwrap(moduleExports.Stagehand.prototype, 'extract');\n this._unwrap(moduleExports.Stagehand.prototype, 'observe');\n\n // Try to unwrap handler methods if they exist on the prototype\n const prototype = moduleExports.Stagehand.prototype;\n if (prototype.actHandler) {\n this._unwrap(prototype.actHandler, 'act');\n this._unwrap(prototype.actHandler, 'actFromObserveResult');\n }\n if (prototype.extractHandler) {\n this._unwrap(prototype.extractHandler, 'extract');\n }\n if (prototype.observeHandler) {\n this._unwrap(prototype.observeHandler, 'observe');\n }\n // Try to unwrap LLM client if it exists\n if (prototype.llmClient) {\n this._unwrap(prototype.llmClient, 'createChatCompletion');\n }\n }\n\n return moduleExports;\n }\n\n private patchStagehandConstructor() {\n const instrumentation = this;\n\n return (Original: any) => {\n // Create a constructor function that maintains the same signature\n const Stagehand = function (this: InstanceType<typeof Original>, ...args: any[]) {\n // Only apply if this is a new instance\n if (!(this instanceof Stagehand)) {\n return new (Stagehand)(...args);\n }\n\n const instance = new Original(args.length > 0 ? args[0] : undefined);\n Object.assign(this, instance);\n\n instrumentation._wrap(\n this,\n 'init',\n instrumentation.patchStagehandInit(),\n );\n\n instrumentation._wrap(\n this,\n 'close',\n instrumentation.patchStagehandClose(),\n );\n\n return this;\n } as unknown as typeof Original;\n\n // Copy static properties\n Object.setPrototypeOf(Stagehand, Original);\n // Copy prototype properties\n Stagehand.prototype = Object.create(Original.prototype);\n Stagehand.prototype.constructor = Stagehand;\n\n return Stagehand;\n };\n }\n\n private patchStagehandInit() {\n const instrumentation = this;\n\n return (original: any) => async function method(this: any) {\n const sessionId = newUUID();\n\n // Create parent span for this Stagehand session\n const parentSpan = Laminar.startSpan({\n name: 'Stagehand',\n });\n instrumentation.sessionIdToParentSpan.set(sessionId, parentSpan);\n\n instrumentation.stagehandInstanceToSessionId.set(this, sessionId);\n\n // Get trace ID from current span context\n const currentSpan = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n currentSpan?.setAttribute(TRACE_HAS_BROWSER_SESSION, true);\n const otelTraceId = parentSpan.spanContext().traceId;\n const traceId = otelTraceIdToUUID(otelTraceId);\n\n // Call the original init method first\n const result = await original.bind(this).apply(this);\n\n // After init, wrap the global methods on the stagehand instance\n instrumentation._wrap(\n this,\n 'act',\n instrumentation.patchStagehandGlobalMethod('act', sessionId, parentSpan),\n );\n\n instrumentation._wrap(\n this,\n 'extract',\n instrumentation.patchStagehandGlobalMethod('extract', sessionId, parentSpan),\n );\n\n instrumentation._wrap(\n this,\n 'observe',\n instrumentation.patchStagehandGlobalMethod('observe', sessionId, parentSpan),\n );\n\n // Wrap handler methods if they exist\n if (this.actHandler) {\n instrumentation.patchActHandler(this.actHandler);\n }\n\n if (this.extractHandler) {\n instrumentation.patchExtractHandler(this.extractHandler);\n }\n\n if (this.observeHandler) {\n instrumentation.patchObserveHandler(this.observeHandler);\n }\n\n // Wrap LLM client if it exists\n if (this.llmClient) {\n instrumentation.globalLLMClientOptions.set(this.llmClient, {\n provider: this.llmClient.type,\n model: this.llmClient.modelName,\n });\n instrumentation._wrap(\n this.llmClient,\n 'createChatCompletion',\n instrumentation.patchStagehandLLMClientCreateChatCompletion(),\n );\n }\n\n // Wrap agent method if it exists\n instrumentation._wrap(\n this,\n 'agent',\n instrumentation.patchStagehandAgentInitializer(sessionId, parentSpan),\n );\n\n // Set up session recording if client is available\n if (instrumentation._client) {\n await instrumentation.setupSessionRecording(this, sessionId, traceId);\n }\n\n // Patch all existing pages\n if (this.context && this.context.pages) {\n for (const page of this.context.pages()) {\n instrumentation.patchStagehandPage(page, parentSpan);\n }\n }\n\n // Set up listener for new pages\n if (this.context && this.context.on) {\n this.context.on('page', (page: any) => {\n instrumentation.patchStagehandPage(page, parentSpan);\n });\n }\n\n return result;\n };\n }\n\n /**\n * Set up session recording for a Stagehand instance\n */\n private async setupSessionRecording(\n stagehandInstance: any,\n sessionId: StringUUID,\n traceId: StringUUID,\n ): Promise<void> {\n if (!this._client) {\n logger.debug(\"No Laminar client available, skipping session recording setup\");\n return;\n }\n\n // Get the context from the Stagehand instance\n const context = stagehandInstance.context as StagehandV3Context | undefined;\n if (!context || !context.conn) {\n logger.debug(\"No context or connection available, skipping session recording setup\");\n return;\n }\n // Create recorder state\n const recorderState: V3RecorderState = {\n sessionId,\n traceId,\n client: this._client,\n chunkBuffers: new Map(),\n contextIdToSession: new Map(),\n instrumentedPageIds: new Set(),\n bindingHandler: null,\n targetCreatedHandler: null,\n targetInfoChangedHandler: null,\n pageSessionHandlers: new Map(),\n };\n\n // Store recorder state\n this.stagehandInstanceToRecorderState.set(stagehandInstance, recorderState);\n\n // Set up binding event handler\n // (will be registered on individual page sessions during injection)\n const bindingHandler = createBindingHandler(recorderState);\n recorderState.bindingHandler = bindingHandler;\n\n // Set up target created handler for new pages\n const targetCreatedHandler = createTargetCreatedHandler(\n context,\n recorderState,\n this._sessionRecordingOptions,\n );\n recorderState.targetCreatedHandler = targetCreatedHandler;\n context.conn.on<TargetCreatedEvent>(\"Target.targetCreated\", targetCreatedHandler);\n\n // Set up target info changed handler for re-injection after navigation\n const targetInfoChangedHandler = createTargetInfoChangedHandler(\n context,\n recorderState,\n this._sessionRecordingOptions,\n );\n recorderState.targetInfoChangedHandler = targetInfoChangedHandler;\n context.conn.on<TargetInfoChangedEvent>(\"Target.targetInfoChanged\", targetInfoChangedHandler);\n\n // Inject recorder into all existing pages\n try {\n const pages = context.pages();\n let injectedCount = 0;\n for (const page of pages) {\n try {\n const result = await injectRecorderViaCDP(\n page,\n recorderState,\n context.conn,\n this._sessionRecordingOptions,\n bindingHandler,\n );\n if (result !== null) {\n injectedCount++;\n }\n } catch (error) {\n // Page might have been closed or CDP session lost, continue with next page\n logger.debug(\"Error injecting recorder into page: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n logger.debug(\n `Injected session recorder into ${injectedCount} of ${pages.length} existing page(s)`,\n );\n } catch (error) {\n logger.debug(\"Error accessing pages for recorder injection: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n private patchStagehandClose() {\n const instrumentation = this;\n return (original: Function) => async function method(this: any, ...args: any[]) {\n // Clean up session recording before closing\n instrumentation.cleanupSessionRecording(this);\n\n // Clean up the session from the registry\n const sessionId = instrumentation.stagehandInstanceToSessionId.get(this);\n if (sessionId) {\n instrumentation.stagehandInstanceToSessionId.delete(this);\n }\n\n await original.bind(this).apply(this, args);\n\n // Clean up the parent span from the registry\n if (sessionId) {\n const parentSpan = instrumentation.sessionIdToParentSpan.get(sessionId);\n if (parentSpan) {\n parentSpan.end();\n instrumentation.sessionIdToParentSpan.delete(sessionId);\n }\n }\n };\n }\n\n /**\n * Clean up session recording resources for a Stagehand instance\n */\n private cleanupSessionRecording(stagehandInstance: any): void {\n const recorderState = this.stagehandInstanceToRecorderState.get(stagehandInstance);\n if (!recorderState) return;\n\n // Get the context to remove event listeners\n const context = stagehandInstance.context as StagehandV3Context | undefined;\n if (context && context.conn) {\n // Remove target created handler\n if (recorderState.targetCreatedHandler) {\n try {\n context.conn.off(\"Target.targetCreated\", recorderState.targetCreatedHandler);\n } catch (error) {\n logger.debug(\"Error removing target created handler: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // Remove target info changed handler\n if (recorderState.targetInfoChangedHandler) {\n try {\n context.conn.off(\"Target.targetInfoChanged\", recorderState.targetInfoChangedHandler);\n } catch (error) {\n logger.debug(\"Error removing target info changed handler: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n\n // Clear state\n recorderState.contextIdToSession.clear();\n recorderState.instrumentedPageIds.clear();\n recorderState.chunkBuffers.clear();\n recorderState.pageSessionHandlers.clear();\n recorderState.bindingHandler = null;\n recorderState.targetCreatedHandler = null;\n recorderState.targetInfoChangedHandler = null;\n\n // Remove from WeakMap\n this.stagehandInstanceToRecorderState.delete(stagehandInstance);\n\n logger.debug(\"Cleaned up session recording for Stagehand instance\");\n }\n\n private patchStagehandGlobalMethod(methodName: string, sessionId: StringUUID, parentSpan: any) {\n return (original: (...args: any[]) => Promise<any>) =>\n async function method(this: any, ...args: any[]) {\n const input = nameArgsOrCopy(args);\n const currentSpan = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n\n // Handle extract schema pretty-printing\n if (methodName === \"extract\"\n && Array.isArray(input)\n && input.length > 1 && (input[1])?.shape\n ) {\n // We need to clone the input object to avoid mutating the original object\n // because the original object is passed to the LLM client\n const schema = input[1];\n let prettySchema = schema?.shape;\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n input[1] = prettySchema;\n }\n\n // Also handle extract when options contain schema\n if (methodName === \"extract\"\n && Array.isArray(input)\n && input.length > 0\n && typeof input[0] === 'string'\n && input.length > 1\n && (input[1])?.shape\n ) {\n const schema = input[1];\n let prettySchema = schema?.shape;\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n input[1] = prettySchema;\n }\n\n return await Laminar.withSpan(\n currentSpan ?? parentSpan,\n async () => await laminarObserve(\n {\n name: `stagehand.${methodName}`,\n input,\n },\n async (thisArg: any, rest: any[]) => {\n const span = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n span?.setAttribute(TRACE_HAS_BROWSER_SESSION, true);\n return await original.apply(thisArg, rest);\n },\n this, args,\n ),\n );\n };\n }\n\n private patchActHandler(actHandler: any) {\n // Patch the main act method on the handler\n this._wrap(\n actHandler,\n 'act',\n this.patchActHandlerAct(),\n );\n\n // Patch actFromObserveResult\n this._wrap(\n actHandler,\n 'actFromObserveResult',\n this.patchActHandlerActFromObserveResult(),\n );\n }\n\n private patchActHandlerAct() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function act(this: any, ...args: any[]) {\n const params = args[0];\n return await laminarObserve(\n {\n name: 'stagehand.actHandler.act',\n input: {\n instruction: params?.instruction,\n variables: params?.variables,\n timeout: params?.timeout,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchActHandlerActFromObserveResult() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function actFromObserveResult(this: any, ...args: any[]) {\n const action = args[0];\n const domSettleTimeoutMs = args[2];\n return await laminarObserve(\n {\n name: 'stagehand.actHandler.actFromObserveResult',\n input: {\n action: action,\n domSettleTimeoutMs: domSettleTimeoutMs,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchExtractHandler(extractHandler: any) {\n // Patch the main extract method on the handler\n this._wrap(\n extractHandler,\n 'extract',\n this.patchExtractHandlerExtract(),\n );\n }\n\n private patchExtractHandlerExtract() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function extract(this: any, ...args: any[]) {\n const params = args[0];\n const schema = params?.schema;\n let prettySchema = schema?.shape;\n\n if (schema) {\n try {\n prettySchema = prettyPrintZodSchema(schema);\n } catch (error) {\n diag.warn('Error pretty printing zod schema', { error });\n }\n }\n\n return await laminarObserve(\n {\n name: 'stagehand.extractHandler.extract',\n input: {\n instruction: params?.instruction,\n schema: prettySchema,\n timeout: params?.timeout,\n selector: params?.selector,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchObserveHandler(observeHandler: any) {\n // Patch the main observe method on the handler\n this._wrap(\n observeHandler,\n 'observe',\n this.patchObserveHandlerObserve(),\n );\n }\n\n private patchObserveHandlerObserve() {\n return (original: (...args: any[]) => Promise<any>) =>\n async function observe(this: any, ...args: any[]) {\n const params = args[0];\n return await laminarObserve(\n {\n name: 'stagehand.observeHandler.observe',\n input: {\n instruction: params?.instruction,\n timeout: params?.timeout,\n selector: params?.selector,\n },\n },\n async () => await original.bind(this).apply(this, args),\n );\n };\n }\n\n private patchStagehandLLMClientCreateChatCompletion() {\n return createLLMClientCreateChatCompletionWrapper(this.globalLLMClientOptions);\n }\n\n private patchStagehandAgentInitializer(sessionId: StringUUID, parentSpan: Span) {\n const instrumentation = this;\n return (original: (...args: any[]) => any) =>\n function agent(this: any, ...args: any[]) {\n if (args.length > 0 && typeof args[0] === 'object') {\n instrumentation.globalAgentOptions.set(this, args[0]);\n }\n const agent = original.bind(this).apply(this, args);\n instrumentation.patchStagehandAgent(agent, sessionId, parentSpan);\n return agent;\n };\n }\n\n private patchStagehandAgent(agent: any, sessionId: StringUUID, parentSpan: Span) {\n this._wrap(\n agent,\n 'execute',\n this.patchStagehandAgentExecute(sessionId, parentSpan),\n );\n\n // Wrap additional agent methods\n this.wrapAgentMethod(\n agent, 'captureScreenshot', parentSpan, { spanType: \"TOOL\", ignoreOutput: true },\n );\n this.wrapAgentMethod(agent, 'setViewport', parentSpan);\n this.wrapAgentMethod(agent, 'setCurrentUrl', parentSpan);\n }\n\n private patchStagehandAgentExecute(sessionId: StringUUID, parentSpan: Span) {\n const instrumentation = this;\n return (original: (this: any, ...args: any[]) => Promise<any>) =>\n async function execute(this: any, ...args: any[]) {\n const input = nameArgsOrCopy(args);\n\n return await Laminar.withSpan(\n parentSpan,\n async () => await laminarObserve(\n {\n name: 'stagehand.agent.execute',\n input,\n },\n async () => await laminarObserve(\n {\n name: 'execute',\n // input and output are set as gen_ai.prompt and gen_ai.completion\n ignoreInput: true,\n ignoreOutput: true,\n spanType: \"LLM\",\n },\n async () => {\n const span = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n\n const agentOptions = instrumentation.globalAgentOptions.get(this);\n const provider = agentOptions?.model?.provider\n ?? (\n (agentOptions?.model as string | undefined)?.includes(\"/\") ?\n (agentOptions?.model as string | undefined)?.split(\"/\")[0] :\n instrumentation.globalLLMClientOptions.get(this)?.provider);\n const model = agentOptions?.model?.modelName\n ?? instrumentation.globalLLMClientOptions.get(this)?.model;\n span?.setAttributes({\n ...(provider ? { \"gen_ai.system\": provider } : {}),\n ...(model ? { \"gen_ai.request.model\": model } : {}),\n });\n\n let promptIndex = 0;\n if (agentOptions?.systemPrompt) {\n span?.setAttributes({\n \"gen_ai.prompt.0.content\": agentOptions.systemPrompt,\n \"gen_ai.prompt.0.role\": \"system\",\n });\n promptIndex++;\n }\n\n const instruction = typeof input === 'string' ? input : (input as any).instruction;\n if (instruction) {\n span?.setAttributes({\n [`gen_ai.prompt.${promptIndex}.content`]: instruction,\n [`gen_ai.prompt.${promptIndex}.role`]: \"user\",\n });\n }\n\n const result = await original\n .bind(this)\n .apply(this, args);\n\n if (result.completed && result.success && result.message) {\n const content = [{ type: \"text\", text: result.message }];\n if (result.actions && result.actions.length > 0) {\n content.push({\n type: \"text\",\n text: JSON.stringify({ actions: result.actions }),\n });\n }\n span?.setAttributes({\n \"gen_ai.completion.0.content\": JSON.stringify(content),\n \"gen_ai.completion.0.role\": \"assistant\",\n });\n } else if (result.completed && !result.success) {\n span?.recordException(new Error(result.message));\n }\n if (result.usage) {\n span?.setAttributes({\n \"gen_ai.usage.input_tokens\": result.usage.input_tokens,\n \"gen_ai.usage.output_tokens\": result.usage.output_tokens,\n \"llm.usage.total_tokens\":\n result.usage.input_tokens + result.usage.output_tokens,\n });\n }\n return result;\n },\n ),\n ),\n );\n };\n }\n\n private wrapAgentMethod(\n agent: any,\n methodName: string,\n parentSpan: Span,\n options?: {\n spanType?: \"TOOL\" | \"LLM\" | \"DEFAULT\" | \"EVALUATOR\" | \"EVALUATION\" | \"EXECUTOR\";\n ignoreOutput?: boolean;\n },\n ) {\n if (typeof agent[methodName] !== 'function') return;\n\n this._wrap(\n agent,\n methodName,\n (original: (...args: any[]) => Promise<any>) =>\n async function method(this: any, ...args: any[]) {\n const currentSpan = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n return await Laminar.withSpan(\n currentSpan ?? parentSpan,\n async () => await laminarObserve(\n {\n name: `stagehand.agent.${methodName}`,\n ...(options?.spanType ? { spanType: options.spanType } : {}),\n ...(options?.ignoreOutput ? { ignoreOutput: true } : {}),\n },\n async (argVals: any[]) => await original.bind(this).apply(this, argVals),\n args,\n ),\n );\n },\n );\n }\n\n private patchStagehandPage(page: any, parentSpan: Span) {\n const pageMethods = [\n 'goto',\n 'reload',\n 'goBack',\n 'goForward',\n 'click',\n 'scroll',\n 'dragAndDrop',\n 'type',\n 'keyPress',\n 'keyDown',\n 'keyUp',\n ];\n\n for (const methodName of pageMethods) {\n if (typeof page[methodName] !== 'function') continue;\n\n this._wrap(\n page,\n methodName,\n (original: (...args: any[]) => Promise<any>) =>\n async function method(this: any, ...args: any[]) {\n const currentSpan = trace.getSpan(LaminarContextManager.getContext())\n ?? trace.getActiveSpan();\n return await Laminar.withSpan(\n currentSpan ?? parentSpan,\n async () => await laminarObserve(\n {\n name: `stagehand.page.${methodName}`,\n },\n async (argVals: any[]) => await original.bind(this).apply(this, argVals),\n args,\n ),\n );\n },\n );\n }\n }\n}\n/* eslint-enable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return,\n @typescript-eslint/no-misused-promises\n*/\n","import { SpanStatusCode } from \"@opentelemetry/api\";\n\nimport { LaminarSpan } from \"../../tracing/span\";\n\n// Re-export attribute keys we use frequently\nconst LLM_REQUEST_MODEL = \"gen_ai.request.model\";\nconst LLM_RESPONSE_MODEL = \"gen_ai.response.model\";\nconst LLM_SYSTEM = \"gen_ai.system\";\nconst LLM_USAGE_TOTAL_TOKENS = \"llm.usage.total_tokens\";\n\n/**\n * Set an attribute on a span only if the value is non-null, non-undefined, and non-empty.\n */\nfunction safeSetAttribute(\n span: LaminarSpan,\n key: string,\n value: unknown,\n): void {\n if (value === null || value === undefined) return;\n if (typeof value === \"string\" && value.length === 0) return;\n if (Array.isArray(value) && value.length === 0) return;\n span.setAttribute(key, value as any);\n}\n\n/**\n * Convert an SDK object to a plain JSON-serializable object.\n */\nfunction toDict(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj !== \"object\") return obj;\n if (Array.isArray(obj)) return obj.map(toDict);\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {\n if (v !== undefined) {\n result[k] = toDict(v);\n }\n }\n return result;\n}\n\n/**\n * Normalize contents to an array of {role, parts} message objects.\n * The GenAI SDK accepts many content shapes; this normalizes them for attribute logging.\n */\nfunction contentToMessages(\n contents: unknown,\n systemInstruction?: unknown,\n): unknown[] {\n const messages: unknown[] = [];\n\n if (systemInstruction) {\n if (typeof systemInstruction === \"string\") {\n messages.push({ role: \"system\", content: systemInstruction });\n } else if (typeof systemInstruction === \"object\" && systemInstruction !== null) {\n messages.push({ role: \"system\", ...(toDict(systemInstruction) as Record<string, any>) });\n }\n }\n\n if (typeof contents === \"string\") {\n messages.push({ role: \"user\", content: contents });\n } else if (Array.isArray(contents)) {\n for (const item of contents) {\n if (typeof item === \"string\") {\n messages.push({ role: \"user\", content: item });\n } else {\n messages.push(toDict(item));\n }\n }\n } else if (contents && typeof contents === \"object\") {\n messages.push(toDict(contents));\n }\n\n return messages;\n}\n\n/**\n * Extract function declarations from the tools config.\n */\nfunction extractToolDefinitions(config: any): any[] {\n if (!config?.tools) return [];\n const tools: any[] = [];\n const toolsArray = Array.isArray(config.tools) ? config.tools : [config.tools];\n\n for (const tool of toolsArray) {\n if (!tool) continue;\n // Tool can be a Tool object with functionDeclarations\n if (tool.functionDeclarations) {\n for (const fd of tool.functionDeclarations) {\n tools.push(toDict(fd));\n }\n }\n // Or it could be a single FunctionDeclaration-like object\n if (tool.name && !tool.functionDeclarations) {\n tools.push(toDict(tool));\n }\n }\n return tools;\n}\n\n/**\n * Set request attributes on a span from generateContent params.\n */\nexport function setRequestAttributes(\n span: LaminarSpan,\n params: any,\n traceContent: boolean,\n): void {\n safeSetAttribute(span, LLM_SYSTEM, \"gemini\");\n\n safeSetAttribute(span, LLM_REQUEST_MODEL, params?.model);\n\n const config = params?.config;\n if (config) {\n safeSetAttribute(span, \"gen_ai.request.temperature\", config.temperature);\n safeSetAttribute(span, \"gen_ai.request.top_p\", config.topP);\n safeSetAttribute(span, \"gen_ai.request.top_k\", config.topK);\n safeSetAttribute(span, \"gen_ai.request.max_tokens\", config.maxOutputTokens);\n safeSetAttribute(span, \"gen_ai.request.frequency_penalty\", config.frequencyPenalty);\n safeSetAttribute(span, \"gen_ai.request.presence_penalty\", config.presencePenalty);\n safeSetAttribute(span, \"gen_ai.request.seed\", config.seed);\n safeSetAttribute(span, \"gen_ai.request.choice_count\", config.candidateCount);\n\n if (config.stopSequences && config.stopSequences.length > 0) {\n safeSetAttribute(span, \"gen_ai.request.stop_sequences\", JSON.stringify(config.stopSequences));\n }\n\n const outputSchema = config.responseSchema ?? config.responseJsonSchema;\n if (outputSchema) {\n safeSetAttribute(\n span,\n \"gen_ai.request.structured_output_schema\",\n JSON.stringify(toDict(outputSchema)),\n );\n }\n\n // Tool definitions\n const toolDefs = extractToolDefinitions(config);\n if (toolDefs.length > 0) {\n safeSetAttribute(span, \"gen_ai.tool.definitions\", JSON.stringify(toolDefs));\n }\n }\n\n // Input messages (content-traced only)\n if (traceContent) {\n const messages = contentToMessages(params?.contents, config?.systemInstruction);\n if (messages.length > 0) {\n safeSetAttribute(span, \"gen_ai.input.messages\", JSON.stringify(messages));\n }\n }\n}\n\n/**\n * Set response attributes on a span from a GenerateContentResponse.\n */\nexport function setResponseAttributes(\n span: LaminarSpan,\n response: any,\n traceContent: boolean,\n): void {\n if (!response) return;\n\n safeSetAttribute(span, LLM_RESPONSE_MODEL, response.modelVersion);\n\n // Usage metadata\n const usage = response.usageMetadata;\n if (usage) {\n safeSetAttribute(span, \"gen_ai.usage.input_tokens\", usage.promptTokenCount);\n\n const outputTokens =\n (usage.candidatesTokenCount ?? 0) + (usage.thoughtsTokenCount ?? 0);\n if (outputTokens > 0) {\n safeSetAttribute(span, \"gen_ai.usage.output_tokens\", outputTokens);\n }\n\n safeSetAttribute(span, LLM_USAGE_TOTAL_TOKENS, usage.totalTokenCount);\n safeSetAttribute(span, \"gen_ai.usage.reasoning_tokens\", usage.thoughtsTokenCount);\n safeSetAttribute(span, \"gen_ai.usage.cache_read_input_tokens\", usage.cachedContentTokenCount);\n }\n\n // Response content (content-traced only)\n if (traceContent && response.candidates) {\n const outputMessages: any[] = [];\n\n for (let i = 0; i < response.candidates.length; i++) {\n const candidate = response.candidates[i];\n const content = candidate?.content;\n if (!content) continue;\n\n const role = content.role ?? \"model\";\n\n // Extract text content and tool calls\n const parts = content.parts ?? [];\n const textParts: string[] = [];\n const toolCalls: any[] = [];\n\n for (let j = 0; j < parts.length; j++) {\n const part = parts[j];\n if (part.text !== undefined) {\n textParts.push(part.text);\n }\n if (part.functionCall) {\n toolCalls.push({\n name: part.functionCall.name,\n id: part.functionCall.id,\n arguments: JSON.stringify(toDict(part.functionCall.args)),\n });\n }\n }\n\n const completionContent = textParts.join(\"\");\n\n outputMessages.push({\n role,\n content: completionContent,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n });\n }\n\n if (outputMessages.length > 0) {\n safeSetAttribute(span, \"gen_ai.output.messages\", JSON.stringify(outputMessages));\n }\n }\n}\n\n/**\n * Merge consecutive text parts in accumulated streaming parts.\n */\nfunction mergeTextParts(parts: any[]): any[] {\n if (parts.length === 0) return parts;\n\n const merged: any[] = [];\n for (const part of parts) {\n if (\n part.text !== undefined &&\n merged.length > 0 &&\n merged[merged.length - 1].text !== undefined\n ) {\n merged[merged.length - 1] = {\n ...merged[merged.length - 1],\n text: merged[merged.length - 1].text + part.text,\n };\n } else {\n merged.push({ ...part });\n }\n }\n return merged;\n}\n\n/**\n * Wrap a streaming async generator to accumulate response data and set span attributes\n * when iteration completes, throws, or is terminated early by the consumer.\n *\n * generateContentStream returns Promise<AsyncGenerator<GenerateContentResponse>>.\n * This wraps the inner async generator.\n */\nexport function wrapStreamingResponse(\n span: LaminarSpan,\n asyncGen: AsyncGenerator<any>,\n traceContent: boolean,\n): AsyncGenerator<any> {\n const accumulatedParts: any[] = [];\n let promptTokenCount: number | undefined;\n let candidatesTokenCount: number | undefined;\n let thoughtsTokenCount: number | undefined;\n let totalTokenCount: number | undefined;\n let cachedContentTokenCount: number | undefined;\n let role: string | undefined;\n let modelVersion: string | undefined;\n let sawUsageMetadata = false;\n\n async function* wrapper(): AsyncGenerator<any> {\n let streamError: unknown;\n let finalizeError: unknown;\n try {\n for await (const chunk of asyncGen) {\n // Accumulate parts\n if (chunk?.candidates) {\n for (const candidate of chunk.candidates) {\n const parts = candidate?.content?.parts;\n if (parts) {\n accumulatedParts.push(...parts);\n }\n if (candidate?.content?.role && !role) {\n role = candidate.content.role;\n }\n }\n }\n\n // Accumulate usage\n const usage = chunk?.usageMetadata;\n if (usage) {\n sawUsageMetadata = true;\n if (promptTokenCount === undefined && usage.promptTokenCount !== undefined) {\n promptTokenCount = usage.promptTokenCount;\n }\n if (usage.candidatesTokenCount !== undefined) {\n candidatesTokenCount = usage.candidatesTokenCount;\n }\n if (usage.thoughtsTokenCount !== undefined) {\n thoughtsTokenCount = usage.thoughtsTokenCount;\n }\n if (usage.totalTokenCount !== undefined) {\n totalTokenCount = usage.totalTokenCount;\n }\n if (cachedContentTokenCount === undefined\n && usage.cachedContentTokenCount !== undefined) {\n cachedContentTokenCount = usage.cachedContentTokenCount;\n }\n }\n\n if (chunk?.modelVersion && !modelVersion) {\n modelVersion = chunk.modelVersion;\n }\n\n yield chunk;\n }\n } catch (error) {\n streamError = error;\n span.setAttribute(\"error.type\", (error as Error).constructor?.name ?? \"Error\");\n span.recordException(error as Error);\n span.setStatus({ code: SpanStatusCode.ERROR });\n throw error;\n } finally {\n try {\n const hasResponseData = (\n modelVersion !== undefined\n || role !== undefined\n || accumulatedParts.length > 0\n || sawUsageMetadata\n );\n if (hasResponseData) {\n const mergedParts = mergeTextParts(accumulatedParts);\n const compoundResponse = {\n modelVersion,\n candidates: [\n {\n content: {\n role: role ?? \"model\",\n parts: mergedParts,\n },\n },\n ],\n usageMetadata: {\n promptTokenCount,\n candidatesTokenCount,\n thoughtsTokenCount,\n totalTokenCount,\n cachedContentTokenCount,\n },\n };\n\n setResponseAttributes(span, compoundResponse, traceContent);\n }\n } catch (caughtFinalizeError) {\n // Do not override the original stream error.\n if (!streamError) {\n finalizeError = caughtFinalizeError;\n }\n } finally {\n span.end();\n }\n }\n if (finalizeError) {\n if (finalizeError instanceof Error) {\n throw finalizeError;\n }\n throw new Error(\"Failed to finalize google-genai stream span\");\n }\n }\n\n return wrapper();\n}\n","import { context, diag, SpanStatusCode } from \"@opentelemetry/api\";\nimport { isTracingSuppressed } from \"@opentelemetry/core\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\n\nimport { version as SDK_VERSION } from \"../../../../package.json\";\nimport { Laminar } from \"../../../laminar\";\nimport { setRequestAttributes, setResponseAttributes, wrapStreamingResponse } from \"./utils\";\n\nconst WRAPPED_SYMBOL = Symbol(\"lmnr.google-genai.wrapped\");\nconst CLASS_PATCH_DATA_SYMBOL = Symbol(\"lmnr.google-genai.classPatchData\");\n\ntype ClassPatchData = {\n instrumentation: GoogleGenAiInstrumentation;\n traceContent: boolean;\n originalModelsDescriptor: PropertyDescriptor | undefined;\n};\n\n/* eslint-disable\n @typescript-eslint/no-unsafe-return\n*/\nexport class GoogleGenAiInstrumentation extends InstrumentationBase {\n private traceContent: boolean;\n\n constructor(config?: { traceContent?: boolean }) {\n super(\n \"@lmnr/google-genai-instrumentation\",\n SDK_VERSION,\n { enabled: true },\n );\n this.traceContent = config?.traceContent ?? true;\n }\n\n protected init(): InstrumentationModuleDefinition {\n return new InstrumentationNodeModuleDefinition(\n \"@google/genai\",\n [\">=1.0.0\"],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n }\n\n public manuallyInstrument(genaiModule: any): void {\n diag.debug(\"Manually instrumenting @google/genai\");\n const GoogleGenAIClass = this.resolveGoogleGenAIClass(genaiModule);\n if (GoogleGenAIClass) {\n this.patchGoogleGenAIClass(GoogleGenAIClass);\n } else {\n diag.warn(\n \"Could not find GoogleGenAI class in google_genai manual instrumentation input. \" +\n \"Pass either GoogleGenAI class or module object with GoogleGenAI export.\",\n );\n }\n }\n\n private patch(moduleExports: any): any {\n diag.debug(\"Patching @google/genai\");\n const GoogleGenAIClass = this.resolveGoogleGenAIClass(moduleExports);\n if (GoogleGenAIClass) {\n this.patchGoogleGenAIClass(GoogleGenAIClass);\n }\n return moduleExports;\n }\n\n private unpatch(moduleExports: any): void {\n diag.debug(\"Unpatching @google/genai\");\n const GoogleGenAIClass = this.resolveGoogleGenAIClass(moduleExports);\n if (GoogleGenAIClass) {\n this.unpatchGoogleGenAIClass(GoogleGenAIClass);\n }\n }\n\n private resolveGoogleGenAIClass(moduleOrClass: any): any {\n if (typeof moduleOrClass === \"function\") {\n return moduleOrClass;\n }\n if (moduleOrClass?.GoogleGenAI && typeof moduleOrClass.GoogleGenAI === \"function\") {\n return moduleOrClass.GoogleGenAI;\n }\n return undefined;\n }\n\n private patchGoogleGenAIClass(GoogleGenAIClass: any): void {\n const classPatchData = (\n GoogleGenAIClass[CLASS_PATCH_DATA_SYMBOL] as ClassPatchData | undefined\n );\n if (classPatchData) {\n classPatchData.instrumentation = this;\n classPatchData.traceContent = this.traceContent;\n return;\n }\n\n const originalModelsDescriptor = Object.getOwnPropertyDescriptor(\n GoogleGenAIClass.prototype,\n \"models\",\n );\n if (originalModelsDescriptor && !originalModelsDescriptor.configurable) {\n diag.warn(\"Could not patch GoogleGenAI.prototype.models: descriptor is non-configurable.\");\n return;\n }\n\n const patchData: ClassPatchData = {\n instrumentation: this,\n traceContent: this.traceContent,\n originalModelsDescriptor,\n };\n Object.defineProperty(GoogleGenAIClass, CLASS_PATCH_DATA_SYMBOL, {\n value: patchData,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n\n Object.defineProperty(GoogleGenAIClass.prototype, \"models\", {\n configurable: true,\n enumerable: originalModelsDescriptor?.enumerable ?? true,\n get: function () {\n if (originalModelsDescriptor?.get) {\n return originalModelsDescriptor.get.call(this);\n }\n return undefined;\n },\n set: function (value: any) {\n patchData.instrumentation.patchModelsInstance(value, patchData);\n if (originalModelsDescriptor?.set) {\n originalModelsDescriptor.set.call(this, value);\n return;\n }\n Object.defineProperty(this, \"models\", {\n value,\n writable: true,\n configurable: true,\n enumerable: true,\n });\n },\n });\n }\n\n private unpatchGoogleGenAIClass(GoogleGenAIClass: any): void {\n const classPatchData = GoogleGenAIClass[CLASS_PATCH_DATA_SYMBOL] as ClassPatchData | undefined;\n if (!classPatchData) {\n return;\n }\n if (classPatchData.originalModelsDescriptor) {\n Object.defineProperty(\n GoogleGenAIClass.prototype,\n \"models\",\n classPatchData.originalModelsDescriptor,\n );\n } else {\n delete GoogleGenAIClass.prototype.models;\n }\n delete GoogleGenAIClass[CLASS_PATCH_DATA_SYMBOL];\n }\n\n private patchModelsInstance(models: any, classPatchData: ClassPatchData): void {\n if (!models || typeof models !== \"object\") return;\n if (typeof models.generateContent !== \"function\") return;\n if (typeof models.generateContentStream !== \"function\") return;\n\n // Guard against double-wrapping\n if (models[WRAPPED_SYMBOL]) return;\n\n const originalGenerateContent = models.generateContent.bind(models);\n const originalGenerateContentStream = models.generateContentStream.bind(models);\n models.generateContent = async function (params: any) {\n if (isTracingSuppressed(context.active())) {\n return originalGenerateContent(params);\n }\n\n const span = Laminar.startSpan({\n name: \"gemini.generate_content\",\n spanType: \"LLM\",\n });\n\n setRequestAttributes(span, params, classPatchData.traceContent);\n\n return Laminar.withSpan(span, async () => {\n try {\n const response = await originalGenerateContent(params);\n setResponseAttributes(span, response, classPatchData.traceContent);\n return response;\n } catch (error) {\n span.setAttribute(\"error.type\", (error as Error).constructor?.name ?? \"Error\");\n span.setStatus({ code: SpanStatusCode.ERROR });\n throw error;\n }\n }, true);\n };\n\n models.generateContentStream = async function (params: any) {\n if (isTracingSuppressed(context.active())) {\n return originalGenerateContentStream(params);\n }\n\n const span = Laminar.startSpan({\n name: \"gemini.generate_content_stream\",\n spanType: \"LLM\",\n });\n\n setRequestAttributes(span, params, classPatchData.traceContent);\n\n try {\n const asyncGen = await originalGenerateContentStream(params);\n return wrapStreamingResponse(span, asyncGen, classPatchData.traceContent);\n } catch (error) {\n span.setAttribute(\"error.type\", (error as Error).constructor?.name ?? \"Error\");\n span.recordException(error as Error);\n span.setStatus({ code: SpanStatusCode.ERROR });\n span.end();\n throw error;\n }\n };\n\n models[WRAPPED_SYMBOL] = true;\n }\n}\n/* eslint-enable\n @typescript-eslint/no-unsafe-return\n*/\n","import type * as KernelSDK from \"@onkernel/sdk\";\nimport { diag } from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\n\nimport { version as SDK_VERSION } from \"../../../package.json\";\nimport { observe } from \"../../decorators\";\nimport { Laminar } from \"../../laminar\";\n\nconst WRAPPED_BROWSER_METHODS: (keyof KernelSDK.Kernel.Browsers)[] = [\n 'create',\n 'retrieve',\n 'list',\n 'delete',\n 'deleteByID',\n 'loadExtensions',\n];\n\nconst WRAPPED_COMPUTER_METHODS: (keyof KernelSDK.Kernel.Browsers.Computer)[] = [\n \"captureScreenshot\",\n \"clickMouse\",\n \"dragMouse\",\n \"moveMouse\",\n \"pressKey\",\n \"scroll\",\n \"typeText\",\n];\n\nconst WRAPPED_PROCESS_METHODS: (keyof KernelSDK.Kernel.Browsers.Process)[] = [\n \"exec\",\n \"kill\",\n \"spawn\",\n \"status\",\n \"stdin\",\n \"stdoutStream\",\n];\n\n/* eslint-disable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type\n*/\nexport class KernelInstrumentation extends InstrumentationBase {\n constructor() {\n super(\n \"@lmnr/kernel-instrumentation\",\n SDK_VERSION,\n {\n enabled: true,\n },\n );\n }\n\n protected init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(\n \"@onkernel/sdk\",\n ['>=0.7.0'],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n\n return module;\n }\n\n public manuallyInstrument(kernelModule: typeof KernelSDK) {\n // Instrument resource classes\n for (const wrappedMethod of WRAPPED_BROWSER_METHODS) {\n this._wrap(\n kernelModule.Kernel.Browsers.prototype,\n wrappedMethod,\n this.patchMethod('Browser', wrappedMethod, 'DEFAULT'),\n );\n }\n for (const wrappedMethod of WRAPPED_COMPUTER_METHODS) {\n if (wrappedMethod === 'captureScreenshot') {\n this._wrap(\n kernelModule.Kernel.Browsers.Computer.prototype,\n wrappedMethod,\n this.patchTakeScreenshot(),\n );\n } else {\n this._wrap(\n kernelModule.Kernel.Browsers.Computer.prototype,\n wrappedMethod,\n this.patchMethod('Computer', wrappedMethod, 'TOOL'),\n );\n }\n }\n for (const wrappedMethod of WRAPPED_PROCESS_METHODS) {\n this._wrap(\n kernelModule.Kernel.Browsers.Process.prototype,\n wrappedMethod,\n this.patchProcessMethod(wrappedMethod),\n );\n }\n\n // Wrap the Kernel.app() factory method to patch KernelApp.action()\n this._wrap(\n kernelModule.Kernel.prototype,\n 'app',\n this.patchAppFactory(),\n );\n }\n\n private patchMethod(className: string, method: string, spanType: 'DEFAULT' | 'TOOL'): any {\n const plugin = this;\n return (original: (...args: any[]) => KernelSDK.APIPromise<unknown>) =>\n async function (this: any, ...args: any[]) {\n // Use observe() to automatically handle span lifecycle, input/output capture, and errors\n return await observe(\n {\n name: `${className}.${method}`,\n spanType,\n input: plugin.formatInput(args),\n },\n async (innerArgs: any[]) =>\n await (original.bind(this).apply(this, innerArgs)),\n args,\n );\n };\n }\n\n private patchTakeScreenshot(): any {\n const plugin = this;\n return (original: (...args: any[]) => KernelSDK.APIPromise<unknown>) =>\n async function (this: any, ...args: any[]) {\n // Use observe() to automatically handle span lifecycle, input/output capture, and errors\n const span = Laminar.startSpan({\n name: `Computer.captureScreenshot`,\n spanType: 'TOOL',\n input: plugin.formatInput(args),\n });\n try {\n const res = await original.bind(this).apply(this, args) as KernelSDK.APIPromise<unknown>;\n // We could actually parse binary and decode here, but we would need to consume\n // the api response byte stream, which may break the subsequent operations\n // on the response.\n span.setAttribute('lmnr.span.output', '<BASE64_ENCODED_IMAGE>');\n return res;\n } finally {\n span.end();\n }\n };\n }\n\n private patchProcessMethod(method: string): any {\n const plugin = this;\n return (original: (...args: any[]) => KernelSDK.APIPromise<unknown>) =>\n async function (this: any, ...args: any[]) {\n // First parameter of spawn and exec is the session ID, for others its PID (string)\n const input = ['spawn', 'exec'].includes(method)\n ? plugin.formatInput(args)\n : plugin.formatProcessInput(args);\n const span = Laminar.startSpan({\n name: `Process.${method}`,\n spanType: 'TOOL',\n input,\n });\n try {\n const result = await (original.bind(this).apply(this, args) as KernelSDK.APIPromise<{\n stderr_b64?: string,\n stdout_b64?: string,\n }>);\n const output = {\n ...(\n result?.stderr_b64\n ? { stderr: Buffer.from(result.stderr_b64, 'base64').toString('utf-8') }\n : {}\n ),\n ...(\n result?.stdout_b64\n ? { stdout: Buffer.from(result.stdout_b64, 'base64').toString('utf-8') }\n : {}),\n ...result,\n };\n span.setAttribute('lmnr.span.output', JSON.stringify(output));\n return result;\n } finally {\n span.end();\n }\n };\n }\n\n\n private patchAppFactory() {\n const plugin = this;\n return (original: Function) => function (this: any, name: string): any {\n // Call the original app() method to get the KernelApp instance\n const kernelApp = original.call(this, name);\n\n // Patch the action method on the returned KernelApp instance\n plugin._wrap(\n kernelApp,\n 'action',\n plugin.patchKernelAppAction(),\n );\n\n return kernelApp;\n };\n }\n\n private patchKernelAppAction() {\n return (original: any) => function (this: any, name: string, handler: Function): any {\n // Wrap the handler with observe\n const wrappedHandler = async (context: any, payload?: any) => {\n const result = await observe(\n {\n name: `action.${name}`,\n spanType: 'DEFAULT',\n },\n async (innerCtx: any, innerPayload: any) => {\n const result = await handler(innerCtx, innerPayload);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return result;\n },\n context,\n payload,\n );\n await Laminar.flush();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return result;\n };\n\n // Register the wrapped handler with the original action method\n return original.call(this, name, wrappedHandler);\n };\n }\n\n private formatInput(args: unknown[]): unknown[] {\n if (args.length === 0) {\n return [];\n }\n if (typeof args[0] === \"string\") {\n return [{ session_id: args[0] }, ...args.slice(1)];\n }\n return args;\n }\n\n private formatProcessInput(args: unknown[]): unknown[] {\n if (args.length === 0) {\n return [];\n }\n if (typeof args[0] === \"string\") {\n if (args.length === 1) {\n return [{ processID: args[0] }];\n }\n const requestParams = args[1] as { id?: string };\n if (requestParams.id) {\n return [{ processID: args[0], session_id: requestParams.id }, ...args.slice(1)];\n }\n return [{ processID: args[0] }, ...args.slice(1)];\n }\n return args;\n }\n\n private patch(moduleExports: typeof KernelSDK): any {\n diag.debug('Patching @onkernel/sdk');\n this.manuallyInstrument(moduleExports);\n return moduleExports;\n }\n\n private unpatch(moduleExports: typeof KernelSDK): void {\n diag.debug('Unpatching @onkernel/sdk');\n\n // Unwrap resource classes\n for (const wrappedMethod of WRAPPED_BROWSER_METHODS) {\n this._unwrap(moduleExports.Kernel.Browsers.prototype, wrappedMethod);\n }\n for (const wrappedMethod of WRAPPED_COMPUTER_METHODS) {\n this._unwrap(moduleExports.Kernel.Browsers.Computer.prototype, wrappedMethod);\n }\n for (const wrappedMethod of WRAPPED_PROCESS_METHODS) {\n this._unwrap(moduleExports.Kernel.Browsers.Process.prototype, wrappedMethod);\n }\n\n // Unwrap Kernel.app\n this._unwrap(moduleExports.Kernel.prototype, 'app');\n }\n}\n/* eslint-enable\n @typescript-eslint/no-this-alias,\n @typescript-eslint/no-unsafe-function-type\n*/\n","import { createContextKey } from \"@opentelemetry/api\";\nimport { AsyncLocalStorage } from \"async_hooks\";\n\n// Laminar context key used to tell the OpenAI Responses API instrumentation\n// (once we add one to the TS SDK) that the current call is already being\n// tracked by the OpenAI Agents trace processor, so it should skip creating\n// a duplicate span for the same underlying HTTP request.\n//\n// We keep the raw key string alongside the symbol because\n// @opentelemetry/api's createContextKey returns an opaque symbol and some\n// downstream code (or future OpenAI Responses instrumentation) may want to\n// reference the human-readable name.\nexport const DISABLE_OPENAI_RESPONSES_INSTRUMENTATION_CONTEXT_KEY_RAW =\n \"LMNR_DISABLE_OPENAI_RESPONSES_INSTRUMENTATION\";\nexport const DISABLE_OPENAI_RESPONSES_INSTRUMENTATION_CONTEXT_KEY = createContextKey(\n DISABLE_OPENAI_RESPONSES_INSTRUMENTATION_CONTEXT_KEY_RAW,\n);\n\n// Task-local system instructions for the currently-executing model call.\n// Set by the wrapped getResponse / getStreamedResponse methods in index.ts\n// and read by the response/generation span_data handlers so the system\n// prompt can be prepended to gen_ai.input.messages.\nconst systemInstructionsStorage = new AsyncLocalStorage<string | undefined>();\n\nexport const getCurrentSystemInstructions = (): string | undefined =>\n systemInstructionsStorage.getStore();\n\nexport const runWithSystemInstructions = <T>(\n value: string | undefined,\n fn: () => T,\n): T => systemInstructionsStorage.run(value, fn);\n\n/* eslint-disable\n @typescript-eslint/prefer-promise-reject-errors,\n @typescript-eslint/no-unused-vars\n*/\n// Wrap an async iterable so that the system instructions ALS value is set for\n// each iteration step. We can't simply call `systemInstructionsStorage.run()`\n// once around generator creation, because the ALS context is restored as soon\n// as `.run()` returns — subsequent `next()` calls would see the old value.\nexport const wrapStreamWithSystemInstructions = <T>(\n value: string | undefined,\n source: AsyncIterable<T>,\n): AsyncIterable<T> => ({\n [Symbol.asyncIterator]() {\n let iterator: AsyncIterator<T> | undefined;\n const getIterator = (): AsyncIterator<T> => {\n if (iterator === undefined) {\n iterator = systemInstructionsStorage.run(value, () =>\n source[Symbol.asyncIterator](),\n );\n }\n return iterator;\n };\n return {\n next: (..._args: [] | [undefined]) =>\n systemInstructionsStorage.run(value, () => getIterator().next()),\n return: (returnValue?: any) => {\n const it = getIterator();\n return it.return\n ? systemInstructionsStorage.run(value, () => it.return!(returnValue))\n : Promise.resolve({ done: true, value: returnValue });\n },\n throw: (err?: any) => {\n const it = getIterator();\n return it.throw\n ? systemInstructionsStorage.run(value, () => it.throw!(err))\n : Promise.reject(err);\n },\n };\n },\n});\n/* eslint-enable\n @typescript-eslint/prefer-promise-reject-errors,\n @typescript-eslint/no-unused-vars\n*/\n\nexport const spanKind = (spanData: any): string => {\n if (spanData == null) {\n return \"\";\n }\n return typeof spanData.type === \"string\" ? (spanData.type as string) : \"\";\n};\n\nexport const spanName = (span: any, spanData: any): string => {\n const name = span?.name;\n if (typeof name === \"string\" && name) {\n return name;\n }\n const kind = spanKind(spanData);\n if (kind) {\n if (kind === \"agent\" || kind === \"custom\" || kind === \"function\" || kind === \"tool\") {\n return nameFromSpanData(spanData) || `agents.${kind}`;\n }\n return `agents.${kind}`;\n }\n return \"agents.span\";\n};\n\nexport type LaminarAgentsSpanType = \"LLM\" | \"TOOL\" | \"DEFAULT\";\n\nexport const mapSpanType = (spanData: any): LaminarAgentsSpanType => {\n const kind = spanKind(spanData);\n if (\n kind === \"generation\" ||\n kind === \"response\" ||\n kind === \"transcription\" ||\n kind === \"speech\" ||\n kind === \"speech_group\"\n ) {\n return \"LLM\";\n }\n if (\n kind === \"function\" ||\n kind === \"tool\" ||\n kind === \"mcp_list_tools\" ||\n kind === \"mcp_tools\" ||\n kind === \"handoff\"\n ) {\n return \"TOOL\";\n }\n return \"DEFAULT\";\n};\n\nexport const nameFromSpanData = (agent: any): string => {\n if (agent == null) {\n return \"\";\n }\n if (typeof agent === \"string\") {\n return agent;\n }\n if (typeof agent === \"object\") {\n if (typeof agent.name === \"string\") {\n return agent.name as string;\n }\n }\n return \"\";\n};\n\nexport const getFirstNotNull = (d: any, ...keys: string[]): any => {\n if (d == null) {\n return undefined;\n }\n for (const key of keys) {\n const v = d[key];\n if (v !== undefined && v !== null) {\n return v;\n }\n }\n return undefined;\n};\n\nexport const modelAsDict = (obj: any): Record<string, any> | undefined => {\n if (obj == null) {\n return undefined;\n }\n if (typeof obj !== \"object\") {\n return undefined;\n }\n if (Array.isArray(obj)) {\n return undefined;\n }\n // Plain object\n return obj as Record<string, any>;\n};\n\nexport const normalizeMessages = (\n data: any,\n role: string = \"user\",\n): Record<string, any>[] => {\n if (data == null) {\n return [];\n }\n\n if (typeof data === \"string\") {\n return [{ role, content: data }];\n }\n\n if (Array.isArray(data)) {\n const messages: Record<string, any>[] = [];\n for (const item of data) {\n if (item != null && typeof item === \"object\" && !Array.isArray(item)) {\n messages.push(item as Record<string, any>);\n } else {\n messages.push({ role, content: String(item) });\n }\n }\n return messages;\n }\n\n if (typeof data === \"object\") {\n return [data as Record<string, any>];\n }\n\n return [{ role, content: String(data) }];\n};\n","import type { Span } from \"@opentelemetry/api\";\n\nimport { initializeLogger } from \"../../../utils\";\nimport {\n LaminarAttributes,\n SPAN_INPUT,\n SPAN_OUTPUT,\n} from \"../../tracing/attributes\";\nimport { getFirstNotNull, modelAsDict, normalizeMessages } from \"./helpers\";\n\nconst logger = initializeLogger();\n\n// ---------------------------------------------------------------------------\n// gen_ai.input.messages / gen_ai.output.messages helpers\n// ---------------------------------------------------------------------------\n\nexport const setLmnrSpanIo = (\n lmnrSpan: Span,\n inputData: any,\n outputData: any,\n): void => {\n if (inputData !== undefined && inputData !== null) {\n lmnrSpan.setAttribute(SPAN_INPUT, JSON.stringify(inputData));\n }\n if (outputData !== undefined && outputData !== null) {\n lmnrSpan.setAttribute(SPAN_OUTPUT, JSON.stringify(outputData));\n }\n};\n\nexport const setGenAiInputMessages = (\n lmnrSpan: Span,\n inputData: any,\n systemInstructions?: string | null,\n): void => {\n const hasInput = inputData !== undefined && inputData !== null;\n if (!hasInput && !systemInstructions) {\n return;\n }\n const messages: Record<string, any>[] = hasInput\n ? normalizeMessages(inputData)\n : [];\n if (systemInstructions) {\n messages.unshift({\n role: \"system\",\n content: [{ type: \"input_text\", text: systemInstructions }],\n });\n }\n if (messages.length > 0) {\n lmnrSpan.setAttribute(\"gen_ai.input.messages\", JSON.stringify(messages));\n }\n};\n\nexport const setGenAiOutputMessages = (\n lmnrSpan: Span,\n outputData: any,\n): void => {\n if (outputData === undefined || outputData === null) {\n return;\n }\n const messages = normalizeMessages(outputData, \"assistant\");\n if (messages.length > 0) {\n lmnrSpan.setAttribute(\"gen_ai.output.messages\", JSON.stringify(messages));\n }\n};\n\nexport const setGenAiOutputMessagesFromResponse = (\n lmnrSpan: Span,\n response: any,\n): void => {\n if (response == null) {\n return;\n }\n\n let outputItems = response.output;\n if (!outputItems) {\n return;\n }\n\n const id = response.id;\n\n if (!Array.isArray(outputItems)) {\n logger.debug(\n \"Laminar OpenAI agents instrumentation, failed to parse output items. Expected array\",\n );\n outputItems = [];\n }\n\n const result = {\n id,\n object: \"response\",\n output: outputItems,\n };\n\n lmnrSpan.setAttribute(\"gen_ai.output.messages\", JSON.stringify(result));\n};\n\n// ---------------------------------------------------------------------------\n// Tool definitions\n// ---------------------------------------------------------------------------\n\nexport const setToolDefinitionsFromResponse = (\n lmnrSpan: Span,\n response: any,\n): void => {\n const tools = response?.tools;\n if (!tools || !Array.isArray(tools)) {\n return;\n }\n\n const toolDefs: Record<string, any>[] = [];\n for (const tool of tools) {\n const toolDict = modelAsDict(tool);\n if (!toolDict) {\n continue;\n }\n const toolType = toolDict.type;\n if (toolType === \"function\") {\n const funcDef: Record<string, any> = { type: \"function\" };\n const functionInfo = toolDict.function ?? toolDict;\n const fn: Record<string, any> = {\n name: functionInfo.name ?? \"\",\n };\n const desc = functionInfo.description;\n if (desc) {\n fn.description = desc;\n }\n const params = functionInfo.parameters;\n if (params) {\n fn.parameters = params;\n }\n const strict = functionInfo.strict;\n if (strict !== undefined && strict !== null) {\n fn.strict = strict;\n }\n funcDef.function = fn;\n toolDefs.push(funcDef);\n } else {\n toolDefs.push(toolDict);\n }\n }\n\n if (toolDefs.length > 0) {\n lmnrSpan.setAttribute(\"gen_ai.tool.definitions\", JSON.stringify(toolDefs));\n }\n};\n\n// ---------------------------------------------------------------------------\n// LLM attributes (model, usage, response_id)\n// ---------------------------------------------------------------------------\n\nexport const applyLlmAttributes = (\n lmnrSpan: Span,\n data: Record<string, any>,\n): void => {\n if (!data) {\n return;\n }\n\n const model = data.model;\n if (model) {\n lmnrSpan.setAttribute(LaminarAttributes.REQUEST_MODEL, model);\n lmnrSpan.setAttribute(LaminarAttributes.RESPONSE_MODEL, model);\n lmnrSpan.setAttribute(LaminarAttributes.PROVIDER, \"openai\");\n }\n\n const usage = data.usage;\n if (usage != null) {\n applyUsage(lmnrSpan, usage);\n }\n\n let responseId = data.response_id;\n if (responseId == null) {\n responseId = data.id;\n }\n if (responseId != null) {\n lmnrSpan.setAttribute(\"gen_ai.response.id\", responseId);\n }\n};\n\nconst applyUsage = (lmnrSpan: Span, usage: any): void => {\n if (usage == null) {\n return;\n }\n\n const inputTokens = getFirstNotNull(\n usage,\n \"input_tokens\",\n \"prompt_tokens\",\n \"input\",\n );\n const outputTokens = getFirstNotNull(\n usage,\n \"output_tokens\",\n \"completion_tokens\",\n \"output\",\n );\n const totalTokens = getFirstNotNull(usage, \"total_tokens\", \"total\");\n const inputTokensDetails = getFirstNotNull(\n usage,\n \"input_tokens_details\",\n \"prompt_tokens_details\",\n );\n const outputTokensDetails = getFirstNotNull(\n usage,\n \"output_tokens_details\",\n \"completion_tokens_details\",\n );\n\n let cachedInputTokens: number | undefined;\n let reasoningOutputTokens: number | undefined;\n\n if (\n inputTokensDetails?.cached_tokens !== undefined &&\n inputTokensDetails?.cached_tokens !== null\n ) {\n cachedInputTokens = Number(inputTokensDetails.cached_tokens);\n }\n if (\n outputTokensDetails?.reasoning_tokens !== undefined &&\n outputTokensDetails?.reasoning_tokens !== null\n ) {\n reasoningOutputTokens = Number(outputTokensDetails.reasoning_tokens);\n }\n if (inputTokens !== undefined && inputTokens !== null) {\n lmnrSpan.setAttribute(\n LaminarAttributes.INPUT_TOKEN_COUNT,\n Number(inputTokens),\n );\n }\n if (cachedInputTokens !== undefined) {\n lmnrSpan.setAttribute(\n \"gen_ai.usage.cache_read_input_tokens\",\n cachedInputTokens,\n );\n }\n if (outputTokens !== undefined && outputTokens !== null) {\n lmnrSpan.setAttribute(\n LaminarAttributes.OUTPUT_TOKEN_COUNT,\n Number(outputTokens),\n );\n }\n if (reasoningOutputTokens !== undefined) {\n lmnrSpan.setAttribute(\n \"gen_ai.usage.reasoning_output_tokens\",\n reasoningOutputTokens,\n );\n }\n if (totalTokens !== undefined && totalTokens !== null) {\n lmnrSpan.setAttribute(\n LaminarAttributes.TOTAL_TOKEN_COUNT,\n Number(totalTokens),\n );\n } else if (\n inputTokens !== undefined &&\n inputTokens !== null &&\n outputTokens !== undefined &&\n outputTokens !== null\n ) {\n lmnrSpan.setAttribute(\n LaminarAttributes.TOTAL_TOKEN_COUNT,\n Number(inputTokens) + Number(outputTokens),\n );\n }\n};\n\nexport const responseToLlmData = (response: any): Record<string, any> => {\n if (response == null) {\n return {};\n }\n return {\n model: response.model,\n usage: response.usage,\n response_id: response.id,\n };\n};\n","import { type Span, SpanStatusCode } from \"@opentelemetry/api\";\n\nimport { LaminarAttributes } from \"../../tracing/attributes\";\nimport {\n getCurrentSystemInstructions,\n nameFromSpanData,\n spanKind,\n} from \"./helpers\";\nimport {\n applyLlmAttributes,\n responseToLlmData,\n setGenAiInputMessages,\n setGenAiOutputMessages,\n setGenAiOutputMessagesFromResponse,\n setLmnrSpanIo,\n setToolDefinitionsFromResponse,\n} from \"./messages\";\n\n// ---------------------------------------------------------------------------\n// Error handling\n// ---------------------------------------------------------------------------\n\nexport const applySpanError = (lmnrSpan: Span, span: any): void => {\n const error = span?.error;\n if (!error) {\n return;\n }\n try {\n const message = error.message ?? String(error);\n lmnrSpan.setStatus({ code: SpanStatusCode.ERROR, message });\n } catch {\n // ignore\n }\n};\n\n// ---------------------------------------------------------------------------\n// Span data extraction\n// ---------------------------------------------------------------------------\n\nexport const applySpanData = (lmnrSpan: Span, spanData: any): void => {\n if (spanData == null) {\n return;\n }\n\n const kind = spanKind(spanData);\n\n if (kind === \"agent\") {\n applyAgentSpanData(lmnrSpan, spanData);\n } else if (kind === \"function\" || kind === \"tool\") {\n applyFunctionSpanData(lmnrSpan, spanData);\n } else if (kind === \"generation\") {\n applyGenerationSpanData(lmnrSpan, spanData);\n } else if (kind === \"response\") {\n applyResponseSpanData(lmnrSpan, spanData);\n } else if (kind === \"handoff\") {\n applyHandoffSpanData(lmnrSpan, spanData);\n } else if (kind === \"guardrail\") {\n applyGuardrailSpanData(lmnrSpan, spanData);\n } else if (kind === \"custom\") {\n applyCustomSpanData(lmnrSpan, spanData);\n } else if (kind === \"mcp_list_tools\" || kind === \"mcp_tools\") {\n applyMcpSpanData(lmnrSpan, spanData);\n } else if (kind === \"speech\") {\n applySpeechSpanData(lmnrSpan, spanData);\n } else if (kind === \"transcription\") {\n applyTranscriptionSpanData(lmnrSpan, spanData);\n } else if (kind === \"speech_group\") {\n applySpeechGroupSpanData(lmnrSpan, spanData);\n } else {\n // Fallback: set generic I/O\n setLmnrSpanIo(lmnrSpan, spanData?.input, spanData?.output);\n }\n};\n\nconst applyAgentSpanData = (lmnrSpan: Span, spanData: any): void => {\n const res: Record<string, any> = {};\n const name = spanData?.name;\n if (name) {\n res.name = name;\n }\n const handoffs = spanData?.handoffs;\n if (handoffs) {\n res.handoffs = handoffs;\n }\n const tools = spanData?.tools;\n if (tools) {\n res.tools = tools;\n }\n const outputType = spanData?.output_type;\n if (outputType) {\n res.output_type = outputType;\n }\n setLmnrSpanIo(lmnrSpan, res, null);\n};\n\nconst applyFunctionSpanData = (lmnrSpan: Span, spanData: any): void => {\n setLmnrSpanIo(lmnrSpan, spanData?.input, spanData?.output);\n};\n\nconst applyGenerationSpanData = (lmnrSpan: Span, spanData: any): void => {\n const inputData = spanData?.input;\n setGenAiInputMessages(lmnrSpan, inputData, getCurrentSystemInstructions());\n\n const outputData = spanData?.output;\n setGenAiOutputMessages(lmnrSpan, outputData);\n\n const llmData: Record<string, any> = {\n model: spanData?.model,\n usage: spanData?.usage,\n response_id: spanData?.response_id ?? spanData?.id,\n };\n applyLlmAttributes(lmnrSpan, llmData);\n};\n\nconst applyResponseSpanData = (lmnrSpan: Span, spanData: any): void => {\n // TS SDK stores the raw response under `_response` and raw input under `_input`\n // for non-OpenAI exporters (the OpenAI exporter strips them via\n // removePrivateFields). See\n // @openai/agents-core/dist/tracing/spans.d.ts::ResponseSpanData.\n const response = spanData?._response ?? spanData?.response;\n const responseInput = spanData?._input ?? spanData?.input;\n\n setGenAiInputMessages(lmnrSpan, responseInput, getCurrentSystemInstructions());\n\n if (response != null) {\n setGenAiOutputMessagesFromResponse(lmnrSpan, response);\n setToolDefinitionsFromResponse(lmnrSpan, response);\n applyLlmAttributes(lmnrSpan, responseToLlmData(response));\n } else if (spanData?.response_id) {\n // If we only have the response_id (OpenAI path strips the response body),\n // still surface it so callers can correlate.\n lmnrSpan.setAttribute(\"gen_ai.response.id\", spanData.response_id);\n }\n};\n\nconst applyHandoffSpanData = (lmnrSpan: Span, spanData: any): void => {\n const fromAgent = spanData?.from_agent;\n const toAgent = spanData?.to_agent;\n if (fromAgent) {\n lmnrSpan.setAttribute(\"openai.agents.handoff.from\", nameFromSpanData(fromAgent));\n }\n if (toAgent) {\n lmnrSpan.setAttribute(\"openai.agents.handoff.to\", nameFromSpanData(toAgent));\n }\n};\n\nconst applyGuardrailSpanData = (lmnrSpan: Span, spanData: any): void => {\n const name = spanData?.name;\n if (name) {\n lmnrSpan.setAttribute(\"openai.agents.guardrail.name\", name);\n }\n const triggered = spanData?.triggered;\n if (triggered !== undefined && triggered !== null) {\n lmnrSpan.setAttribute(\"openai.agents.guardrail.triggered\", Boolean(triggered));\n }\n};\n\nconst applyCustomSpanData = (lmnrSpan: Span, spanData: any): void => {\n const name = spanData?.name;\n if (name) {\n lmnrSpan.setAttribute(\"openai.agents.custom.name\", name);\n }\n const customData = spanData?.data;\n if (customData !== undefined && customData !== null) {\n lmnrSpan.setAttribute(\"openai.agents.custom.data\", JSON.stringify(customData));\n }\n};\n\nconst applyMcpSpanData = (lmnrSpan: Span, spanData: any): void => {\n const server = spanData?.server;\n if (server) {\n lmnrSpan.setAttribute(\"openai.agents.mcp.server\", server);\n }\n const result = spanData?.result;\n if (result !== undefined && result !== null) {\n lmnrSpan.setAttribute(\"openai.agents.mcp.result\", JSON.stringify(result));\n }\n};\n\nconst applySpeechSpanData = (lmnrSpan: Span, spanData: any): void => {\n const model = spanData?.model;\n if (model) {\n lmnrSpan.setAttribute(LaminarAttributes.REQUEST_MODEL, model);\n lmnrSpan.setAttribute(LaminarAttributes.RESPONSE_MODEL, model);\n lmnrSpan.setAttribute(LaminarAttributes.PROVIDER, \"openai\");\n }\n\n const inputText = spanData?.input;\n if (inputText) {\n setGenAiInputMessages(lmnrSpan, inputText);\n }\n\n const outputData = spanData?.output;\n if (outputData) {\n if (typeof outputData === \"object\" && !Array.isArray(outputData)) {\n // Speech output is {data: ..., format: ...}\n setGenAiOutputMessages(lmnrSpan, outputData.data);\n } else {\n setGenAiOutputMessages(lmnrSpan, outputData);\n }\n }\n};\n\nconst applyTranscriptionSpanData = (lmnrSpan: Span, spanData: any): void => {\n const model = spanData?.model;\n if (model) {\n lmnrSpan.setAttribute(LaminarAttributes.REQUEST_MODEL, model);\n lmnrSpan.setAttribute(LaminarAttributes.RESPONSE_MODEL, model);\n lmnrSpan.setAttribute(LaminarAttributes.PROVIDER, \"openai\");\n }\n\n const inputData = spanData?.input;\n if (inputData) {\n if (typeof inputData === \"object\" && !Array.isArray(inputData)) {\n setGenAiInputMessages(lmnrSpan, inputData.data);\n } else {\n setGenAiInputMessages(lmnrSpan, inputData);\n }\n }\n\n const outputText = spanData?.output;\n if (outputText) {\n setGenAiOutputMessages(lmnrSpan, outputText);\n }\n};\n\nconst applySpeechGroupSpanData = (lmnrSpan: Span, spanData: any): void => {\n const inputText = spanData?.input;\n if (inputText) {\n setGenAiInputMessages(lmnrSpan, inputText);\n }\n\n const outputText = spanData?.output;\n if (outputText) {\n setGenAiOutputMessages(lmnrSpan, outputText);\n }\n};\n","import type {\n Span as AgentsSpan,\n SpanData,\n Trace,\n TracingProcessor,\n} from \"@openai/agents\";\nimport { type Context, ROOT_CONTEXT, type Span as OtelSpan, trace } from \"@opentelemetry/api\";\n\nimport { Laminar } from \"../../../laminar\";\nimport { initializeLogger } from \"../../../utils\";\nimport { LaminarContextManager } from \"../../tracing/context\";\nimport { LaminarSpan } from \"../../tracing/span\";\nimport {\n DISABLE_OPENAI_RESPONSES_INSTRUMENTATION_CONTEXT_KEY,\n mapSpanType,\n nameFromSpanData,\n spanKind,\n spanName,\n} from \"./helpers\";\nimport { applySpanData, applySpanError } from \"./span-data\";\n\nconst logger = initializeLogger();\n\ninterface SpanEntry {\n lmnrSpan: OtelSpan;\n agentsSpan: AgentsSpan<SpanData>;\n // Context reference that was pushed onto the Laminar ALS stack when this\n // span started, so nested Laminar instrumentations (google-genai, etc.)\n // running inside the agents callback pick this span up as their parent.\n // `onSpanEnd` removes this exact reference via\n // `LaminarContextManager.removeContext` — using the reference (not a LIFO\n // pop) keeps the stack consistent when agent spans end out of order with\n // respect to other activated spans sharing the same async frame.\n activationContext?: Context;\n}\n\ninterface TraceState {\n rootSpan: OtelSpan | undefined;\n spans: Map<string, SpanEntry>;\n // When true, the trace has been marked as ended (via onTraceEnd or shutdown)\n // and we should not write any more spans into it.\n ended: boolean;\n // Maps destination agent name -> handoff parent Laminar span context so the\n // subsequent agent span becomes a sibling of the handoff span (both children\n // of the handoff's parent).\n pendingHandoffCtxs: Map<string, string>;\n}\n\n/* eslint-disable @typescript-eslint/require-await */\nexport class LaminarAgentsTraceProcessor implements TracingProcessor {\n private traces: Map<string, TraceState> = new Map();\n private disabled: boolean = false;\n\n start(): void {\n // Nothing to do - we don't run an export loop.\n }\n\n async onTraceStart(agentsTrace: Trace): Promise<void> {\n if (this.disabled) {\n return;\n }\n const traceId = agentsTrace.traceId;\n if (!traceId) {\n return;\n }\n try {\n const state = this.getOrCreateTrace(agentsTrace);\n\n // Update root span name to the actual trace name (it defaults to\n // \"agents.trace\" at creation time; see getOrCreateTrace).\n const traceName = agentsTrace.name;\n if (traceName && state.rootSpan !== undefined) {\n try {\n state.rootSpan.updateName(traceName);\n } catch {\n // ignore\n }\n }\n this.applyTraceMetadata(state.rootSpan, agentsTrace);\n } catch (e) {\n logger.debug(`Error in onTraceStart: ${String(e)}`);\n }\n }\n\n async onTraceEnd(agentsTrace: Trace): Promise<void> {\n if (this.disabled) {\n return;\n }\n const traceId = agentsTrace.traceId;\n if (!traceId) {\n return;\n }\n const state = this.traces.get(traceId);\n if (!state || state.ended) {\n return;\n }\n state.ended = true;\n this.endTraceState(state);\n this.traces.delete(traceId);\n }\n\n async onSpanStart(span: AgentsSpan<SpanData>): Promise<void> {\n if (this.disabled) {\n return;\n }\n const traceId = span.traceId;\n if (!traceId) {\n return;\n }\n let lmnrSpan: OtelSpan | undefined;\n try {\n const state = this.getOrCreateTrace(span);\n\n let parentSpanContext: string | undefined;\n\n const spanData = span.spanData;\n\n // If this is an agent span, check if a handoff targeting this agent is\n // pending. If so, make this span a child of the handoff's parent so the\n // subagent is nested correctly.\n if (spanKind(spanData) === \"agent\") {\n const thisAgentName = nameFromSpanData(\n (spanData as any)?.name ?? spanData,\n );\n const handoffCtx = state.pendingHandoffCtxs.get(thisAgentName);\n if (handoffCtx !== undefined) {\n state.pendingHandoffCtxs.delete(thisAgentName);\n parentSpanContext = handoffCtx;\n }\n }\n\n // Resolve the parent Laminar span explicitly via the agents SDK's\n // parentId (or falling back to the trace's root span). Relying on\n // LaminarContextManager.getContext() would consult a process-global\n // stack, which is unsafe when multiple agent runs execute concurrently.\n if (parentSpanContext === undefined) {\n const parentId = span.parentId;\n const parentEntry =\n parentId != null ? state.spans.get(parentId) : undefined;\n const parentLmnrSpan =\n parentEntry !== undefined ? parentEntry.lmnrSpan : state.rootSpan;\n if (parentLmnrSpan !== undefined) {\n try {\n const ctx = (\n parentLmnrSpan as LaminarSpan\n ).getLaminarSpanContext?.();\n if (ctx) {\n parentSpanContext = JSON.stringify(ctx);\n }\n } catch {\n // ignore\n }\n }\n }\n\n const spanType = mapSpanType(spanData);\n const name = spanName(span, spanData);\n\n // Mark the context so any future OpenAI Responses API instrumentation\n // (on the TS side) knows to skip — the agents run already records a\n // matching span for this underlying HTTP call. Start from ROOT_CONTEXT\n // (not getContext()) so the per-trace parent we resolved above — rather\n // than whatever happens to be globally active on the shared stack —\n // determines hierarchy. This keeps concurrent traces isolated.\n const ctx = ROOT_CONTEXT.setValue(\n DISABLE_OPENAI_RESPONSES_INSTRUMENTATION_CONTEXT_KEY,\n true,\n );\n\n // Use startSpan (not startActiveSpan) so we don't push onto the ALS\n // stack via Laminar's built-in activation path — that path uses\n // `popContext` (blunt LIFO) on `end()`, which corrupts the stack when\n // agent spans end out of order with respect to other activated spans.\n lmnrSpan = Laminar.startSpan({\n name,\n spanType,\n parentSpanContext,\n context: ctx,\n });\n\n const key = span.spanId;\n if (!key) {\n logger.debug(\"Span missing spanId, cannot track\");\n try {\n lmnrSpan.end();\n } catch {\n // ignore\n }\n return;\n }\n\n // Register the new span on the Laminar ALS stack so nested Laminar\n // instrumentation (google-genai, etc.) that runs inside the agent /\n // tool callback picks it up as parent via `getContext()`. We push the\n // context reference here and remove that exact reference in onSpanEnd\n // — never relying on LIFO order — so concurrent or out-of-order agent\n // span ends cannot corrupt the stack for unrelated activations sharing\n // the same async frame.\n let activationContext: Context | undefined;\n try {\n activationContext = trace.setSpan(ctx, lmnrSpan);\n LaminarContextManager.pushContext(activationContext);\n } catch {\n activationContext = undefined;\n }\n state.spans.set(key, { lmnrSpan, agentsSpan: span, activationContext });\n } catch (e) {\n logger.debug(`Error in onSpanStart: ${String(e)}`);\n if (lmnrSpan !== undefined) {\n try {\n lmnrSpan.end();\n } catch {\n // ignore\n }\n }\n }\n }\n\n async onSpanEnd(span: AgentsSpan<SpanData>): Promise<void> {\n if (this.disabled) {\n return;\n }\n const traceId = span.traceId;\n if (!traceId) {\n return;\n }\n\n const key = span.spanId;\n if (!key) {\n return;\n }\n\n const state = this.traces.get(traceId);\n const entry = state?.spans.get(key);\n if (!entry || !state) {\n return;\n }\n state.spans.delete(key);\n\n const spanData = span.spanData;\n try {\n try {\n applySpanData(entry.lmnrSpan, spanData);\n applySpanError(entry.lmnrSpan, span);\n } catch {\n // ignore\n }\n\n // When a handoff span ends, save the *parent* span's Laminar context keyed\n // by the destination agent name. The next agent span's start will consume\n // this so it becomes a sibling of the handoff span.\n if (spanKind(spanData) === \"handoff\") {\n try {\n const toAgent = nameFromSpanData((spanData as any)?.to_agent);\n if (toAgent) {\n const parentId = span.parentId;\n const parentEntry =\n parentId != null ? state.spans.get(parentId) : undefined;\n const parentLmnrSpan =\n parentEntry !== undefined ? parentEntry.lmnrSpan : state.rootSpan;\n if (parentLmnrSpan !== undefined) {\n const handoffCtx = (\n parentLmnrSpan as LaminarSpan\n ).getLaminarSpanContext?.();\n if (handoffCtx) {\n state.pendingHandoffCtxs.set(\n toAgent,\n JSON.stringify(handoffCtx),\n );\n }\n }\n }\n } catch {\n // ignore\n }\n }\n\n if (entry.activationContext !== undefined) {\n try {\n LaminarContextManager.removeContext(entry.activationContext);\n } catch {\n // ignore\n }\n }\n\n try {\n entry.lmnrSpan.end();\n } catch {\n // ignore\n }\n } catch {\n // ignore\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async shutdown(_timeout?: number): Promise<void> {\n this.disabled = true;\n const states = Array.from(this.traces.values()).filter((s) => !s.ended);\n for (const s of states) {\n s.ended = true;\n }\n this.traces.clear();\n for (const state of states) {\n this.endTraceState(state);\n }\n try {\n await Laminar.flush();\n } catch {\n // ignore\n }\n }\n\n async forceFlush(): Promise<void> {\n try {\n await Laminar.flush();\n } catch {\n // ignore\n }\n }\n\n private endTraceState(state: TraceState): void {\n // End all child spans (LIFO) then the root span.\n const remaining = Array.from(state.spans.values());\n state.spans.clear();\n for (let i = remaining.length - 1; i >= 0; i--) {\n const entry = remaining[i];\n try {\n const spanData = entry.agentsSpan?.spanData;\n applySpanData(entry.lmnrSpan, spanData);\n applySpanError(entry.lmnrSpan, entry.agentsSpan);\n } catch {\n // ignore\n }\n if (entry.activationContext !== undefined) {\n try {\n LaminarContextManager.removeContext(entry.activationContext);\n } catch {\n // ignore\n }\n }\n try {\n entry.lmnrSpan.end();\n } catch {\n // ignore\n }\n }\n try {\n state.rootSpan?.end();\n } catch {\n // ignore\n }\n }\n\n private getOrCreateTrace(\n traceOrSpan: Trace | AgentsSpan<SpanData>,\n ): TraceState {\n let traceId: string | undefined = (traceOrSpan as any).traceId;\n if (!traceId) {\n traceId = \"unknown\";\n }\n const existing = this.traces.get(traceId);\n if (existing) {\n return existing;\n }\n\n // Generic name; onTraceStart will update it to the actual trace name.\n // Start from ROOT_CONTEXT so the root span of a concurrently-running\n // agent trace cannot become a child of another trace's currently-active\n // span on the shared async context. Use startSpan (not startActiveSpan)\n // so the processor never touches the ALS context stack — see the child\n // span call-site for the rationale.\n const rootSpan = Laminar.startSpan({\n name: \"agents.trace\",\n context: ROOT_CONTEXT,\n });\n const state: TraceState = {\n rootSpan,\n spans: new Map(),\n ended: false,\n pendingHandoffCtxs: new Map(),\n };\n this.traces.set(traceId, state);\n return state;\n }\n\n private applyTraceMetadata(\n rootSpan: OtelSpan | undefined,\n agentsTrace: Trace,\n ): void {\n if (rootSpan === undefined) {\n return;\n }\n const metadata: Record<string, any> = {};\n const traceMetadata = agentsTrace.metadata;\n if (traceMetadata !== undefined && traceMetadata !== null) {\n Object.assign(metadata, traceMetadata);\n }\n const groupId = agentsTrace.groupId;\n if (groupId) {\n metadata[\"openai.agents.group_id\"] = groupId;\n }\n if (agentsTrace.name) {\n metadata[\"openai.agents.trace_name\"] = agentsTrace.name;\n }\n if (Object.keys(metadata).length > 0) {\n try {\n (rootSpan as LaminarSpan).setTraceMetadata?.(metadata);\n } catch {\n // ignore\n }\n }\n const sessionId = metadata.session_id;\n const userId = metadata.user_id;\n if (sessionId) {\n try {\n (rootSpan as LaminarSpan).setTraceSessionId?.(String(sessionId));\n } catch {\n // ignore\n }\n }\n if (userId) {\n try {\n (rootSpan as LaminarSpan).setTraceUserId?.(String(userId));\n } catch {\n // ignore\n }\n }\n }\n}\n/* eslint-enable @typescript-eslint/require-await */\n","import { diag } from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\n\nimport { version as SDK_VERSION } from \"../../../../package.json\";\nimport { initializeLogger } from \"../../../utils\";\nimport {\n runWithSystemInstructions,\n wrapStreamWithSystemInstructions,\n} from \"./helpers\";\nimport { LaminarAgentsTraceProcessor } from \"./processor\";\n\nexport {\n DISABLE_OPENAI_RESPONSES_INSTRUMENTATION_CONTEXT_KEY,\n DISABLE_OPENAI_RESPONSES_INSTRUMENTATION_CONTEXT_KEY_RAW,\n} from \"./helpers\";\nexport { LaminarAgentsTraceProcessor } from \"./processor\";\n\nconst logger = initializeLogger();\n\n/* eslint-disable\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return,\n @typescript-eslint/no-unsafe-argument\n*/\n\ntype ModelRequestLike = {\n systemInstructions?: string;\n} | undefined;\n\nconst wrapGetResponse = (original: Function): Function =>\n function (this: any, request: ModelRequestLike, ...rest: any[]) {\n const systemInstructions = request?.systemInstructions;\n return runWithSystemInstructions(systemInstructions, () =>\n original.call(this, request, ...rest),\n );\n };\n\nconst wrapGetStreamedResponse = (original: Function): Function =>\n function (this: any, request: ModelRequestLike, ...rest: any[]) {\n const systemInstructions = request?.systemInstructions;\n const source = original.call(this, request, ...rest) as AsyncIterable<any>;\n return wrapStreamWithSystemInstructions(systemInstructions, source);\n };\n\nconst MODEL_METHODS: readonly [\"getResponse\", \"getStreamedResponse\"] = [\n \"getResponse\",\n \"getStreamedResponse\",\n];\n\ntype AgentsOpenAIModule = {\n OpenAIResponsesModel?: { prototype: any };\n OpenAIChatCompletionsModel?: { prototype: any };\n};\n\ntype AgentsTracingModule = {\n addTraceProcessor?: (processor: any) => void;\n};\n\nexport class OpenAIAgentsInstrumentation extends InstrumentationBase {\n private _processor: LaminarAgentsTraceProcessor | undefined;\n private _wrappedPrototypes: WeakSet<object> = new WeakSet();\n\n constructor() {\n super(\"@lmnr/openai-agents-instrumentation\", SDK_VERSION, {\n enabled: true,\n });\n }\n\n protected init(): InstrumentationModuleDefinition[] {\n return [\n new InstrumentationNodeModuleDefinition(\n \"@openai/agents\",\n [\">=0.0.1\"],\n this.patchAgents.bind(this),\n this.unpatchAgents.bind(this),\n ),\n new InstrumentationNodeModuleDefinition(\n \"@openai/agents-openai\",\n [\">=0.0.1\"],\n this.patchAgentsOpenAI.bind(this),\n this.unpatchAgentsOpenAI.bind(this),\n ),\n ];\n }\n\n public manuallyInstrument(agentsModule: any) {\n if (!agentsModule) {\n logger.debug(\"@openai/agents module not provided, skipping\");\n return;\n }\n this.registerProcessor(agentsModule);\n this.patchModel(agentsModule);\n }\n\n private registerProcessor(module: AgentsTracingModule) {\n if (this._processor !== undefined) {\n return;\n }\n const addTraceProcessor = module.addTraceProcessor;\n if (typeof addTraceProcessor !== \"function\") {\n logger.debug(\"addTraceProcessor not found in @openai/agents module\");\n return;\n }\n try {\n const processor = new LaminarAgentsTraceProcessor();\n addTraceProcessor(processor);\n this._processor = processor;\n } catch (e) {\n logger.debug(`Failed to register Laminar Agents processor: ${String(e)}`);\n }\n }\n\n private patchModel(module: AgentsOpenAIModule) {\n for (const cls of [\n module.OpenAIResponsesModel,\n module.OpenAIChatCompletionsModel,\n ]) {\n if (!cls || !cls.prototype) {\n continue;\n }\n // @openai/agents re-exports the model classes from @openai/agents-openai,\n // so we may see the same prototype twice. Skip if already wrapped to\n // avoid double-wrapping getResponse/getStreamedResponse.\n if (this._wrappedPrototypes.has(cls.prototype)) {\n continue;\n }\n for (const method of MODEL_METHODS) {\n if (typeof cls.prototype[method] !== \"function\") {\n continue;\n }\n const wrapper = method === \"getResponse\"\n ? wrapGetResponse\n : wrapGetStreamedResponse;\n try {\n this._wrap(cls.prototype, method, wrapper as any);\n } catch (e) {\n logger.debug(`Failed to wrap ${method}: ${String(e)}`);\n }\n }\n this._wrappedPrototypes.add(cls.prototype);\n }\n }\n\n private unpatchModel(module: AgentsOpenAIModule) {\n for (const cls of [\n module.OpenAIResponsesModel,\n module.OpenAIChatCompletionsModel,\n ]) {\n if (!cls || !cls.prototype) {\n continue;\n }\n if (!this._wrappedPrototypes.has(cls.prototype)) {\n continue;\n }\n for (const method of MODEL_METHODS) {\n try {\n this._unwrap(cls.prototype, method);\n } catch {\n // ignore\n }\n }\n this._wrappedPrototypes.delete(cls.prototype);\n }\n }\n\n private patchAgents(moduleExports: any): any {\n diag.debug(\"Patching @openai/agents\");\n this.registerProcessor(moduleExports as AgentsTracingModule);\n // @openai/agents re-exports @openai/agents-openai, so model classes are here\n this.patchModel(moduleExports as AgentsOpenAIModule);\n return moduleExports;\n }\n\n private unpatchAgents(moduleExports: any): void {\n diag.debug(\"Unpatching @openai/agents\");\n this.unpatchModel(moduleExports as AgentsOpenAIModule);\n }\n\n private patchAgentsOpenAI(moduleExports: any): any {\n diag.debug(\"Patching @openai/agents-openai\");\n this.patchModel(moduleExports as AgentsOpenAIModule);\n return moduleExports;\n }\n\n private unpatchAgentsOpenAI(moduleExports: any): void {\n diag.debug(\"Unpatching @openai/agents-openai\");\n this.unpatchModel(moduleExports as AgentsOpenAIModule);\n }\n}\n/* eslint-enable\n @typescript-eslint/no-unsafe-function-type,\n @typescript-eslint/no-unsafe-return,\n @typescript-eslint/no-unsafe-argument\n*/\n","import { diag } from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n} from \"@opentelemetry/instrumentation\";\n\nimport { version as SDK_VERSION } from \"../../../package.json\";\nimport { Laminar } from \"../../laminar\";\n\n/* eslint-disable\n @typescript-eslint/no-unsafe-return,\n @typescript-eslint/no-unsafe-function-type\n*/\n\nexport class OpencodeInstrumentation extends InstrumentationBase {\n constructor() {\n super(\"lmnr-opencode-instrumentation\", SDK_VERSION, { enabled: true });\n }\n\n protected init(): InstrumentationModuleDefinition {\n return new InstrumentationNodeModuleDefinition(\n \"@opencode-ai/sdk\",\n [\">=1.0.0\"],\n this.patch.bind(this),\n this.unpatch.bind(this),\n );\n }\n\n public manuallyInstrument(opencodeModule: any): void {\n diag.debug(\"Manually instrumenting @opencode-ai/sdk\");\n const SessionClass = this.resolveSessionClass(opencodeModule);\n if (SessionClass) {\n this.patchSessionClass(SessionClass);\n } else {\n diag.warn(\n \"Could not find Session class in opencode manual instrumentation input. \" +\n \"Pass the OpencodeClient class or the module object.\",\n );\n }\n }\n\n private resolveSessionClass(input: any): any {\n // Module-level import: { OpencodeClient, ... }\n if (input?.OpencodeClient) {\n return this.getSessionClass(input.OpencodeClient);\n }\n // Direct class passed\n if (typeof input === \"function\" && input.prototype) {\n return this.getSessionClass(input);\n }\n return null;\n }\n\n // session is a class field on OpencodeClient (not on the prototype), so we\n // must instantiate to trigger field initialization and discover Session's constructor.\n private getSessionClass(ClientClass: any): Function | null {\n try {\n const instance = new ClientClass();\n if (instance.session) {\n return instance.session.constructor;\n }\n } catch {\n // fall through\n }\n return null;\n }\n\n private patchSessionClass(SessionClass: Function): void {\n this._wrap(SessionClass.prototype, \"prompt\", this.patchPromptMethod());\n this._wrap(SessionClass.prototype, \"promptAsync\", this.patchPromptMethod());\n }\n\n private patchPromptMethod(): (original: Function) => Function {\n return (original: Function) => function (this: any, ...args: any[]) {\n const options = args[0];\n if (options?.body?.parts && Array.isArray(options.body.parts)) {\n const serializedContext = Laminar.serializeLaminarSpanContext();\n if (serializedContext) {\n options.body.parts = [\n ...options.body.parts,\n {\n type: \"text\",\n metadata: {\n lmnrSpanContext: serializedContext,\n },\n text: \"\",\n ignored: true,\n synthetic: true,\n },\n ];\n }\n }\n return original.apply(this, args);\n };\n }\n\n private patch(moduleExports: any): any {\n diag.debug(\"Patching @opencode-ai/sdk\");\n const SessionClass = this.resolveSessionClass(moduleExports);\n if (SessionClass) {\n this.patchSessionClass(SessionClass);\n }\n return moduleExports;\n }\n\n private unpatch(moduleExports: any): void {\n diag.debug(\"Unpatching @opencode-ai/sdk\");\n const SessionClass = this.resolveSessionClass(moduleExports);\n if (SessionClass) {\n this._unwrap(SessionClass.prototype, \"prompt\");\n this._unwrap(SessionClass.prototype, \"promptAsync\");\n }\n }\n}\n\n/* eslint-enable\n @typescript-eslint/no-unsafe-return,\n @typescript-eslint/no-unsafe-function-type\n*/\n","import { LaminarClient } from \"@lmnr-ai/client\";\nimport { SessionRecordingOptions } from \"@lmnr-ai/types\";\nimport { Instrumentation } from \"@opentelemetry/instrumentation\";\nimport { AnthropicInstrumentation } from \"@traceloop/instrumentation-anthropic\";\nimport { AzureOpenAIInstrumentation } from \"@traceloop/instrumentation-azure\";\nimport { BedrockInstrumentation } from \"@traceloop/instrumentation-bedrock\";\nimport { ChromaDBInstrumentation } from \"@traceloop/instrumentation-chromadb\";\nimport { CohereInstrumentation } from \"@traceloop/instrumentation-cohere\";\nimport { LangChainInstrumentation } from \"@traceloop/instrumentation-langchain\";\nimport { OpenAIInstrumentation } from \"@traceloop/instrumentation-openai\";\nimport { PineconeInstrumentation } from \"@traceloop/instrumentation-pinecone\";\nimport { QdrantInstrumentation } from \"@traceloop/instrumentation-qdrant\";\nimport { TogetherInstrumentation } from \"@traceloop/instrumentation-together\";\nimport {\n AIPlatformInstrumentation,\n VertexAIInstrumentation,\n} from \"@traceloop/instrumentation-vertexai\";\n\nimport { PlaywrightInstrumentation } from \"../../browser\";\nimport { PuppeteerInstrumentation } from \"../../browser/puppeteer\";\nimport { StagehandV2Instrumentation } from \"../../browser/stagehand/v2\";\nimport { StagehandInstrumentation as StagehandV3Instrumentation } from \"../../browser/stagehand/v3\";\nimport { initializeLogger } from \"../../utils\";\nimport { ClaudeAgentSDKInstrumentation } from \"../instrumentation/claude-agent-sdk\";\nimport { GoogleGenAiInstrumentation } from \"../instrumentation/google-genai\";\nimport { KernelInstrumentation } from \"../instrumentation/kernel\";\nimport { OpenAIAgentsInstrumentation } from \"../instrumentation/openai-agents\";\nimport { OpencodeInstrumentation } from \"../instrumentation/opencode\";\nimport { InitializeOptions } from \"../interfaces\";\n\nconst logger = initializeLogger();\n\n/**\n * Initialize and return Laminar instrumentations.\n * Useful to use with libraries that initialize tracing and can register passed\n * instrumentations.\n *\n * @param options\n * @param {string} options.baseUrl - Base URL of the Laminar API.\n * @param {string} options.apiKey - Laminar project API key. If not provided, will use\n * the LMNR_PROJECT_API_KEY environment variable.\n * @param {number} options.httpPort - Laminar API http port. If not provided, will use\n * the port from the baseUrl or defaults to 443. Only required for Playwright/Puppeteer\n * instrumentations for sending browser sessions.\n * @param {boolean} options.suppressContentTracing - Whether to suppress content tracing.\n * @param {InitializeOptions[\"instrumentModules\"]} options.instrumentModules - Record of modules\n * to instrument.\n * If not provided, all auto-instrumentable modules will be instrumented, which include\n * LLM calls (OpenAI, Anthropic, etc), Langchain, VectorDB calls (Pinecone, Qdrant, etc).\n * Pass an empty object {} to disable any kind of automatic instrumentation.\n * If you only want to auto-instrument specific modules, then pass them in the object.\n *\n * @returns {Instrumentation[]} Array of enabled instrumentations. It is your responsibility\n * to enable them and register them with the OpenTelemetry SDK. For example, you could use\n * registerInstrumentations from the opentelemetry-api to register them.\n */\nexport const initializeLaminarInstrumentations = (\n options: {\n baseUrl?: string;\n apiKey?: string;\n httpPort?: number;\n suppressContentTracing?: boolean;\n instrumentModules?: InitializeOptions[\"instrumentModules\"];\n sessionRecordingOptions?: SessionRecordingOptions;\n } = {},\n) => {\n const apiKey = options.apiKey ?? process.env.LMNR_PROJECT_API_KEY;\n\n // Only create client if we have an API key. That is, only send browser\n // session events to Laminar backend, but not other OTEL backends.\n let client: LaminarClient | undefined;\n if (apiKey) {\n const url =\n options.baseUrl ?? process?.env?.LMNR_BASE_URL ?? \"https://api.lmnr.ai\";\n const port =\n options.httpPort ??\n (url.match(/:\\d{1,5}$/g)\n ? parseInt(url.match(/:\\d{1,5}$/g)![0].slice(1))\n : 443);\n const urlWithoutSlash = url.replace(/\\/$/, \"\").replace(/:\\d{1,5}$/g, \"\");\n client = new LaminarClient({\n baseUrl: `${urlWithoutSlash}:${port}`,\n projectApiKey: apiKey,\n });\n }\n\n return options?.instrumentModules !== undefined\n ? manuallyInitInstrumentations(\n client,\n options.instrumentModules,\n options.suppressContentTracing,\n options.sessionRecordingOptions,\n )\n : initInstrumentations(\n client,\n options.suppressContentTracing,\n options.sessionRecordingOptions,\n );\n};\n\n/**\n * Get the appropriate Stagehand instrumentation based on the installed version.\n * Returns v3 instrumentation for stagehand >= 3.0.0, otherwise v2.\n */\nconst getStagehandInstrumentation = (\n playwrightInstrumentation: PlaywrightInstrumentation,\n client: LaminarClient,\n sessionRecordingOptions?: SessionRecordingOptions,\n): StagehandV2Instrumentation | StagehandV3Instrumentation => {\n try {\n // Try to require the stagehand package to get its version\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const stagehandPkg = require(\"@browserbasehq/stagehand/package.json\");\n const version = stagehandPkg.version;\n const majorVersion = parseInt(version.split(\".\")[0], 10);\n\n if (majorVersion >= 3) {\n const stagehandInstrumentation = new StagehandV3Instrumentation(\n sessionRecordingOptions,\n );\n stagehandInstrumentation.setClient(client);\n return stagehandInstrumentation;\n } else {\n return new StagehandV2Instrumentation(playwrightInstrumentation);\n }\n } catch {\n // If we can't find the package, default to v3\n }\n\n const stagehandInstrumentation = new StagehandV3Instrumentation(\n sessionRecordingOptions,\n );\n stagehandInstrumentation.setClient(client);\n return stagehandInstrumentation;\n};\n\nconst initInstrumentations = (\n client: LaminarClient | undefined,\n suppressContentTracing?: boolean,\n sessionRecordingOptions?: SessionRecordingOptions,\n): Instrumentation[] => {\n const enrichTokens = false;\n const instrumentations: Instrumentation[] = [];\n\n instrumentations.push(\n new OpenAIInstrumentation({\n enrichTokens,\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new AnthropicInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new AzureOpenAIInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new CohereInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new VertexAIInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new AIPlatformInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new BedrockInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(new PineconeInstrumentation());\n\n instrumentations.push(\n new LangChainInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new TogetherInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new ChromaDBInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(\n new QdrantInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n // Browser instrumentations require a client (API key)\n if (client) {\n const playwrightInstrumentation = new PlaywrightInstrumentation(\n client,\n sessionRecordingOptions,\n );\n instrumentations.push(playwrightInstrumentation);\n\n instrumentations.push(\n getStagehandInstrumentation(\n playwrightInstrumentation,\n client,\n sessionRecordingOptions,\n ),\n );\n\n instrumentations.push(\n new PuppeteerInstrumentation(client, sessionRecordingOptions),\n );\n }\n\n instrumentations.push(\n new GoogleGenAiInstrumentation({\n traceContent: !suppressContentTracing,\n }),\n );\n\n instrumentations.push(new KernelInstrumentation());\n\n instrumentations.push(new ClaudeAgentSDKInstrumentation());\n\n instrumentations.push(new OpencodeInstrumentation());\n\n instrumentations.push(new OpenAIAgentsInstrumentation());\n\n return instrumentations;\n};\n\nconst manuallyInitInstrumentations = (\n client: LaminarClient | undefined,\n instrumentModules: InitializeOptions[\"instrumentModules\"],\n suppressContentTracing?: boolean,\n sessionRecordingOptions?: SessionRecordingOptions,\n): Instrumentation[] => {\n const enrichTokens = false;\n const instrumentations: Instrumentation[] = [];\n let playwrightInstrumentation: PlaywrightInstrumentation | undefined;\n\n if (instrumentModules?.OpenAI && instrumentModules?.openAI) {\n throw new Error(\n \"`openAI` is deprecated, but both `OpenAI` and `openAI` are provided. \" +\n \"Please use `OpenAI` only.\",\n );\n }\n\n if (instrumentModules?.openAI) {\n const openAIInstrumentation = new OpenAIInstrumentation({\n enrichTokens,\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(openAIInstrumentation);\n openAIInstrumentation.manuallyInstrument(instrumentModules.openAI);\n }\n\n if (instrumentModules?.OpenAI) {\n const openAIInstrumentation = new OpenAIInstrumentation({\n enrichTokens,\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(openAIInstrumentation);\n openAIInstrumentation.manuallyInstrument(instrumentModules.OpenAI);\n }\n\n if (instrumentModules?.anthropic) {\n const anthropicInstrumentation = new AnthropicInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(anthropicInstrumentation);\n anthropicInstrumentation.manuallyInstrument(\n instrumentModules.anthropic,\n );\n }\n\n if (instrumentModules?.azureOpenAI) {\n const azureOpenAIInstrumentation = new AzureOpenAIInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(azureOpenAIInstrumentation as Instrumentation);\n azureOpenAIInstrumentation.manuallyInstrument(\n instrumentModules.azureOpenAI,\n );\n }\n\n if (instrumentModules?.cohere) {\n const cohereInstrumentation = new CohereInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(cohereInstrumentation);\n cohereInstrumentation.manuallyInstrument(instrumentModules.cohere);\n }\n\n if (instrumentModules?.google_vertexai) {\n const vertexaiInstrumentation = new VertexAIInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(vertexaiInstrumentation);\n vertexaiInstrumentation.manuallyInstrument(\n instrumentModules.google_vertexai,\n );\n }\n\n if (instrumentModules?.google_aiplatform) {\n const aiplatformInstrumentation = new AIPlatformInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(aiplatformInstrumentation);\n aiplatformInstrumentation.manuallyInstrument(\n instrumentModules.google_aiplatform,\n );\n }\n\n if (instrumentModules?.bedrock) {\n const bedrockInstrumentation = new BedrockInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(bedrockInstrumentation);\n bedrockInstrumentation.manuallyInstrument(instrumentModules.bedrock);\n }\n\n if (instrumentModules?.pinecone) {\n const instrumentation = new PineconeInstrumentation();\n instrumentations.push(instrumentation as Instrumentation);\n instrumentation.manuallyInstrument(instrumentModules.pinecone);\n }\n\n if (instrumentModules?.langchain) {\n const langchainInstrumentation = new LangChainInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(langchainInstrumentation);\n langchainInstrumentation.manuallyInstrument(instrumentModules.langchain);\n }\n\n if (instrumentModules?.llamaIndex) {\n logger.warn(\n \"Llamaindex JS is deprecated. Not enabling any instrumentation.\",\n );\n }\n\n if (instrumentModules?.chromadb) {\n const chromadbInstrumentation = new ChromaDBInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(chromadbInstrumentation);\n chromadbInstrumentation.manuallyInstrument(instrumentModules.chromadb);\n }\n\n if (instrumentModules?.qdrant) {\n const qdrantInstrumentation = new QdrantInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(qdrantInstrumentation);\n qdrantInstrumentation.manuallyInstrument(instrumentModules.qdrant);\n }\n\n if (instrumentModules?.together) {\n const togetherInstrumentation = new TogetherInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(togetherInstrumentation);\n togetherInstrumentation.manuallyInstrument(\n instrumentModules.together,\n );\n }\n\n if (instrumentModules?.playwright && client) {\n playwrightInstrumentation = new PlaywrightInstrumentation(\n client,\n sessionRecordingOptions,\n );\n instrumentations.push(playwrightInstrumentation);\n playwrightInstrumentation.manuallyInstrument(instrumentModules.playwright);\n }\n\n if (instrumentModules?.puppeteer && client) {\n const puppeteerInstrumentation = new PuppeteerInstrumentation(\n client,\n sessionRecordingOptions,\n );\n instrumentations.push(puppeteerInstrumentation);\n puppeteerInstrumentation.manuallyInstrument(instrumentModules.puppeteer);\n }\n\n if (instrumentModules?.stagehand && client) {\n if (!playwrightInstrumentation) {\n playwrightInstrumentation = new PlaywrightInstrumentation(\n client,\n sessionRecordingOptions,\n );\n instrumentations.push(playwrightInstrumentation);\n }\n const stagehandInstrumentation = getStagehandInstrumentation(\n playwrightInstrumentation,\n client,\n sessionRecordingOptions,\n );\n instrumentations.push(stagehandInstrumentation);\n stagehandInstrumentation.manuallyInstrument(instrumentModules.stagehand);\n }\n\n if (instrumentModules?.google_genai) {\n const googleGenAiInstrumentation = new GoogleGenAiInstrumentation({\n traceContent: !suppressContentTracing,\n });\n instrumentations.push(googleGenAiInstrumentation);\n googleGenAiInstrumentation.manuallyInstrument(\n instrumentModules.google_genai,\n );\n }\n\n if (instrumentModules?.kernel) {\n const kernelInstrumentation = new KernelInstrumentation();\n instrumentations.push(kernelInstrumentation);\n kernelInstrumentation.manuallyInstrument(instrumentModules.kernel);\n }\n\n if (instrumentModules?.claudeAgentSDK) {\n const claudeAgentInstrumentation = new ClaudeAgentSDKInstrumentation();\n instrumentations.push(claudeAgentInstrumentation);\n claudeAgentInstrumentation.manuallyInstrument(\n instrumentModules.claudeAgentSDK,\n );\n }\n\n if (instrumentModules?.opencode) {\n const opencodeInstrumentation = new OpencodeInstrumentation();\n instrumentations.push(opencodeInstrumentation);\n opencodeInstrumentation.manuallyInstrument(instrumentModules.opencode);\n }\n\n if (instrumentModules?.openAIAgents) {\n const openAIAgentsInstrumentation = new OpenAIAgentsInstrumentation();\n instrumentations.push(openAIAgentsInstrumentation);\n openAIAgentsInstrumentation.manuallyInstrument(\n instrumentModules.openAIAgents,\n );\n }\n\n return instrumentations;\n};\n","export const getLangVersion: () => string | undefined = () => {\n if (process?.versions?.node) {\n return `node@${process.versions.node}`;\n }\n// else if (Deno?.version) {\n// return `deno@${Deno?.version?.deno}`;\n// }\n};\n","// This class could be just an initialization of the OTLP exporter,\n// but OTel v2 has some breaking changes, so we're applying\n// a small backward-compatibility fix here.\n\nimport { Metadata } from \"@grpc/grpc-js\";\nimport { ExportResult } from \"@opentelemetry/core\";\nimport {\n OTLPTraceExporter as ExporterGrpc,\n} from \"@opentelemetry/exporter-trace-otlp-grpc\";\nimport {\n OTLPTraceExporter as ExporterHttp,\n} from \"@opentelemetry/exporter-trace-otlp-proto\";\nimport { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\n\nimport { getOtelEnvVar, initializeLogger, parseOtelHeaders } from \"../../utils\";\nimport { makeSpanOtelV2Compatible } from \"./compat\";\n\nconst logger = initializeLogger();\n\nexport class LaminarSpanExporter implements SpanExporter {\n private exporter: SpanExporter;\n\n constructor(options: {\n baseUrl?: string;\n port?: number;\n apiKey?: string;\n forceHttp?: boolean;\n timeoutMillis?: number;\n } = {}) {\n let url = options.baseUrl ?? process?.env?.LMNR_BASE_URL;\n let port = options.port;\n let forceHttp = options.forceHttp ?? false;\n const key = options.apiKey ?? process?.env?.LMNR_PROJECT_API_KEY;\n\n // Determine headers - either from API key or OTEL env vars\n let headers: Record<string, string> = {};\n if (key) {\n headers = forceHttp\n ? { 'Authorization': `Bearer ${key}` }\n : { 'authorization': `Bearer ${key}` };\n if (!url) {\n url = 'https://api.lmnr.ai';\n }\n } else {\n const otelHeaders = getOtelEnvVar('HEADERS');\n if (otelHeaders) {\n headers = parseOtelHeaders(otelHeaders);\n }\n // Check for OTEL endpoint configuration\n const otelEndpoint = getOtelEnvVar('ENDPOINT');\n if (otelEndpoint && !url) {\n url = otelEndpoint;\n\n // Determine protocol from OTEL env vars\n const otelProtocol = getOtelEnvVar('PROTOCOL') || 'grpc/protobuf';\n const otelExporter = process?.env?.OTEL_EXPORTER;\n forceHttp = otelProtocol === 'http/protobuf'\n || otelProtocol === 'http/json'\n || otelExporter === 'otlp_http';\n } else if (otelEndpoint && url) {\n logger.warn(\n 'OTEL_ENDPOINT is set, but Laminar base URL is also set. Ignoring OTEL_ENDPOINT.',\n );\n }\n }\n\n if (!url) {\n throw new Error(\n 'Laminar base URL is not set and OTEL_ENDPOINT is not set. Please either\\n' +\n '- set the LMNR_BASE_URL environment variable\\n' +\n '- set the OTEL_ENDPOINT environment variable (if you are not using a Laminar API key)\\n' +\n '- pass the baseUrl parameter to Laminar.initialize',\n );\n }\n\n // Calculate port\n if (!port) {\n port = url.match(/:\\d{1,5}$/g)\n ? parseInt(url.match(/:\\d{1,5}$/g)![0].slice(1))\n : (forceHttp ? 443 : 8443);\n }\n\n const urlWithoutSlash = url.replace(/\\/$/, '').replace(/:\\d{1,5}$/g, '');\n\n if (forceHttp) {\n this.exporter = new ExporterHttp({\n url: `${urlWithoutSlash}:${port}/v1/traces`,\n headers,\n timeoutMillis: options.timeoutMillis ?? 30000,\n });\n } else {\n const metadata = new Metadata();\n Object.entries(headers).forEach(([key, value]) => {\n metadata.set(key, value);\n });\n this.exporter = new ExporterGrpc({\n url: `${urlWithoutSlash}:${port}`,\n metadata,\n timeoutMillis: options.timeoutMillis ?? 30000,\n });\n }\n }\n\n export(\n items: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ) {\n // ==== //\n // OTel v2 has renamed the instrumentationLibrary field to instrumentationScope,\n // but spans may be created by older versions of the SDK that don't have that change.\n // This is a small hack to support those older spans.\n items.forEach(makeSpanOtelV2Compatible);\n // ==== //\n\n return this.exporter.export(items, resultCallback);\n }\n\n async shutdown(): Promise<void> {\n return this.exporter.shutdown();\n }\n\n async forceFlush(): Promise<void> {\n return this.exporter.forceFlush?.();\n }\n}\n\n","import { LaminarClient } from \"@lmnr-ai/client\";\nimport { SpanType } from \"@lmnr-ai/types\";\nimport { AttributeValue, Context, context } from \"@opentelemetry/api\";\nimport {\n BatchSpanProcessor,\n SimpleSpanProcessor,\n type Span,\n SpanExporter,\n SpanProcessor,\n} from \"@opentelemetry/sdk-trace-base\";\nimport { Logger } from \"pino\";\n\nimport { version as SDK_VERSION } from \"../../../package.json\";\nimport {\n initializeLogger,\n metadataToAttributes,\n otelSpanIdToUUID,\n StringUUID,\n} from \"../../utils\";\nimport { getLangVersion } from \"../../version\";\nimport {\n ASSOCIATION_PROPERTIES,\n ASSOCIATION_PROPERTIES_OVERRIDES,\n PARENT_SPAN_IDS_PATH,\n PARENT_SPAN_PATH,\n ROLLOUT_SESSION_ID,\n SESSION_ID,\n SPAN_IDS_PATH,\n SPAN_INSTRUMENTATION_SOURCE,\n SPAN_LANGUAGE_VERSION,\n SPAN_PATH,\n SPAN_SDK_VERSION,\n SPAN_TYPE,\n TRACE_TYPE,\n USER_ID,\n} from \"./attributes\";\nimport {\n getParentSpanId,\n makeSpanOtelV2Compatible,\n OTelSpanCompat,\n} from \"./compat\";\nimport { ASSOCIATION_PROPERTIES_KEY, CONTEXT_SPAN_PATH_KEY } from \"./context\";\nimport { LaminarSpanExporter } from \"./exporter\";\n\ninterface LaminarSpanProcessorOptions {\n /**\n * The base URL of the Laminar API. Optional.\n * Defaults to https://api.lmnr.ai.\n */\n baseUrl?: string;\n /**\n * The port of the Laminar API. Optional.\n * Defaults to 8443.\n */\n port?: number;\n /**\n * Laminar project API key. Optional.\n * If not provided, the LMNR_PROJECT_API_KEY environment variable will be used.\n */\n apiKey?: string;\n /**\n * The maximum number of spans to export at a time. Optional.\n * Defaults to 512.\n */\n maxExportBatchSize?: number;\n /**\n * Whether to disable batching. Optional.\n * Defaults to false.\n */\n disableBatch?: boolean;\n /**\n * Whether to force HTTP and use OpenTelemetry HTTP/protobuf exporter.\n * Not recommended with Laminar backends.\n * Optional.\n * Defaults to false.\n */\n forceHttp?: boolean;\n /**\n * The timeout for sending traces data. Optional.\n * Defaults to 30 seconds.\n */\n traceExportTimeoutMillis?: number;\n\n /**\n * The exporter to use. Optional. If specified, some of the other options will be ignored.\n * Defaults to a new LaminarSpanExporter.\n */\n exporter?: SpanExporter;\n\n /**\n * The span processor to use. If passed, some of the other options will be ignored.\n * If passed, wraps the underlying span processor.\n */\n spanProcessor?: SpanProcessor;\n\n /**\n * The HTTP port to use. Optional.\n * If not provided, the `port` option will be used.\n */\n httpPort?: number;\n}\n\nexport class LaminarSpanProcessor implements SpanProcessor {\n private instance: BatchSpanProcessor | SimpleSpanProcessor;\n private client: LaminarClient | undefined;\n private logger: Logger;\n private readonly _spanIdToPath: Map<string, string[]> = new Map();\n private readonly _spanIdLists: Map<string, string[]> = new Map();\n\n /**\n * @param {object} options - The options for the Laminar span processor.\n * @param {string} options.baseUrl - The base URL of the Laminar API.\n * @param {number} options.port - The port of the Laminar API.\n * @param {string} options.apiKey - Laminar project API key or any other\n * authorization set as bearer token.\n * @param {boolean} options.disableBatch - Whether to disable batching (uses SimpleSpanProcessor).\n * @param {number} options.maxExportBatchSize - The maximum number of spans to export at a time\n * if disableBatch is false.\n * @param {number} options.traceExportTimeoutMillis - The timeout for sending traces data.\n * Defaults to 30 seconds.\n * @param {boolean} options.forceHttp - Whether to force HTTP and use OpenTelemetry\n * HTTP/protobuf exporter.\n * Not recommended with Laminar backends.\n */\n constructor(options: LaminarSpanProcessorOptions = {}) {\n this.logger = initializeLogger();\n if (\n options.spanProcessor &&\n options.spanProcessor instanceof LaminarSpanProcessor\n ) {\n this.instance = options.spanProcessor.instance;\n // Set by reference, so that updates from the inside are reflected here.\n this._spanIdToPath = options.spanProcessor._spanIdToPath;\n this._spanIdLists = options.spanProcessor._spanIdLists;\n } else if (options.spanProcessor) {\n this.instance = options.spanProcessor as\n | BatchSpanProcessor\n | SimpleSpanProcessor;\n } else {\n const exporter = options.exporter ?? new LaminarSpanExporter(options);\n this.instance = options.disableBatch\n ? new SimpleSpanProcessor(exporter)\n : new BatchSpanProcessor(exporter, {\n maxExportBatchSize: options.maxExportBatchSize ?? 512,\n exportTimeoutMillis: options.traceExportTimeoutMillis ?? 30000,\n });\n }\n\n if (process.env.LMNR_ROLLOUT_SESSION_ID) {\n this.client = new LaminarClient({\n baseUrl: options.baseUrl,\n projectApiKey: options.apiKey,\n port: options.httpPort ?? options.port,\n });\n }\n }\n\n forceFlush(): Promise<void> {\n return this.instance.forceFlush();\n }\n\n shutdown(): Promise<void> {\n return this.instance.shutdown();\n }\n\n onStart(spanArg: any, parentContext: Context): void {\n const span = spanArg as OTelSpanCompat;\n // Check for parent path attributes first (from serialized span context)\n const parentPathFromAttribute = span.attributes?.[PARENT_SPAN_PATH] as\n | string[]\n | undefined;\n const parentIdsPathFromAttribute = span.attributes?.[\n PARENT_SPAN_IDS_PATH\n ] as StringUUID[] | undefined;\n\n const parentSpanId = getParentSpanId(span);\n\n // Use parent path from attributes if available, otherwise fall back to cached paths\n const parentSpanPath =\n parentPathFromAttribute ??\n (parentSpanId !== undefined\n ? this._spanIdToPath.get(parentSpanId)\n : undefined);\n\n const spanId = span.spanContext().spanId;\n const parentSpanIdsPath =\n parentIdsPathFromAttribute ??\n (parentSpanId ? this._spanIdLists.get(parentSpanId) : []);\n const spanPath = parentSpanPath\n ? [...parentSpanPath, span.name]\n : [span.name];\n\n const spanIdUuid = otelSpanIdToUUID(spanId);\n const spanIdsPath = parentSpanIdsPath\n ? [...parentSpanIdsPath, spanIdUuid]\n : [spanIdUuid];\n\n span.setAttribute(SPAN_IDS_PATH, spanIdsPath);\n this._spanIdLists.set(spanId, spanIdsPath);\n\n span.setAttribute(SPAN_PATH, spanPath);\n context.active().setValue(CONTEXT_SPAN_PATH_KEY, spanPath);\n this._spanIdToPath.set(spanId, spanPath);\n\n span.setAttribute(SPAN_INSTRUMENTATION_SOURCE, \"javascript\");\n span.setAttribute(SPAN_SDK_VERSION, SDK_VERSION);\n const langVersion = getLangVersion();\n if (langVersion) {\n span.setAttribute(SPAN_LANGUAGE_VERSION, langVersion);\n }\n\n // This sets the properties only if the context has them\n const associationProperties = context\n .active()\n .getValue(ASSOCIATION_PROPERTIES_KEY);\n if (associationProperties) {\n for (const [key, value] of Object.entries(associationProperties)) {\n if (Object.keys(ASSOCIATION_PROPERTIES_OVERRIDES).includes(key)) {\n span.setAttribute(ASSOCIATION_PROPERTIES_OVERRIDES[key], value);\n } else if (key === \"tracing_level\") {\n span.setAttribute(\"lmnr.internal.tracing_level\", value);\n } else if (key === \"rolloutSessionId\") {\n span.setAttribute(ROLLOUT_SESSION_ID, value);\n span.setAttribute(\"lmnr.rollout.session_id\", value);\n } else if (\n key === \"metadata\" &&\n typeof value === \"object\" &&\n value !== null\n ) {\n // Flatten metadata into individual attributes\n const metadataAttrs = metadataToAttributes(\n value as Record<string, unknown>,\n );\n span.setAttributes(metadataAttrs);\n } else if (key === \"userId\") {\n span.setAttribute(USER_ID, value);\n } else if (key === \"sessionId\") {\n span.setAttribute(SESSION_ID, value);\n } else if (key === \"traceType\") {\n span.setAttribute(TRACE_TYPE, value);\n } else if (key === \"tracingLevel\") {\n span.setAttribute(\"lmnr.internal.tracing_level\", value);\n } else {\n span.setAttribute(`${ASSOCIATION_PROPERTIES}.${key}`, value);\n }\n }\n }\n\n makeSpanOtelV2Compatible(span);\n\n if (process.env.LMNR_ROLLOUT_SESSION_ID && this.client) {\n this.client.rolloutSessions\n .sendSpanUpdate({\n sessionId: process.env.LMNR_ROLLOUT_SESSION_ID,\n span: {\n name: span.name,\n startTime: new Date(\n span.startTime[0] * 1000 + span.startTime[1] / 1e6,\n ).toISOString(),\n spanId: span.spanContext().spanId,\n traceId: span.spanContext().traceId,\n parentSpanId: getParentSpanId(span),\n attributes: attributesForStartEvent(span.name, span.attributes),\n spanType: inferSpanType(span.name, span.attributes),\n },\n })\n .catch((error: any) => {\n this.logger.debug(\n `Failed to send span update: ${error instanceof Error ? error.message : String(error)}`,\n );\n });\n }\n this.instance.onStart(span, parentContext);\n }\n\n // type ReadableSpan\n onEnd(span: any): void {\n const spanId = (span as Span).spanContext().spanId;\n this._spanIdLists.delete(spanId);\n this._spanIdToPath.delete(spanId);\n makeSpanOtelV2Compatible(span);\n this.instance.onEnd(span as Span);\n }\n\n /**\n * Set parent path information for a given span ID.\n * Used when initializing context from environment variables.\n *\n * @param parentSpanId - The span ID to set path information for\n * @param spanPath - The span path (array of span names)\n * @param spanIdsPath - The span IDs path (array of span ID UUIDs)\n */\n setParentPathInfo(\n parentSpanId: string,\n spanPath: string[],\n spanIdsPath: StringUUID[],\n ): void {\n this._spanIdToPath.set(parentSpanId, spanPath);\n this._spanIdLists.set(parentSpanId, spanIdsPath);\n }\n\n /**\n * Drop cached path entries for a given span id. For exporters that stamp\n * their own span id over the SDK-allocated one after `startSpan` has fired\n * `onStart` — without this, `onEnd` reads the mutated id and its delete is\n * a no-op, so the original entry leaks one pair of map entries per span.\n */\n dropPathInfo(spanId: string): void {\n this._spanIdToPath.delete(spanId);\n this._spanIdLists.delete(spanId);\n }\n\n clear() {\n this._spanIdToPath.clear();\n this._spanIdLists.clear();\n }\n}\n\nconst inferSpanType = (\n name: string,\n attributes: Record<string, AttributeValue | undefined>,\n): SpanType => {\n if (attributes[SPAN_TYPE]) {\n return attributes[SPAN_TYPE] as SpanType;\n }\n if (attributes[\"gen_ai.system\"]) {\n return \"LLM\";\n }\n if (\n Object.keys(attributes).some(\n (k) => k.startsWith(\"gen_ai.\") || k.startsWith(\"llm.\"),\n )\n ) {\n return \"LLM\";\n }\n if (\n name === \"ai.toolCall\" ||\n attributes[\"ai.toolCall.id\"] ||\n attributes[\"ai.toolCall.name\"]\n ) {\n return \"TOOL\";\n }\n return \"DEFAULT\";\n};\n\nconst attributesForStartEvent = (\n name: string,\n attributes: Record<string, AttributeValue | undefined>,\n): Record<string, AttributeValue> => {\n const keysToKeep = [\n SPAN_PATH,\n SPAN_TYPE,\n SPAN_IDS_PATH,\n PARENT_SPAN_PATH,\n PARENT_SPAN_IDS_PATH,\n SPAN_INSTRUMENTATION_SOURCE,\n SPAN_SDK_VERSION,\n SPAN_LANGUAGE_VERSION,\n \"gen_ai.request.model\",\n \"gen_ai.response.model\",\n \"gen_ai.system\",\n \"lmnr.span.original_type\",\n \"ai.model.id\",\n ];\n const newAttributes = Object.fromEntries(\n Object.entries(attributes).filter(([key]) => keysToKeep.includes(key)),\n );\n\n // Common scenario, because we don't have the response model in the start event.\n // Atrificially set the response model to the request model, just so frontend\n // can show the model in the UI.\n if (\n attributes[\"gen_ai.request.model\"] &&\n !attributes[\"gen_ai.response.model\"]\n ) {\n newAttributes[\"gen_ai.response.model\"] = attributes[\"gen_ai.request.model\"];\n }\n return {\n [SPAN_TYPE]: inferSpanType(name, attributes),\n ...newAttributes,\n };\n};\n","import { Context, type Span, type SpanOptions, trace, type Tracer } from \"@opentelemetry/api\";\n\nimport { LaminarContextManager } from \"./context\";\nimport { LaminarSpan } from \"./span\";\n\n\nexport class LaminarTracer implements Tracer {\n private _tracer: Tracer;\n constructor(tracer: Tracer) {\n this._tracer = tracer;\n }\n\n public startSpan(name: string, options?: SpanOptions, context?: Context): Span {\n return new LaminarSpan(\n this._tracer.startSpan(name, options, context || LaminarContextManager.getContext()),\n );\n }\n\n public startActiveSpan<F extends (span: Span) => unknown>(name: string, fn: F): ReturnType<F>;\n public startActiveSpan<F extends (span: Span) => unknown>(\n name: string,\n options: SpanOptions,\n fn: F,\n ): ReturnType<F>;\n public startActiveSpan<F extends (span: Span) => unknown>(\n name: string,\n options: SpanOptions,\n context: Context,\n fn: F,\n ): ReturnType<F>;\n\n public startActiveSpan<F extends (span: Span) => unknown>(\n name: string,\n optionsOrFn?: SpanOptions | F,\n contextOrFn?: Context | F,\n fn?: F,\n ): ReturnType<F> {\n let contextToUse: Context;\n if (typeof contextOrFn !== \"function\" && contextOrFn !== undefined) {\n contextToUse = contextOrFn;\n } else {\n contextToUse = LaminarContextManager.getContext();\n }\n\n const wrapped = (fn: F) => (span: Span): ReturnType<F> => {\n const laminarSpan = new LaminarSpan(span);\n const ctxWithAssociationProperties = LaminarContextManager.setAssociationProperties(\n laminarSpan,\n contextToUse,\n );\n const newContext = trace.setSpan(ctxWithAssociationProperties, laminarSpan);\n const currentStack = LaminarContextManager.getContextStack();\n const res = LaminarContextManager.runWithIsolatedContext(\n [...currentStack, newContext],\n () => fn(laminarSpan) as ReturnType<F>,\n );\n // We don't pop the context here, because it is the caller's responsibility to\n // end the span. LaminarSpan.end() will pop the context.\n return res;\n };\n if (typeof optionsOrFn === \"function\") {\n return this._tracer.startActiveSpan(name, {}, contextToUse, wrapped(optionsOrFn));\n }\n if (typeof contextOrFn === \"function\") {\n return this._tracer.startActiveSpan(\n name,\n optionsOrFn as SpanOptions,\n contextToUse,\n wrapped(contextOrFn),\n );\n }\n\n // Use the provided context or the current Laminar context\n return this._tracer.startActiveSpan(\n name,\n optionsOrFn as SpanOptions,\n contextToUse,\n wrapped(fn as F),\n );\n }\n}\n\n","import {\n Context,\n context,\n createContextKey,\n ROOT_CONTEXT,\n} from \"@opentelemetry/api\";\n\nimport { CONTEXT_SPAN_PATH_KEY } from \"./context\";\n\n// Function to check if a global context manager is already configured\nexport const isGlobalContextManagerConfigured = () => {\n // Create a temporary context key for testing\n const testKey = createContextKey('lmnr-test-context-manager-check');\n\n // Create a context with this key\n const testContext = ROOT_CONTEXT.setValue(testKey, 'lmnr-test-value');\n\n // Try to make this context active\n let isContextManagerWorking = false;\n\n context.with(testContext, () => {\n // If the context manager is configured and enabled,\n // active() should return our test context\n const activeContext = context.active();\n isContextManagerWorking = activeContext.getValue(testKey) === 'lmnr-test-value';\n });\n\n return isContextManagerWorking;\n};\n\nexport const getSpanPath = (entityContext: Context): string | undefined => {\n const path = entityContext.getValue(CONTEXT_SPAN_PATH_KEY) as string | undefined;\n return path ? `${path}` : undefined;\n};\n","import { context, trace, Tracer, TracerProvider } from \"@opentelemetry/api\";\nimport { AsyncLocalStorageContextManager } from \"@opentelemetry/context-async-hooks\";\nimport { registerInstrumentations } from \"@opentelemetry/instrumentation\";\nimport { AlwaysOnSampler } from \"@opentelemetry/sdk-trace-base\";\nimport { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\";\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n} from \"@opentelemetry/semantic-conventions\";\n\nimport { version as SDK_VERSION } from \"../../../package.json\";\nimport { initializeLogger } from \"../../utils\";\nimport { _configuration } from \"../configuration\";\nimport { InitializeOptions } from \"../interfaces\";\nimport { createResource } from \"./compat\";\nimport { consumeStreamResult, waitForPendingStreams } from \"./stream-utils\";\n\nexport { consumeStreamResult, waitForPendingStreams };\nimport { initializeLaminarInstrumentations } from \"./instrumentations\";\nimport { LaminarSpanProcessor } from \"./processor\";\nimport { LaminarTracer } from \"./tracer\";\nimport { isGlobalContextManagerConfigured } from \"./utils\";\n\nconst logger = initializeLogger();\n\nlet spanProcessor: LaminarSpanProcessor;\nlet tracerProvider: TracerProvider | undefined;\nlet _baseHttpUrl: string = \"https://api.lmnr.ai:443\";\nlet _apiKey: string | undefined;\n\n/**\n * Initializes the Tracing SDK.\n * Must be called once before any other SDK methods.\n *\n * @param options - The options to initialize the SDK. See the {@link InitializeOptions}\n * for details.\n */\nexport const startTracing = (options: InitializeOptions) => {\n _baseHttpUrl = `${options.baseHttpUrl ?? options.baseUrl}:${options.httpPort ?? 443}`;\n _apiKey = options.apiKey;\n\n const instrumentations = initializeLaminarInstrumentations({\n baseUrl: _baseHttpUrl,\n apiKey: _apiKey,\n suppressContentTracing: !shouldSendTraces(),\n instrumentModules: options.instrumentModules,\n sessionRecordingOptions: options.sessionRecordingOptions,\n });\n\n const port = options.forceHttp ? options.httpPort : options.port;\n\n spanProcessor = new LaminarSpanProcessor({\n spanProcessor: options.spanProcessor,\n baseUrl: options.baseUrl,\n port,\n httpPort: options.httpPort,\n apiKey: options.apiKey,\n forceHttp: options.forceHttp,\n traceExportTimeoutMillis: options.traceExportTimeoutMillis,\n maxExportBatchSize: options.maxExportBatchSize,\n exporter: options.exporter,\n disableBatch: options.disableBatch,\n });\n\n const newProvider = new NodeTracerProvider({\n spanProcessors: [spanProcessor],\n sampler: new AlwaysOnSampler(),\n resource: createResource({\n [ATTR_SERVICE_NAME]: \"laminar-tracer-resource\",\n [ATTR_SERVICE_VERSION]: SDK_VERSION,\n }),\n });\n\n tracerProvider = newProvider;\n\n // Usually, we would do `tracerProvider.register()`, which does three things:\n // 1. Sets the global tracer provider\n // 2. Sets the global context manager to a default one, unless we specify a custom one\n // 3. Sets the global propagator to a default one, unless we specify a custom one\n // We don't do that, because Opentelemetry only allows setting these global\n // OTel API instances once.\n //\n // Instead, we do the following:\n // 1. Carry the global tracer provider around without globally registering it.\n // - Set this tracer provider in the auto-instrumentations from OpenLLMetry\n // - expose the `getTracer` function, which will return a tracer from our\n // tracer provider.\n // 2. Set a context manager globally, only if we are the first ones to do so.\n // - If we are not the first ones, we don't set the global context manager.\n // - If an existing context manager is not broken, it suffices for our purposes\n // for carrying the parent span context.\n // - If any library tries to do so afterwards (and they will, e.g. @vercel/otel\n // or @sentry/node do tracerProvider.register() internally), there will be\n // an error message at their initialization.\n // - We recommend to initialize Laminar after other tracing libraries to avoid that\n // 3. We don't do anything about the propagator, because no Laminar functionality\n // depends on it. We might want to revisit this in the future w.r.t. `LaminarSpanContext`.\n\n // This is a small hack to only set the global context manager if there is none.\n if (!isGlobalContextManagerConfigured()) {\n const contextManager = new AsyncLocalStorageContextManager();\n contextManager.enable();\n context.setGlobalContextManager(contextManager);\n logger.debug(\"Laminar set global OTel Context Manager\");\n }\n logger.debug(\"Global OTel Context Manager exists\");\n\n logger.debug(\n `Laminar registering ${instrumentations.length} instrumentations`,\n );\n // Similarly, we carry our global tracer provider around without globally\n // registering it.\n registerInstrumentations({\n instrumentations,\n tracerProvider: newProvider,\n });\n};\n\nexport const patchModules = (\n modules: InitializeOptions[\"instrumentModules\"],\n) => {\n const instrumentations = initializeLaminarInstrumentations({\n baseUrl: _baseHttpUrl,\n apiKey: _apiKey,\n instrumentModules: modules,\n suppressContentTracing: !shouldSendTraces(),\n sessionRecordingOptions: _configuration?.sessionRecordingOptions,\n });\n registerInstrumentations({\n instrumentations,\n tracerProvider: tracerProvider,\n });\n};\n\nexport const shouldSendTraces = () => {\n if (!_configuration) {\n /**\n * We've only seen this happen in Next.js where apparently\n * the initialization in `instrumentation.ts` somehow does not\n * respect `Object.freeze`. Unlike original OpenLLMetry/Traceloop,\n * we return true here, because we have other mechanisms\n * {@link withTracingLevel} to disable tracing inputs and outputs.\n */\n return true;\n }\n\n if (\n _configuration.traceContent === false ||\n (process.env.TRACELOOP_TRACE_CONTENT || \"true\").toLowerCase() === \"false\"\n ) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Get the tracer provider. Returns Laminar's tracer provider if Laminar is initialized,\n * otherwise returns the global tracer provider.\n * @returns The tracer provider.\n */\nexport const getTracerProvider = (): TracerProvider =>\n tracerProvider ?? trace.getTracerProvider();\n\n/**\n * Get the tracer.\n * @returns Laminar's tracer if Laminar is initialized,\n * otherwise returns Laminar's tracer from the global tracer provider\n *\n * @example\n * // instrumentation.ts\n * import { Laminar } from '@lmnr-ai/lmnr';\n * Laminar.initialize()\n *\n * // File that calls AI SDK.\n * import { getTracer } from '@lmnr-ai/lmnr';\n * import { openai } from \"@ai-sdk/openai\";\n * import { generateText } from \"ai\";\n *\n * const response = await generateText({\n * model: openai(\"gpt-4.1-nano\"),\n * prompt: \"What is the capital of France?\",\n * experimental_telemetry: {\n * isEnabled: true,\n * tracer: getTracer(),\n * }\n * })\n */\nexport const getTracer = (): Tracer => {\n const TRACER_NAME = \"lmnr.tracer\";\n const TRACER_VERSION = \"0.0.1\";\n const provider = getTracerProvider();\n return new LaminarTracer(provider.getTracer(TRACER_NAME, TRACER_VERSION));\n};\n\n/**\n * Get the span processor.\n * Used internally for setting parent path information when initializing from environment.\n * @returns The span processor, or undefined if not initialized.\n */\nexport const getSpanProcessor = (): LaminarSpanProcessor | undefined =>\n spanProcessor;\n\nexport const forceFlush = async () => {\n // Wait for pending stream processing with 5 second timeout\n await waitForPendingStreams(5000);\n await spanProcessor.forceFlush();\n};\n\nexport const clearSpanProcessor = () => {\n spanProcessor.clear();\n};\n","import { diag, DiagConsoleLogger, DiagLogLevel } from \"@opentelemetry/api\";\n\nimport { type InitializeOptions } from \"../interfaces\";\nimport { startTracing } from \"../tracing\";\n\nexport let _configuration: InitializeOptions | undefined;\n\n/**\n * Initializes the SDK.\n * Must be called once before any other SDK methods.\n *\n * @param options - The options to initialize the SDK. See the {@link InitializeOptions}\n * for details.\n * @throws {InitializationError} if the configuration is invalid or if failed to fetch\n * feature data.\n */\nexport const initializeTracing = (options: InitializeOptions) => {\n if (_configuration) {\n return;\n }\n\n // Only set defaults if not already provided and if we have an API key\n // (when using OTEL env vars, we don't need a baseUrl or API key)\n const apiKey = options.apiKey ?? process.env.LMNR_PROJECT_API_KEY;\n if (!options.baseUrl && apiKey) {\n options.baseUrl = process.env.LMNR_BASE_URL || \"https://api.lmnr.ai:8443\";\n }\n if (!options.apiKey) {\n options.apiKey = apiKey;\n }\n\n _configuration = Object.freeze(options);\n\n if (options.logLevel) {\n diag.setLogger(\n new DiagConsoleLogger(),\n {\n logLevel: logLevelToOtelLogLevel(options.logLevel),\n suppressOverrideMessage: true,\n },\n );\n }\n\n startTracing(_configuration);\n};\n\nconst logLevelToOtelLogLevel = (\n logLevel: \"debug\" | \"info\" | \"warn\" | \"error\",\n) => {\n switch (logLevel) {\n case \"debug\":\n return DiagLogLevel.DEBUG;\n case \"info\":\n return DiagLogLevel.INFO;\n case \"warn\":\n return DiagLogLevel.WARN;\n case \"error\":\n return DiagLogLevel.ERROR;\n }\n};\n\nexport const _resetConfiguration = () => {\n _configuration = undefined;\n};\n","import { LaminarSpanContext, TraceType, TracingLevel } from \"@lmnr-ai/types\";\nimport { AttributeValue, context, type Span, trace } from \"@opentelemetry/api\";\nimport { suppressTracing } from \"@opentelemetry/core\";\n\nimport {\n deserializeLaminarSpanContext,\n initializeLogger,\n tryToOtelSpanContext,\n} from \"../../utils\";\nimport { getStream, StreamInfo } from \"../instrumentation/aisdk/utils\";\nimport { getTracer, shouldSendTraces } from \".\";\nimport {\n SPAN_INPUT,\n SPAN_OUTPUT,\n} from \"./attributes\";\nimport {\n ASSOCIATION_PROPERTIES_KEY,\n LaminarContextManager,\n} from \"./context\";\nimport { handleStreamResult } from \"./stream-utils\";\n\nconst logger = initializeLogger();\n\nexport { consumeStreamResult, waitForPendingStreams } from \"./stream-utils\";\n\nexport type DecoratorConfig = {\n name: string;\n contextProperties?: {\n userId?: string;\n sessionId?: string;\n traceType?: TraceType;\n tracingLevel?: TracingLevel;\n metadata?: Record<string, any>;\n };\n spanAttributes?: Record<string, AttributeValue>;\n input?: unknown;\n ignoreInput?: boolean;\n ignoreOutput?: boolean;\n inputParameters?: unknown[];\n suppressTracing?: boolean;\n parentSpanContext?: string | LaminarSpanContext;\n};\n\n// Overload for when thisArg is provided (method call)\nexport function observeBase<\n A extends unknown[],\n This,\n F extends (this: This, ...args: A) => ReturnType<F>,\n>(\n config: DecoratorConfig,\n fn: F,\n thisArg: This,\n ...args: A\n): ReturnType<F>;\n\n// Overload for when thisArg is not provided (standalone function)\nexport function observeBase<\n A extends unknown[],\n F extends (...args: A) => ReturnType<F>,\n>(\n config: DecoratorConfig,\n fn: F,\n thisArg: undefined,\n ...args: A\n): ReturnType<F>;\n\n// Implementation signature (more permissive to handle both cases)\nexport function observeBase<\n A extends unknown[],\n F extends (this: ThisParameterType<F>, ...args: A) => ReturnType<F>,\n>(\n {\n name,\n contextProperties,\n spanAttributes,\n input,\n ignoreInput,\n ignoreOutput,\n inputParameters,\n suppressTracing: shouldSuppressTracing,\n parentSpanContext,\n }: DecoratorConfig,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n): ReturnType<F> {\n let entityContext = LaminarContextManager.getContext();\n\n if (shouldSuppressTracing) {\n entityContext = suppressTracing(entityContext);\n }\n\n if (parentSpanContext) {\n try {\n const laminarContext = typeof parentSpanContext === 'string'\n ? deserializeLaminarSpanContext(parentSpanContext)\n : parentSpanContext;\n\n const spanContext = tryToOtelSpanContext(laminarContext);\n entityContext = trace.setSpan(entityContext, trace.wrapSpanContext(spanContext));\n } catch (e) {\n logger.warn(\"Failed to parse parent span context: \" +\n (e instanceof Error ? e.message : String(e)),\n );\n }\n }\n\n // Set context properties for propagation to child spans\n try {\n if (contextProperties && Object.keys(contextProperties).length > 0) {\n const currentAssociationProperties = entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {};\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n { ...currentAssociationProperties, ...contextProperties },\n );\n }\n } catch (e) {\n logger.warn(\"Failed to set context properties: \" +\n (e instanceof Error ? e.message : String(e)),\n );\n }\n\n return context.with(entityContext, () =>\n getTracer().startActiveSpan(\n name,\n {\n attributes: spanAttributes,\n },\n entityContext,\n (span: Span) => {\n if (shouldSendTraces() && !ignoreInput) {\n try {\n const spanInput = inputParameters ?? args;\n if (input !== undefined) {\n span.setAttribute(\n SPAN_INPUT,\n typeof input === 'string' ? input : serialize(input),\n );\n } else if (\n spanInput.length === 1 &&\n typeof spanInput[0] === \"object\" &&\n !(spanInput[0] instanceof Map)\n ) {\n span.setAttribute(\n SPAN_INPUT,\n typeof spanInput[0] === 'string' ? spanInput[0] : serialize(spanInput[0]),\n );\n } else {\n // pass an array of the arguments without names\n // Need to convert it to map from argument name to value,\n // if we figure out how to do it elegantly\n span.setAttribute(\n SPAN_INPUT,\n serialize(spanInput.length > 0 ? spanInput : {}),\n );\n }\n } catch (error) {\n logger.warn(\"Failed to serialize input: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n let res: ReturnType<F>;\n try {\n res = fn.apply(thisArg as ThisParameterType<F>, args);\n } catch (error) {\n try {\n span.recordException(error as Error);\n span.end();\n } catch (error) {\n logger.warn(\"Failed to record exception and end span: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n throw error;\n }\n\n if (res instanceof Promise) {\n return res.then((resolvedRes) => {\n // Check if the resolved result is a stream\n let streamInfo: StreamInfo = { type: null };\n try {\n streamInfo = getStream(resolvedRes);\n } catch (error) {\n logger.warn(\"Failed to get stream info: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n if (streamInfo.type !== null) {\n return handleStreamResult(\n resolvedRes,\n streamInfo,\n span,\n ignoreOutput,\n serialize,\n ) as ReturnType<F>;\n }\n\n // Not a stream, handle normally\n try {\n if (shouldSendTraces() && !ignoreOutput) {\n span.setAttribute(\n SPAN_OUTPUT,\n serialize(resolvedRes),\n );\n }\n } catch (error) {\n logger.warn(\"Failed to serialize async output: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n } finally {\n try {\n span.end();\n } catch (error) {\n logger.warn(\"Failed to end span: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return resolvedRes;\n })\n .catch((error) => {\n try {\n span.recordException(error as Error);\n span.end();\n } catch (error) {\n logger.warn(\"Failed to record exception and end span: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n throw error;\n }) as ReturnType<F>;\n }\n\n // Check if the result is a stream\n let streamInfo: StreamInfo = { type: null };\n try {\n streamInfo = getStream(res);\n } catch (error) {\n logger.warn(\"Failed to get stream info: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n if (streamInfo.type !== null) {\n return handleStreamResult(\n res, streamInfo, span, ignoreOutput, serialize) as ReturnType<F>;\n }\n\n try {\n if (shouldSendTraces() && !ignoreOutput) {\n span.setAttribute(\n SPAN_OUTPUT,\n typeof res === 'string' ? res : serialize(res),\n );\n }\n } catch (error) {\n logger.warn(\"Failed to serialize output: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n } finally {\n try {\n span.end();\n } catch (error) {\n logger.warn(\"Failed to end span: \" +\n `${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n return res;\n },\n ),\n );\n}\n\nconst normalizePayload = (payload: unknown, seen: WeakSet<any>): unknown => {\n if (payload instanceof Map) {\n return Array.from(payload.entries());\n } else if (Array.isArray(payload)) {\n return payload.map((value) => normalizePayload(value, seen));\n } else if (!payload) {\n return payload;\n } else if (typeof payload === \"object\") {\n if (seen.has(payload)) {\n return \"[Circular reference]\";\n }\n seen.add(payload);\n\n // serialize object one by one\n const output: any = {};\n Object.entries(payload as any).forEach(([key, value]) => {\n\n output[key] = normalizePayload(value, seen);\n });\n return output;\n }\n\n return payload;\n};\n\nconst serialize = (payload: unknown): string =>\n JSON.stringify(normalizePayload(payload, new WeakSet()));\n","import { LaminarSpanContext, RolloutParam, TraceType, TracingLevel } from '@lmnr-ai/types';\nimport { AttributeValue } from \"@opentelemetry/api\";\n\nimport { observeBase } from './opentelemetry-lib';\nimport {\n ASSOCIATION_PROPERTIES,\n PARENT_SPAN_IDS_PATH,\n PARENT_SPAN_PATH,\n SPAN_TYPE,\n} from \"./opentelemetry-lib/tracing/attributes\";\nimport {\n ASSOCIATION_PROPERTIES_KEY,\n LaminarContextManager,\n} from \"./opentelemetry-lib/tracing/context\";\nimport { deserializeLaminarSpanContext, initializeLogger } from \"./utils\";\n\nconst logger = initializeLogger();\n\ndeclare global {\n var _rolloutFunctions: Map<string, {\n fn: (...args: any[]) => any;\n params: RolloutParam[];\n name: string;\n }> | undefined;\n var _set_rollout_global: boolean;\n var _currentExportName: string | undefined;\n}\n\ninterface ObserveOptions {\n name?: string;\n sessionId?: string;\n userId?: string;\n rolloutSessionId?: string;\n traceType?: TraceType;\n spanType?: 'DEFAULT' | 'LLM' | 'TOOL' | 'EVALUATOR' | 'EVALUATION' | 'EXECUTOR';\n input?: unknown;\n ignoreInput?: boolean;\n ignoreOutput?: boolean;\n parentSpanContext?: string | LaminarSpanContext;\n metadata?: Record<string, any>;\n tags?: string[];\n rolloutEntrypoint?: boolean;\n}\n\n/**\n * Extracts parameter names from a function using regex (fallback for runtime parsing)\n * Note: This is a best-effort fallback. For TypeScript files, use ts-parser.ts instead.\n */\nconst extractParamNames = (fn: (...args: any[]) => any): RolloutParam[] => {\n const fnStr = fn.toString();\n\n // Match function parameters - handles regular functions, arrow functions, async functions\n const paramMatch = fnStr.match(\n /(?:async\\s+)?(?:function\\s*)?\\(([^)]*)\\)|(?:async\\s*)?([^=\\s(]+)\\s*=>/,\n );\n\n if (!paramMatch) {\n return [];\n }\n\n const paramsStr = paramMatch[1] || paramMatch[2] || '';\n\n if (!paramsStr.trim()) {\n return [];\n }\n\n // Split by comma and extract parameter names with metadata\n const params = paramsStr.split(',').map(param => {\n const trimmed = param.trim();\n\n // Check if it's destructured (starts with { or [)\n if (trimmed.startsWith('{')) {\n return {\n name: '_destructured',\n required: !trimmed.includes('='), // Has default if includes =\n };\n }\n\n if (trimmed.startsWith('[')) {\n return {\n name: '_arrayDestructured',\n required: !trimmed.includes('='),\n };\n }\n\n // Extract default value if present\n const hasDefault = trimmed.includes('=');\n let defaultValue: string | undefined;\n let nameWithoutDefault = trimmed;\n\n if (hasDefault) {\n const parts = trimmed.split('=');\n nameWithoutDefault = parts[0].trim();\n defaultValue = parts.slice(1).join('=').trim();\n }\n\n // Check for optional marker (?)\n const isOptional = nameWithoutDefault.includes('?');\n\n // Remove type annotations and whitespace\n const name = nameWithoutDefault\n .replace(/:.+$/, '') // Remove type annotations\n .replace(/\\?/g, '') // Remove optional marker\n .replace(/\\s+/g, ''); // Remove whitespace\n\n // Extract just the parameter name\n const simpleNameMatch = name.match(/^[a-zA-Z_$][a-zA-Z0-9_$]*/);\n const paramName = simpleNameMatch ? simpleNameMatch[0] : name;\n\n return {\n name: paramName,\n required: !hasDefault && !isOptional,\n default: defaultValue,\n };\n });\n\n return params.filter(p => p.name && p.name.length > 0);\n};\n\n/**\n * The main decorator entrypoint for Laminar. This is used to wrap\n * functions and methods to create spans.\n *\n * When `rolloutEntrypoint: true` is set, returns a wrapped function that can be\n * used for agent debugging sessions with `npx lmnr serve`.\n *\n * @param options - Configuration options for the span\n * @param options.name - Name of the span. Function name is used if not specified.\n * @param options.sessionId - Session ID to associate with the span and the following context.\n * @param options.userId - User ID to associate with the span and the following context.\n * This is different from the id of a Laminar user.\n * @param options.traceType - Type of the trace. Unless it is within evaluation, it should be\n * 'DEFAULT'.\n * @param options.spanType - Type of the span. 'DEFAULT' is used if not specified. If the type\n * is 'LLM', you must manually specify some attributes. See `Laminar.setSpanAttributes`\n * for more information.\n * @param options.input - Force override the input for the span. If not specified, the\n * input will be the arguments passed to the function.\n * @param options.ignoreInput - Whether to ignore the input altogether.\n * @param options.ignoreOutput - Whether to ignore the output altogether.\n * @param options.parentSpanContext - Parent span context to associate with this span.\n * @param options.metadata - Metadata to add to a trace for further filtering. Must be\n * JSON serializable.\n * @param options.tags - Tags to associate with the span.\n * @param options.rolloutEntrypoint - When true, returns a wrapped function for\n * rollout debugging. When false/undefined, executes the function immediately.\n * @param fn - The function to wrap\n * @param args - Arguments to pass to the function (only when rolloutEntrypoint is\n * false/undefined)\n * @returns Wrapped function (when rolloutEntrypoint: true) or Promise with result\n * @throws Exception - Re-throws the exception if the wrapped function throws an exception.\n *\n * @example\n * ```typescript\n * // Regular usage (immediate execution)\n * await observe({ name: 'my_function' }, async (x: string) => {\n * // Your code here\n * return x.toUpperCase();\n * }, 'hello');\n *\n * // Rollout entrypoint (returns wrapped function)\n * export const myAgent = observe(\n * { name: 'agent', rolloutEntrypoint: true },\n * async (input: string) => {\n * // Your agent code here\n * return processInput(input);\n * }\n * );\n * // Then call: await myAgent('hello');\n * ```\n */\n// Overload: when rolloutEntrypoint is true, return wrapped function\nexport function observe<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n options: ObserveOptions & { rolloutEntrypoint: true },\n fn: F,\n ...args: A\n): F;\n\nexport function observe<F extends (...args: any[]) => ReturnType<F>>(\n options: ObserveOptions & { rolloutEntrypoint: true },\n fn: F,\n): F;\n\n// Overload: when rolloutEntrypoint is false/undefined, execute immediately\nexport function observe<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n options: ObserveOptions,\n fn: F,\n ...args: A\n): ReturnType<F>;\n\n// Implementation\nexport function observe<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n options: ObserveOptions,\n fn: F,\n ...args: A\n): F | ReturnType<F> {\n if (fn === undefined || typeof fn !== \"function\") {\n throw new Error(\"Invalid `observe` usage. Second argument `fn` must be a function.\");\n }\n\n const {\n name,\n sessionId,\n userId,\n traceType,\n spanType,\n input,\n ignoreInput,\n ignoreOutput,\n parentSpanContext,\n metadata,\n tags,\n rolloutEntrypoint,\n } = options;\n const spanName = name ?? fn.name;\n\n // If rolloutEntrypoint is true, return a wrapped function\n if (rolloutEntrypoint) {\n // Extract parameter names for rollout\n const params = extractParamNames(fn);\n // Get rollout session ID from env var if in rollout mode\n const envRolloutSessionId = process.env.LMNR_ROLLOUT_SESSION_ID;\n\n // Create wrapped function\n const wrappedFn = ((...fnArgs: Parameters<F>): ReturnType<F> => {\n const observeOptions = {\n sessionId,\n traceType,\n spanType,\n userId,\n rolloutSessionId: envRolloutSessionId,\n tags,\n metadata,\n };\n\n const contextProperties = buildContextProperties(observeOptions);\n const spanAttributes = buildSpanAttributes(observeOptions);\n\n const argsToPass = (args && args.length > 0) ? args : fnArgs;\n\n return observeBase<A, F>({\n name: spanName,\n contextProperties,\n spanAttributes,\n input: input ?? argsToPass,\n ignoreInput,\n ignoreOutput,\n parentSpanContext,\n }, fn, undefined, ...argsToPass);\n }) as F;\n\n // If in registration mode, register this function\n if (globalThis._set_rollout_global) {\n if (!globalThis._rolloutFunctions) {\n globalThis._rolloutFunctions = new Map();\n }\n\n // Use current export name if available, otherwise use function name\n const exportName = globalThis._currentExportName || spanName || 'unknown';\n\n globalThis._rolloutFunctions.set(exportName, {\n fn: wrappedFn as (...args: any[]) => any,\n params,\n name: spanName,\n });\n }\n\n return wrappedFn;\n }\n\n // Regular execution mode (backward compatible)\n const observeOptions = {\n sessionId,\n traceType,\n spanType,\n userId,\n tags,\n metadata,\n parentSpanContext,\n };\n\n const contextProperties = buildContextProperties(observeOptions);\n const spanAttributes = buildSpanAttributes(observeOptions);\n\n return observeBase<A, F>({\n name: spanName,\n contextProperties,\n spanAttributes,\n input,\n ignoreInput,\n ignoreOutput,\n parentSpanContext,\n }, fn, undefined, ...args);\n}\n\n/**\n * Sets the tracing level for any spans inside the function. This is useful for\n * conditionally disabling the tracing for certain functions.\n * Tracing level must be one of the values in {@link TracingLevel}. Returns the\n * result of the wrapped function, so you can use it in an `await` statement if\n * needed.\n *\n * @param tracingLevel - The tracing level to set.\n * @returns The result of the wrapped function.\n *\n * @example\n * ```typescript\n * import { withTracingLevel, TracingLevel } from '@lmnr-ai/lmnr';\n *\n * const result = await withTracingLevel(TracingLevel.META_ONLY, () => {\n * openai.chat.completions.create({});\n * });\n * ```\n */\nexport function withTracingLevel<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n tracingLevel: TracingLevel,\n fn: F,\n ...args: A\n): ReturnType<F> {\n let entityContext = LaminarContextManager.getContext();\n const currentAssociationProperties = entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {};\n\n entityContext = entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n { ...currentAssociationProperties, \"tracing_level\": tracingLevel },\n );\n\n const result = LaminarContextManager.runWithIsolatedContext(\n [entityContext],\n () => fn(...args),\n );\n\n const newAssociationProperties = (\n entityContext.getValue(ASSOCIATION_PROPERTIES_KEY) ?? {}\n ) as Record<string, any>;\n delete newAssociationProperties[\"tracing_level\"];\n\n entityContext.setValue(\n ASSOCIATION_PROPERTIES_KEY,\n newAssociationProperties,\n );\n\n return result;\n}\n\n/**\n * Builds context-level association properties that propagate to child spans.\n * These properties flow through the OpenTelemetry context and are inherited by\n * any child spans created with startActiveSpan.\n */\nconst buildContextProperties = (\n options: Partial<ObserveOptions>,\n): {\n userId?: string;\n sessionId?: string;\n rolloutSessionId?: string;\n traceType?: TraceType;\n tracingLevel?: TracingLevel;\n metadata?: Record<string, any>;\n} => {\n const parentSpanContext = options.parentSpanContext;\n const globalMetadata = LaminarContextManager.getGlobalMetadata();\n const ctxAssociationProperties = LaminarContextManager.getAssociationProperties();\n\n let parentMetadata: Record<string, any> | undefined;\n let parentTraceType: TraceType | undefined;\n let parentTracingLevel: TracingLevel | undefined;\n let parentUserId: string | undefined;\n let parentSessionId: string | undefined;\n let parentRolloutSessionId: string | undefined;\n\n if (parentSpanContext) {\n try {\n const laminarContext = typeof parentSpanContext === 'string'\n ? deserializeLaminarSpanContext(parentSpanContext)\n : parentSpanContext;\n\n parentMetadata = laminarContext.metadata;\n parentTraceType = laminarContext.traceType;\n parentTracingLevel = laminarContext.tracingLevel;\n parentUserId = laminarContext.userId;\n parentSessionId = laminarContext.sessionId;\n parentRolloutSessionId = laminarContext.rolloutSessionId;\n } catch (e) {\n logger.warn(\"Failed to parse parent span context: \" +\n (e instanceof Error ? e.message : String(e)),\n );\n }\n }\n\n const contextProperties: {\n userId?: string;\n sessionId?: string;\n rolloutSessionId?: string;\n traceType?: TraceType;\n tracingLevel?: TracingLevel;\n metadata?: Record<string, any>;\n } = {};\n\n const sessionIdValue = options.sessionId ?? parentSessionId ?? ctxAssociationProperties.sessionId;\n if (sessionIdValue) {\n contextProperties.sessionId = sessionIdValue;\n }\n\n const userIdValue = options.userId ?? parentUserId ?? ctxAssociationProperties.userId;\n if (userIdValue) {\n contextProperties.userId = userIdValue;\n }\n\n const rolloutSessionIdValue = options.rolloutSessionId ?? parentRolloutSessionId\n ?? ctxAssociationProperties.rolloutSessionId;\n if (rolloutSessionIdValue) {\n contextProperties.rolloutSessionId = rolloutSessionIdValue;\n }\n\n const traceTypeValue = options.traceType ?? parentTraceType\n ?? ([\"EVALUATION\", \"EXECUTOR\", \"EVALUATOR\"].includes(options.spanType ?? \"DEFAULT\")\n ? \"EVALUATION\"\n : undefined\n )\n ?? ctxAssociationProperties.traceType\n ?? \"DEFAULT\";\n if (traceTypeValue) {\n contextProperties.traceType = traceTypeValue;\n }\n\n const tracingLevelValue = parentTracingLevel ?? ctxAssociationProperties.tracingLevel;\n if (tracingLevelValue) {\n contextProperties.tracingLevel = tracingLevelValue;\n }\n\n const mergedMetadata = {\n ...globalMetadata,\n ...ctxAssociationProperties.metadata,\n ...parentMetadata,\n ...options.metadata,\n ...(rolloutSessionIdValue ? { 'rollout.session_id': rolloutSessionIdValue } : {}),\n };\n\n if (Object.keys(mergedMetadata).length > 0) {\n contextProperties.metadata = mergedMetadata;\n }\n\n return contextProperties;\n};\n\n/**\n * Builds span-specific attributes that do NOT propagate to child spans.\n * These include spanType, tags, and parent span path information.\n */\nconst buildSpanAttributes = (\n options: Partial<ObserveOptions>,\n): Record<string, AttributeValue> => {\n const spanAttributes: Record<string, AttributeValue> = {};\n\n if (options.spanType) {\n spanAttributes[SPAN_TYPE] = options.spanType;\n }\n\n if (options.tags) {\n spanAttributes[`${ASSOCIATION_PROPERTIES}.tags`] = Array.from(new Set(options.tags));\n }\n\n if (options.parentSpanContext) {\n try {\n const laminarContext = typeof options.parentSpanContext === 'string'\n ? deserializeLaminarSpanContext(options.parentSpanContext)\n : options.parentSpanContext;\n\n if (laminarContext.spanPath) {\n spanAttributes[PARENT_SPAN_PATH] = laminarContext.spanPath;\n }\n if (laminarContext.spanIdsPath) {\n spanAttributes[PARENT_SPAN_IDS_PATH] = laminarContext.spanIdsPath;\n }\n } catch (e) {\n logger.warn(\"Failed to parse parent span context for span attributes: \" +\n (e instanceof Error ? e.message : String(e)),\n );\n }\n }\n\n return spanAttributes;\n};\n\n/**\n * Decorator that wraps a method to automatically observe it with Laminar tracing.\n * This decorator uses the TypeScript 5.0+ standard decorator syntax.\n *\n * **Important**: Use this decorator only if your `tsconfig.json` does NOT have\n * `experimentalDecorators: true`. If you're using experimental decorators, use\n * {@link observeExperimentalDecorator} instead.\n *\n * This decorator can be used on class methods to automatically create spans.\n *\n * @param config - Configuration for the observe decorator, can be static or a function\n * @returns A method decorator\n *\n * @example\n * ```typescript\n * // In your tsconfig.json, ensure experimentalDecorators is NOT enabled:\n * // {\n * // \"compilerOptions\": {\n * // \"experimentalDecorators\": false // or omit this line\n * // }\n * // }\n *\n * import { observeDecorator } from '@lmnr-ai/lmnr';\n *\n * class MyService {\n * @observeDecorator({ name: 'processData', spanType: 'DEFAULT' })\n * async processData(input: string) {\n * // Your code here\n * return `processed: ${input}`;\n * }\n *\n * @observeDecorator((thisArg, ...args) => ({\n * name: `dynamicMethod_${args[0]}`,\n * sessionId: thisArg.sessionId\n * }))\n * async dynamicMethod(id: string) {\n * // Your code here\n * }\n * }\n * ```\n */\nexport function observeDecorator<This, Args extends unknown[], Return>(\n config:\n | Partial<ObserveOptions>\n | ((thisArg: This, ...funcArgs: Args) => Partial<ObserveOptions>),\n) {\n return function (\n originalMethod: (this: This, ...args: Args) => Return,\n context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>,\n ) {\n if (context.kind !== 'method') {\n throw new Error(\n `observeDecorator can only be applied to methods. Applied to: ${String(context.name)}`,\n );\n }\n\n const methodName = String(context.name);\n\n return function (this: This, ...args: Args): Return {\n let actualConfig: Partial<ObserveOptions>;\n\n if (typeof config === \"function\") {\n actualConfig = config(this, ...args);\n } else {\n actualConfig = config;\n }\n\n const observeName = actualConfig.name ?? methodName;\n const contextProperties = buildContextProperties(actualConfig);\n const spanAttributes = buildSpanAttributes(actualConfig);\n\n return observeBase(\n {\n name: observeName,\n contextProperties,\n spanAttributes,\n input: actualConfig.input,\n ignoreInput: actualConfig.ignoreInput,\n ignoreOutput: actualConfig.ignoreOutput,\n parentSpanContext: actualConfig.parentSpanContext,\n },\n originalMethod,\n this,\n ...args,\n );\n };\n };\n}\n\n/**\n * Decorator that wraps a method to automatically observe it with Laminar tracing.\n * This decorator uses the legacy experimental decorator syntax\n * (requires `--experimentalDecorators` flag).\n *\n * **Important**: Use this decorator only if your `tsconfig.json` has\n * `experimentalDecorators: true` in the `compilerOptions` section\n * (or if you compile with the `--experimentalDecorators` flag).\n * For TypeScript 5.0+ projects without experimental decorators, use\n * {@link observeDecorator} instead.\n *\n * This decorator can be used on class methods to automatically create spans.\n *\n * Use this only if you need the legacy experimental decorator syntax.\n * @param config - Configuration for the observe decorator, can be static or a function\n * @returns A method decorator\n *\n * @example\n * ```typescript\n * // In your tsconfig.json, ensure experimentalDecorators is enabled:\n * // {\n * // \"compilerOptions\": {\n * // \"experimentalDecorators\": true\n * // }\n * // }\n *\n * import { observeExperimentalDecorator } from '@lmnr-ai/lmnr';\n *\n * class MyService {\n * @observeExperimentalDecorator({ name: 'processData', spanType: 'DEFAULT' })\n * async processData(input: string) {\n * // Your code here\n * return `processed: ${input}`;\n * }\n *\n * @observeExperimentalDecorator((thisArg, ...args) => ({\n * name: `dynamicMethod_${args[0]}`,\n * sessionId: thisArg.sessionId\n * }))\n * async dynamicMethod(id: string) {\n * // Your code here\n * }\n * }\n * ```\n */\nexport function observeExperimentalDecorator(\n config:\n | Partial<ObserveOptions>\n | ((thisArg: unknown, ...funcArgs: unknown[]) => Partial<ObserveOptions>),\n) {\n return function (\n _target: unknown,\n propertyKey: string,\n descriptor: PropertyDescriptor,\n ) {\n if (!descriptor || typeof descriptor.value !== 'function') {\n throw new Error(\n \"observeExperimentalDecorator can only be applied to methods. \" +\n `Applied to: ${String(propertyKey)}`,\n );\n }\n\n const originalMethod = descriptor.value;\n\n descriptor.value = function (...args: unknown[]) {\n let actualConfig: Partial<ObserveOptions>;\n\n if (typeof config === \"function\") {\n actualConfig = config(this, ...args);\n } else {\n actualConfig = config;\n }\n\n const observeName = actualConfig.name ?? originalMethod.name;\n const contextProperties = buildContextProperties(actualConfig);\n const spanAttributes = buildSpanAttributes(actualConfig);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return observeBase(\n {\n name: observeName,\n contextProperties,\n spanAttributes,\n input: actualConfig.input,\n ignoreInput: actualConfig.ignoreInput,\n ignoreOutput: actualConfig.ignoreOutput,\n parentSpanContext: actualConfig.parentSpanContext,\n },\n originalMethod,\n this,\n ...args,\n );\n };\n };\n}\n"],"mappings":"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"}