@agentmark-ai/shared-utils 0.6.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +197 -1
- package/dist/index.d.ts +197 -1
- package/dist/index.js +705 -62
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +696 -62
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/generate-unique-8-char-string.ts","../src/hmac-256-signature.ts","../src/serialize.ts","../src/generate-types.ts","../src/normalizer/types.ts","../src/normalizer/registry.ts","../src/normalizer/transformers/ai-sdk/version-detector.ts","../src/normalizer/extractors/token-parser.ts","../src/normalizer/utils/key-sanitizer.ts","../src/normalizer/extractors/metadata-parser.ts","../src/normalizer/transformers/ai-sdk/token-helpers.ts","../src/normalizer/transformers/ai-sdk/strategies/v4.ts","../src/normalizer/transformers/ai-sdk/strategies/v5.ts","../src/normalizer/transformers/ai-sdk/index.ts","../src/normalizer/transformers/mastra/index.ts","../src/normalizer/extractors/agentmark-parser.ts","../src/normalizer/transformers/agentmark/index.ts","../src/normalizer/transformers/otel-genai/index.ts","../src/normalizer/converters/otlp-converter.ts","../src/normalizer/resolvers/semantic-kind-resolver.ts","../src/normalizer/type-classifier.ts","../src/normalizer/index.ts","../src/trace-io.ts"],"sourcesContent":["export * from \"./generate-unique-8-char-string\";\nexport { createSignature, verifySignature } from \"./hmac-256-signature\";\nexport type * from \"./types\";\nexport * from \"./serialize\";\nexport { generateTypeDefinitions, fetchPromptsFrontmatter, findPromptFiles, type GenerateTypesLanguage } from \"./generate-types\";\nexport * from \"./normalizer\";\nexport * from \"./trace-io\";\n// `computeDatasetItemName` moved to @agentmark-ai/prompt-core (single canonical\n// implementation — prompt-core/src/webhook-runner.ts). The fork that lived here\n// had drifted: no unicode escaping and a different empty-input fallback.\n","export const generateUnique8CharString = () => {\n const timestamp = Date.now().toString(36); // Convert timestamp to base36 string\n const randomChars = Math.random().toString(36).substr(2, 6); // Generate random base36 string\n return timestamp + randomChars;\n};\n","const encoder = new TextEncoder();\n\nexport async function createSignature(secret: string = \"\", payload: string) {\n if (!secret) {\n secret = \"DEFAULT\";\n }\n\n const algorithm = { name: \"HMAC\", hash: { name: \"SHA-256\" } };\n\n const keyBytes = encoder.encode(secret);\n const extractable = false;\n const key = await crypto.subtle.importKey(\n \"raw\",\n keyBytes,\n algorithm,\n extractable,\n [\"sign\", \"verify\"]\n );\n\n const signature = await crypto.subtle.sign(\n algorithm,\n key,\n encoder.encode(payload)\n );\n\n return `sha256=${toHexString(signature)}`;\n}\n\nfunction toHexString(signature: ArrayBuffer) {\n return Array.from(new Uint8Array(signature))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport async function verifySignature(\n secret: string,\n header: string,\n payload: string\n) {\n if (!secret) {\n secret = \"DEFAULT\";\n }\n\n const parts = header.split(\"=\");\n const sigHex = parts[1]!;\n\n const algorithm = { name: \"HMAC\", hash: { name: \"SHA-256\" } };\n\n const keyBytes = encoder.encode(secret);\n const extractable = false;\n const key = await crypto.subtle.importKey(\n \"raw\",\n keyBytes,\n algorithm,\n extractable,\n [\"sign\", \"verify\"]\n );\n\n const sigBytes = hexToBytes(sigHex);\n const dataBytes = encoder.encode(payload);\n const equal = await crypto.subtle.verify(\n algorithm.name,\n key,\n sigBytes,\n dataBytes\n );\n\n return equal;\n}\n\nfunction hexToBytes(hex: string) {\n const len = hex.length / 2;\n const bytes = new Uint8Array(len);\n\n let index = 0;\n for (let i = 0; i < hex.length; i += 2) {\n const c = hex.slice(i, i + 2);\n const b = parseInt(c, 16);\n bytes[index] = b;\n index += 1;\n }\n\n return bytes;\n}\n","import yaml from \"js-yaml\";\n\nexport function toFrontMatter(content: { [key: string]: any }): string {\n // Serialize with js-yaml — the same library templatedx uses to read the\n // frontmatter back (`yaml.load` in ast-utils.ts) — so the output always\n // round-trips. A hand-rolled emitter cannot: prop values pulled from a trace\n // can be page markdown that starts with `` (a YAML tag indicator),\n // embeds quotes, or spans multiple lines, all of which need quoting or a\n // block scalar. `yaml.dump` applies those rules; bare interpolation did not.\n //\n // - lineWidth: -1 — never wrap long scalars (URLs, page content) so the\n // emitted value is stable and diff-friendly.\n // - noRefs: true — expand shared references instead of emitting `&anchor`\n // / `*alias`, which would be surprising in a prompt file.\n // - skipInvalid: true — drop non-representable values (e.g. `undefined`)\n // rather than throw in the save path; the old emitter\n // would have written the literal string \"undefined\".\n const body =\n Object.keys(content).length === 0\n ? \"\"\n : yaml.dump(content, { lineWidth: -1, noRefs: true, skipInvalid: true });\n\n return `---\\n${body}---\\n`;\n}\n","import * as fs from \"fs-extra\";\nimport path from \"path\";\nimport yaml from \"js-yaml\";\n\nfunction extractFrontmatter<T = any>(content: string): { attributes: T } {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) {\n return { attributes: {} as T };\n }\n const attributes = yaml.load(match[1]) as T;\n return { attributes: attributes || ({} as T) };\n}\n\n// Lazily load json-schema-to-typescript to avoid cwd access at startup\nlet _compile: ((schema: any, name: string, opts: any) => Promise<string>) | null = null;\nasync function getCompile() {\n if (_compile) return _compile;\n const mod = await import(\"json-schema-to-typescript\");\n // Support both ESM/CJS interop shapes\n const c = (mod as any).compile || (mod as any).default?.compile;\n _compile = c.bind(mod);\n return _compile!;\n}\n\ntype TextPromptFrontmatterV1_0 = {\n path: string;\n version: \"1.0\";\n text_config: {\n model_name: string;\n tools?: string[];\n };\n input_schema?: any;\n};\n\ntype ObjectPromptFrontmatterV1_0 = {\n path: string;\n version: \"1.0\";\n object_config: {\n model_name: string;\n schema: any;\n tools?: Record<string, any>;\n };\n input_schema?: any;\n};\n\ntype ImagePromptFrontmatterV1_0 = {\n path: string;\n version: \"1.0\";\n image_config: {\n model_name: string;\n tools?: Record<string, any>;\n };\n input_schema?: any;\n};\n\ntype PromptFrontmatterV0 = {\n path: string;\n metadata: {\n model?: {\n settings?: {\n schema?: any;\n tools?: Record<string, any>;\n };\n };\n };\n input_schema?: any;\n version?: \"0.0\";\n};\n\ntype PromptFrontmatter =\n | PromptFrontmatterV0\n | TextPromptFrontmatterV1_0\n | ObjectPromptFrontmatterV1_0\n | ImagePromptFrontmatterV1_0;\n\nfunction getInterfaceName(filePath: string): string {\n return filePath\n .replace(/\\.prompt\\.mdx$/, \"\")\n .split(\"/\")\n .map((part) => {\n // Handle snake_case, camelCase, and kebab-case\n return part\n .split(/[-_]|(?=[A-Z])/)\n .map(\n (word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n )\n .join(\"\")\n .replace(/[^a-zA-Z0-9]/g, \"\");\n })\n .join(\"$\");\n}\n\nfunction getToolInterfaceName(toolName: string): string {\n return toolName\n .split(/[-_]|(?=[A-Z])/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\"\");\n}\n\nexport async function findPromptFiles(dir: string): Promise<string[]> {\n const files = await fs.readdir(dir, { withFileTypes: true });\n let promptFiles: string[] = [];\n\n for (const file of files) {\n const fullPath = path.join(dir, file.name);\n if (file.isDirectory()) {\n promptFiles = promptFiles.concat(await findPromptFiles(fullPath));\n } else if (file.name.endsWith(\".prompt.mdx\")) {\n promptFiles.push(fullPath);\n }\n }\n\n return promptFiles;\n}\n\nasync function generateTypeDefinitionsV1_0(\n prompts:\n | TextPromptFrontmatterV1_0[]\n | ObjectPromptFrontmatterV1_0[]\n | ImagePromptFrontmatterV1_0[]\n): Promise<string> {\n const interfaces: string[] = [];\n const headerComment = `// Auto-generated types from AgentMark\n// Do not edit this file directly\n\n`;\n let output = \"\";\n const typeMapping: string[] = [];\n\n for (const prompt of prompts) {\n const { path: promptPath, input_schema } = prompt;\n const name = getInterfaceName(promptPath);\n try {\n let kind = \"text\";\n let output_schema = null;\n let hasTools = false;\n\n if (\"text_config\" in prompt) {\n kind = \"text\";\n hasTools = Array.isArray(prompt.text_config.tools)\n ? prompt.text_config.tools.length > 0\n : !!prompt.text_config.tools;\n } else if (\"object_config\" in prompt) {\n kind = \"object\";\n hasTools = Array.isArray(prompt.object_config.tools)\n ? prompt.object_config.tools.length > 0\n : !!prompt.object_config.tools;\n output_schema = prompt.object_config.schema;\n } else if (\"image_config\" in prompt) {\n kind = \"image\";\n hasTools = Array.isArray(prompt.image_config.tools)\n ? prompt.image_config.tools.length > 0\n : !!prompt.image_config.tools;\n }\n\n const compile = await getCompile();\n const inputInterface = input_schema\n ? await compile(input_schema, `${name}In`, {\n bannerComment: \"\",\n additionalProperties: false,\n })\n : `interface ${name}In { [key: string]: any }`;\n const outputInterface = output_schema\n ? await compile(output_schema, `${name}Out`, {\n bannerComment: \"\",\n additionalProperties: false,\n })\n : `type ${name}Out = string`;\n\n interfaces.push(\n inputInterface.replace(\"export interface\", \"interface\"),\n outputInterface\n .replace(\"export type\", \"type\")\n .replace(\"export interface\", \"interface\")\n );\n\n // MDX `tools` is a list of tool names (per 2026-03-13 doctrine).\n // Tool argument schemas live in the native SDK code, not in MDX\n // frontmatter — so we don't generate `Tools`/`XxxArgs` types here.\n output += `type ${name} = {\n kind: '${kind}';\n input: ${name}In;\n output: ${name}Out;${\n hasTools\n ? `\n tools?: string[];`\n : \"\"\n }\n};\\n\\n`;\n\n // Generate all path variants for type-safe access:\n // - \"greeting.prompt.mdx\" (full path)\n // - \"greeting.prompt\" (without .mdx)\n // - \"greeting\" (short name)\n typeMapping.push(` \"${promptPath}\": ${name}`);\n const withoutMdx = promptPath.replace(/\\.mdx$/, \"\");\n if (withoutMdx !== promptPath) {\n typeMapping.push(` \"${withoutMdx}\": ${name}`);\n }\n const shortName = promptPath.replace(/\\.prompt\\.mdx$/, \"\");\n if (shortName !== promptPath && shortName !== withoutMdx) {\n typeMapping.push(` \"${shortName}\": ${name}`);\n }\n } catch (error) {\n console.error(`Error processing ${promptPath}:`, error);\n interfaces.push(\n `interface ${name}In { [key: string]: any }\ntype ${name}Out = string`\n );\n }\n }\n\n output += `export default interface AgentmarkTypes {\n${typeMapping.join(\",\\n\")}\n}\\n`;\n\n return headerComment + interfaces.join(\"\\n\\n\") + \"\\n\\n\" + output;\n}\n\nasync function generateTypeDefinitionsV0(\n prompts: PromptFrontmatterV0[]\n): Promise<string> {\n const interfaces: string[] = [];\n const headerComment = `// Auto-generated types from AgentMark\n// Do not edit this file directly\n\n`;\n let output = \"\";\n const typeMapping: string[] = [];\n\n for (const prompt of prompts) {\n const { path: promptPath, metadata, input_schema } = prompt;\n const name = getInterfaceName(promptPath);\n\n try {\n const compile = await getCompile();\n const inputInterface = input_schema\n ? await compile(input_schema, `${name}In`, {\n bannerComment: \"\",\n additionalProperties: false,\n })\n : `interface ${name}In { [key: string]: any }`;\n\n const outputSchema = metadata?.model?.settings?.schema;\n\n const outputInterface = outputSchema\n ? await compile(outputSchema, `${name}Out`, {\n bannerComment: \"\",\n additionalProperties: false,\n })\n : `type ${name}Out = string`;\n\n interfaces.push(\n inputInterface.replace(\"export interface\", \"interface\"),\n outputInterface\n .replace(\"export type\", \"type\")\n .replace(\"export interface\", \"interface\")\n );\n\n output += `interface ${name} {\n input: ${name}In;\n output: ${name}Out;\n}\\n\\n`;\n\n // Generate all path variants for type-safe access:\n // - \"greeting.prompt.mdx\" (full path)\n // - \"greeting.prompt\" (without .mdx)\n // - \"greeting\" (short name)\n typeMapping.push(` \"${promptPath}\": ${name}`);\n const withoutMdx = promptPath.replace(/\\.mdx$/, \"\");\n if (withoutMdx !== promptPath) {\n typeMapping.push(` \"${withoutMdx}\": ${name}`);\n }\n const shortName = promptPath.replace(/\\.prompt\\.mdx$/, \"\");\n if (shortName !== promptPath && shortName !== withoutMdx) {\n typeMapping.push(` \"${shortName}\": ${name}`);\n }\n } catch (error: any) {\n console.error(`Error processing ${promptPath}:`, error);\n interfaces.push(\n `interface ${name}In { [key: string]: any }\ntype ${name}Out = string`\n );\n\n output += `interface ${name} {\n input: ${name}In;\n output: ${name}Out;\n}\\n\\n`;\n\n // Generate all path variants for type-safe access even on error\n typeMapping.push(` \"${promptPath}\": ${name}`);\n const withoutMdx = promptPath.replace(/\\.mdx$/, \"\");\n if (withoutMdx !== promptPath) {\n typeMapping.push(` \"${withoutMdx}\": ${name}`);\n }\n const shortName = promptPath.replace(/\\.prompt\\.mdx$/, \"\");\n if (shortName !== promptPath && shortName !== withoutMdx) {\n typeMapping.push(` \"${shortName}\": ${name}`);\n }\n }\n }\n\n output += `export default interface AgentmarkTypes {\n${typeMapping.join(\",\\n\")}\n}\\n`;\n\n return headerComment + interfaces.join(\"\\n\\n\") + \"\\n\\n\" + output;\n}\n\nconst isNewFormat = (frontmatter: any) => {\n return (\n frontmatter[\"text_config\"] ||\n frontmatter[\"object_config\"] ||\n frontmatter[\"image_config\"]\n );\n};\n\n// =============================================================================\n// Python TypedDict generation\n// =============================================================================\n\nfunction pythonPrimitiveType(schemaType: string): string {\n const map: Record<string, string> = {\n string: \"str\",\n number: \"float\",\n integer: \"int\",\n boolean: \"bool\",\n null: \"None\",\n };\n return map[schemaType] || \"Any\";\n}\n\nfunction propToPascal(prop: string): string {\n return prop\n .split(/[-_]/)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\"\");\n}\n\n/**\n * Recursively convert a JSON Schema to a Python type annotation string.\n * For nested object types, creates TypedDict classes and appends them to `collected`.\n */\nfunction schemaToPythonType(\n schema: any,\n parentClass: string,\n propKey: string,\n collected: string[]\n): string {\n if (!schema) return \"Any\";\n\n // anyOf / oneOf (commonly used for nullable types)\n const union = schema.anyOf || schema.oneOf;\n if (union) {\n const nullIdx = union.findIndex((v: any) => v.type === \"null\");\n const hasNull = nullIdx >= 0;\n const others = union.filter((_: any, i: number) => i !== nullIdx);\n\n if (hasNull && others.length === 1) {\n return `${schemaToPythonType(others[0], parentClass, propKey, collected)} | None`;\n }\n const parts = others.map((v: any, i: number) =>\n schemaToPythonType(v, parentClass, `${propKey}${i}`, collected)\n );\n if (hasNull) parts.push(\"None\");\n return parts.join(\" | \");\n }\n\n // Type arrays: [\"string\", \"null\"] → str | None\n if (Array.isArray(schema.type)) {\n const hasNull = schema.type.includes(\"null\");\n const nonNull = schema.type.filter((t: string) => t !== \"null\");\n\n // [\"object\", \"null\"] with properties → TypedDict | None\n if (nonNull.length === 1 && nonNull[0] === \"object\" && schema.properties) {\n const clsName = `${parentClass}${propToPascal(propKey)}`;\n collected.push(buildTypedDict(clsName, schema, collected));\n return hasNull ? `${clsName} | None` : clsName;\n }\n\n // [\"array\", \"null\"] with items → list[T] | None\n if (nonNull.length === 1 && nonNull[0] === \"array\" && schema.items) {\n const item = schemaToPythonType(\n schema.items,\n parentClass,\n propKey,\n collected\n );\n return hasNull ? `list[${item}] | None` : `list[${item}]`;\n }\n\n const base =\n nonNull.length === 1\n ? pythonPrimitiveType(nonNull[0])\n : nonNull.map(pythonPrimitiveType).join(\" | \");\n return hasNull ? `${base} | None` : base;\n }\n\n switch (schema.type) {\n case \"string\":\n case \"number\":\n case \"integer\":\n case \"boolean\":\n case \"null\":\n return pythonPrimitiveType(schema.type);\n\n case \"array\": {\n const item = schema.items\n ? schemaToPythonType(schema.items, parentClass, propKey, collected)\n : \"Any\";\n return `list[${item}]`;\n }\n\n case \"object\": {\n if (!schema.properties || Object.keys(schema.properties).length === 0) {\n return \"dict[str, Any]\";\n }\n const clsName = `${parentClass}${propToPascal(propKey)}`;\n collected.push(buildTypedDict(clsName, schema, collected));\n return clsName;\n }\n\n default:\n // No explicit type but has properties — treat as object\n if (schema.properties) {\n const clsName = `${parentClass}${propToPascal(propKey)}`;\n collected.push(buildTypedDict(clsName, schema, collected));\n return clsName;\n }\n return \"Any\";\n }\n}\n\n/**\n * Build a Python TypedDict class definition from an object JSON Schema.\n * Nested objects are extracted into separate classes and appended to `collected`.\n */\nfunction buildTypedDict(\n className: string,\n schema: any,\n collected: string[]\n): string {\n const props = schema.properties || {};\n const requiredSet = new Set<string>(schema.required || []);\n const lines: string[] = [];\n const desc = schema.description;\n\n if (desc) {\n lines.push(`class ${className}(TypedDict):`);\n lines.push(` \"\"\"${desc}\"\"\"`);\n } else {\n lines.push(`class ${className}(TypedDict):`);\n }\n\n const entries = Object.entries(props);\n if (entries.length === 0) {\n lines.push(\" pass\");\n return lines.join(\"\\n\");\n }\n\n for (const [key, propSchema] of entries) {\n const pyType = schemaToPythonType(\n propSchema as any,\n className,\n key,\n collected\n );\n const isRequired = requiredSet.has(key);\n const annotation = isRequired ? pyType : `NotRequired[${pyType}]`;\n const propDesc = (propSchema as any).description;\n\n if (propDesc) {\n const prefix = ` ${key}: ${annotation} # `;\n const maxDesc = 99 - prefix.length;\n if (maxDesc > 10) {\n const shortDesc =\n propDesc.length > maxDesc\n ? propDesc.substring(0, maxDesc - 3) + \"...\"\n : propDesc;\n lines.push(`${prefix}${shortDesc}`);\n } else {\n // Annotation itself is already near 100 chars — skip comment\n lines.push(` ${key}: ${annotation}`);\n }\n } else {\n lines.push(` ${key}: ${annotation}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction generatePythonToolTypes(tools: Record<string, any>): string | null {\n if (Object.keys(tools).length === 0) return null;\n\n const collected: string[] = [];\n\n for (const [toolName, schema] of Object.entries(tools)) {\n const argsName = `${getToolInterfaceName(toolName)}Args`;\n if (schema.parameters && schema.parameters.properties) {\n collected.push(buildTypedDict(argsName, schema.parameters, collected));\n } else {\n collected.push(`class ${argsName}(TypedDict):\\n pass`);\n }\n }\n\n const toolLines = Object.keys(tools)\n .map((name) => ` ${name}: ${getToolInterfaceName(name)}Args`)\n .join(\"\\n\");\n collected.push(`class Tools(TypedDict):\\n${toolLines}`);\n\n return collected.join(\"\\n\\n\\n\");\n}\n\nfunction buildPythonHeader(body: string): string {\n const imports: string[] = [\"TypedDict\"];\n if (body.includes(\"NotRequired[\")) imports.push(\"NotRequired\");\n if (body.includes(\"Literal[\")) imports.push(\"Literal\");\n if (/\\bAny\\b/.test(body)) imports.push(\"Any\");\n imports.sort();\n return `# Auto-generated types from AgentMark\n# Do not edit this file directly\n\nfrom __future__ import annotations\n\nfrom typing import ${imports.join(\", \")}\n\n\n`;\n}\n\nasync function generatePythonTypeDefinitionsV1_0(\n prompts: (\n | TextPromptFrontmatterV1_0\n | ObjectPromptFrontmatterV1_0\n | ImagePromptFrontmatterV1_0\n )[]\n): Promise<string> {\n\n const allClasses: string[] = [];\n const typeMapping: { path: string; name: string }[] = [];\n\n for (const prompt of prompts) {\n const { path: promptPath, input_schema } = prompt;\n const name = getInterfaceName(promptPath);\n\n try {\n let kind = \"text\";\n let outputSchema = null;\n let tools: any = {};\n\n if (\"text_config\" in prompt) {\n kind = \"text\";\n tools = prompt.text_config.tools || {};\n } else if (\"object_config\" in prompt) {\n kind = \"object\";\n tools = prompt.object_config.tools || {};\n outputSchema = prompt.object_config.schema;\n } else if (\"image_config\" in prompt) {\n kind = \"image\";\n tools = prompt.image_config.tools || {};\n }\n\n // Input class\n const inputCollected: string[] = [];\n if (input_schema && input_schema.properties) {\n inputCollected.push(\n buildTypedDict(`${name}In`, input_schema, inputCollected)\n );\n } else {\n inputCollected.push(`class ${name}In(TypedDict):\\n pass`);\n }\n allClasses.push(...inputCollected);\n\n // Output class\n const outputCollected: string[] = [];\n if (outputSchema && outputSchema.properties) {\n outputCollected.push(\n buildTypedDict(`${name}Out`, outputSchema, outputCollected)\n );\n } else if (kind === \"object\") {\n outputCollected.push(`class ${name}Out(TypedDict):\\n pass`);\n } else {\n outputCollected.push(`${name}Out = str`);\n }\n allClasses.push(...outputCollected);\n\n // Tool types\n if (Object.keys(tools).length > 0) {\n const toolOutput = generatePythonToolTypes(tools);\n if (toolOutput) allClasses.push(toolOutput);\n }\n\n // Prompt type class\n const toolsLine =\n Object.keys(tools).length > 0\n ? \"\\n tools: NotRequired[list[str]]\"\n : \"\";\n allClasses.push(\n `class ${name}(TypedDict):\\n` +\n ` kind: Literal['${kind}']\\n` +\n ` input: ${name}In\\n` +\n ` output: ${name}Out${toolsLine}`\n );\n\n // Path variants\n typeMapping.push({ path: promptPath, name });\n const withoutMdx = promptPath.replace(/\\.mdx$/, \"\");\n if (withoutMdx !== promptPath)\n typeMapping.push({ path: withoutMdx, name });\n const shortName = promptPath.replace(/\\.prompt\\.mdx$/, \"\");\n if (shortName !== promptPath && shortName !== withoutMdx) {\n typeMapping.push({ path: shortName, name });\n }\n } catch (error) {\n console.error(`Error processing ${promptPath}:`, error);\n allClasses.push(`class ${name}In(TypedDict):\\n pass`);\n allClasses.push(`${name}Out = str`);\n allClasses.push(\n `class ${name}(TypedDict):\\n` +\n ` kind: Literal['text']\\n` +\n ` input: ${name}In\\n` +\n ` output: ${name}Out`\n );\n typeMapping.push({ path: promptPath, name });\n const withoutMdx = promptPath.replace(/\\.mdx$/, \"\");\n if (withoutMdx !== promptPath)\n typeMapping.push({ path: withoutMdx, name });\n const shortName = promptPath.replace(/\\.prompt\\.mdx$/, \"\");\n if (shortName !== promptPath && shortName !== withoutMdx) {\n typeMapping.push({ path: shortName, name });\n }\n }\n }\n\n // AgentmarkTypes — functional form since keys contain hyphens\n const mappingLines = typeMapping\n .map(({ path, name }) => ` '${path}': ${name}`)\n .join(\",\\n\");\n\n allClasses.push(\n `AgentmarkTypes = TypedDict('AgentmarkTypes', {\\n${mappingLines},\\n})`\n );\n\n const body = allClasses.join(\"\\n\\n\\n\") + \"\\n\";\n return buildPythonHeader(body) + body;\n}\n\nasync function generatePythonTypeDefinitionsV0(\n prompts: PromptFrontmatterV0[]\n): Promise<string> {\n const allClasses: string[] = [];\n const typeMapping: { path: string; name: string }[] = [];\n\n for (const prompt of prompts) {\n const { path: promptPath, metadata, input_schema } = prompt;\n const name = getInterfaceName(promptPath);\n\n try {\n // Input class\n const inputCollected: string[] = [];\n if (input_schema && input_schema.properties) {\n inputCollected.push(\n buildTypedDict(`${name}In`, input_schema, inputCollected)\n );\n } else {\n inputCollected.push(`class ${name}In(TypedDict):\\n pass`);\n }\n allClasses.push(...inputCollected);\n\n // Output class\n const outputSchema = metadata?.model?.settings?.schema;\n const outputCollected: string[] = [];\n if (outputSchema && outputSchema.properties) {\n outputCollected.push(\n buildTypedDict(`${name}Out`, outputSchema, outputCollected)\n );\n } else {\n outputCollected.push(`${name}Out = str`);\n }\n allClasses.push(...outputCollected);\n\n // Prompt type class\n allClasses.push(\n `class ${name}(TypedDict):\\n` +\n ` input: ${name}In\\n` +\n ` output: ${name}Out`\n );\n\n // Path variants\n typeMapping.push({ path: promptPath, name });\n const withoutMdx = promptPath.replace(/\\.mdx$/, \"\");\n if (withoutMdx !== promptPath)\n typeMapping.push({ path: withoutMdx, name });\n const shortName = promptPath.replace(/\\.prompt\\.mdx$/, \"\");\n if (shortName !== promptPath && shortName !== withoutMdx) {\n typeMapping.push({ path: shortName, name });\n }\n } catch (error) {\n console.error(`Error processing ${promptPath}:`, error);\n allClasses.push(`class ${name}In(TypedDict):\\n pass`);\n allClasses.push(`${name}Out = str`);\n allClasses.push(\n `class ${name}(TypedDict):\\n` +\n ` input: ${name}In\\n` +\n ` output: ${name}Out`\n );\n typeMapping.push({ path: promptPath, name });\n const withoutMdx = promptPath.replace(/\\.mdx$/, \"\");\n if (withoutMdx !== promptPath)\n typeMapping.push({ path: withoutMdx, name });\n const shortName = promptPath.replace(/\\.prompt\\.mdx$/, \"\");\n if (shortName !== promptPath && shortName !== withoutMdx) {\n typeMapping.push({ path: shortName, name });\n }\n }\n }\n\n // AgentmarkTypes\n const mappingLines = typeMapping\n .map(({ path, name }) => ` '${path}': ${name}`)\n .join(\",\\n\");\n\n allClasses.push(\n `AgentmarkTypes = TypedDict('AgentmarkTypes', {\\n${mappingLines},\\n})`\n );\n\n const body = allClasses.join(\"\\n\\n\\n\") + \"\\n\";\n return buildPythonHeader(body) + body;\n}\n\nexport type GenerateTypesLanguage = \"typescript\" | \"python\";\n\nexport async function generateTypeDefinitions(\n prompts: PromptFrontmatter[],\n language: GenerateTypesLanguage = \"typescript\"\n): Promise<string> {\n if (language === \"python\") {\n if (prompts[0].version === \"1.0\") {\n return generatePythonTypeDefinitionsV1_0(prompts as any);\n }\n return generatePythonTypeDefinitionsV0(prompts as any);\n }\n if (prompts[0].version === \"1.0\") {\n return generateTypeDefinitionsV1_0(prompts as any);\n }\n return generateTypeDefinitionsV0(prompts as any);\n}\n\nexport async function fetchPromptsFrontmatter(options: {\n local?: number;\n rootDir?: string;\n}): Promise<PromptFrontmatter[]> {\n if (options.local) {\n const baseUrl = `http://localhost:${options.local}`;\n try {\n const pathsResponse = await fetch(`${baseUrl}/v1/prompts`);\n if (!pathsResponse.ok) {\n throw new Error(\n `Failed to fetch prompt paths: ${pathsResponse.statusText}`\n );\n }\n\n // Wire shape: `{ data: { paths } }` (canonical envelope). Tolerate\n // the older flat `{ paths }` shape for forward-compat with any\n // pinned mock servers / older fixtures still in the wild.\n // TODO(envelope-cleanup): drop the `?? body?.paths` fallback once the\n // OSS api-server cutover is fully rolled. Sister shims in\n // `cli/src/lib/api/prompts.ts` and `cli-src/runner-server.ts` —\n // remove all three together.\n const body = await pathsResponse.json();\n const paths: string[] = body?.data?.paths ?? body?.paths ?? [];\n\n return Promise.all(\n paths.map(async (promptPath: string) => {\n const templateResponse = await fetch(\n `${baseUrl}/v1/templates?path=${promptPath}`\n );\n if (!templateResponse.ok) {\n throw new Error(\n `Failed to fetch template ${promptPath}: ${templateResponse.statusText}`\n );\n }\n\n const { data: ast } = await templateResponse.json();\n const yamlNode = ast.children.find(\n (node: any) => node.type === \"yaml\"\n );\n if (!yamlNode) {\n throw new Error(`No YAML frontmatter found in ${promptPath}`);\n }\n\n const { parse: parseYaml } = await import(\"yaml\");\n const frontmatter = parseYaml(yamlNode.value);\n\n if (isNewFormat(frontmatter)) {\n return {\n path: promptPath,\n ...frontmatter,\n version: \"1.0\",\n };\n }\n\n return {\n path: promptPath,\n ...frontmatter,\n };\n })\n );\n } catch (error) {\n if (\n error instanceof TypeError &&\n error.message.includes(\"fetch failed\")\n ) {\n console.error(`Connection failed to ${baseUrl}.`);\n }\n console.error(\"\\nError details:\", error);\n throw error;\n }\n }\n\n if (options.rootDir) {\n if (!fs.existsSync(options.rootDir)) {\n throw new Error(`Directory not found at: ${options.rootDir}`);\n }\n\n const promptFiles = await findPromptFiles(options.rootDir);\n\n return Promise.all(\n promptFiles.map(async (file) => {\n const content = await fs.readFile(file, \"utf-8\");\n const { attributes } = extractFrontmatter(content);\n\n if (isNewFormat(attributes)) {\n return {\n path: path.relative(options.rootDir!, file),\n ...attributes,\n version: \"1.0\",\n };\n }\n return {\n path: path.relative(options.rootDir!, file),\n ...attributes,\n };\n })\n );\n }\n\n throw new Error(\"Either --local or --root-dir must be specified\");\n}\n\n","export enum SpanType {\n SPAN = 'SPAN',\n GENERATION = 'GENERATION',\n EVENT = 'EVENT',\n}\n\n/**\n * Standard message content part types\n */\nexport interface StandardTextContent {\n type: 'text';\n text: string;\n}\n\nexport interface StandardToolCallContent {\n type: 'tool-call';\n toolCallId: string;\n toolName: string;\n args: Record<string, any>; // Normalized field name (V4 uses 'args', V5 uses 'input' -> normalized to 'args')\n}\n\nexport interface StandardToolResultContent {\n type: 'tool-result';\n toolCallId: string;\n toolName: string;\n result: any; // Normalized field name (V4 uses 'result', V5 uses 'output.value' -> normalized to 'result')\n}\n\nexport type StandardMessageContent = \n | StandardTextContent \n | StandardToolCallContent \n | StandardToolResultContent\n | string; // Plain string content\n\n/**\n * Standard message type used throughout the normalizer.\n * Messages are normalized from V4/V5 formats to this standard format.\n * \n * Content can be:\n * - A plain string\n * - An array of content parts (text, tool-call, tool-result)\n */\nexport interface Message {\n role: string;\n content: StandardMessageContent | StandardMessageContent[];\n}\n\nexport interface ToolCall {\n type: string; // e.g., \"tool-call\"\n toolCallId: string;\n toolName: string;\n args: Record<string, any>; // Unified: v4 uses 'args', v5 uses 'input' (normalized to 'args')\n result?: string; // Tool execution result (JSON string for tool call execution spans)\n providerMetadata?: Record<string, any>; // v5 specific: provider-specific metadata\n}\n\nexport interface OtelScope {\n name?: string;\n version?: string;\n}\n\nexport interface OtelResource {\n attributes?: Record<string, any>;\n}\n\nexport interface OtelEvent {\n timeUnixNano: string;\n name: string;\n attributes?: Record<string, any>;\n}\n\nexport interface OtelLink {\n traceId: string;\n spanId: string;\n traceState?: string;\n attributes?: Record<string, any>;\n}\n\nexport interface OtelSpan {\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n traceState?: string;\n name: string;\n kind: number;\n startTimeUnixNano: string;\n endTimeUnixNano: string;\n attributes?: Record<string, any>;\n events?: OtelEvent[];\n links?: OtelLink[];\n status?: {\n code: number;\n message?: string;\n };\n}\n\nexport interface NormalizedSpan {\n // Identity\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n traceState?: string;\n\n // Core type and classification\n type: SpanType;\n\n // Timing\n startTime: number; // Unix timestamp in milliseconds\n endTime?: number; // Unix timestamp in milliseconds\n duration: number; // Duration in milliseconds\n\n // Span metadata\n name: string;\n kind: string;\n semanticKind?: string;\n serviceName?: string;\n statusCode: string;\n statusMessage?: string;\n\n // Normalized LLM generation fields\n model?: string;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n reasoningTokens?: number; // Add reasoning tokens\n cost?: number;\n\n // I/O fields\n input?: Message[]; // Array of messages passed to the model\n output?: string; // Plain text or JSON-stringified structured data\n outputObject?: Record<string, any>; // Structured object output (separate from text)\n toolCalls?: ToolCall[]; // Tool calls from the response\n finishReason?: string; // Unified finish reason (stop, tool-calls, length, etc.)\n settings?: { // Model generation settings\n temperature?: number;\n maxTokens?: number;\n topP?: number;\n presencePenalty?: number;\n frequencyPenalty?: number;\n };\n\n // Trace context fields\n sessionId?: string;\n sessionName?: string;\n userId?: string;\n traceName?: string;\n\n // Dataset/evaluation fields\n datasetRunId?: string;\n datasetRunName?: string;\n datasetPath?: string;\n datasetItemName?: string;\n datasetExpectedOutput?: string;\n datasetInput?: string;\n\n // Experiment identity (regression-gate baseline matching).\n // experimentKey: stable, composition-agnostic identity of the evaluation\n // (prompt/workflow/agent), set on the dataset-run root span.\n experimentKey?: string;\n\n // Prompt fields\n promptName?: string;\n props?: string; // Props/metadata from ai.telemetry.metadata.props\n\n // Version control fields.\n // commitSha: deployed-commit notion (pinned envs override it gateway-side).\n // sourceTreeHash: git tree hash of the code state the run executed against —\n // distinct from commitSha; the regression gate matches baselines on this.\n commitSha?: string;\n sourceTreeHash?: string;\n\n // Custom metadata fields (keys from metadata prefixes that don't map to known fields)\n metadata?: Record<string, string>;\n\n // Raw data for export/debug\n resourceAttributes: Record<string, any>;\n spanAttributes: Record<string, any>;\n events: Array<{ timestamp: number; name: string; attributes: Record<string, any> }>;\n links: Array<{ traceId: string; spanId: string; traceState?: string; attributes?: Record<string, any> }>;\n}\n\nexport interface AttributeExtractor {\n extractModel(attributes: Record<string, any>): string | undefined;\n extractInput(attributes: Record<string, any>): Message[] | undefined;\n extractOutput(attributes: Record<string, any>): string | undefined;\n extractTokens(attributes: Record<string, any>): { input?: number; output?: number; total?: number; reasoning?: number };\n extractMetadata(attributes: Record<string, any>): Partial<NormalizedSpan>;\n extractToolCalls(attributes: Record<string, any>): ToolCall[] | undefined;\n extractOutputObject(attributes: Record<string, any>): Record<string, any> | undefined;\n extractFinishReason(attributes: Record<string, any>): string | undefined;\n extractSettings(attributes: Record<string, any>): NormalizedSpan['settings'];\n}\n\nexport interface ScopeTransformer {\n // Classify the span type based on span and attributes\n classify(span: OtelSpan, attributes: Record<string, any>): SpanType;\n \n // Transform the span and extract normalized fields\n transform(span: OtelSpan, attributes: Record<string, any>): Partial<NormalizedSpan>;\n}\n","import { ScopeTransformer } from './types';\r\n\r\nexport class TransformerRegistry {\r\n private transformers: Map<string, ScopeTransformer> = new Map();\r\n private defaultTransformer: ScopeTransformer | null = null;\r\n\r\n register(scope: string, transformer: ScopeTransformer): void {\r\n this.transformers.set(scope, transformer);\r\n }\r\n\r\n setDefault(transformer: ScopeTransformer): void {\r\n this.defaultTransformer = transformer;\r\n }\r\n\r\n getTransformer(scope: string): ScopeTransformer | null {\r\n return this.transformers.get(scope) || this.defaultTransformer;\r\n }\r\n}\r\n\r\nexport const registry = new TransformerRegistry();\r\n","export type AiSdkVersion = 'v5' | 'v4' | 'unknown';\n\nexport function detectVersion(attributes: Record<string, any>): AiSdkVersion {\n // Check for V5 specific attributes (must be defined and not null)\n if (\n (attributes['ai.response.text'] !== undefined && attributes['ai.response.text'] !== null) ||\n (attributes['ai.response.toolCalls'] !== undefined && attributes['ai.response.toolCalls'] !== null) ||\n (attributes['ai.response.object'] !== undefined && attributes['ai.response.object'] !== null)\n ) {\n return 'v5';\n }\n\n // Check for V4 specific attributes (must be defined and not null)\n if (\n (attributes['ai.result.text'] !== undefined && attributes['ai.result.text'] !== null) ||\n (attributes['ai.result.toolCalls'] !== undefined && attributes['ai.result.toolCalls'] !== null) ||\n (attributes['ai.result.object'] !== undefined && attributes['ai.result.object'] !== null)\n ) {\n return 'v4';\n }\n\n // Also check for V4 prompt attributes (for error cases where result might not be present)\n if (\n (attributes['ai.prompt.messages'] !== undefined && attributes['ai.prompt.messages'] !== null) ||\n (attributes['ai.prompt'] !== undefined && attributes['ai.prompt'] !== null)\n ) {\n return 'v4';\n }\n\n // If we have generic gen_ai attributes but no specific SDK ones, it might be an older version or just generic OTel\n // But for the purpose of \"AI SDK\" transformer, we treat it as unknown if it doesn't match known patterns\n return 'unknown';\n}\n","export interface TokenKeys {\n inputKey?: string;\n outputKey?: string;\n totalKey?: string;\n promptKey?: string; // Legacy alias for input\n completionKey?: string; // Legacy alias for output\n reasoningKey?: string; \n}\n\nexport interface TokenCounts {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n reasoningTokens?: number;\n}\n\nexport function parseTokens(attributes: Record<string, any>, keys: TokenKeys): TokenCounts {\n const result: TokenCounts = {};\n\n // Helper to safely parse integer\n const parseIntSafe = (val: any): number | undefined => {\n if (typeof val === 'number') return Math.floor(val);\n if (typeof val === 'string') {\n // Handle JSON string format (e.g., from OTel SDK)\n try {\n const parsed = JSON.parse(val);\n if (typeof parsed === 'number') return Math.floor(parsed);\n if (parsed && typeof parsed.intValue === 'number') return Math.floor(parsed.intValue);\n } catch {\n // Not JSON, try direct parseInt\n }\n const parsed = parseInt(val, 10);\n return isNaN(parsed) ? undefined : parsed;\n }\n return undefined;\n };\n\n // Extract input tokens (check inputKey first, then promptKey)\n if (keys.inputKey && attributes[keys.inputKey] !== undefined) {\n result.inputTokens = parseIntSafe(attributes[keys.inputKey]);\n } else if (keys.promptKey && attributes[keys.promptKey] !== undefined) {\n result.inputTokens = parseIntSafe(attributes[keys.promptKey]);\n }\n\n // Extract output tokens (check outputKey first, then completionKey)\n if (keys.outputKey && attributes[keys.outputKey] !== undefined) {\n result.outputTokens = parseIntSafe(attributes[keys.outputKey]);\n } else if (keys.completionKey && attributes[keys.completionKey] !== undefined) {\n result.outputTokens = parseIntSafe(attributes[keys.completionKey]);\n }\n\n // Extract total tokens\n if (keys.totalKey && attributes[keys.totalKey] !== undefined) {\n result.totalTokens = parseIntSafe(attributes[keys.totalKey]);\n }\n\n // Calculate total if missing but input/output are present\n if (result.totalTokens === undefined && result.inputTokens !== undefined && result.outputTokens !== undefined) {\n result.totalTokens = result.inputTokens + result.outputTokens;\n }\n\n // Extract reasoning tokens\n if (keys.reasoningKey && attributes[keys.reasoningKey] !== undefined) {\n result.reasoningTokens = parseIntSafe(attributes[keys.reasoningKey]);\n }\n\n return result;\n}\n\n// Helper function to extract reasoning tokens from providerMetadata\nexport function extractReasoningFromProviderMetadata(attributes: Record<string, any>): number | undefined {\n const providerMetadata = attributes['ai.response.providerMetadata'];\n if (!providerMetadata) return undefined;\n\n try {\n const parsed = typeof providerMetadata === 'string' \n ? JSON.parse(providerMetadata) \n : providerMetadata;\n \n // Check OpenAI provider metadata\n if (parsed?.openai?.reasoningTokens !== undefined) {\n return typeof parsed.openai.reasoningTokens === 'number' \n ? parsed.openai.reasoningTokens \n : undefined;\n }\n } catch {\n // Invalid JSON, ignore\n }\n\n return undefined;\n}\n","/**\n * Key sanitization utilities to prevent prototype pollution attacks.\n *\n * These utilities filter out dangerous keys that could be used to\n * modify object prototypes when processing untrusted attribute data.\n */\n\n/**\n * Set of keys that could cause prototype pollution if used as object properties\n */\nexport const DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * Check if a key is safe to use as an object property.\n * Returns false for keys that could cause prototype pollution.\n *\n * @param key - The key to check\n * @returns true if the key is safe, false otherwise\n */\nexport function isSafeKey(key: string): boolean {\n return !DANGEROUS_KEYS.has(key);\n}\n","import { NormalizedSpan } from '../types';\nimport { isSafeKey } from '../utils/key-sanitizer';\n\n// Known metadata fields that should be excluded from custom metadata.\n//\n// NOTE: 'commit_sha' is deliberately NOT in this set. It IS promoted to the\n// typed NormalizedSpan.commitSha field by parseMetadata() below, but it is\n// ALSO allowed to flow into the custom metadata bucket because the OSS CLI's\n// SQLite trace schema has no dedicated CommitSha column (unlike production\n// ClickHouse). The CLI's experiments query reads commit_sha via:\n// MAX(json_extract(root.Metadata, '$.commit_sha'))\n// which only works if commit_sha is present in the Metadata JSON bucket.\n// Promoting it here would break the CLI's experiment comparison SHA display.\n//\n// History: commit 64a9333b2 removed 'commit_sha' from this set originally.\n// That removal was silently lost when PR #1754 was squash-merged, and was\n// subsequently re-added by PR #1797 (commit 405230643) without awareness\n// of 64a9333b2's dependency on it. Do NOT add 'commit_sha' back here without\n// first adding a dedicated CommitSha column to the CLI SQLite schema\n// (cli/cli-src/server/database/index.ts) and mapping span.commitSha in\n// normalizedSpanToSqliteRow (cli/cli-src/server/routes/traces/index.ts).\nconst KNOWN_METADATA_FIELDS = new Set([\n 'session_id',\n 'session_name',\n 'user_id',\n 'trace_name',\n 'dataset_run_id',\n 'dataset_run_name',\n 'dataset_path',\n 'dataset_item_name',\n 'dataset_expected_output',\n 'dataset_input',\n 'prompt_name',\n 'props',\n]);\n\nexport function parseMetadata(attributes: Record<string, any>, prefix: string = 'agentmark.metadata.'): Partial<NormalizedSpan> {\n const result: Partial<NormalizedSpan> = {};\n\n // Helper to get value with prefix\n const get = (key: string) => attributes[`${prefix}${key}`];\n\n // Session Context\n if (get('session_id')) result.sessionId = String(get('session_id'));\n if (get('session_name')) result.sessionName = String(get('session_name'));\n if (get('user_id')) result.userId = String(get('user_id'));\n if (get('trace_name')) result.traceName = String(get('trace_name'));\n\n // Dataset / Evaluation Context\n if (get('dataset_run_id')) result.datasetRunId = String(get('dataset_run_id'));\n if (get('dataset_run_name')) result.datasetRunName = String(get('dataset_run_name'));\n if (get('dataset_path')) result.datasetPath = String(get('dataset_path'));\n if (get('dataset_item_name')) result.datasetItemName = String(get('dataset_item_name'));\n if (get('dataset_expected_output')) result.datasetExpectedOutput = String(get('dataset_expected_output'));\n\n if (get('prompt_name')) result.promptName = String(get('prompt_name'));\n\n if (get('props')) result.props = String(get('props'));\n\n // Version Control\n if (get('commit_sha')) result.commitSha = String(get('commit_sha'));\n\n return result;\n}\n\n/**\n * Extracts custom metadata keys from attributes that start with the given prefix.\n * Excludes known metadata fields that are already extracted as normalized fields.\n * \n * @param attributes - The attributes to extract from\n * @param prefix - The prefix to look for (default: 'agentmark.metadata.')\n * @returns A record of custom metadata keys (with prefix stripped) to string values\n */\nexport function extractCustomMetadata(attributes: Record<string, any>, prefix: string = 'agentmark.metadata.'): Record<string, string> {\n const customMetadata: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(attributes)) {\n // Check if the key starts with the prefix\n if (key.startsWith(prefix)) {\n // Extract the metadata key by removing the prefix\n const metadataKey = key.slice(prefix.length);\n \n // Skip known fields, empty keys, and dangerous keys to prevent prototype pollution\n if (metadataKey && !KNOWN_METADATA_FIELDS.has(metadataKey) && isSafeKey(metadataKey)) {\n // Convert value to string (raw strings, no JSON parsing)\n customMetadata[metadataKey] = String(value);\n }\n }\n }\n\n return customMetadata;\n}\n","/**\n * AI SDK-specific token extraction helpers\n */\n\n/**\n * Extracts reasoning tokens from AI SDK's providerMetadata attribute.\n * This is a fallback when ai.usage.reasoningTokens is not directly available.\n */\nexport function extractReasoningFromProviderMetadata(attributes: Record<string, any>): number | undefined {\n const providerMetadata = attributes['ai.response.providerMetadata'];\n if (!providerMetadata) return undefined;\n\n try {\n const parsed = typeof providerMetadata === 'string' \n ? JSON.parse(providerMetadata) \n : providerMetadata;\n \n // Check OpenAI provider metadata\n if (parsed?.openai?.reasoningTokens !== undefined) {\n return typeof parsed.openai.reasoningTokens === 'number' \n ? parsed.openai.reasoningTokens \n : undefined;\n }\n } catch {\n // Invalid JSON, ignore\n }\n\n return undefined;\n}\n\n\n\n\n\n\n","import { \n AttributeExtractor, \n NormalizedSpan, \n Message, \n ToolCall,\n StandardMessageContent,\n StandardToolCallContent,\n StandardToolResultContent,\n} from '../../../types';\nimport { parseTokens } from '../../../extractors/token-parser';\nimport { parseMetadata, extractCustomMetadata } from '../../../extractors/metadata-parser';\nimport { extractReasoningFromProviderMetadata } from '../token-helpers';\n\nexport class AiSdkV4Strategy implements AttributeExtractor {\n /**\n * Normalize a content part from V4 format to standard format\n */\n private normalizeContentPart(part: any): StandardMessageContent {\n // Handle plain text parts\n if (typeof part === 'string') {\n return part;\n }\n\n if (!part || typeof part !== 'object') {\n return part;\n }\n\n const type = part.type;\n\n // Handle text content\n if (type === 'text') {\n return {\n type: 'text',\n text: part.text || '',\n };\n }\n\n // Handle tool-call content (V4 uses 'args')\n if (type === 'tool-call') {\n return {\n type: 'tool-call',\n toolCallId: part.toolCallId || '',\n toolName: part.toolName || '',\n args: part.args || {}, // V4 uses 'args' directly\n } as StandardToolCallContent;\n }\n\n // Handle tool-result content (V4 uses 'result')\n if (type === 'tool-result') {\n return {\n type: 'tool-result',\n toolCallId: part.toolCallId || '',\n toolName: part.toolName || '',\n result: part.result, // V4 uses 'result' directly\n } as StandardToolResultContent;\n }\n\n // Unknown type, return as-is\n return part;\n }\n\n /**\n * Normalize a single message from V4 format to standard format\n */\n private normalizeMessage(message: any): Message {\n if (!message || typeof message !== 'object') {\n return message;\n }\n\n const { role, content, ...rest } = message;\n\n // Normalize content\n let normalizedContent: StandardMessageContent | StandardMessageContent[];\n\n if (typeof content === 'string') {\n // Plain string content\n normalizedContent = content;\n } else if (Array.isArray(content)) {\n // Array of content parts - normalize each part\n normalizedContent = content.map((part) => this.normalizeContentPart(part));\n } else if (content && typeof content === 'object') {\n // Single content object - normalize it\n normalizedContent = this.normalizeContentPart(content);\n } else {\n normalizedContent = content;\n }\n\n return {\n role: role || '',\n content: normalizedContent,\n ...rest,\n };\n }\n\n /**\n * Normalize messages array from V4 format to standard format\n */\n private normalizeMessages(messages: any[]): Message[] {\n if (!Array.isArray(messages)) {\n return messages;\n }\n\n return messages.map((msg) => this.normalizeMessage(msg));\n }\n\n extractModel(attributes: Record<string, any>): string | undefined {\n return attributes['gen_ai.request.model'] || attributes['ai.model.id'];\n }\n\n extractInput(attributes: Record<string, any>): Message[] | undefined {\n // The assembled messages live on `ai.prompt.messages` (present on the\n // `.doGenerate` leaf spans). The parent `ai.*` wrapper spans carry\n // `ai.prompt` instead — and `ai.prompt` is NOT always `{ messages }`:\n // for a string `prompt:` call it's `{ prompt, system? }`. Coerce every\n // shape to a messages array so wrapper spans (and any string-prompt\n // generation) surface their input instead of rendering blank.\n const raw =\n attributes['ai.prompt.messages'] !== undefined\n ? attributes['ai.prompt.messages']\n : attributes['ai.prompt'];\n if (raw === undefined) {\n return undefined;\n }\n\n let value: any = raw;\n if (typeof value === 'string') {\n try {\n value = JSON.parse(value);\n } catch {\n // Not JSON — treat the raw string as the prompt text below.\n }\n }\n\n const messages = this.coerceToMessages(value);\n if (!messages) {\n return undefined;\n }\n return this.normalizeMessages(messages);\n }\n\n /**\n * Coerce the shapes `ai.prompt` / `ai.prompt.messages` can take into a\n * messages array: a raw array, `{ messages, system? }`,\n * `{ prompt, system? }` (string prompt), or a bare string.\n */\n private coerceToMessages(value: any): any[] | undefined {\n if (typeof value === 'string') {\n return [{ role: 'user', content: value }];\n }\n if (Array.isArray(value)) {\n return value;\n }\n if (value && typeof value === 'object') {\n if (Array.isArray(value.messages)) {\n return typeof value.system === 'string'\n ? [{ role: 'system', content: value.system }, ...value.messages]\n : value.messages;\n }\n if (typeof value.prompt === 'string') {\n const messages: any[] = [];\n if (typeof value.system === 'string') {\n messages.push({ role: 'system', content: value.system });\n }\n messages.push({ role: 'user', content: value.prompt });\n return messages;\n }\n }\n return undefined;\n }\n\n extractOutput(attributes: Record<string, any>): string | undefined {\n // V4 uses 'ai.result.*' but may also have 'ai.response.*' in some cases\n // Only return text, objects go to outputObject\n if (attributes['ai.result.text'] !== undefined) return attributes['ai.result.text'];\n // Fallback to ai.response.* for compatibility\n if (attributes['ai.response.text'] !== undefined) return attributes['ai.response.text'];\n return undefined;\n }\n\n extractOutputObject(attributes: Record<string, any>): Record<string, any> | undefined {\n // V4 uses 'ai.result.*' but may also have 'ai.response.*' in some cases\n let objValue: any;\n if (attributes['ai.result.object'] !== undefined) {\n objValue = attributes['ai.result.object'];\n } else if (attributes['ai.response.object'] !== undefined) {\n objValue = attributes['ai.response.object'];\n } else {\n return undefined;\n }\n\n // Parse if it's a string, otherwise use as-is\n if (typeof objValue === 'string') {\n try {\n return JSON.parse(objValue);\n } catch {\n return undefined;\n }\n }\n return objValue;\n }\n\n extractToolCalls(attributes: Record<string, any>): ToolCall[] | undefined {\n // V4 uses 'ai.result.toolCalls' (primary) or 'ai.response.toolCalls' (fallback)\n // Check these first as they take precedence over individual ai.toolCall.* attributes\n let toolCallsValue: any;\n if (attributes['ai.result.toolCalls'] !== undefined) {\n toolCallsValue = attributes['ai.result.toolCalls'];\n } else if (attributes['ai.response.toolCalls'] !== undefined) {\n toolCallsValue = attributes['ai.response.toolCalls'];\n } else {\n // Fallback: check for individual ai.toolCall.* attributes (for tool call execution spans)\n if (attributes['ai.toolCall.name'] !== undefined) {\n const toolCallId = attributes['ai.toolCall.id'];\n const toolName = attributes['ai.toolCall.name'];\n const argsValue = attributes['ai.toolCall.args'];\n const resultValue = attributes['ai.toolCall.result'];\n \n if (toolCallId && toolName) {\n let args: Record<string, any> = {};\n if (argsValue !== undefined) {\n if (typeof argsValue === 'string') {\n try {\n args = JSON.parse(argsValue);\n } catch {\n // If parsing fails, treat as empty object\n args = {};\n }\n } else if (typeof argsValue === 'object' && argsValue !== null) {\n args = argsValue;\n }\n }\n \n // Extract result - keep as string (JSON stringified) for UI compatibility\n let result: string | undefined;\n if (resultValue !== undefined) {\n if (typeof resultValue === 'string') {\n result = resultValue;\n } else {\n // If it's an object, stringify it\n try {\n result = JSON.stringify(resultValue);\n } catch {\n result = String(resultValue);\n }\n }\n }\n \n return [{\n type: 'tool-call',\n toolCallId: String(toolCallId),\n toolName: String(toolName),\n args,\n result,\n }];\n }\n }\n return undefined;\n }\n\n // Parse if it's a string, otherwise use as-is\n let toolCalls: any;\n if (typeof toolCallsValue === 'string') {\n try {\n toolCalls = JSON.parse(toolCallsValue);\n } catch {\n return undefined;\n }\n } else {\n toolCalls = toolCallsValue;\n }\n\n // Ensure it's an array\n if (!Array.isArray(toolCalls)) {\n return undefined;\n }\n\n // Normalize: map v4 'args' to unified 'args' field\n return toolCalls.map((tc: any) => ({\n type: tc.type || 'tool-call',\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: tc.args || tc.input || {}, // v4 uses 'args', normalize to 'args'\n }));\n }\n\n extractFinishReason(attributes: Record<string, any>): string | undefined {\n // V4: Check ai.result.finishReason (primary) or ai.response.finishReason (fallback) or gen_ai.response.finish_reasons (OTel)\n if (attributes['ai.result.finishReason'] !== undefined) {\n return String(attributes['ai.result.finishReason']);\n }\n if (attributes['ai.response.finishReason'] !== undefined) {\n return String(attributes['ai.response.finishReason']);\n }\n if (attributes['gen_ai.response.finish_reasons'] !== undefined) {\n const reasons = attributes['gen_ai.response.finish_reasons'];\n // OTel can be an array, take first element if array\n if (Array.isArray(reasons) && reasons.length > 0) {\n return String(reasons[0]);\n }\n return String(reasons);\n }\n return undefined;\n }\n\n extractSettings(attributes: Record<string, any>): NormalizedSpan['settings'] {\n const settings: NormalizedSpan['settings'] = {};\n\n // Check OTel keys first, then fallback to AI SDK keys\n if (attributes['gen_ai.request.temperature'] !== undefined || attributes['ai.settings.temperature'] !== undefined) {\n const value = attributes['gen_ai.request.temperature'] ?? attributes['ai.settings.temperature'];\n settings.temperature = typeof value === 'number' ? value : parseFloat(String(value));\n }\n\n if (attributes['gen_ai.request.max_tokens'] !== undefined || attributes['ai.settings.maxTokens'] !== undefined) {\n const value = attributes['gen_ai.request.max_tokens'] ?? attributes['ai.settings.maxTokens'];\n settings.maxTokens = typeof value === 'number' ? value : parseInt(String(value), 10);\n }\n\n if (attributes['gen_ai.request.top_p'] !== undefined || attributes['ai.settings.topP'] !== undefined) {\n const value = attributes['gen_ai.request.top_p'] ?? attributes['ai.settings.topP'];\n settings.topP = typeof value === 'number' ? value : parseFloat(String(value));\n }\n\n if (attributes['gen_ai.request.presence_penalty'] !== undefined || attributes['ai.settings.presencePenalty'] !== undefined) {\n const value = attributes['gen_ai.request.presence_penalty'] ?? attributes['ai.settings.presencePenalty'];\n settings.presencePenalty = typeof value === 'number' ? value : parseFloat(String(value));\n }\n\n if (attributes['gen_ai.request.frequency_penalty'] !== undefined || attributes['ai.settings.frequencyPenalty'] !== undefined) {\n const value = attributes['gen_ai.request.frequency_penalty'] ?? attributes['ai.settings.frequencyPenalty'];\n settings.frequencyPenalty = typeof value === 'number' ? value : parseFloat(String(value));\n }\n\n // Only return if at least one setting is present\n return Object.keys(settings).length > 0 ? settings : undefined;\n }\n\n extractTokens(attributes: Record<string, any>): { input?: number; output?: number; total?: number; reasoning?: number } {\n // V4 often uses legacy token keys\n const tokens = parseTokens(attributes, {\n inputKey: 'gen_ai.usage.prompt_tokens',\n outputKey: 'gen_ai.usage.completion_tokens',\n totalKey: 'gen_ai.usage.total_tokens',\n promptKey: 'ai.usage.promptTokens', // SDK specific fallback\n completionKey: 'ai.usage.completionTokens' // SDK specific fallback\n });\n\n // V4 reasoning tokens come from providerMetadata\n tokens.reasoningTokens = extractReasoningFromProviderMetadata(attributes);\n \n if (!tokens.reasoningTokens) {\n tokens.reasoningTokens = 0;\n }\n\n return {\n input: tokens.inputTokens,\n output: tokens.outputTokens,\n total: tokens.totalTokens,\n reasoning: tokens.reasoningTokens\n };\n }\n\n extractMetadata(attributes: Record<string, any>): Partial<NormalizedSpan> {\n // First try agentmark.metadata.* prefix\n const result = parseMetadata(attributes);\n \n // Also check for ai.telemetry.metadata.* attributes\n const aiTelemetryResult = parseMetadata(attributes, 'ai.telemetry.metadata.');\n \n // Extract custom metadata from both prefixes\n const agentmarkCustomMetadata = extractCustomMetadata(attributes, 'agentmark.metadata.');\n const aiTelemetryCustomMetadata = extractCustomMetadata(attributes, 'ai.telemetry.metadata.');\n \n // Merge custom metadata (ai.telemetry.metadata takes precedence if both exist)\n const mergedCustomMetadata = {\n ...agentmarkCustomMetadata,\n ...aiTelemetryCustomMetadata,\n };\n \n // Merge results (ai.telemetry.metadata takes precedence if both exist)\n return {\n ...result,\n ...aiTelemetryResult,\n // Only include metadata field if there are custom metadata keys\n ...(Object.keys(mergedCustomMetadata).length > 0 ? { metadata: mergedCustomMetadata } : {}),\n };\n }\n}\n","import { \n AttributeExtractor, \n NormalizedSpan, \n Message, \n ToolCall,\n StandardMessageContent,\n StandardToolCallContent,\n StandardToolResultContent,\n} from '../../../types';\nimport { parseTokens } from '../../../extractors/token-parser';\nimport { parseMetadata, extractCustomMetadata } from '../../../extractors/metadata-parser';\nimport { extractReasoningFromProviderMetadata } from '../token-helpers';\n\nexport class AiSdkV5Strategy implements AttributeExtractor {\n /**\n * Normalize a content part from V5 format to standard format\n */\n private normalizeContentPart(part: any): StandardMessageContent {\n // Handle plain text parts\n if (typeof part === 'string') {\n return part;\n }\n\n if (!part || typeof part !== 'object') {\n return part;\n }\n\n const type = part.type;\n\n // Handle text content\n if (type === 'text') {\n return {\n type: 'text',\n text: part.text || '',\n };\n }\n\n // Handle tool-call content (V5 uses 'input', normalize to 'args')\n if (type === 'tool-call') {\n return {\n type: 'tool-call',\n toolCallId: part.toolCallId || '',\n toolName: part.toolName || '',\n args: part.input || part.args || {}, // V5 uses 'input', normalize to 'args'\n } as StandardToolCallContent;\n }\n\n // Handle tool-result content (V5 uses 'output.value', normalize to 'result')\n if (type === 'tool-result') {\n let normalizedResult: any;\n\n // V5 uses output: {type, value} structure\n if (part.output !== undefined) {\n // Extract the value from the output wrapper\n if (typeof part.output === 'object' && part.output !== null) {\n // Handle output.value structure\n if ('value' in part.output) {\n normalizedResult = part.output.value;\n } else {\n // Fallback: use the whole output object\n normalizedResult = part.output;\n }\n } else {\n normalizedResult = part.output;\n }\n } else if (part.result !== undefined) {\n // Fallback to result if output is not present\n normalizedResult = part.result;\n } else {\n normalizedResult = undefined;\n }\n\n return {\n type: 'tool-result',\n toolCallId: part.toolCallId || '',\n toolName: part.toolName || '',\n result: normalizedResult,\n } as StandardToolResultContent;\n }\n\n // Unknown type, return as-is\n return part;\n }\n\n /**\n * Normalize a single message from V5 format to standard format\n */\n private normalizeMessage(message: any): Message {\n if (!message || typeof message !== 'object') {\n return message;\n }\n\n const { role, content, ...rest } = message;\n\n // Normalize content\n let normalizedContent: StandardMessageContent | StandardMessageContent[];\n\n if (typeof content === 'string') {\n // Plain string content\n normalizedContent = content;\n } else if (Array.isArray(content)) {\n // Array of content parts - normalize each part\n normalizedContent = content.map((part) => this.normalizeContentPart(part));\n } else if (content && typeof content === 'object') {\n // Single content object - normalize it\n normalizedContent = this.normalizeContentPart(content);\n } else {\n normalizedContent = content;\n }\n\n return {\n role: role || '',\n content: normalizedContent,\n ...rest,\n };\n }\n\n /**\n * Normalize messages array from V5 format to standard format\n */\n private normalizeMessages(messages: any[]): Message[] {\n if (!Array.isArray(messages)) {\n return messages;\n }\n\n return messages.map((msg) => this.normalizeMessage(msg));\n }\n\n extractModel(attributes: Record<string, any>): string | undefined {\n return attributes['gen_ai.request.model'] || attributes['ai.model.id'];\n }\n\n extractInput(attributes: Record<string, any>): Message[] | undefined {\n // The assembled messages live on `ai.prompt.messages` (present on the\n // `.doGenerate` leaf spans). The parent `ai.*` wrapper spans carry\n // `ai.prompt` instead — and `ai.prompt` is NOT always `{ messages }`:\n // for the common `generateText({ prompt: \"...\" })` call it's\n // `{ prompt, system? }`. Coerce every shape to a messages array via\n // `coerceToMessages` so wrapper spans (and any string-prompt\n // generation) surface their input instead of rendering blank.\n const raw =\n attributes['ai.prompt.messages'] !== undefined\n ? attributes['ai.prompt.messages']\n : attributes['ai.prompt'];\n if (raw === undefined) {\n return undefined;\n }\n\n let value: any = raw;\n if (typeof value === 'string') {\n try {\n value = JSON.parse(value);\n } catch {\n // Not JSON — treat the raw string as the prompt text below.\n }\n }\n\n const messages = this.coerceToMessages(value);\n if (!messages) {\n return undefined;\n }\n return this.normalizeMessages(messages);\n }\n\n /**\n * Coerce the shapes `ai.prompt` / `ai.prompt.messages` can take into a\n * messages array:\n * - `[ ...messages ]` — ai.prompt.messages (leaf spans)\n * - `{ messages: [...], system? }` — ai.prompt with messages\n * - `{ prompt: \"text\", system? }` — ai.prompt for a string prompt\n * (the parent wrapper spans)\n * - `\"text\"` — a bare (non-JSON) prompt string\n */\n private coerceToMessages(value: any): any[] | undefined {\n if (typeof value === 'string') {\n return [{ role: 'user', content: value }];\n }\n if (Array.isArray(value)) {\n return value;\n }\n if (value && typeof value === 'object') {\n if (Array.isArray(value.messages)) {\n return typeof value.system === 'string'\n ? [{ role: 'system', content: value.system }, ...value.messages]\n : value.messages;\n }\n if (typeof value.prompt === 'string') {\n const messages: any[] = [];\n if (typeof value.system === 'string') {\n messages.push({ role: 'system', content: value.system });\n }\n messages.push({ role: 'user', content: value.prompt });\n return messages;\n }\n }\n return undefined;\n }\n\n extractOutput(attributes: Record<string, any>): string | undefined {\n // V5 uses 'ai.response.*'\n // Only return text, objects go to outputObject\n if (attributes['ai.response.text'] !== undefined) return attributes['ai.response.text'];\n return undefined;\n }\n\n extractOutputObject(attributes: Record<string, any>): Record<string, any> | undefined {\n // V5 uses 'ai.response.object'\n if (attributes['ai.response.object'] === undefined) {\n return undefined;\n }\n\n const objValue = attributes['ai.response.object'];\n \n // Parse if it's a string, otherwise use as-is\n if (typeof objValue === 'string') {\n try {\n return JSON.parse(objValue);\n } catch {\n return undefined;\n }\n }\n \n // Return object directly (not stringified)\n if (typeof objValue === 'object' && objValue !== null) {\n return objValue;\n }\n return undefined;\n }\n\n extractToolCalls(attributes: Record<string, any>): ToolCall[] | undefined {\n // V5 uses 'ai.response.toolCalls' (for generation spans with tool calls)\n // Check this first as it takes precedence over individual ai.toolCall.* attributes\n if (attributes['ai.response.toolCalls'] !== undefined) {\n\n const toolCallsValue = attributes['ai.response.toolCalls'];\n\n // Parse if it's a string, otherwise use as-is\n let toolCalls: any;\n if (typeof toolCallsValue === 'string') {\n try {\n toolCalls = JSON.parse(toolCallsValue);\n } catch {\n return undefined;\n }\n } else {\n toolCalls = toolCallsValue;\n }\n\n // Ensure it's an array\n if (!Array.isArray(toolCalls)) {\n return undefined;\n }\n\n // Normalize: map v5 'input' to unified 'args' field\n return toolCalls.map((tc: any) => ({\n type: tc.type || 'tool-call',\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: tc.input || tc.args || {}, // v5 uses 'input', normalize to 'args'\n providerMetadata: tc.providerMetadata || tc.providerOptions,\n }));\n }\n\n // Fallback: check for individual ai.toolCall.* attributes (for tool call execution spans)\n if (attributes['ai.toolCall.name'] !== undefined) {\n const toolCallId = attributes['ai.toolCall.id'];\n const toolName = attributes['ai.toolCall.name'];\n const argsValue = attributes['ai.toolCall.args'];\n const resultValue = attributes['ai.toolCall.result'];\n \n if (toolCallId && toolName) {\n let args: Record<string, any> = {};\n if (argsValue !== undefined) {\n if (typeof argsValue === 'string') {\n try {\n args = JSON.parse(argsValue);\n } catch {\n // If parsing fails, treat as empty object\n args = {};\n }\n } else if (typeof argsValue === 'object' && argsValue !== null) {\n args = argsValue;\n }\n }\n \n // Extract result - keep as string (JSON stringified) for UI compatibility\n let result: string | undefined;\n if (resultValue !== undefined) {\n if (typeof resultValue === 'string') {\n result = resultValue;\n } else {\n // If it's an object, stringify it\n try {\n result = JSON.stringify(resultValue);\n } catch {\n result = String(resultValue);\n }\n }\n }\n \n return [{\n type: 'tool-call',\n toolCallId: String(toolCallId),\n toolName: String(toolName),\n args,\n result,\n }];\n }\n }\n\n return undefined;\n }\n\n extractFinishReason(attributes: Record<string, any>): string | undefined {\n // V5: Check ai.response.finishReason (primary) or gen_ai.response.finish_reasons (OTel)\n if (attributes['ai.response.finishReason'] !== undefined) {\n return String(attributes['ai.response.finishReason']);\n }\n if (attributes['gen_ai.response.finish_reasons'] !== undefined) {\n const reasons = attributes['gen_ai.response.finish_reasons'];\n // OTel can be an array, take first element if array\n if (Array.isArray(reasons) && reasons.length > 0) {\n return String(reasons[0]);\n }\n return String(reasons);\n }\n return undefined;\n }\n\n extractSettings(attributes: Record<string, any>): NormalizedSpan['settings'] {\n const settings: NormalizedSpan['settings'] = {};\n\n // Check OTel keys first, then fallback to AI SDK keys\n if (attributes['gen_ai.request.temperature'] !== undefined || attributes['ai.settings.temperature'] !== undefined) {\n const value = attributes['gen_ai.request.temperature'] ?? attributes['ai.settings.temperature'];\n settings.temperature = typeof value === 'number' ? value : parseFloat(String(value));\n }\n\n if (attributes['gen_ai.request.max_tokens'] !== undefined || attributes['ai.settings.maxTokens'] !== undefined) {\n const value = attributes['gen_ai.request.max_tokens'] ?? attributes['ai.settings.maxTokens'];\n settings.maxTokens = typeof value === 'number' ? value : parseInt(String(value), 10);\n }\n\n if (attributes['gen_ai.request.top_p'] !== undefined || attributes['ai.settings.topP'] !== undefined) {\n const value = attributes['gen_ai.request.top_p'] ?? attributes['ai.settings.topP'];\n settings.topP = typeof value === 'number' ? value : parseFloat(String(value));\n }\n\n if (attributes['gen_ai.request.presence_penalty'] !== undefined || attributes['ai.settings.presencePenalty'] !== undefined) {\n const value = attributes['gen_ai.request.presence_penalty'] ?? attributes['ai.settings.presencePenalty'];\n settings.presencePenalty = typeof value === 'number' ? value : parseFloat(String(value));\n }\n\n if (attributes['gen_ai.request.frequency_penalty'] !== undefined || attributes['ai.settings.frequencyPenalty'] !== undefined) {\n const value = attributes['gen_ai.request.frequency_penalty'] ?? attributes['ai.settings.frequencyPenalty'];\n settings.frequencyPenalty = typeof value === 'number' ? value : parseFloat(String(value));\n }\n\n // Only return if at least one setting is present\n return Object.keys(settings).length > 0 ? settings : undefined;\n }\n\n extractTokens(attributes: Record<string, any>): { input?: number; output?: number; total?: number; reasoning?: number } {\n // V5 aligns better with OTel GenAI conventions\n const tokens = parseTokens(attributes, {\n inputKey: 'gen_ai.usage.input_tokens',\n outputKey: 'gen_ai.usage.output_tokens',\n totalKey: 'gen_ai.usage.total_tokens',\n promptKey: 'ai.usage.promptTokens', // SDK specific fallback\n completionKey: 'ai.usage.completionTokens', // SDK specific fallback\n reasoningKey: 'ai.usage.reasoningTokens' // AI SDK v5 uses this\n });\n\n // Fallback to providerMetadata for reasoning tokens only if not already set\n // Note: We check for undefined explicitly to preserve 0 values\n if (tokens.reasoningTokens === undefined) {\n tokens.reasoningTokens = extractReasoningFromProviderMetadata(attributes);\n }\n \n if (!tokens.reasoningTokens) {\n tokens.reasoningTokens = 0;\n }\n\n return {\n input: tokens.inputTokens,\n output: tokens.outputTokens,\n total: tokens.totalTokens,\n reasoning: tokens.reasoningTokens\n };\n }\n\n extractMetadata(attributes: Record<string, any>): Partial<NormalizedSpan> {\n // First try agentmark.metadata.* prefix\n const result = parseMetadata(attributes);\n \n // Also check for ai.telemetry.metadata.* attributes\n const aiTelemetryResult = parseMetadata(attributes, 'ai.telemetry.metadata.');\n \n // Extract custom metadata from both prefixes\n const agentmarkCustomMetadata = extractCustomMetadata(attributes, 'agentmark.metadata.');\n const aiTelemetryCustomMetadata = extractCustomMetadata(attributes, 'ai.telemetry.metadata.');\n \n // Merge custom metadata (ai.telemetry.metadata takes precedence if both exist)\n const mergedCustomMetadata = {\n ...agentmarkCustomMetadata,\n ...aiTelemetryCustomMetadata,\n };\n \n // Merge results (ai.telemetry.metadata takes precedence if both exist)\n return {\n ...result,\n ...aiTelemetryResult,\n // Only include metadata field if there are custom metadata keys\n ...(Object.keys(mergedCustomMetadata).length > 0 ? { metadata: mergedCustomMetadata } : {}),\n };\n }\n}\n","import { NormalizedSpan, OtelSpan, ScopeTransformer, AttributeExtractor, SpanType } from '../../types';\nimport { detectVersion } from './version-detector';\nimport { AiSdkV4Strategy } from './strategies/v4';\nimport { AiSdkV5Strategy } from './strategies/v5';\n\nexport class AiSdkTransformer implements ScopeTransformer {\n private strategies: {\n v4: AttributeExtractor;\n v5: AttributeExtractor;\n };\n\n constructor() {\n this.strategies = {\n v4: new AiSdkV4Strategy(),\n v5: new AiSdkV5Strategy(),\n };\n }\n\n classify(span: OtelSpan, _attributes: Record<string, any>): SpanType {\n // Only specific generation spans are GENERATION:\n // - ai.generateText.doGenerate\n // - ai.streamText.doStream\n // - ai.generateObject.doGenerate\n // - ai.streamObject.doStream\n const isGenerationSpan = \n span.name === 'ai.generateText.doGenerate' ||\n span.name === 'ai.streamText.doStream' ||\n span.name === 'ai.generateObject.doGenerate' ||\n span.name === 'ai.streamObject.doStream';\n \n return isGenerationSpan ? SpanType.GENERATION : SpanType.SPAN;\n }\n\n transform(_span: OtelSpan, attributes: Record<string, any>): Partial<NormalizedSpan> {\n const version = detectVersion(attributes);\n\n const strategy = version === 'v5' ? this.strategies.v5 : this.strategies.v4;\n\n const tokens = strategy.extractTokens(attributes);\n const toolCalls = strategy.extractToolCalls(attributes);\n\n // Build result with standard fields\n const result: Partial<NormalizedSpan> = {\n model: strategy.extractModel(attributes),\n input: strategy.extractInput(attributes),\n output: strategy.extractOutput(attributes),\n outputObject: strategy.extractOutputObject(attributes),\n toolCalls,\n finishReason: strategy.extractFinishReason(attributes),\n settings: strategy.extractSettings(attributes),\n inputTokens: tokens.input,\n outputTokens: tokens.output,\n totalTokens: tokens.total,\n reasoningTokens: tokens.reasoning,\n\n ...strategy.extractMetadata(attributes),\n };\n\n // Override span name with tool name for tool call execution spans\n // This enables proper grouping by tool name in the workflow graph\n // (e.g., \"search_web\" instead of generic \"ai.toolCall\")\n const toolName = attributes['ai.toolCall.name'];\n if (toolName && typeof toolName === 'string') {\n result.name = toolName;\n }\n\n return result;\n }\n}\n","import { NormalizedSpan, OtelSpan, ScopeTransformer, SpanType, Message } from '../../types';\n\nexport class MastraTransformer implements ScopeTransformer {\n classify(span: OtelSpan, _attributes: Record<string, any>): SpanType {\n // Classify agent generation spans as GENERATION\n const isGenerationSpan = \n span.name === 'agent.streamLegacy' ||\n span.name === 'agent.stream' ||\n span.name === 'agent.streamObject' ||\n span.name === 'agent.generate' ||\n span.name === 'agent.generateObject';\n \n return isGenerationSpan ? SpanType.GENERATION : SpanType.SPAN;\n }\n\n transform(span: OtelSpan, attributes: Record<string, any>): Partial<NormalizedSpan> {\n const result: Partial<NormalizedSpan> = {};\n\n // Extract model from agent.resolveModelConfig.result or from current span\n const modelConfig = this.extractModelConfig(attributes, span);\n if (modelConfig?.modelId) {\n result.model = modelConfig.modelId;\n }\n\n // Extract input messages\n const input = this.extractInput(span, attributes);\n if (input) {\n result.input = input;\n }\n\n // Extract output and tokens from agent.stream.result or agent.streamLegacy.result\n const streamResult = this.extractStreamResult(span, attributes);\n if (streamResult) {\n if (streamResult.output) {\n result.output = streamResult.output;\n }\n if (streamResult.outputObject) {\n result.outputObject = streamResult.outputObject;\n }\n if (streamResult.usage) {\n result.inputTokens = streamResult.usage.promptTokens;\n result.outputTokens = streamResult.usage.completionTokens;\n result.totalTokens = streamResult.usage.totalTokens;\n }\n }\n\n // Extract trace name from agentmark.trace_name or componentName\n if (attributes['agentmark.trace_name']) {\n result.traceName = attributes['agentmark.trace_name'] as string;\n } else if (attributes['componentName']) {\n result.traceName = attributes['componentName'] as string;\n }\n\n // Extract settings from model config\n if (modelConfig?.settings) {\n result.settings = modelConfig.settings;\n }\n\n return result;\n }\n\n private extractModelConfig(\n attributes: Record<string, any>,\n _span: OtelSpan\n ): { modelId?: string; provider?: string; settings?: any } | null {\n // Try to find model config in resolveModelConfig.result attribute\n // This might be in a sibling span, so we check current span first\n const resolveModelConfigResult = attributes['agent.resolveModelConfig.result'];\n if (resolveModelConfigResult) {\n try {\n const config = typeof resolveModelConfigResult === 'string' \n ? JSON.parse(resolveModelConfigResult) \n : resolveModelConfigResult;\n \n if (config.modelId) {\n return {\n modelId: config.modelId,\n provider: config.config?.provider,\n settings: config.settings,\n };\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n // Also check prepareLLMOptions.result for model info\n const prepareLLMOptionsResult = attributes['agent.prepareLLMOptions.result'];\n if (prepareLLMOptionsResult) {\n try {\n const result = typeof prepareLLMOptionsResult === 'string'\n ? JSON.parse(prepareLLMOptionsResult)\n : prepareLLMOptionsResult;\n \n if (result.llm?.name) {\n // This gives us the LLM component name, but not the model ID\n // Model ID would be in resolveModelConfig\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n return null;\n }\n\n private extractInput(span: OtelSpan, attributes: Record<string, any>): Message[] | undefined {\n // Try to extract messages from various agent span attributes\n const spanName = span.name;\n \n // Check for argument.0 which typically contains messages\n const argument0 = attributes[`${spanName}.argument.0`] || \n attributes['agent.prepareLLMOptions.argument.0'] ||\n attributes['agent.stream.argument.0'] ||\n attributes['agent.streamLegacy.argument.0'];\n \n if (argument0) {\n try {\n const messages = typeof argument0 === 'string' ? JSON.parse(argument0) : argument0;\n if (Array.isArray(messages)) {\n return messages as Message[];\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n return undefined;\n }\n\n private extractStreamResult(\n span: OtelSpan,\n attributes: Record<string, any>\n ): { output?: string; outputObject?: any; usage?: { promptTokens?: number; completionTokens?: number; totalTokens?: number } } | null {\n const spanName = span.name;\n \n // Check for result attribute\n const resultAttr = attributes[`${spanName}.result`] ||\n attributes['agent.stream.result'] ||\n attributes['agent.streamLegacy.result'] ||\n attributes['agent.streamObject.result'];\n \n if (resultAttr) {\n try {\n const result = typeof resultAttr === 'string' ? JSON.parse(resultAttr) : resultAttr;\n \n const extracted: any = {};\n \n // Extract usage/tokens\n if (result.usage) {\n extracted.usage = {\n promptTokens: result.usage.promptTokens,\n completionTokens: result.usage.completionTokens,\n totalTokens: result.usage.totalTokens,\n };\n }\n \n // Extract output object\n if (result.object) {\n extracted.outputObject = result.object;\n extracted.output = JSON.stringify(result.object);\n } else if (result.text) {\n extracted.output = result.text;\n } else if (result.response) {\n // Sometimes response is nested\n if (typeof result.response === 'string') {\n extracted.output = result.response;\n } else {\n extracted.output = JSON.stringify(result.response);\n extracted.outputObject = result.response;\n }\n }\n \n return extracted;\n } catch {\n // Ignore parse errors\n }\n }\n\n return null;\n }\n}\n\n","import { NormalizedSpan } from '../types';\n\n/**\n * Parse attributes with 'agentmark.' prefix (not 'agentmark.metadata.')\n * These are direct context attributes set by the AgentMark SDK.\n * \n * @param attributes - The attributes to extract from\n * @param prefix - The prefix to look for (default: 'agentmark.')\n * @returns Partial NormalizedSpan with extracted fields in camelCase\n */\nexport function parseAgentMarkAttributes(\n attributes: Record<string, any>, \n prefix: string = 'agentmark.'\n): Partial<NormalizedSpan> {\n const result: Partial<NormalizedSpan> = {};\n\n // Helper to get value with prefix\n const get = (key: string) => attributes[`${prefix}${key}`];\n\n // Session Context\n if (get('session_id')) result.sessionId = String(get('session_id'));\n if (get('session_name')) result.sessionName = String(get('session_name'));\n if (get('user_id')) result.userId = String(get('user_id'));\n if (get('trace_name')) result.traceName = String(get('trace_name'));\n\n // Prompt Context\n if (get('prompt_name')) result.promptName = String(get('prompt_name'));\n // Template variables. Only `agentmark.props` populates `result.props`\n // — never fall back to `agentmark.input`. The two attributes have\n // different semantics:\n // `agentmark.props` = frontmatter template variables. Set by\n // spans that ran a templated prompt (e.g.\n // invoke_agent in traced.py).\n // `agentmark.input` = arbitrary input data (dataset rows on a\n // wrapper span, chat messages on a generation\n // span, tool args on an execute_tool span).\n // Backfilling props from input would mis-label every wrapper / tool /\n // generation span as \"has template variables\", which the trace\n // drawer's Test Prompt button reads as \"this is a prompt invocation\n // you can re-run\". The asymmetry is intentional: AgentMarkTransformer\n // already does the safe direction (`props -> input`) at\n // transformers/agentmark/index.ts:258.\n if (get('props')) result.props = String(get('props'));\n\n // Span Kind (set by @traced decorator / traced() wrapper)\n // Route to semanticKind — keep kind as OTel-only (see Hazard 1 in issue #1817)\n if (get('span.kind')) result.semanticKind = String(get('span.kind'));\n\n // Dataset / Evaluation Context\n if (get('dataset_run_id')) result.datasetRunId = String(get('dataset_run_id'));\n if (get('dataset_run_name')) result.datasetRunName = String(get('dataset_run_name'));\n if (get('dataset_item_name')) result.datasetItemName = String(get('dataset_item_name'));\n if (get('dataset_expected_output')) result.datasetExpectedOutput = String(get('dataset_expected_output'));\n if (get('dataset_input')) result.datasetInput = String(get('dataset_input'));\n if (get('dataset_path')) result.datasetPath = String(get('dataset_path'));\n\n // Experiment identity (regression-gate baseline matching).\n if (get('experiment_key')) result.experimentKey = String(get('experiment_key'));\n if (get('source_tree_hash')) result.sourceTreeHash = String(get('source_tree_hash'));\n\n return result;\n}\n\n","import { NormalizedSpan, OtelSpan, ScopeTransformer, SpanType, Message, ToolCall } from '../../types';\nimport { parseAgentMarkAttributes } from '../../extractors/agentmark-parser';\nimport { parseMetadata, extractCustomMetadata } from '../../extractors/metadata-parser';\n\n/**\n * GenAI Semantic Convention attribute names.\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/\n */\nconst GenAIAttributes = {\n SYSTEM: 'gen_ai.system',\n OPERATION_NAME: 'gen_ai.operation.name',\n REQUEST_MODEL: 'gen_ai.request.model',\n REQUEST_MAX_TOKENS: 'gen_ai.request.max_tokens',\n REQUEST_TEMPERATURE: 'gen_ai.request.temperature',\n REQUEST_INPUT: 'gen_ai.request.input',\n RESPONSE_ID: 'gen_ai.response.id',\n RESPONSE_MODEL: 'gen_ai.response.model',\n RESPONSE_OUTPUT: 'gen_ai.response.output',\n RESPONSE_FINISH_REASONS: 'gen_ai.response.finish_reasons',\n USAGE_INPUT_TOKENS: 'gen_ai.usage.input_tokens',\n USAGE_OUTPUT_TOKENS: 'gen_ai.usage.output_tokens',\n TOOL_NAME: 'gen_ai.tool.name',\n TOOL_CALL_ID: 'gen_ai.tool.call.id',\n TOOL_INPUT: 'gen_ai.tool.input',\n TOOL_OUTPUT: 'gen_ai.tool.output',\n\n // Spec replacement for the deprecated gen_ai.system attribute.\n PROVIDER_NAME: 'gen_ai.provider.name',\n\n // Vendor-namespaced IO keys (dual-emitted by observe()/setInput()/\n // setOutput() alongside the deprecated gen_ai.request.input /\n // gen_ai.response.output during the OTel GenAI spec migration).\n AM_REQUEST_INPUT: 'agentmark.request.input',\n AM_RESPONSE_OUTPUT: 'agentmark.response.output',\n\n // Standard OTel GenAI semconv content keys (spec status: Development).\n // Accepted as fallbacks so spec-conformant instrumentation routed to\n // this transformer doesn't silently lose IO data on ingest.\n // https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/\n INPUT_MESSAGES: 'gen_ai.input.messages',\n OUTPUT_MESSAGES: 'gen_ai.output.messages',\n SYSTEM_INSTRUCTIONS: 'gen_ai.system_instructions',\n\n // Legacy (pre-1.27) OTel GenAI content keys.\n LEGACY_PROMPT: 'gen_ai.prompt',\n LEGACY_COMPLETION: 'gen_ai.completion',\n\n // Legacy OTel GenAI usage keys (pre input_tokens/output_tokens rename).\n USAGE_PROMPT_TOKENS: 'gen_ai.usage.prompt_tokens',\n USAGE_COMPLETION_TOKENS: 'gen_ai.usage.completion_tokens',\n} as const;\n\n/**\n * Parse a free-form serialized input value into normalized Messages.\n * Handles a JSON {role, content} messages array, or any other string\n * (wrapped as a single user message — backwards compatible).\n */\nfunction parseLooseInput(raw: string): Message[] {\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed) && parsed.length > 0) {\n const isMessagesArray = parsed.every(\n (item: unknown) =>\n item &&\n typeof item === 'object' &&\n 'role' in item &&\n 'content' in item\n );\n if (isMessagesArray) {\n return parsed as Message[];\n }\n }\n } catch {\n // Not valid JSON — fall through to plain-text handling.\n }\n return [{ role: 'user', content: raw }];\n}\n\n/**\n * Extract text content from an OTel GenAI spec parts array\n * ({type: \"text\", content} | {type: \"tool_call\", ...} | ...).\n */\nfunction specPartsToText(parts: any[]): string {\n return parts\n .filter((p: any) => p && p.type === 'text' && typeof p.content === 'string')\n .map((p: any) => p.content)\n .join('\\n');\n}\n\n/**\n * Parse spec-shaped gen_ai.input.messages / gen_ai.output.messages\n * ({role, parts: [...]}) into normalized {role, content} Messages.\n * Returns null when the value is not a non-empty spec messages array.\n */\nfunction parseSpecMessages(raw: string): Message[] | null {\n try {\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed) || parsed.length === 0) return null;\n const messages: Message[] = [];\n for (const msg of parsed) {\n if (!msg || !msg.role) continue;\n if (typeof msg.content === 'string') {\n messages.push({ role: msg.role, content: msg.content });\n } else if (Array.isArray(msg.parts)) {\n const text = specPartsToText(msg.parts);\n if (text) messages.push({ role: msg.role, content: text });\n }\n }\n return messages.length > 0 ? messages : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Extract the text of gen_ai.system_instructions — either a plain string\n * or a JSON array of spec parts ([{type: \"text\", content}]).\n */\nfunction parseSystemInstructions(raw: string): string | null {\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n const text = specPartsToText(parsed);\n return text || null;\n }\n if (typeof parsed === 'string') return parsed || null;\n } catch {\n // Not JSON — treat the raw value as the instruction text.\n }\n return raw || null;\n}\n\n/**\n * Standard span names following OpenTelemetry GenAI semantic conventions.\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/\n *\n * Span naming convention: `{operation_name}` or `{operation_name} {target}`\n * - chat / chat {model} - LLM chat completion (GENERATION)\n * - execute_tool / execute_tool {tool_name} - Tool execution (SPAN)\n * - invoke_agent / invoke_agent {agent_name} - Agent invocation (SPAN)\n */\nconst SpanNames = {\n // OTEL GenAI standard operation names (these can be followed by model/tool/agent name)\n CHAT: 'chat',\n EXECUTE_TOOL: 'execute_tool',\n INVOKE_AGENT: 'invoke_agent',\n\n // Legacy span names (for backwards compatibility)\n SESSION: 'gen_ai.session',\n TOOL_CALL: 'gen_ai.tool.call',\n SUBAGENT: 'gen_ai.subagent',\n CONVERSATION: 'gen_ai.conversation',\n LLM_TURN: 'gen_ai.llm.turn',\n} as const;\n\n/**\n * Operation names per OTEL GenAI semantic conventions.\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/\n */\nconst OperationNames = {\n CHAT: 'chat',\n EMBEDDINGS: 'embeddings',\n TEXT_COMPLETION: 'text_completion',\n GENERATE_CONTENT: 'generate_content',\n EXECUTE_TOOL: 'execute_tool',\n CREATE_AGENT: 'create_agent',\n INVOKE_AGENT: 'invoke_agent',\n} as const;\n\n/**\n * Transformer for AgentMark spans emitted via OTEL.\n * Handles GenAI semantic convention attributes and classifies spans.\n *\n * Classification rules (per OTEL GenAI conventions):\n * - GENERATION: Spans that represent actual LLM API calls (chat, text_completion)\n * - SPAN: All other spans (tool execution, agent invocation, grouping spans)\n *\n * Only spans that send requests to the LLM should be GENERATION type.\n * Wrapper/grouping spans like conversations are regular SPAN type.\n */\nexport class AgentMarkTransformer implements ScopeTransformer {\n /**\n * Classify the span type based on span name and attributes.\n *\n * GENERATION type (actual LLM calls):\n * - Spans starting with \"chat \" (OTEL convention)\n * - gen_ai.llm.turn spans (legacy traced module)\n * - gen_ai.session spans (legacy hooks) - these wrap LLM calls\n * - Spans with gen_ai.operation.name = \"chat\" or \"text_completion\"\n *\n * SPAN type (everything else):\n * - gen_ai.conversation (grouping span)\n * - execute_tool / gen_ai.tool.call (tool execution)\n * - invoke_agent / gen_ai.subagent (agent invocation)\n */\n classify(span: OtelSpan, attributes: Record<string, any>): SpanType {\n const operationName = attributes[GenAIAttributes.OPERATION_NAME];\n\n // Check operation name first (OTEL standard)\n if (operationName === OperationNames.CHAT || operationName === OperationNames.TEXT_COMPLETION) {\n return SpanType.GENERATION;\n }\n\n // Embedding operations are generations too (they have tokens/cost)\n if (operationName === OperationNames.EMBEDDINGS) {\n return SpanType.GENERATION;\n }\n\n // OTEL convention: \"chat\" or \"chat {model}\" format\n if (span.name === SpanNames.CHAT || span.name.startsWith(SpanNames.CHAT + ' ')) {\n return SpanType.GENERATION;\n }\n\n // LLM turn spans represent actual LLM responses (GENERATION) - legacy\n if (span.name === SpanNames.LLM_TURN) {\n return SpanType.GENERATION;\n }\n\n // Legacy session spans (these wrapped LLM interactions)\n if (span.name === SpanNames.SESSION) {\n return SpanType.GENERATION;\n }\n\n // Tool calls are not LLM generations (execute_tool or execute_tool {name})\n if (span.name === SpanNames.EXECUTE_TOOL ||\n span.name.startsWith(SpanNames.EXECUTE_TOOL + ' ') ||\n span.name.startsWith(SpanNames.TOOL_CALL)) {\n return SpanType.SPAN;\n }\n\n // Agent invocations are not direct LLM calls (invoke_agent or invoke_agent {name})\n if (span.name === SpanNames.INVOKE_AGENT ||\n span.name.startsWith(SpanNames.INVOKE_AGENT + ' ')) {\n return SpanType.SPAN;\n }\n\n // Legacy conversation/subagent spans are grouping spans, not LLM calls\n if (span.name === SpanNames.CONVERSATION || span.name === SpanNames.SUBAGENT) {\n return SpanType.SPAN;\n }\n\n // Fallback: check for LLM-specific attributes that indicate generation.\n // gen_ai.system is deprecated in the OTel GenAI spec in favor of\n // gen_ai.provider.name — accept either.\n if (attributes[GenAIAttributes.SYSTEM] === 'anthropic' ||\n attributes[GenAIAttributes.PROVIDER_NAME] === 'anthropic') {\n // Has usage tokens AND response output = likely an LLM generation\n if (attributes[GenAIAttributes.USAGE_INPUT_TOKENS] !== undefined &&\n attributes[GenAIAttributes.RESPONSE_OUTPUT] !== undefined) {\n return SpanType.GENERATION;\n }\n }\n\n return SpanType.SPAN;\n }\n\n /**\n * Transform the span and extract normalized fields from GenAI attributes.\n */\n transform(_span: OtelSpan, attributes: Record<string, any>): Partial<NormalizedSpan> {\n const result: Partial<NormalizedSpan> = {};\n\n // Model (prefer response model over request model)\n const responseModel = attributes[GenAIAttributes.RESPONSE_MODEL];\n const requestModel = attributes[GenAIAttributes.REQUEST_MODEL];\n if (responseModel) {\n result.model = String(responseModel);\n } else if (requestModel) {\n result.model = String(requestModel);\n }\n\n // Token usage. The current spec keys (input_tokens / output_tokens)\n // win; the legacy prompt_tokens / completion_tokens names are\n // accepted as fallbacks for older OTel GenAI emitters.\n const inputTokens = attributes[GenAIAttributes.USAGE_INPUT_TOKENS]\n ?? attributes[GenAIAttributes.USAGE_PROMPT_TOKENS];\n const outputTokens = attributes[GenAIAttributes.USAGE_OUTPUT_TOKENS]\n ?? attributes[GenAIAttributes.USAGE_COMPLETION_TOKENS];\n if (typeof inputTokens === 'number') {\n result.inputTokens = inputTokens;\n }\n if (typeof outputTokens === 'number') {\n result.outputTokens = outputTokens;\n }\n if (result.inputTokens !== undefined && result.outputTokens !== undefined) {\n result.totalTokens = result.inputTokens + result.outputTokens;\n }\n\n // Cost from agentmark.usage.cost_usd attribute\n const costUsd = attributes['agentmark.usage.cost_usd'];\n if (typeof costUsd === 'number' && costUsd > 0) {\n result.cost = costUsd;\n }\n\n // Finish reason (stored as JSON array per OTEL spec)\n const finishReasons = attributes[GenAIAttributes.RESPONSE_FINISH_REASONS];\n if (finishReasons) {\n try {\n const reasons = JSON.parse(finishReasons);\n if (Array.isArray(reasons) && reasons.length > 0) {\n result.finishReason = String(reasons[0]);\n }\n } catch {\n // If not valid JSON, use as-is\n result.finishReason = String(finishReasons);\n }\n }\n\n // Settings from request attributes\n const maxTokens = attributes[GenAIAttributes.REQUEST_MAX_TOKENS];\n const temperature = attributes[GenAIAttributes.REQUEST_TEMPERATURE];\n if (maxTokens !== undefined || temperature !== undefined) {\n result.settings = {};\n if (typeof maxTokens === 'number') {\n result.settings.maxTokens = maxTokens;\n }\n if (typeof temperature === 'number') {\n result.settings.temperature = temperature;\n }\n }\n\n // Input. Precedence (additive — AgentMark keys always win over the\n // standard-spec fallbacks, so existing traffic is byte-identical):\n // 1. gen_ai.request.input (deprecated AgentMark key, still emitted)\n // 2. agentmark.request.input (vendor-namespaced replacement)\n // 3. gen_ai.input.messages (OTel GenAI spec shape, {role, parts[]})\n // 4. gen_ai.prompt (legacy OTel GenAI key)\n // The agentmark.input / agentmark.props fallback below also outranks\n // the spec keys (3/4) — every agentmark.* key wins over spec fallbacks.\n const requestInput = attributes[GenAIAttributes.REQUEST_INPUT]\n ?? attributes[GenAIAttributes.AM_REQUEST_INPUT];\n const hasAgentmarkInput = Boolean(\n attributes['agentmark.input'] ?? attributes['agentmark.props']\n );\n if (requestInput && typeof requestInput === 'string') {\n result.input = parseLooseInput(requestInput);\n } else if (!hasAgentmarkInput) {\n const inputMessages = attributes[GenAIAttributes.INPUT_MESSAGES];\n if (inputMessages && typeof inputMessages === 'string') {\n const messages = parseSpecMessages(inputMessages);\n if (messages) result.input = messages;\n }\n if (!result.input) {\n const legacyPrompt = attributes[GenAIAttributes.LEGACY_PROMPT];\n if (legacyPrompt && typeof legacyPrompt === 'string') {\n result.input = parseLooseInput(legacyPrompt);\n }\n }\n }\n\n // gen_ai.system_instructions (OTel GenAI spec): fold into the input\n // messages as a leading system message — matching how our SDKs embed\n // the system prompt as messages[0] in gen_ai.request.input.\n const systemInstructions = attributes[GenAIAttributes.SYSTEM_INSTRUCTIONS];\n if (systemInstructions && typeof systemInstructions === 'string' && !hasAgentmarkInput) {\n const text = parseSystemInstructions(systemInstructions);\n if (text && (!result.input || result.input[0]?.role !== 'system')) {\n result.input = [{ role: 'system', content: text }, ...(result.input ?? [])];\n }\n }\n\n // Output. Precedence mirrors input:\n // 1. gen_ai.response.output (deprecated AgentMark key, still emitted)\n // 2. agentmark.response.output (vendor-namespaced replacement)\n // 3. gen_ai.output.messages (OTel GenAI spec shape)\n // 4. gen_ai.completion (legacy OTel GenAI key)\n // The agentmark.output fallback below also outranks the spec keys.\n const responseOutput = attributes[GenAIAttributes.RESPONSE_OUTPUT]\n ?? attributes[GenAIAttributes.AM_RESPONSE_OUTPUT];\n const hasAgentmarkOutput = Boolean(attributes['agentmark.output']);\n if (responseOutput && typeof responseOutput === 'string') {\n result.output = responseOutput;\n try {\n result.outputObject = JSON.parse(responseOutput);\n } catch { /* not JSON, keep as text only */ }\n } else if (!hasAgentmarkOutput) {\n const outputMessages = attributes[GenAIAttributes.OUTPUT_MESSAGES];\n if (outputMessages && typeof outputMessages === 'string') {\n const messages = parseSpecMessages(outputMessages);\n if (messages) {\n result.output = messages.map((m) => m.content).join('\\n');\n }\n }\n if (result.output === undefined) {\n const legacyCompletion = attributes[GenAIAttributes.LEGACY_COMPLETION];\n if (legacyCompletion && typeof legacyCompletion === 'string') {\n result.output = legacyCompletion;\n try {\n result.outputObject = JSON.parse(legacyCompletion);\n } catch { /* not JSON, keep as text only */ }\n }\n }\n }\n\n // Fallback: agentmark.input / agentmark.output (set by SDK's set_input/set_output)\n // Also accept the legacy `agentmark.props` key as a fallback. Pre-2026-05\n // adapter wrappers set props instead of input; the OtelGenAiTransformer\n // already accepted both, this transformer didn't, which caused\n // experiment wrapper spans (emitted under the \"agentmark\" scope) to\n // render with empty Input panels in the trace drawer despite the\n // adapter setting the attribute. Defense-in-depth: tolerate either\n // key here so any external caller still using the legacy attribute\n // works without forcing them to migrate.\n const amInput = attributes['agentmark.input'] ?? attributes['agentmark.props'];\n if (amInput && typeof amInput === 'string' && !result.input) {\n // The WebhookRunner writes agentmark.input as a JSON messages\n // array ({role, content} pairs). Parse it so the wrapper span's\n // input renders as messages, mirroring the REQUEST_INPUT\n // handling above; anything else stays a single user message.\n let parsedMessages: Message[] | null = null;\n try {\n const parsed = JSON.parse(amInput);\n if (\n Array.isArray(parsed) &&\n parsed.length > 0 &&\n parsed.every(\n (item: unknown) =>\n item &&\n typeof item === 'object' &&\n 'role' in item &&\n 'content' in item\n )\n ) {\n parsedMessages = parsed as Message[];\n }\n } catch { /* not JSON — fall through to plain text */ }\n result.input = parsedMessages ?? [{ role: 'user', content: amInput }];\n }\n const amOutput = attributes['agentmark.output'];\n if (amOutput && typeof amOutput === 'string' && !result.output) {\n result.output = amOutput;\n try {\n result.outputObject = JSON.parse(amOutput);\n } catch { /* ignore */ }\n }\n\n // Tool call spans: extract tool info\n const toolName = attributes[GenAIAttributes.TOOL_NAME];\n const toolCallId = attributes[GenAIAttributes.TOOL_CALL_ID];\n const toolInput = attributes[GenAIAttributes.TOOL_INPUT];\n const toolOutput = attributes[GenAIAttributes.TOOL_OUTPUT];\n\n if (toolName && typeof toolName === 'string') {\n // Override name with tool name for better grouping\n result.name = toolName;\n\n // Build tool call info\n const toolCall: ToolCall = {\n type: 'tool-call',\n toolCallId: typeof toolCallId === 'string' ? toolCallId : '',\n toolName: toolName,\n args: {},\n };\n\n // Parse tool input (JSON string)\n if (toolInput && typeof toolInput === 'string') {\n try {\n toolCall.args = JSON.parse(toolInput);\n } catch {\n // If not valid JSON, store as raw value\n toolCall.args = { raw: toolInput };\n }\n }\n\n // Parse tool output (JSON string)\n if (toolOutput && typeof toolOutput === 'string') {\n toolCall.result = toolOutput;\n }\n\n result.toolCalls = [toolCall];\n }\n\n // Extract agentmark-specific attributes (prompt_name, props, session_id, etc.)\n // First extract from agentmark.* prefix (direct attributes)\n const agentmarkAttrs = parseAgentMarkAttributes(attributes);\n\n // Also extract from agentmark.metadata.* prefix (for custom metadata passed via telemetry)\n const metadataAttrs = parseMetadata(attributes, 'agentmark.metadata.');\n\n // Extract custom metadata keys (anything not in known fields)\n const customMetadata = extractCustomMetadata(attributes, 'agentmark.metadata.');\n\n return {\n ...result,\n ...metadataAttrs, // agentmark.metadata.* values (lower priority)\n ...agentmarkAttrs, // agentmark.* values (higher priority)\n // Only include metadata field if there are custom metadata keys\n ...(Object.keys(customMetadata).length > 0 ? { metadata: customMetadata } : {}),\n };\n }\n}\n\n/**\n * The scope name used by AgentMark's OTEL tracer.\n * Used by the registry to route spans to this transformer.\n */\nexport const AGENTMARK_SCOPE_NAME = 'agentmark';\n\n// Backwards compatibility export\nexport { AgentMarkTransformer as ClaudeAgentTransformer };\n","/**\n * Transformer for the official OTel GenAI Semantic Conventions (v1.37.0+).\n *\n * Handles attribute names:\n * gen_ai.input.messages — JSON array of input messages ({role, parts[]})\n * gen_ai.output.messages — JSON array of output messages ({role, parts[], finish_reason})\n * gen_ai.system_instructions — JSON array of system instruction parts\n *\n * Used by frameworks that follow the official spec:\n * - Pydantic AI (scope: \"pydantic-ai\")\n * - Any future OTel-compliant GenAI instrumentation\n *\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/\n */\n\nimport { NormalizedSpan, OtelSpan, ScopeTransformer, SpanType, Message, ToolCall } from '../../types';\nimport { parseAgentMarkAttributes } from '../../extractors/agentmark-parser';\nimport { parseMetadata, extractCustomMetadata } from '../../extractors/metadata-parser';\n\nconst Attrs = {\n // Standard OTel GenAI attributes\n SYSTEM: 'gen_ai.system',\n PROVIDER_NAME: 'gen_ai.provider.name',\n OPERATION_NAME: 'gen_ai.operation.name',\n REQUEST_MODEL: 'gen_ai.request.model',\n REQUEST_MAX_TOKENS: 'gen_ai.request.max_tokens',\n REQUEST_TEMPERATURE: 'gen_ai.request.temperature',\n RESPONSE_ID: 'gen_ai.response.id',\n RESPONSE_MODEL: 'gen_ai.response.model',\n RESPONSE_FINISH_REASONS: 'gen_ai.response.finish_reasons',\n USAGE_INPUT_TOKENS: 'gen_ai.usage.input_tokens',\n USAGE_OUTPUT_TOKENS: 'gen_ai.usage.output_tokens',\n\n // v1.37.0+ content attributes (canonical OTel GenAI semantic conventions).\n // SDKs that emit the AgentMark-scoped equivalents (`gen_ai.request.input`\n // / `gen_ai.response.output`) are\n // also accepted here as fallbacks so an SDK picking either key set\n // doesn't silently lose IO data on ingest. The canonical pair always wins\n // when both are present.\n INPUT_MESSAGES: 'gen_ai.input.messages',\n OUTPUT_MESSAGES: 'gen_ai.output.messages',\n REQUEST_INPUT_FALLBACK: 'gen_ai.request.input',\n RESPONSE_OUTPUT_FALLBACK: 'gen_ai.response.output',\n SYSTEM_INSTRUCTIONS: 'gen_ai.system_instructions',\n TOOL_DEFINITIONS: 'gen_ai.tool.definitions',\n\n // Legacy (pre-1.27) OTel GenAI content keys, accepted as last-resort\n // fallbacks below the canonical and AgentMark-scoped keys.\n LEGACY_PROMPT: 'gen_ai.prompt',\n LEGACY_COMPLETION: 'gen_ai.completion',\n\n // Legacy OTel GenAI usage keys (pre input_tokens/output_tokens rename).\n USAGE_PROMPT_TOKENS: 'gen_ai.usage.prompt_tokens',\n USAGE_COMPLETION_TOKENS: 'gen_ai.usage.completion_tokens',\n\n // Tool call attributes (v1.37.0+)\n TOOL_NAME: 'gen_ai.tool.name',\n TOOL_CALL_ID: 'gen_ai.tool.call.id',\n TOOL_CALL_ARGS: 'gen_ai.tool.call.arguments',\n TOOL_CALL_RESULT: 'gen_ai.tool.call.result',\n} as const;\n\n/**\n * Extract text content from a parts array.\n * OTel GenAI v1.37.0 messages use: {role, parts: [{type: \"text\", content: \"...\"}]}\n */\nfunction partsToText(parts: any[]): string {\n return parts\n .filter((p: any) => p.type === 'text' && p.content)\n .map((p: any) => p.content)\n .join('\\n');\n}\n\n/**\n * Convert OTel GenAI messages ({role, parts[]}) to normalized Messages ({role, content}).\n */\nfunction normalizeMessages(raw: string): Message[] | null {\n try {\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed) || parsed.length === 0) return null;\n\n const messages: Message[] = [];\n for (const msg of parsed) {\n if (!msg.role) continue;\n if (msg.content && typeof msg.content === 'string') {\n // Already in {role, content} format\n messages.push(msg);\n } else if (msg.parts && Array.isArray(msg.parts)) {\n // OTel v1.37.0 format: {role, parts: [{type, content}]}\n const text = partsToText(msg.parts);\n if (text) {\n messages.push({ role: msg.role, content: text });\n }\n }\n }\n return messages.length > 0 ? messages : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Extract structured output from OTel GenAI output messages.\n * Pydantic AI structured output comes as a tool_call with name \"final_result\".\n */\nfunction extractStructuredOutput(raw: string): { output: string; outputObject?: any } | null {\n try {\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return null;\n\n for (const msg of parsed) {\n for (const part of (msg.parts || [])) {\n if (part.type === 'tool_call' && part.arguments) {\n // Structured output via tool call (e.g., final_result)\n return {\n output: JSON.stringify(part.arguments),\n outputObject: part.arguments,\n };\n }\n }\n }\n // No tool calls — check for text output\n for (const msg of parsed) {\n const text = partsToText(msg.parts || []);\n if (text) return { output: text };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport class OtelGenAiTransformer implements ScopeTransformer {\n\n classify(span: OtelSpan, attributes: Record<string, any>): SpanType {\n // \"chat {model}\" spans with usage tokens are GENERATION\n if (span.name.startsWith('chat ')) return SpanType.GENERATION;\n // \"invoke_agent\" or \"agent run\" spans are parent SPAN\n if (span.name.startsWith('invoke_agent') || span.name === 'agent run') return SpanType.SPAN;\n // \"execute_tool\" spans\n if (span.name.startsWith('execute_tool') || span.name.startsWith('running ')) return SpanType.SPAN;\n // Fallback: check for token usage\n if (attributes[Attrs.USAGE_INPUT_TOKENS] !== undefined) return SpanType.GENERATION;\n return SpanType.SPAN;\n }\n\n transform(span: OtelSpan, attributes: Record<string, any>): Partial<NormalizedSpan> {\n const result: Partial<NormalizedSpan> = {};\n\n // Model\n const model = attributes[Attrs.RESPONSE_MODEL] || attributes[Attrs.REQUEST_MODEL];\n if (model && typeof model === 'string') {\n result.model = model;\n }\n\n // Tokens — current spec keys win; legacy prompt_tokens /\n // completion_tokens names accepted as fallbacks for older emitters.\n const inputTokens = attributes[Attrs.USAGE_INPUT_TOKENS]\n ?? attributes[Attrs.USAGE_PROMPT_TOKENS];\n const outputTokens = attributes[Attrs.USAGE_OUTPUT_TOKENS]\n ?? attributes[Attrs.USAGE_COMPLETION_TOKENS];\n if (typeof inputTokens === 'number') result.inputTokens = inputTokens;\n if (typeof outputTokens === 'number') result.outputTokens = outputTokens;\n if (result.inputTokens !== undefined && result.outputTokens !== undefined) {\n result.totalTokens = result.inputTokens + result.outputTokens;\n }\n\n // Finish reason\n const finishReasons = attributes[Attrs.RESPONSE_FINISH_REASONS];\n if (Array.isArray(finishReasons) && finishReasons.length > 0) {\n result.finishReason = finishReasons[0];\n }\n\n // Temperature\n const temperature = attributes[Attrs.REQUEST_TEMPERATURE];\n if (typeof temperature === 'number') {\n result.settings = { ...result.settings, temperature };\n }\n\n // Input messages — canonical OTel GenAI key (gen_ai.input.messages).\n // Fall back to the AgentMark-scoped equivalent (gen_ai.request.input)\n // so SDKs that picked the older key set don't lose IO data on ingest.\n const inputMessages = attributes[Attrs.INPUT_MESSAGES]\n ?? attributes[Attrs.REQUEST_INPUT_FALLBACK]\n ?? attributes[Attrs.LEGACY_PROMPT];\n if (inputMessages && typeof inputMessages === 'string') {\n const messages = normalizeMessages(inputMessages);\n if (messages) result.input = messages;\n }\n\n // gen_ai.system_instructions: fold into the input messages as a\n // leading system message — matching how AgentMark SDKs embed the\n // system prompt as messages[0] of the input.\n const systemInstructions = attributes[Attrs.SYSTEM_INSTRUCTIONS];\n if (systemInstructions && typeof systemInstructions === 'string') {\n let text: string | null = null;\n try {\n const parsed = JSON.parse(systemInstructions);\n if (Array.isArray(parsed)) {\n text = partsToText(parsed) || null;\n } else if (typeof parsed === 'string') {\n text = parsed || null;\n }\n } catch {\n text = systemInstructions;\n }\n if (text && (!result.input || result.input[0]?.role !== 'system')) {\n result.input = [{ role: 'system', content: text }, ...(result.input ?? [])];\n }\n }\n\n // Output messages — canonical OTel GenAI key (gen_ai.output.messages),\n // with gen_ai.response.output as a fallback for older SDK emitters.\n const outputMessages = attributes[Attrs.OUTPUT_MESSAGES]\n ?? attributes[Attrs.RESPONSE_OUTPUT_FALLBACK]\n ?? attributes[Attrs.LEGACY_COMPLETION];\n if (outputMessages && typeof outputMessages === 'string') {\n const extracted = extractStructuredOutput(outputMessages);\n if (extracted) {\n result.output = extracted.output;\n if (extracted.outputObject) {\n result.outputObject = extracted.outputObject;\n }\n } else {\n // Not a spec messages array — the legacy gen_ai.completion\n // key (and some emitters' response.output) carry plain text.\n result.output = outputMessages;\n }\n }\n\n // Pydantic AI agent run span: extract user prompt from all_messages\n // when gen_ai.input.messages is not available (agent run spans don't have it)\n const allMessages = attributes['pydantic_ai.all_messages'];\n if (allMessages && typeof allMessages === 'string' && !result.input) {\n const messages = normalizeMessages(allMessages);\n if (messages) {\n const userMessages = messages.filter(m => m.role === 'user');\n if (userMessages.length > 0) {\n result.input = userMessages;\n }\n }\n }\n\n // Pydantic AI agent span: final_result attribute contains structured output\n const finalResult = attributes['final_result'];\n if (finalResult && typeof finalResult === 'string' && !result.output) {\n result.output = finalResult;\n try {\n result.outputObject = JSON.parse(finalResult);\n } catch { /* ignore */ }\n }\n\n // AgentMark props: the original prompt input (set by the adapter)\n // This is the semantic input that maps to the prompt's input_schema.\n const propsStr = attributes['agentmark.props'];\n if (propsStr && typeof propsStr === 'string' && !result.input) {\n try {\n const props = JSON.parse(propsStr);\n result.input = [{ role: 'user', content: JSON.stringify(props) }];\n } catch { /* ignore */ }\n }\n\n // AgentMark output: structured result (set by the adapter)\n const outputStr = attributes['agentmark.output'];\n if (outputStr && typeof outputStr === 'string' && !result.output) {\n result.output = outputStr;\n try {\n result.outputObject = JSON.parse(outputStr);\n } catch { /* ignore */ }\n }\n\n // Tool execution spans\n const toolName = attributes[Attrs.TOOL_NAME];\n if (toolName && typeof toolName === 'string') {\n result.name = toolName;\n const toolCall: ToolCall = {\n type: 'tool-call',\n toolCallId: attributes[Attrs.TOOL_CALL_ID] || '',\n toolName,\n args: {},\n };\n const toolArgs = attributes[Attrs.TOOL_CALL_ARGS];\n if (toolArgs && typeof toolArgs === 'string') {\n try { toolCall.args = JSON.parse(toolArgs); } catch { toolCall.args = { raw: toolArgs }; }\n }\n const toolResult = attributes[Attrs.TOOL_CALL_RESULT];\n if (toolResult && typeof toolResult === 'string') {\n toolCall.result = toolResult;\n }\n result.toolCalls = [toolCall];\n }\n\n // Parse agentmark.* attributes if present\n const agentmarkAttrs = parseAgentMarkAttributes(attributes);\n Object.assign(result, agentmarkAttrs);\n\n // Metadata\n const parsedMeta = parseMetadata(attributes);\n if (parsedMeta.metadata && Object.keys(parsedMeta.metadata).length > 0) {\n result.metadata = { ...result.metadata, ...parsedMeta.metadata };\n }\n const customMeta = extractCustomMetadata(attributes);\n if (Object.keys(customMeta).length > 0) {\n result.metadata = { ...result.metadata, ...customMeta };\n }\n\n return result;\n }\n\n static readonly SCOPE_NAME = 'pydantic-ai';\n}\n","import { OtelResource, OtelScope, OtelSpan, OtelEvent, OtelLink } from '../types';\nimport { isSafeKey } from '../utils/key-sanitizer';\n\n/**\n * OTLP attribute value types\n */\nexport interface OtlpAttributeValue {\n stringValue?: string;\n intValue?: string | number;\n doubleValue?: number;\n boolValue?: boolean;\n arrayValue?: {\n values?: OtlpAttributeValue[];\n };\n bytesValue?: string | Uint8Array;\n}\n\n/**\n * OTLP attribute structure\n */\nexport interface OtlpAttribute {\n key: string;\n value: OtlpAttributeValue;\n}\n\n/**\n * Raw OTLP span structure\n */\nexport interface OtlpSpan {\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n traceState?: string;\n name: string;\n kind: number;\n startTimeUnixNano: string;\n endTimeUnixNano: string;\n attributes?: OtlpAttribute[];\n events?: OtlpEvent[];\n links?: OtlpLink[];\n status?: {\n code: number;\n message?: string;\n };\n droppedAttributesCount?: number;\n droppedEventsCount?: number;\n droppedLinksCount?: number;\n}\n\n/**\n * Raw OTLP event structure\n */\nexport interface OtlpEvent {\n timeUnixNano: string;\n name: string;\n attributes?: OtlpAttribute[];\n droppedAttributesCount?: number;\n}\n\n/**\n * Raw OTLP link structure\n */\nexport interface OtlpLink {\n traceId: string;\n spanId: string;\n traceState?: string;\n attributes?: OtlpAttribute[];\n droppedAttributesCount?: number;\n}\n\n/**\n * Raw OTLP resource structure\n */\nexport interface OtlpResource {\n attributes?: OtlpAttribute[];\n droppedAttributesCount?: number;\n}\n\n/**\n * Raw OTLP scope structure\n */\nexport interface OtlpScope {\n name?: string;\n version?: string;\n}\n\n/**\n * Raw OTLP scope spans structure\n */\nexport interface OtlpScopeSpans {\n scope?: OtlpScope;\n spans: OtlpSpan[];\n}\n\n/**\n * Raw OTLP resource spans structure\n */\nexport interface OtlpResourceSpans {\n resource?: OtlpResource;\n scopeSpans: OtlpScopeSpans[];\n}\n\n/**\n * Convert OTLP attribute value to JavaScript value\n */\nfunction convertOtlpValue(value: OtlpAttributeValue): any {\n if (value.stringValue !== undefined) {\n return value.stringValue;\n }\n if (value.intValue !== undefined) {\n // OTLP intValue can be string or number\n return typeof value.intValue === 'string' ? parseInt(value.intValue, 10) : value.intValue;\n }\n if (value.doubleValue !== undefined) {\n return value.doubleValue;\n }\n if (value.boolValue !== undefined) {\n return value.boolValue;\n }\n if (value.arrayValue?.values) {\n return value.arrayValue.values.map(convertOtlpValue);\n }\n if (value.bytesValue !== undefined) {\n // Return as-is for bytes, caller can handle if needed\n return value.bytesValue;\n }\n return undefined;\n}\n\n/**\n * Convert OTLP attribute array to flat Record<string, any>\n */\nexport function convertOtlpAttributes(attributes?: OtlpAttribute[]): Record<string, any> {\n if (!attributes || attributes.length === 0) {\n return {};\n }\n\n const result: Record<string, any> = {};\n for (const attr of attributes) {\n // Skip dangerous keys to prevent prototype pollution\n if (attr.key && isSafeKey(attr.key)) {\n result[attr.key] = convertOtlpValue(attr.value);\n }\n }\n return result;\n}\n\n/**\n * Extract resource, scope, and span from OTLP structure\n */\nexport function extractResourceScopeSpan(\n resourceSpans: OtlpResourceSpans\n): Array<{ resource: OtelResource; scope: OtelScope; span: OtelSpan }> {\n const result: Array<{ resource: OtelResource; scope: OtelScope; span: OtelSpan }> = [];\n\n // Convert resource attributes\n const resourceAttributes = convertOtlpAttributes(resourceSpans.resource?.attributes);\n\n // Process each scope spans\n for (const scopeSpans of resourceSpans.scopeSpans || []) {\n const scope: OtelScope = {\n name: scopeSpans.scope?.name,\n version: scopeSpans.scope?.version,\n };\n\n // Process each span\n for (const otlpSpan of scopeSpans.spans || []) {\n // Convert span attributes\n const spanAttributes = convertOtlpAttributes(otlpSpan.attributes);\n\n // Convert events\n const events: OtelEvent[] = (otlpSpan.events || []).map((otlpEvent) => ({\n timeUnixNano: otlpEvent.timeUnixNano,\n name: otlpEvent.name,\n attributes: convertOtlpAttributes(otlpEvent.attributes),\n }));\n\n // Convert links\n const links: OtelLink[] = (otlpSpan.links || []).map((otlpLink) => ({\n traceId: otlpLink.traceId,\n spanId: otlpLink.spanId,\n traceState: otlpLink.traceState,\n attributes: convertOtlpAttributes(otlpLink.attributes),\n }));\n\n const span: OtelSpan = {\n traceId: otlpSpan.traceId,\n spanId: otlpSpan.spanId,\n parentSpanId: otlpSpan.parentSpanId,\n traceState: otlpSpan.traceState,\n name: otlpSpan.name,\n kind: otlpSpan.kind,\n startTimeUnixNano: otlpSpan.startTimeUnixNano,\n endTimeUnixNano: otlpSpan.endTimeUnixNano,\n attributes: spanAttributes,\n events,\n links,\n status: otlpSpan.status,\n };\n\n const resource: OtelResource = {\n attributes: resourceAttributes,\n };\n\n result.push({ resource, scope, span });\n }\n }\n\n return result;\n}\n\n","import { NormalizedSpan, SpanType } from '../types';\n\n/** Valid semantic kind values. */\nexport const SEMANTIC_KINDS = ['function', 'llm', 'tool', 'agent', 'retrieval', 'embedding', 'guardrail'] as const;\nexport type SemanticKind = typeof SEMANTIC_KINDS[number];\n\nconst VALID_KINDS = new Set<string>(SEMANTIC_KINDS);\n\n/** OpenInference span.kind → AgentMark semantic kind. */\nconst OPENINFERENCE_MAP: Record<string, SemanticKind> = {\n 'CHAIN': 'function',\n 'LLM': 'llm',\n 'TOOL': 'tool',\n 'AGENT': 'agent',\n 'RETRIEVER': 'retrieval',\n 'EMBEDDING': 'embedding',\n 'GUARDRAIL': 'guardrail',\n 'RERANKER': 'retrieval',\n};\n\n/** Framework-specific attribute mappings (checked in order). */\nconst FRAMEWORK_MAPPINGS: Array<{ key: string; map: Record<string, SemanticKind> }> = [\n {\n key: 'ai.operationId', // Vercel AI SDK\n // The AI SDK emits ai.operationId WITH the \"ai.\" prefix (e.g.\n // \"ai.generateText\"); accept both prefixed and unprefixed so generation\n // wrappers resolve to \"llm\" instead of falling through to \"function\".\n map: {\n 'embed': 'embedding',\n 'ai.embed': 'embedding',\n 'generateText': 'llm',\n 'ai.generateText': 'llm',\n 'streamText': 'llm',\n 'ai.streamText': 'llm',\n 'generateObject': 'llm',\n 'ai.generateObject': 'llm',\n 'streamObject': 'llm',\n 'ai.streamObject': 'llm',\n },\n },\n {\n key: 'traceloop.span.kind', // Traceloop / OpenLLMetry\n map: { 'LLM': 'llm', 'TOOL': 'tool', 'AGENT': 'agent', 'WORKFLOW': 'function', 'TASK': 'function' },\n },\n {\n key: 'langchain.run_type', // LangChain via OTLP\n map: { 'llm': 'llm', 'chat_model': 'llm', 'retriever': 'retrieval', 'tool': 'tool', 'chain': 'function', 'embedding': 'embedding' },\n },\n {\n key: 'genkit:type', // Firebase Genkit\n map: { 'model': 'llm', 'tool': 'tool', 'flow': 'function', 'retriever': 'retrieval', 'embedder': 'embedding' },\n },\n];\n\n/**\n * Resolve the semantic kind of a span using a 9-level priority chain.\n *\n * Priority:\n * 1. normalized.semanticKind (from agentmark.span.kind attribute) — if valid\n * 2. openinference.span.kind attribute\n * 3. Framework-specific attributes (Vercel AI SDK, Traceloop, LangChain, Genkit)\n * 4. gen_ai.operation.name → llm/embedding\n * 5. Type = GENERATION → llm\n * 6. Carries a model (gen_ai.request.model) → llm — vendor-neutral generation\n * signal; catches model calls the framework maps above don't name.\n * 7. Has non-empty ToolCalls → tool\n * 8. Name-based heuristics\n * 9. Default → function\n */\nexport function resolveSemanticKind(\n normalized: Partial<NormalizedSpan> & { type: SpanType; name: string },\n allAttributes: Record<string, any>,\n): SemanticKind {\n // 1. Explicit agentmark.span.kind (already parsed into semanticKind)\n if (normalized.semanticKind && VALID_KINDS.has(normalized.semanticKind)) {\n return normalized.semanticKind as SemanticKind;\n }\n\n // 2. OpenInference span.kind attribute\n const oiKind = allAttributes['openinference.span.kind'];\n if (oiKind) {\n const mapped = OPENINFERENCE_MAP[String(oiKind).toUpperCase()];\n if (mapped) return mapped;\n }\n\n // 3. Framework-specific attributes\n for (const { key, map } of FRAMEWORK_MAPPINGS) {\n const val = allAttributes[key];\n if (val) {\n const mapped = map[String(val)];\n if (mapped) return mapped;\n }\n }\n\n // 4. gen_ai.operation.name\n const opName = allAttributes['gen_ai.operation.name'];\n if (opName) {\n const op = String(opName).toLowerCase();\n if (op === 'chat' || op === 'text_completion' || op === 'generate_content') return 'llm';\n if (op === 'embeddings') return 'embedding';\n }\n\n // 5. Type = GENERATION → llm\n if (normalized.type === SpanType.GENERATION) {\n return 'llm';\n }\n\n // 6. Carries a model (OTel gen_ai.request.model) → llm. Vendor-neutral\n // generation signal that catches model calls the framework maps above don't\n // name (e.g. the Vercel ai.generateText wrapper, whose ai.operationId the\n // map may not cover). A span with a resolved model is a model call —\n // including an LLM that also requested tools — so this is checked before the\n // ToolCalls heuristic.\n if (normalized.model) {\n return 'llm';\n }\n\n // 7. Has non-empty ToolCalls → tool\n if (normalized.toolCalls && normalized.toolCalls.length > 0) {\n return 'tool';\n }\n\n // 8. Name-based heuristics\n const name = (normalized.name || '').toLowerCase();\n if (/retriev|search|rag/i.test(name)) return 'retrieval';\n if (/embed/i.test(name)) return 'embedding';\n if (/guard|safety/i.test(name)) return 'guardrail';\n\n // 9. Default\n return 'function';\n}\n","import { OtelSpan, SpanType } from './types';\r\n\r\nexport class TypeClassifier {\r\n classify(span: OtelSpan, attributes: Record<string, any>): SpanType {\r\n // 1. Check for GenAI semantic conventions\r\n // OTel GenAI semantic conventions use gen_ai.system (deprecated) /\r\n // gen_ai.provider.name (its spec replacement) as strong indicators\r\n if (attributes['gen_ai.system'] || attributes['gen_ai.provider.name'] || attributes['gen_ai.request.model'] || attributes['gen_ai.operation.name']) {\r\n return SpanType.GENERATION;\r\n }\r\n\r\n // 2. Check for AI SDK generation indicators (Vercel AI SDK)\r\n // Vercel AI SDK uses specific span names or attributes\r\n if (\r\n attributes['ai.response.text'] ||\r\n attributes['ai.result.text'] ||\r\n attributes['ai.response.toolCalls'] ||\r\n attributes['ai.result.toolCalls']\r\n ) {\r\n return SpanType.GENERATION;\r\n }\r\n\r\n // Check span name for common patterns if no attributes match\r\n if (span.name.startsWith('ai.generate') || span.name.startsWith('ai.stream')) {\r\n return SpanType.GENERATION;\r\n }\r\n\r\n // Default to SPAN\r\n return SpanType.SPAN;\r\n }\r\n}\r\n\r\nexport const typeClassifier = new TypeClassifier();\r\n","import { NormalizedSpan, OtelResource, OtelScope, OtelSpan, SpanType } from './types';\nimport { registry } from './registry';\nimport { AiSdkTransformer } from './transformers/ai-sdk';\nimport { MastraTransformer } from './transformers/mastra';\nimport { AgentMarkTransformer } from './transformers/agentmark';\nimport { OtelGenAiTransformer } from './transformers/otel-genai';\nimport { OtlpResourceSpans, extractResourceScopeSpan } from './converters/otlp-converter';\nimport { parseAgentMarkAttributes } from './extractors/agentmark-parser';\nimport { resolveSemanticKind } from './resolvers/semantic-kind-resolver';\n\n// Register scope-specific transformers\nregistry.register('ai', new AiSdkTransformer()); // Vercel AI SDK\nregistry.register('default-tracer', new MastraTransformer()); // Mastra\nregistry.register('agentmark', new AgentMarkTransformer()); // AgentMark SDK\nregistry.register('pydantic-ai', new OtelGenAiTransformer()); // Pydantic AI\n// Default: OTel GenAI semconv v1.37+ (the official standard)\nregistry.setDefault(new OtelGenAiTransformer());\n\n/**\n * OTLP status.code arrives in different encodings depending on the SDK's\n * JSON serializer: the numeric enum value (0/1/2), the proto enum name\n * ('STATUS_CODE_ERROR'), or a short name ('Error', 'OK'). Normalize to the\n * canonical numeric strings '0' (Unset) / '1' (Ok) / '2' (Error) so every\n * downstream store (gateway ClickHouse rows, CLI local SQLite) gets one\n * vocabulary. Unknown values pass through unchanged.\n */\nconst OTLP_STATUS_CODE_MAP: Record<string, string> = {\n '0': '0', STATUS_CODE_UNSET: '0', UNSET: '0', Unset: '0',\n '1': '1', STATUS_CODE_OK: '1', OK: '1', Ok: '1',\n '2': '2', STATUS_CODE_ERROR: '2', ERROR: '2', Error: '2',\n};\n\nexport function normalizeOtlpStatusCode(raw: string | number | undefined | null): string {\n if (raw === undefined || raw === null || raw === '') {\n return '0';\n }\n const key = String(raw);\n return OTLP_STATUS_CODE_MAP[key] ?? key;\n}\n\nexport function normalizeSpan(\n resource: OtelResource,\n scope: OtelScope,\n span: OtelSpan\n): NormalizedSpan {\n // 1. Merge attributes (Resource + Span)\n const allAttributes = {\n ...(resource.attributes || {}),\n ...(span.attributes || {}),\n };\n\n // 2. Get transformer and classify span type\n const transformer = registry.getTransformer(scope.name || '');\n const type = transformer\n ? transformer.classify(span, allAttributes)\n : SpanType.SPAN; // Default if no transformer\n\n // Timing (convert nanoseconds string to milliseconds number)\n // Use BigInt division to preserve precision, then add remainder for decimals\n const startNs = BigInt(span.startTimeUnixNano);\n const endNs = BigInt(span.endTimeUnixNano);\n const startMsInt = startNs / BigInt(1000000);\n const startMsRemainder = Number(startNs % BigInt(1000000)) / 1000000;\n const endMsInt = endNs / BigInt(1000000);\n const endMsRemainder = Number(endNs % BigInt(1000000)) / 1000000;\n const startMs = Number(startMsInt) + startMsRemainder;\n const endMs = Number(endMsInt) + endMsRemainder;\n\n // 3. Initialize base normalized span\n const normalized: NormalizedSpan = {\n // Identity\n traceId: span.traceId,\n spanId: span.spanId,\n parentSpanId: span.parentSpanId,\n traceState: span.traceState,\n\n // Type\n type,\n\n // Timing (convert nanoseconds to milliseconds: divide by 1,000,000)\n startTime: startMs,\n endTime: endMs,\n duration: endMs - startMs,\n\n // Metadata\n name: span.name,\n kind: span.kind.toString(),\n serviceName: resource.attributes?.['service.name'] as string | undefined,\n statusCode: normalizeOtlpStatusCode(span.status?.code),\n statusMessage: span.status?.message,\n\n // Raw Data\n resourceAttributes: resource.attributes || {},\n spanAttributes: span.attributes || {},\n events: (span.events || []).map(e => ({\n timestamp: Number(BigInt(e.timeUnixNano)) / 1000000,\n name: e.name,\n attributes: e.attributes || {}\n })),\n links: (span.links || []).map(l => ({\n traceId: l.traceId,\n spanId: l.spanId,\n traceState: l.traceState,\n attributes: l.attributes\n })),\n };\n\n // 4. Apply Scope-Specific Transformation\n if (transformer) {\n const transformed = transformer.transform(span, allAttributes);\n Object.assign(normalized, transformed);\n }\n\n // 5. Parse agentmark.* attributes (direct SDK context attributes)\n // These take precedence over metadata.* attributes if both exist\n const agentMarkAttributes = parseAgentMarkAttributes(allAttributes);\n Object.assign(normalized, agentMarkAttributes);\n\n // 5b. Standard OTel GenAI conversation id (gen_ai.conversation.id) as a\n // sessionId fallback. agentmark.session_id always wins when present —\n // this only fills the gap for spec-conformant emitters.\n if (!normalized.sessionId && allAttributes['gen_ai.conversation.id']) {\n normalized.sessionId = String(allAttributes['gen_ai.conversation.id']);\n }\n\n // 6. Resolve semantic kind from all available attribute sources\n normalized.semanticKind = resolveSemanticKind(normalized, allAttributes);\n\n return normalized;\n}\n\n/**\n * Normalize spans from raw OTLP resourceSpans structure\n * This is a higher-level API that accepts raw OTLP format and handles conversion internally\n */\nexport function normalizeOtlpSpans(resourceSpans: OtlpResourceSpans[]): NormalizedSpan[] {\n const normalizedSpans: NormalizedSpan[] = [];\n\n for (const resourceSpan of resourceSpans) {\n const extracted = extractResourceScopeSpan(resourceSpan);\n for (const { resource, scope, span } of extracted) {\n normalizedSpans.push(normalizeSpan(resource, scope, span));\n }\n }\n\n return normalizedSpans;\n}\n\nexport * from './types';\nexport * from './registry';\nexport * from './type-classifier';\nexport * from './converters/otlp-converter';\nexport { parseTokens } from './extractors/token-parser';\nexport * from './extractors/metadata-parser';\nexport * from './extractors/agentmark-parser';\nexport * from './resolvers/semantic-kind-resolver';\nexport * from './transformers/ai-sdk';\nexport * from './transformers/ai-sdk/token-helpers';\nexport * from './transformers/ai-sdk/version-detector';\nexport * from './transformers/mastra';\nexport * from './transformers/agentmark';\nexport * from './transformers/otel-genai';\n","/**\n * Canonical trace-level input/output derivation — the ONE definition of\n * \"what is a trace's input and output\", shared by every read path that\n * projects spans into a trace summary: the cloud gateway's\n * `transformTraceDetail`, the local CLI's `mapRawTraceToDetail`\n * (`GET /v1/traces/:id`), and the CLI's dataset import-from-traces source\n * mapper. Before this helper existed each call site had its own semantics\n * (root span vs first/last GENERATION span), so the same trace answered\n * differently depending on which endpoint you asked.\n *\n * Layered semantics, per-field:\n *\n * 1. **Root span first.** The WebhookRunner owns the prompt (root) span and\n * records `agentmark.input` / `agentmark.output` on it — the true\n * end-to-end request/response boundary. When the root span carries a\n * value, it wins.\n * 2. **GENERATION fallback.** Traces emitted without the runner (third-party\n * OTEL instrumentation pointed straight at the collector, or pre-runner\n * SDK versions) have no root-span I/O. Fall back to the first GENERATION\n * span's input and the last GENERATION span's output, in timestamp order\n * — the model's view of the run.\n *\n * Fields resolve independently: a trace whose root span has only an output\n * (e.g. written by an older runner that recorded output but not input)\n * gets its input from the GENERATION fallback.\n */\n\n/** Minimal span projection the derivation needs — both the camelCase\n * service-layer `Span` and mapped wire spans satisfy it. */\nexport interface TraceIOSpan {\n /** null/undefined/'' parent marks a root span. */\n parentId?: string | null;\n /** Span classification; only 'GENERATION' participates in the fallback. */\n type?: string | null;\n /** Sort key for first/last GENERATION. ISO strings and epoch numbers both\n * order correctly under `<`. */\n timestamp?: string | number;\n input?: unknown;\n output?: unknown;\n}\n\nexport interface TraceIO {\n input?: unknown;\n output?: unknown;\n}\n\n/** Truthy-and-nonempty check that keeps non-string payloads (objects from\n * already-parsed wire spans) while rejecting '', null, undefined. */\nfunction present(v: unknown): boolean {\n if (v === null || v === undefined) return false;\n if (typeof v === \"string\") return v.length > 0;\n return true;\n}\n\n/**\n * Derive trace-level input/output from a trace's spans. Returns each field\n * only when a value exists — callers spread the result so absent fields stay\n * absent on the wire (`{...deriveTraceIO(spans)}`).\n */\nexport function deriveTraceIO(spans: readonly TraceIOSpan[]): TraceIO {\n const rootSpan = spans.find((s) => !s.parentId) ?? spans[0];\n\n const generationSpans = spans\n .filter((s) => s.type === \"GENERATION\")\n .sort((a, b) => {\n const ta = a.timestamp ?? 0;\n const tb = b.timestamp ?? 0;\n return ta < tb ? -1 : ta > tb ? 1 : 0;\n });\n\n const input = present(rootSpan?.input)\n ? rootSpan?.input\n : generationSpans.find((s) => present(s.input))?.input;\n\n const lastGenWithOutput = [...generationSpans]\n .reverse()\n .find((s) => present(s.output));\n const output = present(rootSpan?.output)\n ? rootSpan?.output\n : lastGenWithOutput?.output;\n\n return {\n ...(present(input) ? { input } : {}),\n ...(present(output) ? { output } : {}),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,4BAA4B,MAAM;AAC7C,QAAM,YAAY,KAAK,IAAI,EAAE,SAAS,EAAE;AACxC,QAAM,cAAc,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC;AAC1D,SAAO,YAAY;AACrB;;;ACJA,IAAM,UAAU,IAAI,YAAY;AAEhC,eAAsB,gBAAgB,SAAiB,IAAI,SAAiB;AAC1E,MAAI,CAAC,QAAQ;AACX,aAAS;AAAA,EACX;AAEA,QAAM,YAAY,EAAE,MAAM,QAAQ,MAAM,EAAE,MAAM,UAAU,EAAE;AAE5D,QAAM,WAAW,QAAQ,OAAO,MAAM;AACtC,QAAM,cAAc;AACpB,QAAM,MAAM,MAAM,OAAO,OAAO;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,EACnB;AAEA,QAAM,YAAY,MAAM,OAAO,OAAO;AAAA,IACpC;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,OAAO;AAAA,EACxB;AAEA,SAAO,UAAU,YAAY,SAAS,CAAC;AACzC;AAEA,SAAS,YAAY,WAAwB;AAC3C,SAAO,MAAM,KAAK,IAAI,WAAW,SAAS,CAAC,EACxC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE;AACZ;AAEA,eAAsB,gBACpB,QACA,QACA,SACA;AACA,MAAI,CAAC,QAAQ;AACX,aAAS;AAAA,EACX;AAEA,QAAM,QAAQ,OAAO,MAAM,GAAG;AAC9B,QAAM,SAAS,MAAM,CAAC;AAEtB,QAAM,YAAY,EAAE,MAAM,QAAQ,MAAM,EAAE,MAAM,UAAU,EAAE;AAE5D,QAAM,WAAW,QAAQ,OAAO,MAAM;AACtC,QAAM,cAAc;AACpB,QAAM,MAAM,MAAM,OAAO,OAAO;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,EACnB;AAEA,QAAM,WAAW,WAAW,MAAM;AAClC,QAAM,YAAY,QAAQ,OAAO,OAAO;AACxC,QAAM,QAAQ,MAAM,OAAO,OAAO;AAAA,IAChC,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,KAAa;AAC/B,QAAM,MAAM,IAAI,SAAS;AACzB,QAAM,QAAQ,IAAI,WAAW,GAAG;AAEhC,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,GAAG;AACtC,UAAM,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC;AAC5B,UAAM,IAAI,SAAS,GAAG,EAAE;AACxB,UAAM,KAAK,IAAI;AACf,aAAS;AAAA,EACX;AAEA,SAAO;AACT;;;ACnFA,qBAAiB;AAEV,SAAS,cAAc,SAAyC;AAerE,QAAM,OACJ,OAAO,KAAK,OAAO,EAAE,WAAW,IAC5B,KACA,eAAAA,QAAK,KAAK,SAAS,EAAE,WAAW,IAAI,QAAQ,MAAM,aAAa,KAAK,CAAC;AAE3E,SAAO;AAAA,EAAQ,IAAI;AAAA;AACrB;;;ACvBA,SAAoB;AACpB,kBAAiB;AACjB,IAAAC,kBAAiB;AAEjB,SAAS,mBAA4B,SAAoC;AACvE,QAAM,QAAQ,QAAQ,MAAM,6BAA6B;AACzD,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,YAAY,CAAC,EAAO;AAAA,EAC/B;AACA,QAAM,aAAa,gBAAAC,QAAK,KAAK,MAAM,CAAC,CAAC;AACrC,SAAO,EAAE,YAAY,cAAe,CAAC,EAAQ;AAC/C;AAGA,IAAI,WAA+E;AACnF,eAAe,aAAa;AAf5B;AAgBE,MAAI,SAAU,QAAO;AACrB,QAAM,MAAM,MAAM,OAAO,2BAA2B;AAEpD,QAAM,IAAK,IAAY,aAAY,SAAY,YAAZ,mBAAqB;AACxD,aAAW,EAAE,KAAK,GAAG;AACrB,SAAO;AACT;AAqDA,SAAS,iBAAiB,UAA0B;AAClD,SAAO,SACJ,QAAQ,kBAAkB,EAAE,EAC5B,MAAM,GAAG,EACT,IAAI,CAAC,SAAS;AAEb,WAAO,KACJ,MAAM,gBAAgB,EACtB;AAAA,MACC,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY;AAAA,IACrE,EACC,KAAK,EAAE,EACP,QAAQ,iBAAiB,EAAE;AAAA,EAChC,CAAC,EACA,KAAK,GAAG;AACb;AAEA,SAAS,qBAAqB,UAA0B;AACtD,SAAO,SACJ,MAAM,gBAAgB,EACtB,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EACxE,KAAK,EAAE;AACZ;AAEA,eAAsB,gBAAgB,KAAgC;AACpE,QAAM,QAAQ,MAAS,WAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAC3D,MAAI,cAAwB,CAAC;AAE7B,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,YAAAC,QAAK,KAAK,KAAK,KAAK,IAAI;AACzC,QAAI,KAAK,YAAY,GAAG;AACtB,oBAAc,YAAY,OAAO,MAAM,gBAAgB,QAAQ,CAAC;AAAA,IAClE,WAAW,KAAK,KAAK,SAAS,aAAa,GAAG;AAC5C,kBAAY,KAAK,QAAQ;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,4BACb,SAIiB;AACjB,QAAM,aAAuB,CAAC;AAC9B,QAAM,gBAAgB;AAAA;AAAA;AAAA;AAItB,MAAI,SAAS;AACb,QAAM,cAAwB,CAAC;AAE/B,aAAW,UAAU,SAAS;AAC5B,UAAM,EAAE,MAAM,YAAY,aAAa,IAAI;AAC3C,UAAM,OAAO,iBAAiB,UAAU;AACxC,QAAI;AACF,UAAI,OAAO;AACX,UAAI,gBAAgB;AACpB,UAAI,WAAW;AAEf,UAAI,iBAAiB,QAAQ;AAC3B,eAAO;AACP,mBAAW,MAAM,QAAQ,OAAO,YAAY,KAAK,IAC7C,OAAO,YAAY,MAAM,SAAS,IAClC,CAAC,CAAC,OAAO,YAAY;AAAA,MAC3B,WAAW,mBAAmB,QAAQ;AACpC,eAAO;AACP,mBAAW,MAAM,QAAQ,OAAO,cAAc,KAAK,IAC/C,OAAO,cAAc,MAAM,SAAS,IACpC,CAAC,CAAC,OAAO,cAAc;AAC3B,wBAAgB,OAAO,cAAc;AAAA,MACvC,WAAW,kBAAkB,QAAQ;AACnC,eAAO;AACP,mBAAW,MAAM,QAAQ,OAAO,aAAa,KAAK,IAC9C,OAAO,aAAa,MAAM,SAAS,IACnC,CAAC,CAAC,OAAO,aAAa;AAAA,MAC5B;AAEA,YAAM,UAAU,MAAM,WAAW;AACjC,YAAM,iBAAiB,eACnB,MAAM,QAAQ,cAAc,GAAG,IAAI,MAAM;AAAA,QACvC,eAAe;AAAA,QACf,sBAAsB;AAAA,MACxB,CAAC,IACD,aAAa,IAAI;AACrB,YAAM,kBAAkB,gBACpB,MAAM,QAAQ,eAAe,GAAG,IAAI,OAAO;AAAA,QACzC,eAAe;AAAA,QACf,sBAAsB;AAAA,MACxB,CAAC,IACD,QAAQ,IAAI;AAEhB,iBAAW;AAAA,QACT,eAAe,QAAQ,oBAAoB,WAAW;AAAA,QACtD,gBACG,QAAQ,eAAe,MAAM,EAC7B,QAAQ,oBAAoB,WAAW;AAAA,MAC5C;AAKA,gBAAU,QAAQ,IAAI;AAAA,WACjB,IAAI;AAAA,YACH,IAAI;AAAA,YACJ,IAAI,OACR,WACI;AAAA,uBAEA,EACN;AAAA;AAAA;AAAA;AAOA,kBAAY,KAAK,MAAM,UAAU,MAAM,IAAI,EAAE;AAC7C,YAAM,aAAa,WAAW,QAAQ,UAAU,EAAE;AAClD,UAAI,eAAe,YAAY;AAC7B,oBAAY,KAAK,MAAM,UAAU,MAAM,IAAI,EAAE;AAAA,MAC/C;AACA,YAAM,YAAY,WAAW,QAAQ,kBAAkB,EAAE;AACzD,UAAI,cAAc,cAAc,cAAc,YAAY;AACxD,oBAAY,KAAK,MAAM,SAAS,MAAM,IAAI,EAAE;AAAA,MAC9C;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,oBAAoB,UAAU,KAAK,KAAK;AACtD,iBAAW;AAAA,QACT,aAAa,IAAI;AAAA,OAClB,IAAI;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,YAAU;AAAA,EACV,YAAY,KAAK,KAAK,CAAC;AAAA;AAAA;AAGvB,SAAO,gBAAgB,WAAW,KAAK,MAAM,IAAI,SAAS;AAC5D;AAEA,eAAe,0BACb,SACiB;AA7NnB;AA8NE,QAAM,aAAuB,CAAC;AAC9B,QAAM,gBAAgB;AAAA;AAAA;AAAA;AAItB,MAAI,SAAS;AACb,QAAM,cAAwB,CAAC;AAE/B,aAAW,UAAU,SAAS;AAC5B,UAAM,EAAE,MAAM,YAAY,UAAU,aAAa,IAAI;AACrD,UAAM,OAAO,iBAAiB,UAAU;AAExC,QAAI;AACF,YAAM,UAAU,MAAM,WAAW;AACjC,YAAM,iBAAiB,eACnB,MAAM,QAAQ,cAAc,GAAG,IAAI,MAAM;AAAA,QACvC,eAAe;AAAA,QACf,sBAAsB;AAAA,MACxB,CAAC,IACD,aAAa,IAAI;AAErB,YAAM,gBAAe,gDAAU,UAAV,mBAAiB,aAAjB,mBAA2B;AAEhD,YAAM,kBAAkB,eACpB,MAAM,QAAQ,cAAc,GAAG,IAAI,OAAO;AAAA,QACxC,eAAe;AAAA,QACf,sBAAsB;AAAA,MACxB,CAAC,IACD,QAAQ,IAAI;AAEhB,iBAAW;AAAA,QACT,eAAe,QAAQ,oBAAoB,WAAW;AAAA,QACtD,gBACG,QAAQ,eAAe,MAAM,EAC7B,QAAQ,oBAAoB,WAAW;AAAA,MAC5C;AAEA,gBAAU,aAAa,IAAI;AAAA,WACtB,IAAI;AAAA,YACH,IAAI;AAAA;AAAA;AAAA;AAOV,kBAAY,KAAK,MAAM,UAAU,MAAM,IAAI,EAAE;AAC7C,YAAM,aAAa,WAAW,QAAQ,UAAU,EAAE;AAClD,UAAI,eAAe,YAAY;AAC7B,oBAAY,KAAK,MAAM,UAAU,MAAM,IAAI,EAAE;AAAA,MAC/C;AACA,YAAM,YAAY,WAAW,QAAQ,kBAAkB,EAAE;AACzD,UAAI,cAAc,cAAc,cAAc,YAAY;AACxD,oBAAY,KAAK,MAAM,SAAS,MAAM,IAAI,EAAE;AAAA,MAC9C;AAAA,IACF,SAAS,OAAY;AACnB,cAAQ,MAAM,oBAAoB,UAAU,KAAK,KAAK;AACtD,iBAAW;AAAA,QACT,aAAa,IAAI;AAAA,OAClB,IAAI;AAAA,MACL;AAEA,gBAAU,aAAa,IAAI;AAAA,WACtB,IAAI;AAAA,YACH,IAAI;AAAA;AAAA;AAAA;AAIV,kBAAY,KAAK,MAAM,UAAU,MAAM,IAAI,EAAE;AAC7C,YAAM,aAAa,WAAW,QAAQ,UAAU,EAAE;AAClD,UAAI,eAAe,YAAY;AAC7B,oBAAY,KAAK,MAAM,UAAU,MAAM,IAAI,EAAE;AAAA,MAC/C;AACA,YAAM,YAAY,WAAW,QAAQ,kBAAkB,EAAE;AACzD,UAAI,cAAc,cAAc,cAAc,YAAY;AACxD,oBAAY,KAAK,MAAM,SAAS,MAAM,IAAI,EAAE;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAEA,YAAU;AAAA,EACV,YAAY,KAAK,KAAK,CAAC;AAAA;AAAA;AAGvB,SAAO,gBAAgB,WAAW,KAAK,MAAM,IAAI,SAAS;AAC5D;AAEA,IAAM,cAAc,CAAC,gBAAqB;AACxC,SACE,YAAY,aAAa,KACzB,YAAY,eAAe,KAC3B,YAAY,cAAc;AAE9B;AAMA,SAAS,oBAAoB,YAA4B;AACvD,QAAM,MAA8B;AAAA,IAClC,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AACA,SAAO,IAAI,UAAU,KAAK;AAC5B;AAEA,SAAS,aAAa,MAAsB;AAC1C,SAAO,KACJ,MAAM,MAAM,EACZ,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,CAAC,EACjD,KAAK,EAAE;AACZ;AAMA,SAAS,mBACP,QACA,aACA,SACA,WACQ;AACR,MAAI,CAAC,OAAQ,QAAO;AAGpB,QAAM,QAAQ,OAAO,SAAS,OAAO;AACrC,MAAI,OAAO;AACT,UAAM,UAAU,MAAM,UAAU,CAAC,MAAW,EAAE,SAAS,MAAM;AAC7D,UAAM,UAAU,WAAW;AAC3B,UAAM,SAAS,MAAM,OAAO,CAAC,GAAQ,MAAc,MAAM,OAAO;AAEhE,QAAI,WAAW,OAAO,WAAW,GAAG;AAClC,aAAO,GAAG,mBAAmB,OAAO,CAAC,GAAG,aAAa,SAAS,SAAS,CAAC;AAAA,IAC1E;AACA,UAAM,QAAQ,OAAO;AAAA,MAAI,CAAC,GAAQ,MAChC,mBAAmB,GAAG,aAAa,GAAG,OAAO,GAAG,CAAC,IAAI,SAAS;AAAA,IAChE;AACA,QAAI,QAAS,OAAM,KAAK,MAAM;AAC9B,WAAO,MAAM,KAAK,KAAK;AAAA,EACzB;AAGA,MAAI,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC9B,UAAM,UAAU,OAAO,KAAK,SAAS,MAAM;AAC3C,UAAM,UAAU,OAAO,KAAK,OAAO,CAAC,MAAc,MAAM,MAAM;AAG9D,QAAI,QAAQ,WAAW,KAAK,QAAQ,CAAC,MAAM,YAAY,OAAO,YAAY;AACxE,YAAM,UAAU,GAAG,WAAW,GAAG,aAAa,OAAO,CAAC;AACtD,gBAAU,KAAK,eAAe,SAAS,QAAQ,SAAS,CAAC;AACzD,aAAO,UAAU,GAAG,OAAO,YAAY;AAAA,IACzC;AAGA,QAAI,QAAQ,WAAW,KAAK,QAAQ,CAAC,MAAM,WAAW,OAAO,OAAO;AAClE,YAAM,OAAO;AAAA,QACX,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,aAAO,UAAU,QAAQ,IAAI,aAAa,QAAQ,IAAI;AAAA,IACxD;AAEA,UAAM,OACJ,QAAQ,WAAW,IACf,oBAAoB,QAAQ,CAAC,CAAC,IAC9B,QAAQ,IAAI,mBAAmB,EAAE,KAAK,KAAK;AACjD,WAAO,UAAU,GAAG,IAAI,YAAY;AAAA,EACtC;AAEA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,oBAAoB,OAAO,IAAI;AAAA,IAExC,KAAK,SAAS;AACZ,YAAM,OAAO,OAAO,QAChB,mBAAmB,OAAO,OAAO,aAAa,SAAS,SAAS,IAChE;AACJ,aAAO,QAAQ,IAAI;AAAA,IACrB;AAAA,IAEA,KAAK,UAAU;AACb,UAAI,CAAC,OAAO,cAAc,OAAO,KAAK,OAAO,UAAU,EAAE,WAAW,GAAG;AACrE,eAAO;AAAA,MACT;AACA,YAAM,UAAU,GAAG,WAAW,GAAG,aAAa,OAAO,CAAC;AACtD,gBAAU,KAAK,eAAe,SAAS,QAAQ,SAAS,CAAC;AACzD,aAAO;AAAA,IACT;AAAA,IAEA;AAEE,UAAI,OAAO,YAAY;AACrB,cAAM,UAAU,GAAG,WAAW,GAAG,aAAa,OAAO,CAAC;AACtD,kBAAU,KAAK,eAAe,SAAS,QAAQ,SAAS,CAAC;AACzD,eAAO;AAAA,MACT;AACA,aAAO;AAAA,EACX;AACF;AAMA,SAAS,eACP,WACA,QACA,WACQ;AACR,QAAM,QAAQ,OAAO,cAAc,CAAC;AACpC,QAAM,cAAc,IAAI,IAAY,OAAO,YAAY,CAAC,CAAC;AACzD,QAAM,QAAkB,CAAC;AACzB,QAAM,OAAO,OAAO;AAEpB,MAAI,MAAM;AACR,UAAM,KAAK,SAAS,SAAS,cAAc;AAC3C,UAAM,KAAK,UAAU,IAAI,KAAK;AAAA,EAChC,OAAO;AACL,UAAM,KAAK,SAAS,SAAS,cAAc;AAAA,EAC7C;AAEA,QAAM,UAAU,OAAO,QAAQ,KAAK;AACpC,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,KAAK,UAAU;AACrB,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAEA,aAAW,CAAC,KAAK,UAAU,KAAK,SAAS;AACvC,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,aAAa,YAAY,IAAI,GAAG;AACtC,UAAM,aAAa,aAAa,SAAS,eAAe,MAAM;AAC9D,UAAM,WAAY,WAAmB;AAErC,QAAI,UAAU;AACZ,YAAM,SAAS,OAAO,GAAG,KAAK,UAAU;AACxC,YAAM,UAAU,KAAK,OAAO;AAC5B,UAAI,UAAU,IAAI;AAChB,cAAM,YACJ,SAAS,SAAS,UACd,SAAS,UAAU,GAAG,UAAU,CAAC,IAAI,QACrC;AACN,cAAM,KAAK,GAAG,MAAM,GAAG,SAAS,EAAE;AAAA,MACpC,OAAO;AAEL,cAAM,KAAK,OAAO,GAAG,KAAK,UAAU,EAAE;AAAA,MACxC;AAAA,IACF,OAAO;AACL,YAAM,KAAK,OAAO,GAAG,KAAK,UAAU,EAAE;AAAA,IACxC;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,wBAAwB,OAA2C;AAC1E,MAAI,OAAO,KAAK,KAAK,EAAE,WAAW,EAAG,QAAO;AAE5C,QAAM,YAAsB,CAAC;AAE7B,aAAW,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,KAAK,GAAG;AACtD,UAAM,WAAW,GAAG,qBAAqB,QAAQ,CAAC;AAClD,QAAI,OAAO,cAAc,OAAO,WAAW,YAAY;AACrD,gBAAU,KAAK,eAAe,UAAU,OAAO,YAAY,SAAS,CAAC;AAAA,IACvE,OAAO;AACL,gBAAU,KAAK,SAAS,QAAQ;AAAA,SAAwB;AAAA,IAC1D;AAAA,EACF;AAEA,QAAM,YAAY,OAAO,KAAK,KAAK,EAChC,IAAI,CAAC,SAAS,OAAO,IAAI,KAAK,qBAAqB,IAAI,CAAC,MAAM,EAC9D,KAAK,IAAI;AACZ,YAAU,KAAK;AAAA,EAA4B,SAAS,EAAE;AAEtD,SAAO,UAAU,KAAK,QAAQ;AAChC;AAEA,SAAS,kBAAkB,MAAsB;AAC/C,QAAM,UAAoB,CAAC,WAAW;AACtC,MAAI,KAAK,SAAS,cAAc,EAAG,SAAQ,KAAK,aAAa;AAC7D,MAAI,KAAK,SAAS,UAAU,EAAG,SAAQ,KAAK,SAAS;AACrD,MAAI,UAAU,KAAK,IAAI,EAAG,SAAQ,KAAK,KAAK;AAC5C,UAAQ,KAAK;AACb,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,qBAKY,QAAQ,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAIvC;AAEA,eAAe,kCACb,SAKiB;AAEjB,QAAM,aAAuB,CAAC;AAC9B,QAAM,cAAgD,CAAC;AAEvD,aAAW,UAAU,SAAS;AAC5B,UAAM,EAAE,MAAM,YAAY,aAAa,IAAI;AAC3C,UAAM,OAAO,iBAAiB,UAAU;AAExC,QAAI;AACF,UAAI,OAAO;AACX,UAAI,eAAe;AACnB,UAAI,QAAa,CAAC;AAElB,UAAI,iBAAiB,QAAQ;AAC3B,eAAO;AACP,gBAAQ,OAAO,YAAY,SAAS,CAAC;AAAA,MACvC,WAAW,mBAAmB,QAAQ;AACpC,eAAO;AACP,gBAAQ,OAAO,cAAc,SAAS,CAAC;AACvC,uBAAe,OAAO,cAAc;AAAA,MACtC,WAAW,kBAAkB,QAAQ;AACnC,eAAO;AACP,gBAAQ,OAAO,aAAa,SAAS,CAAC;AAAA,MACxC;AAGA,YAAM,iBAA2B,CAAC;AAClC,UAAI,gBAAgB,aAAa,YAAY;AAC3C,uBAAe;AAAA,UACb,eAAe,GAAG,IAAI,MAAM,cAAc,cAAc;AAAA,QAC1D;AAAA,MACF,OAAO;AACL,uBAAe,KAAK,SAAS,IAAI;AAAA,SAA0B;AAAA,MAC7D;AACA,iBAAW,KAAK,GAAG,cAAc;AAGjC,YAAM,kBAA4B,CAAC;AACnC,UAAI,gBAAgB,aAAa,YAAY;AAC3C,wBAAgB;AAAA,UACd,eAAe,GAAG,IAAI,OAAO,cAAc,eAAe;AAAA,QAC5D;AAAA,MACF,WAAW,SAAS,UAAU;AAC5B,wBAAgB,KAAK,SAAS,IAAI;AAAA,SAA2B;AAAA,MAC/D,OAAO;AACL,wBAAgB,KAAK,GAAG,IAAI,WAAW;AAAA,MACzC;AACA,iBAAW,KAAK,GAAG,eAAe;AAGlC,UAAI,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AACjC,cAAM,aAAa,wBAAwB,KAAK;AAChD,YAAI,WAAY,YAAW,KAAK,UAAU;AAAA,MAC5C;AAGA,YAAM,YACJ,OAAO,KAAK,KAAK,EAAE,SAAS,IACxB,wCACA;AACN,iBAAW;AAAA,QACT,SAAS,IAAI;AAAA,qBACW,IAAI;AAAA,aACZ,IAAI;AAAA,cACH,IAAI,MAAM,SAAS;AAAA,MACtC;AAGA,kBAAY,KAAK,EAAE,MAAM,YAAY,KAAK,CAAC;AAC3C,YAAM,aAAa,WAAW,QAAQ,UAAU,EAAE;AAClD,UAAI,eAAe;AACjB,oBAAY,KAAK,EAAE,MAAM,YAAY,KAAK,CAAC;AAC7C,YAAM,YAAY,WAAW,QAAQ,kBAAkB,EAAE;AACzD,UAAI,cAAc,cAAc,cAAc,YAAY;AACxD,oBAAY,KAAK,EAAE,MAAM,WAAW,KAAK,CAAC;AAAA,MAC5C;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,oBAAoB,UAAU,KAAK,KAAK;AACtD,iBAAW,KAAK,SAAS,IAAI;AAAA,SAA0B;AACvD,iBAAW,KAAK,GAAG,IAAI,WAAW;AAClC,iBAAW;AAAA,QACT,SAAS,IAAI;AAAA;AAAA,aAEG,IAAI;AAAA,cACH,IAAI;AAAA,MACvB;AACA,kBAAY,KAAK,EAAE,MAAM,YAAY,KAAK,CAAC;AAC3C,YAAM,aAAa,WAAW,QAAQ,UAAU,EAAE;AAClD,UAAI,eAAe;AACjB,oBAAY,KAAK,EAAE,MAAM,YAAY,KAAK,CAAC;AAC7C,YAAM,YAAY,WAAW,QAAQ,kBAAkB,EAAE;AACzD,UAAI,cAAc,cAAc,cAAc,YAAY;AACxD,oBAAY,KAAK,EAAE,MAAM,WAAW,KAAK,CAAC;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAGA,QAAM,eAAe,YAClB,IAAI,CAAC,EAAE,MAAAA,OAAM,KAAK,MAAM,QAAQA,KAAI,MAAM,IAAI,EAAE,EAChD,KAAK,KAAK;AAEb,aAAW;AAAA,IACT;AAAA,EAAmD,YAAY;AAAA;AAAA,EACjE;AAEA,QAAM,OAAO,WAAW,KAAK,QAAQ,IAAI;AACzC,SAAO,kBAAkB,IAAI,IAAI;AACnC;AAEA,eAAe,gCACb,SACiB;AA1oBnB;AA2oBE,QAAM,aAAuB,CAAC;AAC9B,QAAM,cAAgD,CAAC;AAEvD,aAAW,UAAU,SAAS;AAC5B,UAAM,EAAE,MAAM,YAAY,UAAU,aAAa,IAAI;AACrD,UAAM,OAAO,iBAAiB,UAAU;AAExC,QAAI;AAEF,YAAM,iBAA2B,CAAC;AAClC,UAAI,gBAAgB,aAAa,YAAY;AAC3C,uBAAe;AAAA,UACb,eAAe,GAAG,IAAI,MAAM,cAAc,cAAc;AAAA,QAC1D;AAAA,MACF,OAAO;AACL,uBAAe,KAAK,SAAS,IAAI;AAAA,SAA0B;AAAA,MAC7D;AACA,iBAAW,KAAK,GAAG,cAAc;AAGjC,YAAM,gBAAe,gDAAU,UAAV,mBAAiB,aAAjB,mBAA2B;AAChD,YAAM,kBAA4B,CAAC;AACnC,UAAI,gBAAgB,aAAa,YAAY;AAC3C,wBAAgB;AAAA,UACd,eAAe,GAAG,IAAI,OAAO,cAAc,eAAe;AAAA,QAC5D;AAAA,MACF,OAAO;AACL,wBAAgB,KAAK,GAAG,IAAI,WAAW;AAAA,MACzC;AACA,iBAAW,KAAK,GAAG,eAAe;AAGlC,iBAAW;AAAA,QACT,SAAS,IAAI;AAAA,aACG,IAAI;AAAA,cACH,IAAI;AAAA,MACvB;AAGA,kBAAY,KAAK,EAAE,MAAM,YAAY,KAAK,CAAC;AAC3C,YAAM,aAAa,WAAW,QAAQ,UAAU,EAAE;AAClD,UAAI,eAAe;AACjB,oBAAY,KAAK,EAAE,MAAM,YAAY,KAAK,CAAC;AAC7C,YAAM,YAAY,WAAW,QAAQ,kBAAkB,EAAE;AACzD,UAAI,cAAc,cAAc,cAAc,YAAY;AACxD,oBAAY,KAAK,EAAE,MAAM,WAAW,KAAK,CAAC;AAAA,MAC5C;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,oBAAoB,UAAU,KAAK,KAAK;AACtD,iBAAW,KAAK,SAAS,IAAI;AAAA,SAA0B;AACvD,iBAAW,KAAK,GAAG,IAAI,WAAW;AAClC,iBAAW;AAAA,QACT,SAAS,IAAI;AAAA,aACG,IAAI;AAAA,cACH,IAAI;AAAA,MACvB;AACA,kBAAY,KAAK,EAAE,MAAM,YAAY,KAAK,CAAC;AAC3C,YAAM,aAAa,WAAW,QAAQ,UAAU,EAAE;AAClD,UAAI,eAAe;AACjB,oBAAY,KAAK,EAAE,MAAM,YAAY,KAAK,CAAC;AAC7C,YAAM,YAAY,WAAW,QAAQ,kBAAkB,EAAE;AACzD,UAAI,cAAc,cAAc,cAAc,YAAY;AACxD,oBAAY,KAAK,EAAE,MAAM,WAAW,KAAK,CAAC;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAGA,QAAM,eAAe,YAClB,IAAI,CAAC,EAAE,MAAAA,OAAM,KAAK,MAAM,QAAQA,KAAI,MAAM,IAAI,EAAE,EAChD,KAAK,KAAK;AAEb,aAAW;AAAA,IACT;AAAA,EAAmD,YAAY;AAAA;AAAA,EACjE;AAEA,QAAM,OAAO,WAAW,KAAK,QAAQ,IAAI;AACzC,SAAO,kBAAkB,IAAI,IAAI;AACnC;AAIA,eAAsB,wBACpB,SACA,WAAkC,cACjB;AACjB,MAAI,aAAa,UAAU;AACzB,QAAI,QAAQ,CAAC,EAAE,YAAY,OAAO;AAChC,aAAO,kCAAkC,OAAc;AAAA,IACzD;AACA,WAAO,gCAAgC,OAAc;AAAA,EACvD;AACA,MAAI,QAAQ,CAAC,EAAE,YAAY,OAAO;AAChC,WAAO,4BAA4B,OAAc;AAAA,EACnD;AACA,SAAO,0BAA0B,OAAc;AACjD;AAEA,eAAsB,wBAAwB,SAGb;AAhvBjC;AAivBE,MAAI,QAAQ,OAAO;AACjB,UAAM,UAAU,oBAAoB,QAAQ,KAAK;AACjD,QAAI;AACF,YAAM,gBAAgB,MAAM,MAAM,GAAG,OAAO,aAAa;AACzD,UAAI,CAAC,cAAc,IAAI;AACrB,cAAM,IAAI;AAAA,UACR,iCAAiC,cAAc,UAAU;AAAA,QAC3D;AAAA,MACF;AASA,YAAM,OAAO,MAAM,cAAc,KAAK;AACtC,YAAM,SAAkB,8CAAM,SAAN,mBAAY,UAAZ,YAAqB,6BAAM,UAA3B,YAAoC,CAAC;AAE7D,aAAO,QAAQ;AAAA,QACb,MAAM,IAAI,OAAO,eAAuB;AACtC,gBAAM,mBAAmB,MAAM;AAAA,YAC7B,GAAG,OAAO,sBAAsB,UAAU;AAAA,UAC5C;AACA,cAAI,CAAC,iBAAiB,IAAI;AACxB,kBAAM,IAAI;AAAA,cACR,4BAA4B,UAAU,KAAK,iBAAiB,UAAU;AAAA,YACxE;AAAA,UACF;AAEA,gBAAM,EAAE,MAAM,IAAI,IAAI,MAAM,iBAAiB,KAAK;AAClD,gBAAM,WAAW,IAAI,SAAS;AAAA,YAC5B,CAAC,SAAc,KAAK,SAAS;AAAA,UAC/B;AACA,cAAI,CAAC,UAAU;AACb,kBAAM,IAAI,MAAM,gCAAgC,UAAU,EAAE;AAAA,UAC9D;AAEA,gBAAM,EAAE,OAAO,UAAU,IAAI,MAAM,OAAO,MAAM;AAChD,gBAAM,cAAc,UAAU,SAAS,KAAK;AAE5C,cAAI,YAAY,WAAW,GAAG;AAC5B,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,GAAG;AAAA,cACH,SAAS;AAAA,YACX;AAAA,UACF;AAEA,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,GAAG;AAAA,UACL;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,UACE,iBAAiB,aACjB,MAAM,QAAQ,SAAS,cAAc,GACrC;AACA,gBAAQ,MAAM,wBAAwB,OAAO,GAAG;AAAA,MAClD;AACA,cAAQ,MAAM,oBAAoB,KAAK;AACvC,YAAM;AAAA,IACR;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS;AACnB,QAAI,CAAI,cAAW,QAAQ,OAAO,GAAG;AACnC,YAAM,IAAI,MAAM,2BAA2B,QAAQ,OAAO,EAAE;AAAA,IAC9D;AAEA,UAAM,cAAc,MAAM,gBAAgB,QAAQ,OAAO;AAEzD,WAAO,QAAQ;AAAA,MACb,YAAY,IAAI,OAAO,SAAS;AAC9B,cAAM,UAAU,MAAS,YAAS,MAAM,OAAO;AAC/C,cAAM,EAAE,WAAW,IAAI,mBAAmB,OAAO;AAEjD,YAAI,YAAY,UAAU,GAAG;AAC3B,iBAAO;AAAA,YACL,MAAM,YAAAA,QAAK,SAAS,QAAQ,SAAU,IAAI;AAAA,YAC1C,GAAG;AAAA,YACH,SAAS;AAAA,UACX;AAAA,QACF;AACA,eAAO;AAAA,UACL,MAAM,YAAAA,QAAK,SAAS,QAAQ,SAAU,IAAI;AAAA,UAC1C,GAAG;AAAA,QACL;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,gDAAgD;AAClE;;;ACj1BO,IAAK,WAAL,kBAAKC,cAAL;AACH,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,WAAQ;AAHA,SAAAA;AAAA,GAAA;;;ACEL,IAAM,sBAAN,MAA0B;AAAA,EAA1B;AACH,SAAQ,eAA8C,oBAAI,IAAI;AAC9D,SAAQ,qBAA8C;AAAA;AAAA,EAEtD,SAAS,OAAe,aAAqC;AACzD,SAAK,aAAa,IAAI,OAAO,WAAW;AAAA,EAC5C;AAAA,EAEA,WAAW,aAAqC;AAC5C,SAAK,qBAAqB;AAAA,EAC9B;AAAA,EAEA,eAAe,OAAwC;AACnD,WAAO,KAAK,aAAa,IAAI,KAAK,KAAK,KAAK;AAAA,EAChD;AACJ;AAEO,IAAM,WAAW,IAAI,oBAAoB;;;ACjBzC,SAAS,cAAc,YAA+C;AAEzE,MACK,WAAW,kBAAkB,MAAM,UAAa,WAAW,kBAAkB,MAAM,QACnF,WAAW,uBAAuB,MAAM,UAAa,WAAW,uBAAuB,MAAM,QAC7F,WAAW,oBAAoB,MAAM,UAAa,WAAW,oBAAoB,MAAM,MAC1F;AACE,WAAO;AAAA,EACX;AAGA,MACK,WAAW,gBAAgB,MAAM,UAAa,WAAW,gBAAgB,MAAM,QAC/E,WAAW,qBAAqB,MAAM,UAAa,WAAW,qBAAqB,MAAM,QACzF,WAAW,kBAAkB,MAAM,UAAa,WAAW,kBAAkB,MAAM,MACtF;AACE,WAAO;AAAA,EACX;AAGA,MACK,WAAW,oBAAoB,MAAM,UAAa,WAAW,oBAAoB,MAAM,QACvF,WAAW,WAAW,MAAM,UAAa,WAAW,WAAW,MAAM,MACxE;AACE,WAAO;AAAA,EACX;AAIA,SAAO;AACX;;;AChBO,SAAS,YAAY,YAAiC,MAA8B;AACvF,QAAM,SAAsB,CAAC;AAG7B,QAAM,eAAe,CAAC,QAAiC;AACnD,QAAI,OAAO,QAAQ,SAAU,QAAO,KAAK,MAAM,GAAG;AAClD,QAAI,OAAO,QAAQ,UAAU;AAEzB,UAAI;AACA,cAAMC,UAAS,KAAK,MAAM,GAAG;AAC7B,YAAI,OAAOA,YAAW,SAAU,QAAO,KAAK,MAAMA,OAAM;AACxD,YAAIA,WAAU,OAAOA,QAAO,aAAa,SAAU,QAAO,KAAK,MAAMA,QAAO,QAAQ;AAAA,MACxF,QAAQ;AAAA,MAER;AACA,YAAM,SAAS,SAAS,KAAK,EAAE;AAC/B,aAAO,MAAM,MAAM,IAAI,SAAY;AAAA,IACvC;AACA,WAAO;AAAA,EACX;AAGA,MAAI,KAAK,YAAY,WAAW,KAAK,QAAQ,MAAM,QAAW;AAC1D,WAAO,cAAc,aAAa,WAAW,KAAK,QAAQ,CAAC;AAAA,EAC/D,WAAW,KAAK,aAAa,WAAW,KAAK,SAAS,MAAM,QAAW;AACnE,WAAO,cAAc,aAAa,WAAW,KAAK,SAAS,CAAC;AAAA,EAChE;AAGA,MAAI,KAAK,aAAa,WAAW,KAAK,SAAS,MAAM,QAAW;AAC5D,WAAO,eAAe,aAAa,WAAW,KAAK,SAAS,CAAC;AAAA,EACjE,WAAW,KAAK,iBAAiB,WAAW,KAAK,aAAa,MAAM,QAAW;AAC3E,WAAO,eAAe,aAAa,WAAW,KAAK,aAAa,CAAC;AAAA,EACrE;AAGA,MAAI,KAAK,YAAY,WAAW,KAAK,QAAQ,MAAM,QAAW;AAC1D,WAAO,cAAc,aAAa,WAAW,KAAK,QAAQ,CAAC;AAAA,EAC/D;AAGA,MAAI,OAAO,gBAAgB,UAAa,OAAO,gBAAgB,UAAa,OAAO,iBAAiB,QAAW;AAC3G,WAAO,cAAc,OAAO,cAAc,OAAO;AAAA,EACrD;AAGA,MAAI,KAAK,gBAAgB,WAAW,KAAK,YAAY,MAAM,QAAW;AAClE,WAAO,kBAAkB,aAAa,WAAW,KAAK,YAAY,CAAC;AAAA,EACvE;AAEA,SAAO;AACX;;;ACzDO,IAAM,iBAAiB,oBAAI,IAAI,CAAC,aAAa,eAAe,WAAW,CAAC;AASxE,SAAS,UAAU,KAAsB;AAC9C,SAAO,CAAC,eAAe,IAAI,GAAG;AAChC;;;ACAA,IAAM,wBAAwB,oBAAI,IAAI;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;AAEM,SAAS,cAAc,YAAiC,SAAiB,uBAAgD;AAC5H,QAAM,SAAkC,CAAC;AAGzC,QAAM,MAAM,CAAC,QAAgB,WAAW,GAAG,MAAM,GAAG,GAAG,EAAE;AAGzD,MAAI,IAAI,YAAY,EAAG,QAAO,YAAY,OAAO,IAAI,YAAY,CAAC;AAClE,MAAI,IAAI,cAAc,EAAG,QAAO,cAAc,OAAO,IAAI,cAAc,CAAC;AACxE,MAAI,IAAI,SAAS,EAAG,QAAO,SAAS,OAAO,IAAI,SAAS,CAAC;AACzD,MAAI,IAAI,YAAY,EAAG,QAAO,YAAY,OAAO,IAAI,YAAY,CAAC;AAGlE,MAAI,IAAI,gBAAgB,EAAG,QAAO,eAAe,OAAO,IAAI,gBAAgB,CAAC;AAC7E,MAAI,IAAI,kBAAkB,EAAG,QAAO,iBAAiB,OAAO,IAAI,kBAAkB,CAAC;AACnF,MAAI,IAAI,cAAc,EAAG,QAAO,cAAc,OAAO,IAAI,cAAc,CAAC;AACxE,MAAI,IAAI,mBAAmB,EAAG,QAAO,kBAAkB,OAAO,IAAI,mBAAmB,CAAC;AACtF,MAAI,IAAI,yBAAyB,EAAG,QAAO,wBAAwB,OAAO,IAAI,yBAAyB,CAAC;AAExG,MAAI,IAAI,aAAa,EAAG,QAAO,aAAa,OAAO,IAAI,aAAa,CAAC;AAErE,MAAI,IAAI,OAAO,EAAG,QAAO,QAAQ,OAAO,IAAI,OAAO,CAAC;AAGpD,MAAI,IAAI,YAAY,EAAG,QAAO,YAAY,OAAO,IAAI,YAAY,CAAC;AAElE,SAAO;AACX;AAUO,SAAS,sBAAsB,YAAiC,SAAiB,uBAA+C;AACnI,QAAM,iBAAyC,CAAC;AAEhD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AAEnD,QAAI,IAAI,WAAW,MAAM,GAAG;AAExB,YAAM,cAAc,IAAI,MAAM,OAAO,MAAM;AAG3C,UAAI,eAAe,CAAC,sBAAsB,IAAI,WAAW,KAAK,UAAU,WAAW,GAAG;AAElF,uBAAe,WAAW,IAAI,OAAO,KAAK;AAAA,MAC9C;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;;;ACnFO,SAAS,qCAAqC,YAAqD;AAR1G;AASI,QAAM,mBAAmB,WAAW,8BAA8B;AAClE,MAAI,CAAC,iBAAkB,QAAO;AAE9B,MAAI;AACA,UAAM,SAAS,OAAO,qBAAqB,WACrC,KAAK,MAAM,gBAAgB,IAC3B;AAGN,UAAI,sCAAQ,WAAR,mBAAgB,qBAAoB,QAAW;AAC/C,aAAO,OAAO,OAAO,OAAO,oBAAoB,WAC1C,OAAO,OAAO,kBACd;AAAA,IACV;AAAA,EACJ,QAAQ;AAAA,EAER;AAEA,SAAO;AACX;;;ACfO,IAAM,kBAAN,MAAoD;AAAA;AAAA;AAAA;AAAA,EAI/C,qBAAqB,MAAmC;AAE5D,QAAI,OAAO,SAAS,UAAU;AAC1B,aAAO;AAAA,IACX;AAEA,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACnC,aAAO;AAAA,IACX;AAEA,UAAM,OAAO,KAAK;AAGlB,QAAI,SAAS,QAAQ;AACjB,aAAO;AAAA,QACH,MAAM;AAAA,QACN,MAAM,KAAK,QAAQ;AAAA,MACvB;AAAA,IACJ;AAGA,QAAI,SAAS,aAAa;AACtB,aAAO;AAAA,QACH,MAAM;AAAA,QACN,YAAY,KAAK,cAAc;AAAA,QAC/B,UAAU,KAAK,YAAY;AAAA,QAC3B,MAAM,KAAK,QAAQ,CAAC;AAAA;AAAA,MACxB;AAAA,IACJ;AAGA,QAAI,SAAS,eAAe;AACxB,aAAO;AAAA,QACH,MAAM;AAAA,QACN,YAAY,KAAK,cAAc;AAAA,QAC/B,UAAU,KAAK,YAAY;AAAA,QAC3B,QAAQ,KAAK;AAAA;AAAA,MACjB;AAAA,IACJ;AAGA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,SAAuB;AAC5C,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AACzC,aAAO;AAAA,IACX;AAEA,UAAM,EAAE,MAAM,SAAS,GAAG,KAAK,IAAI;AAGnC,QAAI;AAEJ,QAAI,OAAO,YAAY,UAAU;AAE7B,0BAAoB;AAAA,IACxB,WAAW,MAAM,QAAQ,OAAO,GAAG;AAE/B,0BAAoB,QAAQ,IAAI,CAAC,SAAS,KAAK,qBAAqB,IAAI,CAAC;AAAA,IAC7E,WAAW,WAAW,OAAO,YAAY,UAAU;AAE/C,0BAAoB,KAAK,qBAAqB,OAAO;AAAA,IACzD,OAAO;AACH,0BAAoB;AAAA,IACxB;AAEA,WAAO;AAAA,MACH,MAAM,QAAQ;AAAA,MACd,SAAS;AAAA,MACT,GAAG;AAAA,IACP;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,UAA4B;AAClD,QAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC1B,aAAO;AAAA,IACX;AAEA,WAAO,SAAS,IAAI,CAAC,QAAQ,KAAK,iBAAiB,GAAG,CAAC;AAAA,EAC3D;AAAA,EAEA,aAAa,YAAqD;AAC9D,WAAO,WAAW,sBAAsB,KAAK,WAAW,aAAa;AAAA,EACzE;AAAA,EAEA,aAAa,YAAwD;AAOjE,UAAM,MACF,WAAW,oBAAoB,MAAM,SAC/B,WAAW,oBAAoB,IAC/B,WAAW,WAAW;AAChC,QAAI,QAAQ,QAAW;AACnB,aAAO;AAAA,IACX;AAEA,QAAI,QAAa;AACjB,QAAI,OAAO,UAAU,UAAU;AAC3B,UAAI;AACA,gBAAQ,KAAK,MAAM,KAAK;AAAA,MAC5B,QAAQ;AAAA,MAER;AAAA,IACJ;AAEA,UAAM,WAAW,KAAK,iBAAiB,KAAK;AAC5C,QAAI,CAAC,UAAU;AACX,aAAO;AAAA,IACX;AACA,WAAO,KAAK,kBAAkB,QAAQ;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,iBAAiB,OAA+B;AACpD,QAAI,OAAO,UAAU,UAAU;AAC3B,aAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,CAAC;AAAA,IAC5C;AACA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,aAAO;AAAA,IACX;AACA,QAAI,SAAS,OAAO,UAAU,UAAU;AACpC,UAAI,MAAM,QAAQ,MAAM,QAAQ,GAAG;AAC/B,eAAO,OAAO,MAAM,WAAW,WACzB,CAAC,EAAE,MAAM,UAAU,SAAS,MAAM,OAAO,GAAG,GAAG,MAAM,QAAQ,IAC7D,MAAM;AAAA,MAChB;AACA,UAAI,OAAO,MAAM,WAAW,UAAU;AAClC,cAAM,WAAkB,CAAC;AACzB,YAAI,OAAO,MAAM,WAAW,UAAU;AAClC,mBAAS,KAAK,EAAE,MAAM,UAAU,SAAS,MAAM,OAAO,CAAC;AAAA,QAC3D;AACA,iBAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,MAAM,OAAO,CAAC;AACrD,eAAO;AAAA,MACX;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,cAAc,YAAqD;AAG/D,QAAI,WAAW,gBAAgB,MAAM,OAAW,QAAO,WAAW,gBAAgB;AAElF,QAAI,WAAW,kBAAkB,MAAM,OAAW,QAAO,WAAW,kBAAkB;AACtF,WAAO;AAAA,EACX;AAAA,EAEA,oBAAoB,YAAkE;AAElF,QAAI;AACJ,QAAI,WAAW,kBAAkB,MAAM,QAAW;AAC9C,iBAAW,WAAW,kBAAkB;AAAA,IAC5C,WAAW,WAAW,oBAAoB,MAAM,QAAW;AACvD,iBAAW,WAAW,oBAAoB;AAAA,IAC9C,OAAO;AACH,aAAO;AAAA,IACX;AAGA,QAAI,OAAO,aAAa,UAAU;AAC9B,UAAI;AACA,eAAO,KAAK,MAAM,QAAQ;AAAA,MAC9B,QAAQ;AACJ,eAAO;AAAA,MACX;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,iBAAiB,YAAyD;AAGtE,QAAI;AACJ,QAAI,WAAW,qBAAqB,MAAM,QAAW;AACjD,uBAAiB,WAAW,qBAAqB;AAAA,IACrD,WAAW,WAAW,uBAAuB,MAAM,QAAW;AAC1D,uBAAiB,WAAW,uBAAuB;AAAA,IACvD,OAAO;AAEH,UAAI,WAAW,kBAAkB,MAAM,QAAW;AAC9C,cAAM,aAAa,WAAW,gBAAgB;AAC9C,cAAM,WAAW,WAAW,kBAAkB;AAC9C,cAAM,YAAY,WAAW,kBAAkB;AAC/C,cAAM,cAAc,WAAW,oBAAoB;AAEnD,YAAI,cAAc,UAAU;AACxB,cAAI,OAA4B,CAAC;AACjC,cAAI,cAAc,QAAW;AACzB,gBAAI,OAAO,cAAc,UAAU;AAC/B,kBAAI;AACA,uBAAO,KAAK,MAAM,SAAS;AAAA,cAC/B,QAAQ;AAEJ,uBAAO,CAAC;AAAA,cACZ;AAAA,YACJ,WAAW,OAAO,cAAc,YAAY,cAAc,MAAM;AAC5D,qBAAO;AAAA,YACX;AAAA,UACJ;AAGA,cAAI;AACJ,cAAI,gBAAgB,QAAW;AAC3B,gBAAI,OAAO,gBAAgB,UAAU;AACjC,uBAAS;AAAA,YACb,OAAO;AAEH,kBAAI;AACA,yBAAS,KAAK,UAAU,WAAW;AAAA,cACvC,QAAQ;AACJ,yBAAS,OAAO,WAAW;AAAA,cAC/B;AAAA,YACJ;AAAA,UACJ;AAEA,iBAAO,CAAC;AAAA,YACJ,MAAM;AAAA,YACN,YAAY,OAAO,UAAU;AAAA,YAC7B,UAAU,OAAO,QAAQ;AAAA,YACzB;AAAA,YACA;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ;AACA,aAAO;AAAA,IACX;AAGA,QAAI;AACJ,QAAI,OAAO,mBAAmB,UAAU;AACpC,UAAI;AACA,oBAAY,KAAK,MAAM,cAAc;AAAA,MACzC,QAAQ;AACJ,eAAO;AAAA,MACX;AAAA,IACJ,OAAO;AACH,kBAAY;AAAA,IAChB;AAGA,QAAI,CAAC,MAAM,QAAQ,SAAS,GAAG;AAC3B,aAAO;AAAA,IACX;AAGA,WAAO,UAAU,IAAI,CAAC,QAAa;AAAA,MAC/B,MAAM,GAAG,QAAQ;AAAA,MACjB,YAAY,GAAG;AAAA,MACf,UAAU,GAAG;AAAA,MACb,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAAA;AAAA,IAClC,EAAE;AAAA,EACN;AAAA,EAEA,oBAAoB,YAAqD;AAErE,QAAI,WAAW,wBAAwB,MAAM,QAAW;AACpD,aAAO,OAAO,WAAW,wBAAwB,CAAC;AAAA,IACtD;AACA,QAAI,WAAW,0BAA0B,MAAM,QAAW;AACtD,aAAO,OAAO,WAAW,0BAA0B,CAAC;AAAA,IACxD;AACA,QAAI,WAAW,gCAAgC,MAAM,QAAW;AAC5D,YAAM,UAAU,WAAW,gCAAgC;AAE3D,UAAI,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,GAAG;AAC9C,eAAO,OAAO,QAAQ,CAAC,CAAC;AAAA,MAC5B;AACA,aAAO,OAAO,OAAO;AAAA,IACzB;AACA,WAAO;AAAA,EACX;AAAA,EAEA,gBAAgB,YAA6D;AAhTjF;AAiTQ,UAAM,WAAuC,CAAC;AAG9C,QAAI,WAAW,4BAA4B,MAAM,UAAa,WAAW,yBAAyB,MAAM,QAAW;AAC/G,YAAM,SAAQ,gBAAW,4BAA4B,MAAvC,YAA4C,WAAW,yBAAyB;AAC9F,eAAS,cAAc,OAAO,UAAU,WAAW,QAAQ,WAAW,OAAO,KAAK,CAAC;AAAA,IACvF;AAEA,QAAI,WAAW,2BAA2B,MAAM,UAAa,WAAW,uBAAuB,MAAM,QAAW;AAC5G,YAAM,SAAQ,gBAAW,2BAA2B,MAAtC,YAA2C,WAAW,uBAAuB;AAC3F,eAAS,YAAY,OAAO,UAAU,WAAW,QAAQ,SAAS,OAAO,KAAK,GAAG,EAAE;AAAA,IACvF;AAEA,QAAI,WAAW,sBAAsB,MAAM,UAAa,WAAW,kBAAkB,MAAM,QAAW;AAClG,YAAM,SAAQ,gBAAW,sBAAsB,MAAjC,YAAsC,WAAW,kBAAkB;AACjF,eAAS,OAAO,OAAO,UAAU,WAAW,QAAQ,WAAW,OAAO,KAAK,CAAC;AAAA,IAChF;AAEA,QAAI,WAAW,iCAAiC,MAAM,UAAa,WAAW,6BAA6B,MAAM,QAAW;AACxH,YAAM,SAAQ,gBAAW,iCAAiC,MAA5C,YAAiD,WAAW,6BAA6B;AACvG,eAAS,kBAAkB,OAAO,UAAU,WAAW,QAAQ,WAAW,OAAO,KAAK,CAAC;AAAA,IAC3F;AAEA,QAAI,WAAW,kCAAkC,MAAM,UAAa,WAAW,8BAA8B,MAAM,QAAW;AAC1H,YAAM,SAAQ,gBAAW,kCAAkC,MAA7C,YAAkD,WAAW,8BAA8B;AACzG,eAAS,mBAAmB,OAAO,UAAU,WAAW,QAAQ,WAAW,OAAO,KAAK,CAAC;AAAA,IAC5F;AAGA,WAAO,OAAO,KAAK,QAAQ,EAAE,SAAS,IAAI,WAAW;AAAA,EACzD;AAAA,EAEA,cAAc,YAA0G;AAEpH,UAAM,SAAS,YAAY,YAAY;AAAA,MACnC,UAAU;AAAA,MACV,WAAW;AAAA,MACX,UAAU;AAAA,MACV,WAAW;AAAA;AAAA,MACX,eAAe;AAAA;AAAA,IACnB,CAAC;AAGD,WAAO,kBAAkB,qCAAqC,UAAU;AAExE,QAAI,CAAC,OAAO,iBAAiB;AACzB,aAAO,kBAAkB;AAAA,IAC7B;AAEA,WAAO;AAAA,MACH,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,MACd,WAAW,OAAO;AAAA,IACtB;AAAA,EACJ;AAAA,EAEA,gBAAgB,YAA0D;AAEtE,UAAM,SAAS,cAAc,UAAU;AAGvC,UAAM,oBAAoB,cAAc,YAAY,wBAAwB;AAG5E,UAAM,0BAA0B,sBAAsB,YAAY,qBAAqB;AACvF,UAAM,4BAA4B,sBAAsB,YAAY,wBAAwB;AAG5F,UAAM,uBAAuB;AAAA,MACzB,GAAG;AAAA,MACH,GAAG;AAAA,IACP;AAGA,WAAO;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA;AAAA,MAEH,GAAI,OAAO,KAAK,oBAAoB,EAAE,SAAS,IAAI,EAAE,UAAU,qBAAqB,IAAI,CAAC;AAAA,IAC7F;AAAA,EACJ;AACJ;;;ACtXO,IAAM,kBAAN,MAAoD;AAAA;AAAA;AAAA;AAAA,EAI/C,qBAAqB,MAAmC;AAE5D,QAAI,OAAO,SAAS,UAAU;AAC1B,aAAO;AAAA,IACX;AAEA,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACnC,aAAO;AAAA,IACX;AAEA,UAAM,OAAO,KAAK;AAGlB,QAAI,SAAS,QAAQ;AACjB,aAAO;AAAA,QACH,MAAM;AAAA,QACN,MAAM,KAAK,QAAQ;AAAA,MACvB;AAAA,IACJ;AAGA,QAAI,SAAS,aAAa;AACtB,aAAO;AAAA,QACH,MAAM;AAAA,QACN,YAAY,KAAK,cAAc;AAAA,QAC/B,UAAU,KAAK,YAAY;AAAA,QAC3B,MAAM,KAAK,SAAS,KAAK,QAAQ,CAAC;AAAA;AAAA,MACtC;AAAA,IACJ;AAGA,QAAI,SAAS,eAAe;AACxB,UAAI;AAGJ,UAAI,KAAK,WAAW,QAAW;AAE3B,YAAI,OAAO,KAAK,WAAW,YAAY,KAAK,WAAW,MAAM;AAEzD,cAAI,WAAW,KAAK,QAAQ;AACxB,+BAAmB,KAAK,OAAO;AAAA,UACnC,OAAO;AAEH,+BAAmB,KAAK;AAAA,UAC5B;AAAA,QACJ,OAAO;AACH,6BAAmB,KAAK;AAAA,QAC5B;AAAA,MACJ,WAAW,KAAK,WAAW,QAAW;AAElC,2BAAmB,KAAK;AAAA,MAC5B,OAAO;AACH,2BAAmB;AAAA,MACvB;AAEA,aAAO;AAAA,QACH,MAAM;AAAA,QACN,YAAY,KAAK,cAAc;AAAA,QAC/B,UAAU,KAAK,YAAY;AAAA,QAC3B,QAAQ;AAAA,MACZ;AAAA,IACJ;AAGA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,SAAuB;AAC5C,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AACzC,aAAO;AAAA,IACX;AAEA,UAAM,EAAE,MAAM,SAAS,GAAG,KAAK,IAAI;AAGnC,QAAI;AAEJ,QAAI,OAAO,YAAY,UAAU;AAE7B,0BAAoB;AAAA,IACxB,WAAW,MAAM,QAAQ,OAAO,GAAG;AAE/B,0BAAoB,QAAQ,IAAI,CAAC,SAAS,KAAK,qBAAqB,IAAI,CAAC;AAAA,IAC7E,WAAW,WAAW,OAAO,YAAY,UAAU;AAE/C,0BAAoB,KAAK,qBAAqB,OAAO;AAAA,IACzD,OAAO;AACH,0BAAoB;AAAA,IACxB;AAEA,WAAO;AAAA,MACH,MAAM,QAAQ;AAAA,MACd,SAAS;AAAA,MACT,GAAG;AAAA,IACP;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,UAA4B;AAClD,QAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC1B,aAAO;AAAA,IACX;AAEA,WAAO,SAAS,IAAI,CAAC,QAAQ,KAAK,iBAAiB,GAAG,CAAC;AAAA,EAC3D;AAAA,EAEA,aAAa,YAAqD;AAC9D,WAAO,WAAW,sBAAsB,KAAK,WAAW,aAAa;AAAA,EACzE;AAAA,EAEA,aAAa,YAAwD;AAQjE,UAAM,MACF,WAAW,oBAAoB,MAAM,SAC/B,WAAW,oBAAoB,IAC/B,WAAW,WAAW;AAChC,QAAI,QAAQ,QAAW;AACnB,aAAO;AAAA,IACX;AAEA,QAAI,QAAa;AACjB,QAAI,OAAO,UAAU,UAAU;AAC3B,UAAI;AACA,gBAAQ,KAAK,MAAM,KAAK;AAAA,MAC5B,QAAQ;AAAA,MAER;AAAA,IACJ;AAEA,UAAM,WAAW,KAAK,iBAAiB,KAAK;AAC5C,QAAI,CAAC,UAAU;AACX,aAAO;AAAA,IACX;AACA,WAAO,KAAK,kBAAkB,QAAQ;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,iBAAiB,OAA+B;AACpD,QAAI,OAAO,UAAU,UAAU;AAC3B,aAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,MAAM,CAAC;AAAA,IAC5C;AACA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,aAAO;AAAA,IACX;AACA,QAAI,SAAS,OAAO,UAAU,UAAU;AACpC,UAAI,MAAM,QAAQ,MAAM,QAAQ,GAAG;AAC/B,eAAO,OAAO,MAAM,WAAW,WACzB,CAAC,EAAE,MAAM,UAAU,SAAS,MAAM,OAAO,GAAG,GAAG,MAAM,QAAQ,IAC7D,MAAM;AAAA,MAChB;AACA,UAAI,OAAO,MAAM,WAAW,UAAU;AAClC,cAAM,WAAkB,CAAC;AACzB,YAAI,OAAO,MAAM,WAAW,UAAU;AAClC,mBAAS,KAAK,EAAE,MAAM,UAAU,SAAS,MAAM,OAAO,CAAC;AAAA,QAC3D;AACA,iBAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,MAAM,OAAO,CAAC;AACrD,eAAO;AAAA,MACX;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,cAAc,YAAqD;AAG/D,QAAI,WAAW,kBAAkB,MAAM,OAAW,QAAO,WAAW,kBAAkB;AACtF,WAAO;AAAA,EACX;AAAA,EAEA,oBAAoB,YAAkE;AAElF,QAAI,WAAW,oBAAoB,MAAM,QAAW;AAChD,aAAO;AAAA,IACX;AAEA,UAAM,WAAW,WAAW,oBAAoB;AAGhD,QAAI,OAAO,aAAa,UAAU;AAC9B,UAAI;AACA,eAAO,KAAK,MAAM,QAAQ;AAAA,MAC9B,QAAQ;AACJ,eAAO;AAAA,MACX;AAAA,IACJ;AAGA,QAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AACnD,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA,EAEA,iBAAiB,YAAyD;AAGtE,QAAI,WAAW,uBAAuB,MAAM,QAAW;AAEvD,YAAM,iBAAiB,WAAW,uBAAuB;AAGzD,UAAI;AACJ,UAAI,OAAO,mBAAmB,UAAU;AACpC,YAAI;AACA,sBAAY,KAAK,MAAM,cAAc;AAAA,QACzC,QAAQ;AACJ,iBAAO;AAAA,QACX;AAAA,MACJ,OAAO;AACH,oBAAY;AAAA,MAChB;AAGA,UAAI,CAAC,MAAM,QAAQ,SAAS,GAAG;AAC3B,eAAO;AAAA,MACX;AAGA,aAAO,UAAU,IAAI,CAAC,QAAa;AAAA,QAC/B,MAAM,GAAG,QAAQ;AAAA,QACjB,YAAY,GAAG;AAAA,QACf,UAAU,GAAG;AAAA,QACb,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAAA;AAAA,QAC9B,kBAAkB,GAAG,oBAAoB,GAAG;AAAA,MAChD,EAAE;AAAA,IACF;AAGA,QAAI,WAAW,kBAAkB,MAAM,QAAW;AAC9C,YAAM,aAAa,WAAW,gBAAgB;AAC9C,YAAM,WAAW,WAAW,kBAAkB;AAC9C,YAAM,YAAY,WAAW,kBAAkB;AAC/C,YAAM,cAAc,WAAW,oBAAoB;AAEnD,UAAI,cAAc,UAAU;AACxB,YAAI,OAA4B,CAAC;AACjC,YAAI,cAAc,QAAW;AACzB,cAAI,OAAO,cAAc,UAAU;AAC/B,gBAAI;AACA,qBAAO,KAAK,MAAM,SAAS;AAAA,YAC/B,QAAQ;AAEJ,qBAAO,CAAC;AAAA,YACZ;AAAA,UACJ,WAAW,OAAO,cAAc,YAAY,cAAc,MAAM;AAC5D,mBAAO;AAAA,UACX;AAAA,QACJ;AAGA,YAAI;AACJ,YAAI,gBAAgB,QAAW;AAC3B,cAAI,OAAO,gBAAgB,UAAU;AACjC,qBAAS;AAAA,UACb,OAAO;AAEH,gBAAI;AACA,uBAAS,KAAK,UAAU,WAAW;AAAA,YACvC,QAAQ;AACJ,uBAAS,OAAO,WAAW;AAAA,YAC/B;AAAA,UACJ;AAAA,QACJ;AAEA,eAAO,CAAC;AAAA,UACJ,MAAM;AAAA,UACN,YAAY,OAAO,UAAU;AAAA,UAC7B,UAAU,OAAO,QAAQ;AAAA,UACzB;AAAA,UACA;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,oBAAoB,YAAqD;AAErE,QAAI,WAAW,0BAA0B,MAAM,QAAW;AACtD,aAAO,OAAO,WAAW,0BAA0B,CAAC;AAAA,IACxD;AACA,QAAI,WAAW,gCAAgC,MAAM,QAAW;AAC5D,YAAM,UAAU,WAAW,gCAAgC;AAE3D,UAAI,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,GAAG;AAC9C,eAAO,OAAO,QAAQ,CAAC,CAAC;AAAA,MAC5B;AACA,aAAO,OAAO,OAAO;AAAA,IACzB;AACA,WAAO;AAAA,EACX;AAAA,EAEA,gBAAgB,YAA6D;AAzUjF;AA0UQ,UAAM,WAAuC,CAAC;AAG9C,QAAI,WAAW,4BAA4B,MAAM,UAAa,WAAW,yBAAyB,MAAM,QAAW;AAC/G,YAAM,SAAQ,gBAAW,4BAA4B,MAAvC,YAA4C,WAAW,yBAAyB;AAC9F,eAAS,cAAc,OAAO,UAAU,WAAW,QAAQ,WAAW,OAAO,KAAK,CAAC;AAAA,IACvF;AAEA,QAAI,WAAW,2BAA2B,MAAM,UAAa,WAAW,uBAAuB,MAAM,QAAW;AAC5G,YAAM,SAAQ,gBAAW,2BAA2B,MAAtC,YAA2C,WAAW,uBAAuB;AAC3F,eAAS,YAAY,OAAO,UAAU,WAAW,QAAQ,SAAS,OAAO,KAAK,GAAG,EAAE;AAAA,IACvF;AAEA,QAAI,WAAW,sBAAsB,MAAM,UAAa,WAAW,kBAAkB,MAAM,QAAW;AAClG,YAAM,SAAQ,gBAAW,sBAAsB,MAAjC,YAAsC,WAAW,kBAAkB;AACjF,eAAS,OAAO,OAAO,UAAU,WAAW,QAAQ,WAAW,OAAO,KAAK,CAAC;AAAA,IAChF;AAEA,QAAI,WAAW,iCAAiC,MAAM,UAAa,WAAW,6BAA6B,MAAM,QAAW;AACxH,YAAM,SAAQ,gBAAW,iCAAiC,MAA5C,YAAiD,WAAW,6BAA6B;AACvG,eAAS,kBAAkB,OAAO,UAAU,WAAW,QAAQ,WAAW,OAAO,KAAK,CAAC;AAAA,IAC3F;AAEA,QAAI,WAAW,kCAAkC,MAAM,UAAa,WAAW,8BAA8B,MAAM,QAAW;AAC1H,YAAM,SAAQ,gBAAW,kCAAkC,MAA7C,YAAkD,WAAW,8BAA8B;AACzG,eAAS,mBAAmB,OAAO,UAAU,WAAW,QAAQ,WAAW,OAAO,KAAK,CAAC;AAAA,IAC5F;AAGA,WAAO,OAAO,KAAK,QAAQ,EAAE,SAAS,IAAI,WAAW;AAAA,EACzD;AAAA,EAEA,cAAc,YAA0G;AAEpH,UAAM,SAAS,YAAY,YAAY;AAAA,MACnC,UAAU;AAAA,MACV,WAAW;AAAA,MACX,UAAU;AAAA,MACV,WAAW;AAAA;AAAA,MACX,eAAe;AAAA;AAAA,MACf,cAAc;AAAA;AAAA,IAClB,CAAC;AAID,QAAI,OAAO,oBAAoB,QAAW;AACtC,aAAO,kBAAkB,qCAAqC,UAAU;AAAA,IAC5E;AAEA,QAAI,CAAC,OAAO,iBAAiB;AACzB,aAAO,kBAAkB;AAAA,IAC7B;AAEA,WAAO;AAAA,MACH,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,MACd,WAAW,OAAO;AAAA,IACtB;AAAA,EACJ;AAAA,EAEA,gBAAgB,YAA0D;AAEtE,UAAM,SAAS,cAAc,UAAU;AAGvC,UAAM,oBAAoB,cAAc,YAAY,wBAAwB;AAG5E,UAAM,0BAA0B,sBAAsB,YAAY,qBAAqB;AACvF,UAAM,4BAA4B,sBAAsB,YAAY,wBAAwB;AAG5F,UAAM,uBAAuB;AAAA,MACzB,GAAG;AAAA,MACH,GAAG;AAAA,IACP;AAGA,WAAO;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA;AAAA,MAEH,GAAI,OAAO,KAAK,oBAAoB,EAAE,SAAS,IAAI,EAAE,UAAU,qBAAqB,IAAI,CAAC;AAAA,IAC7F;AAAA,EACJ;AACJ;;;AC3ZO,IAAM,mBAAN,MAAmD;AAAA,EAMtD,cAAc;AACV,SAAK,aAAa;AAAA,MACd,IAAI,IAAI,gBAAgB;AAAA,MACxB,IAAI,IAAI,gBAAgB;AAAA,IAC5B;AAAA,EACJ;AAAA,EAEA,SAAS,MAAgB,aAA4C;AAMjE,UAAM,mBACF,KAAK,SAAS,gCACd,KAAK,SAAS,4BACd,KAAK,SAAS,kCACd,KAAK,SAAS;AAElB,WAAO;AAAA,EACX;AAAA,EAEA,UAAU,OAAiB,YAA0D;AACjF,UAAM,UAAU,cAAc,UAAU;AAExC,UAAM,WAAW,YAAY,OAAO,KAAK,WAAW,KAAK,KAAK,WAAW;AAEzE,UAAM,SAAS,SAAS,cAAc,UAAU;AAChD,UAAM,YAAY,SAAS,iBAAiB,UAAU;AAGtD,UAAM,SAAkC;AAAA,MACpC,OAAO,SAAS,aAAa,UAAU;AAAA,MACvC,OAAO,SAAS,aAAa,UAAU;AAAA,MACvC,QAAQ,SAAS,cAAc,UAAU;AAAA,MACzC,cAAc,SAAS,oBAAoB,UAAU;AAAA,MACrD;AAAA,MACA,cAAc,SAAS,oBAAoB,UAAU;AAAA,MACrD,UAAU,SAAS,gBAAgB,UAAU;AAAA,MAC7C,aAAa,OAAO;AAAA,MACpB,cAAc,OAAO;AAAA,MACrB,aAAa,OAAO;AAAA,MACpB,iBAAiB,OAAO;AAAA,MAExB,GAAG,SAAS,gBAAgB,UAAU;AAAA,IAC1C;AAKA,UAAM,WAAW,WAAW,kBAAkB;AAC9C,QAAI,YAAY,OAAO,aAAa,UAAU;AAC1C,aAAO,OAAO;AAAA,IAClB;AAEA,WAAO;AAAA,EACX;AACJ;;;AClEO,IAAM,oBAAN,MAAoD;AAAA,EACvD,SAAS,MAAgB,aAA4C;AAEjE,UAAM,mBACF,KAAK,SAAS,wBACd,KAAK,SAAS,kBACd,KAAK,SAAS,wBACd,KAAK,SAAS,oBACd,KAAK,SAAS;AAElB,WAAO;AAAA,EACX;AAAA,EAEA,UAAU,MAAgB,YAA0D;AAChF,UAAM,SAAkC,CAAC;AAGzC,UAAM,cAAc,KAAK,mBAAmB,YAAY,IAAI;AAC5D,QAAI,2CAAa,SAAS;AACtB,aAAO,QAAQ,YAAY;AAAA,IAC/B;AAGA,UAAM,QAAQ,KAAK,aAAa,MAAM,UAAU;AAChD,QAAI,OAAO;AACP,aAAO,QAAQ;AAAA,IACnB;AAGA,UAAM,eAAe,KAAK,oBAAoB,MAAM,UAAU;AAC9D,QAAI,cAAc;AACd,UAAI,aAAa,QAAQ;AACrB,eAAO,SAAS,aAAa;AAAA,MACjC;AACA,UAAI,aAAa,cAAc;AAC3B,eAAO,eAAe,aAAa;AAAA,MACvC;AACA,UAAI,aAAa,OAAO;AACpB,eAAO,cAAc,aAAa,MAAM;AACxC,eAAO,eAAe,aAAa,MAAM;AACzC,eAAO,cAAc,aAAa,MAAM;AAAA,MAC5C;AAAA,IACJ;AAGA,QAAI,WAAW,sBAAsB,GAAG;AACpC,aAAO,YAAY,WAAW,sBAAsB;AAAA,IACxD,WAAW,WAAW,eAAe,GAAG;AACpC,aAAO,YAAY,WAAW,eAAe;AAAA,IACjD;AAGA,QAAI,2CAAa,UAAU;AACvB,aAAO,WAAW,YAAY;AAAA,IAClC;AAEA,WAAO;AAAA,EACX;AAAA,EAEQ,mBACJ,YACA,OAC8D;AAhEtE;AAmEQ,UAAM,2BAA2B,WAAW,iCAAiC;AAC7E,QAAI,0BAA0B;AAC1B,UAAI;AACA,cAAM,SAAS,OAAO,6BAA6B,WAC7C,KAAK,MAAM,wBAAwB,IACnC;AAEN,YAAI,OAAO,SAAS;AAChB,iBAAO;AAAA,YACH,SAAS,OAAO;AAAA,YAChB,WAAU,YAAO,WAAP,mBAAe;AAAA,YACzB,UAAU,OAAO;AAAA,UACrB;AAAA,QACJ;AAAA,MACJ,QAAQ;AAAA,MAER;AAAA,IACJ;AAGA,UAAM,0BAA0B,WAAW,gCAAgC;AAC3E,QAAI,yBAAyB;AACzB,UAAI;AACA,cAAM,SAAS,OAAO,4BAA4B,WAC5C,KAAK,MAAM,uBAAuB,IAClC;AAEN,aAAI,YAAO,QAAP,mBAAY,MAAM;AAAA,QAGtB;AAAA,MACJ,QAAQ;AAAA,MAER;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEQ,aAAa,MAAgB,YAAwD;AAEzF,UAAM,WAAW,KAAK;AAGtB,UAAM,YAAY,WAAW,GAAG,QAAQ,aAAa,KACpC,WAAW,oCAAoC,KAC/C,WAAW,yBAAyB,KACpC,WAAW,+BAA+B;AAE3D,QAAI,WAAW;AACX,UAAI;AACA,cAAM,WAAW,OAAO,cAAc,WAAW,KAAK,MAAM,SAAS,IAAI;AACzE,YAAI,MAAM,QAAQ,QAAQ,GAAG;AACzB,iBAAO;AAAA,QACX;AAAA,MACJ,QAAQ;AAAA,MAER;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEQ,oBACJ,MACA,YACkI;AAClI,UAAM,WAAW,KAAK;AAGtB,UAAM,aAAa,WAAW,GAAG,QAAQ,SAAS,KAChC,WAAW,qBAAqB,KAChC,WAAW,2BAA2B,KACtC,WAAW,2BAA2B;AAExD,QAAI,YAAY;AACZ,UAAI;AACA,cAAM,SAAS,OAAO,eAAe,WAAW,KAAK,MAAM,UAAU,IAAI;AAEzE,cAAM,YAAiB,CAAC;AAGxB,YAAI,OAAO,OAAO;AACd,oBAAU,QAAQ;AAAA,YACd,cAAc,OAAO,MAAM;AAAA,YAC3B,kBAAkB,OAAO,MAAM;AAAA,YAC/B,aAAa,OAAO,MAAM;AAAA,UAC9B;AAAA,QACJ;AAGA,YAAI,OAAO,QAAQ;AACf,oBAAU,eAAe,OAAO;AAChC,oBAAU,SAAS,KAAK,UAAU,OAAO,MAAM;AAAA,QACnD,WAAW,OAAO,MAAM;AACpB,oBAAU,SAAS,OAAO;AAAA,QAC9B,WAAW,OAAO,UAAU;AAExB,cAAI,OAAO,OAAO,aAAa,UAAU;AACrC,sBAAU,SAAS,OAAO;AAAA,UAC9B,OAAO;AACH,sBAAU,SAAS,KAAK,UAAU,OAAO,QAAQ;AACjD,sBAAU,eAAe,OAAO;AAAA,UACpC;AAAA,QACJ;AAEA,eAAO;AAAA,MACX,QAAQ;AAAA,MAER;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AACJ;;;AC3KO,SAAS,yBACZ,YACA,SAAiB,cACM;AACvB,QAAM,SAAkC,CAAC;AAGzC,QAAM,MAAM,CAAC,QAAgB,WAAW,GAAG,MAAM,GAAG,GAAG,EAAE;AAGzD,MAAI,IAAI,YAAY,EAAG,QAAO,YAAY,OAAO,IAAI,YAAY,CAAC;AAClE,MAAI,IAAI,cAAc,EAAG,QAAO,cAAc,OAAO,IAAI,cAAc,CAAC;AACxE,MAAI,IAAI,SAAS,EAAG,QAAO,SAAS,OAAO,IAAI,SAAS,CAAC;AACzD,MAAI,IAAI,YAAY,EAAG,QAAO,YAAY,OAAO,IAAI,YAAY,CAAC;AAGlE,MAAI,IAAI,aAAa,EAAG,QAAO,aAAa,OAAO,IAAI,aAAa,CAAC;AAgBrE,MAAI,IAAI,OAAO,EAAG,QAAO,QAAQ,OAAO,IAAI,OAAO,CAAC;AAIpD,MAAI,IAAI,WAAW,EAAG,QAAO,eAAe,OAAO,IAAI,WAAW,CAAC;AAGnE,MAAI,IAAI,gBAAgB,EAAG,QAAO,eAAe,OAAO,IAAI,gBAAgB,CAAC;AAC7E,MAAI,IAAI,kBAAkB,EAAG,QAAO,iBAAiB,OAAO,IAAI,kBAAkB,CAAC;AACnF,MAAI,IAAI,mBAAmB,EAAG,QAAO,kBAAkB,OAAO,IAAI,mBAAmB,CAAC;AACtF,MAAI,IAAI,yBAAyB,EAAG,QAAO,wBAAwB,OAAO,IAAI,yBAAyB,CAAC;AACxG,MAAI,IAAI,eAAe,EAAG,QAAO,eAAe,OAAO,IAAI,eAAe,CAAC;AAC3E,MAAI,IAAI,cAAc,EAAG,QAAO,cAAc,OAAO,IAAI,cAAc,CAAC;AAGxE,MAAI,IAAI,gBAAgB,EAAG,QAAO,gBAAgB,OAAO,IAAI,gBAAgB,CAAC;AAC9E,MAAI,IAAI,kBAAkB,EAAG,QAAO,iBAAiB,OAAO,IAAI,kBAAkB,CAAC;AAEnF,SAAO;AACX;;;ACrDA,IAAM,kBAAkB;AAAA,EACpB,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EACzB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,aAAa;AAAA;AAAA,EAGb,eAAe;AAAA;AAAA;AAAA;AAAA,EAKf,kBAAkB;AAAA,EAClB,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA;AAAA,EAGrB,eAAe;AAAA,EACf,mBAAmB;AAAA;AAAA,EAGnB,qBAAqB;AAAA,EACrB,yBAAyB;AAC7B;AAOA,SAAS,gBAAgB,KAAwB;AAC7C,MAAI;AACA,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,GAAG;AAC5C,YAAM,kBAAkB,OAAO;AAAA,QAC3B,CAAC,SACG,QACA,OAAO,SAAS,YAChB,UAAU,QACV,aAAa;AAAA,MACrB;AACA,UAAI,iBAAiB;AACjB,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,EACJ,QAAQ;AAAA,EAER;AACA,SAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,IAAI,CAAC;AAC1C;AAMA,SAAS,gBAAgB,OAAsB;AAC3C,SAAO,MACF,OAAO,CAAC,MAAW,KAAK,EAAE,SAAS,UAAU,OAAO,EAAE,YAAY,QAAQ,EAC1E,IAAI,CAAC,MAAW,EAAE,OAAO,EACzB,KAAK,IAAI;AAClB;AAOA,SAAS,kBAAkB,KAA+B;AACtD,MAAI;AACA,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,EAAG,QAAO;AAC1D,UAAM,WAAsB,CAAC;AAC7B,eAAW,OAAO,QAAQ;AACtB,UAAI,CAAC,OAAO,CAAC,IAAI,KAAM;AACvB,UAAI,OAAO,IAAI,YAAY,UAAU;AACjC,iBAAS,KAAK,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,CAAC;AAAA,MAC1D,WAAW,MAAM,QAAQ,IAAI,KAAK,GAAG;AACjC,cAAM,OAAO,gBAAgB,IAAI,KAAK;AACtC,YAAI,KAAM,UAAS,KAAK,EAAE,MAAM,IAAI,MAAM,SAAS,KAAK,CAAC;AAAA,MAC7D;AAAA,IACJ;AACA,WAAO,SAAS,SAAS,IAAI,WAAW;AAAA,EAC5C,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAMA,SAAS,wBAAwB,KAA4B;AACzD,MAAI;AACA,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,MAAM,QAAQ,MAAM,GAAG;AACvB,YAAM,OAAO,gBAAgB,MAAM;AACnC,aAAO,QAAQ;AAAA,IACnB;AACA,QAAI,OAAO,WAAW,SAAU,QAAO,UAAU;AAAA,EACrD,QAAQ;AAAA,EAER;AACA,SAAO,OAAO;AAClB;AAWA,IAAM,YAAY;AAAA;AAAA,EAEd,MAAM;AAAA,EACN,cAAc;AAAA,EACd,cAAc;AAAA;AAAA,EAGd,SAAS;AAAA,EACT,WAAW;AAAA,EACX,UAAU;AAAA,EACV,cAAc;AAAA,EACd,UAAU;AACd;AAMA,IAAM,iBAAiB;AAAA,EACnB,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAClB;AAaO,IAAM,uBAAN,MAAuD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAe1D,SAAS,MAAgB,YAA2C;AAChE,UAAM,gBAAgB,WAAW,gBAAgB,cAAc;AAG/D,QAAI,kBAAkB,eAAe,QAAQ,kBAAkB,eAAe,iBAAiB;AAC3F;AAAA,IACJ;AAGA,QAAI,kBAAkB,eAAe,YAAY;AAC7C;AAAA,IACJ;AAGA,QAAI,KAAK,SAAS,UAAU,QAAQ,KAAK,KAAK,WAAW,UAAU,OAAO,GAAG,GAAG;AAC5E;AAAA,IACJ;AAGA,QAAI,KAAK,SAAS,UAAU,UAAU;AAClC;AAAA,IACJ;AAGA,QAAI,KAAK,SAAS,UAAU,SAAS;AACjC;AAAA,IACJ;AAGA,QAAI,KAAK,SAAS,UAAU,gBACxB,KAAK,KAAK,WAAW,UAAU,eAAe,GAAG,KACjD,KAAK,KAAK,WAAW,UAAU,SAAS,GAAG;AAC3C;AAAA,IACJ;AAGA,QAAI,KAAK,SAAS,UAAU,gBACxB,KAAK,KAAK,WAAW,UAAU,eAAe,GAAG,GAAG;AACpD;AAAA,IACJ;AAGA,QAAI,KAAK,SAAS,UAAU,gBAAgB,KAAK,SAAS,UAAU,UAAU;AAC1E;AAAA,IACJ;AAKA,QAAI,WAAW,gBAAgB,MAAM,MAAM,eACvC,WAAW,gBAAgB,aAAa,MAAM,aAAa;AAE3D,UAAI,WAAW,gBAAgB,kBAAkB,MAAM,UACnD,WAAW,gBAAgB,eAAe,MAAM,QAAW;AAC3D;AAAA,MACJ;AAAA,IACJ;AAEA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAiB,YAA0D;AAnQzF;AAoQQ,UAAM,SAAkC,CAAC;AAGzC,UAAM,gBAAgB,WAAW,gBAAgB,cAAc;AAC/D,UAAM,eAAe,WAAW,gBAAgB,aAAa;AAC7D,QAAI,eAAe;AACf,aAAO,QAAQ,OAAO,aAAa;AAAA,IACvC,WAAW,cAAc;AACrB,aAAO,QAAQ,OAAO,YAAY;AAAA,IACtC;AAKA,UAAM,eAAc,gBAAW,gBAAgB,kBAAkB,MAA7C,YACb,WAAW,gBAAgB,mBAAmB;AACrD,UAAM,gBAAe,gBAAW,gBAAgB,mBAAmB,MAA9C,YACd,WAAW,gBAAgB,uBAAuB;AACzD,QAAI,OAAO,gBAAgB,UAAU;AACjC,aAAO,cAAc;AAAA,IACzB;AACA,QAAI,OAAO,iBAAiB,UAAU;AAClC,aAAO,eAAe;AAAA,IAC1B;AACA,QAAI,OAAO,gBAAgB,UAAa,OAAO,iBAAiB,QAAW;AACvE,aAAO,cAAc,OAAO,cAAc,OAAO;AAAA,IACrD;AAGA,UAAM,UAAU,WAAW,0BAA0B;AACrD,QAAI,OAAO,YAAY,YAAY,UAAU,GAAG;AAC5C,aAAO,OAAO;AAAA,IAClB;AAGA,UAAM,gBAAgB,WAAW,gBAAgB,uBAAuB;AACxE,QAAI,eAAe;AACf,UAAI;AACA,cAAM,UAAU,KAAK,MAAM,aAAa;AACxC,YAAI,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,GAAG;AAC9C,iBAAO,eAAe,OAAO,QAAQ,CAAC,CAAC;AAAA,QAC3C;AAAA,MACJ,QAAQ;AAEJ,eAAO,eAAe,OAAO,aAAa;AAAA,MAC9C;AAAA,IACJ;AAGA,UAAM,YAAY,WAAW,gBAAgB,kBAAkB;AAC/D,UAAM,cAAc,WAAW,gBAAgB,mBAAmB;AAClE,QAAI,cAAc,UAAa,gBAAgB,QAAW;AACtD,aAAO,WAAW,CAAC;AACnB,UAAI,OAAO,cAAc,UAAU;AAC/B,eAAO,SAAS,YAAY;AAAA,MAChC;AACA,UAAI,OAAO,gBAAgB,UAAU;AACjC,eAAO,SAAS,cAAc;AAAA,MAClC;AAAA,IACJ;AAUA,UAAM,gBAAe,gBAAW,gBAAgB,aAAa,MAAxC,YACd,WAAW,gBAAgB,gBAAgB;AAClD,UAAM,oBAAoB;AAAA,OACtB,gBAAW,iBAAiB,MAA5B,YAAiC,WAAW,iBAAiB;AAAA,IACjE;AACA,QAAI,gBAAgB,OAAO,iBAAiB,UAAU;AAClD,aAAO,QAAQ,gBAAgB,YAAY;AAAA,IAC/C,WAAW,CAAC,mBAAmB;AAC3B,YAAM,gBAAgB,WAAW,gBAAgB,cAAc;AAC/D,UAAI,iBAAiB,OAAO,kBAAkB,UAAU;AACpD,cAAM,WAAW,kBAAkB,aAAa;AAChD,YAAI,SAAU,QAAO,QAAQ;AAAA,MACjC;AACA,UAAI,CAAC,OAAO,OAAO;AACf,cAAM,eAAe,WAAW,gBAAgB,aAAa;AAC7D,YAAI,gBAAgB,OAAO,iBAAiB,UAAU;AAClD,iBAAO,QAAQ,gBAAgB,YAAY;AAAA,QAC/C;AAAA,MACJ;AAAA,IACJ;AAKA,UAAM,qBAAqB,WAAW,gBAAgB,mBAAmB;AACzE,QAAI,sBAAsB,OAAO,uBAAuB,YAAY,CAAC,mBAAmB;AACpF,YAAM,OAAO,wBAAwB,kBAAkB;AACvD,UAAI,SAAS,CAAC,OAAO,WAAS,YAAO,MAAM,CAAC,MAAd,mBAAiB,UAAS,WAAW;AAC/D,eAAO,QAAQ,CAAC,EAAE,MAAM,UAAU,SAAS,KAAK,GAAG,IAAI,YAAO,UAAP,YAAgB,CAAC,CAAE;AAAA,MAC9E;AAAA,IACJ;AAQA,UAAM,kBAAiB,gBAAW,gBAAgB,eAAe,MAA1C,YAChB,WAAW,gBAAgB,kBAAkB;AACpD,UAAM,qBAAqB,QAAQ,WAAW,kBAAkB,CAAC;AACjE,QAAI,kBAAkB,OAAO,mBAAmB,UAAU;AACtD,aAAO,SAAS;AAChB,UAAI;AACA,eAAO,eAAe,KAAK,MAAM,cAAc;AAAA,MACnD,QAAQ;AAAA,MAAoC;AAAA,IAChD,WAAW,CAAC,oBAAoB;AAC5B,YAAM,iBAAiB,WAAW,gBAAgB,eAAe;AACjE,UAAI,kBAAkB,OAAO,mBAAmB,UAAU;AACtD,cAAM,WAAW,kBAAkB,cAAc;AACjD,YAAI,UAAU;AACV,iBAAO,SAAS,SAAS,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI;AAAA,QAC5D;AAAA,MACJ;AACA,UAAI,OAAO,WAAW,QAAW;AAC7B,cAAM,mBAAmB,WAAW,gBAAgB,iBAAiB;AACrE,YAAI,oBAAoB,OAAO,qBAAqB,UAAU;AAC1D,iBAAO,SAAS;AAChB,cAAI;AACA,mBAAO,eAAe,KAAK,MAAM,gBAAgB;AAAA,UACrD,QAAQ;AAAA,UAAoC;AAAA,QAChD;AAAA,MACJ;AAAA,IACJ;AAWA,UAAM,WAAU,gBAAW,iBAAiB,MAA5B,YAAiC,WAAW,iBAAiB;AAC7E,QAAI,WAAW,OAAO,YAAY,YAAY,CAAC,OAAO,OAAO;AAKzD,UAAI,iBAAmC;AACvC,UAAI;AACA,cAAM,SAAS,KAAK,MAAM,OAAO;AACjC,YACI,MAAM,QAAQ,MAAM,KACpB,OAAO,SAAS,KAChB,OAAO;AAAA,UACH,CAAC,SACG,QACA,OAAO,SAAS,YAChB,UAAU,QACV,aAAa;AAAA,QACrB,GACF;AACE,2BAAiB;AAAA,QACrB;AAAA,MACJ,QAAQ;AAAA,MAA8C;AACtD,aAAO,QAAQ,0CAAkB,CAAC,EAAE,MAAM,QAAQ,SAAS,QAAQ,CAAC;AAAA,IACxE;AACA,UAAM,WAAW,WAAW,kBAAkB;AAC9C,QAAI,YAAY,OAAO,aAAa,YAAY,CAAC,OAAO,QAAQ;AAC5D,aAAO,SAAS;AAChB,UAAI;AACA,eAAO,eAAe,KAAK,MAAM,QAAQ;AAAA,MAC7C,QAAQ;AAAA,MAAe;AAAA,IAC3B;AAGA,UAAM,WAAW,WAAW,gBAAgB,SAAS;AACrD,UAAM,aAAa,WAAW,gBAAgB,YAAY;AAC1D,UAAM,YAAY,WAAW,gBAAgB,UAAU;AACvD,UAAM,aAAa,WAAW,gBAAgB,WAAW;AAEzD,QAAI,YAAY,OAAO,aAAa,UAAU;AAE1C,aAAO,OAAO;AAGd,YAAM,WAAqB;AAAA,QACvB,MAAM;AAAA,QACN,YAAY,OAAO,eAAe,WAAW,aAAa;AAAA,QAC1D;AAAA,QACA,MAAM,CAAC;AAAA,MACX;AAGA,UAAI,aAAa,OAAO,cAAc,UAAU;AAC5C,YAAI;AACA,mBAAS,OAAO,KAAK,MAAM,SAAS;AAAA,QACxC,QAAQ;AAEJ,mBAAS,OAAO,EAAE,KAAK,UAAU;AAAA,QACrC;AAAA,MACJ;AAGA,UAAI,cAAc,OAAO,eAAe,UAAU;AAC9C,iBAAS,SAAS;AAAA,MACtB;AAEA,aAAO,YAAY,CAAC,QAAQ;AAAA,IAChC;AAIA,UAAM,iBAAiB,yBAAyB,UAAU;AAG1D,UAAM,gBAAgB,cAAc,YAAY,qBAAqB;AAGrE,UAAM,iBAAiB,sBAAsB,YAAY,qBAAqB;AAE9E,WAAO;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA;AAAA,MACH,GAAG;AAAA;AAAA;AAAA,MAEH,GAAI,OAAO,KAAK,cAAc,EAAE,SAAS,IAAI,EAAE,UAAU,eAAe,IAAI,CAAC;AAAA,IACjF;AAAA,EACJ;AACJ;AAMO,IAAM,uBAAuB;;;AC7dpC,IAAM,QAAQ;AAAA;AAAA,EAEV,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,yBAAyB;AAAA,EACzB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQrB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,qBAAqB;AAAA,EACrB,kBAAkB;AAAA;AAAA;AAAA,EAIlB,eAAe;AAAA,EACf,mBAAmB;AAAA;AAAA,EAGnB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA;AAAA,EAGzB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,kBAAkB;AACtB;AAMA,SAAS,YAAY,OAAsB;AACvC,SAAO,MACF,OAAO,CAAC,MAAW,EAAE,SAAS,UAAU,EAAE,OAAO,EACjD,IAAI,CAAC,MAAW,EAAE,OAAO,EACzB,KAAK,IAAI;AAClB;AAKA,SAAS,kBAAkB,KAA+B;AACtD,MAAI;AACA,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,EAAG,QAAO;AAE1D,UAAM,WAAsB,CAAC;AAC7B,eAAW,OAAO,QAAQ;AACtB,UAAI,CAAC,IAAI,KAAM;AACf,UAAI,IAAI,WAAW,OAAO,IAAI,YAAY,UAAU;AAEhD,iBAAS,KAAK,GAAG;AAAA,MACrB,WAAW,IAAI,SAAS,MAAM,QAAQ,IAAI,KAAK,GAAG;AAE9C,cAAM,OAAO,YAAY,IAAI,KAAK;AAClC,YAAI,MAAM;AACN,mBAAS,KAAK,EAAE,MAAM,IAAI,MAAM,SAAS,KAAK,CAAC;AAAA,QACnD;AAAA,MACJ;AAAA,IACJ;AACA,WAAO,SAAS,SAAS,IAAI,WAAW;AAAA,EAC5C,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAMA,SAAS,wBAAwB,KAA4D;AACzF,MAAI;AACA,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO;AAEnC,eAAW,OAAO,QAAQ;AACtB,iBAAW,QAAS,IAAI,SAAS,CAAC,GAAI;AAClC,YAAI,KAAK,SAAS,eAAe,KAAK,WAAW;AAE7C,iBAAO;AAAA,YACH,QAAQ,KAAK,UAAU,KAAK,SAAS;AAAA,YACrC,cAAc,KAAK;AAAA,UACvB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,eAAW,OAAO,QAAQ;AACtB,YAAM,OAAO,YAAY,IAAI,SAAS,CAAC,CAAC;AACxC,UAAI,KAAM,QAAO,EAAE,QAAQ,KAAK;AAAA,IACpC;AACA,WAAO;AAAA,EACX,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAEO,IAAM,uBAAN,MAAuD;AAAA,EAE1D,SAAS,MAAgB,YAA2C;AAEhE,QAAI,KAAK,KAAK,WAAW,OAAO,EAAG;AAEnC,QAAI,KAAK,KAAK,WAAW,cAAc,KAAK,KAAK,SAAS,YAAa;AAEvE,QAAI,KAAK,KAAK,WAAW,cAAc,KAAK,KAAK,KAAK,WAAW,UAAU,EAAG;AAE9E,QAAI,WAAW,MAAM,kBAAkB,MAAM,OAAW;AACxD;AAAA,EACJ;AAAA,EAEA,UAAU,MAAgB,YAA0D;AAlJxF;AAmJQ,UAAM,SAAkC,CAAC;AAGzC,UAAM,QAAQ,WAAW,MAAM,cAAc,KAAK,WAAW,MAAM,aAAa;AAChF,QAAI,SAAS,OAAO,UAAU,UAAU;AACpC,aAAO,QAAQ;AAAA,IACnB;AAIA,UAAM,eAAc,gBAAW,MAAM,kBAAkB,MAAnC,YACb,WAAW,MAAM,mBAAmB;AAC3C,UAAM,gBAAe,gBAAW,MAAM,mBAAmB,MAApC,YACd,WAAW,MAAM,uBAAuB;AAC/C,QAAI,OAAO,gBAAgB,SAAU,QAAO,cAAc;AAC1D,QAAI,OAAO,iBAAiB,SAAU,QAAO,eAAe;AAC5D,QAAI,OAAO,gBAAgB,UAAa,OAAO,iBAAiB,QAAW;AACvE,aAAO,cAAc,OAAO,cAAc,OAAO;AAAA,IACrD;AAGA,UAAM,gBAAgB,WAAW,MAAM,uBAAuB;AAC9D,QAAI,MAAM,QAAQ,aAAa,KAAK,cAAc,SAAS,GAAG;AAC1D,aAAO,eAAe,cAAc,CAAC;AAAA,IACzC;AAGA,UAAM,cAAc,WAAW,MAAM,mBAAmB;AACxD,QAAI,OAAO,gBAAgB,UAAU;AACjC,aAAO,WAAW,EAAE,GAAG,OAAO,UAAU,YAAY;AAAA,IACxD;AAKA,UAAM,iBAAgB,sBAAW,MAAM,cAAc,MAA/B,YACf,WAAW,MAAM,sBAAsB,MADxB,YAEf,WAAW,MAAM,aAAa;AACrC,QAAI,iBAAiB,OAAO,kBAAkB,UAAU;AACpD,YAAM,WAAW,kBAAkB,aAAa;AAChD,UAAI,SAAU,QAAO,QAAQ;AAAA,IACjC;AAKA,UAAM,qBAAqB,WAAW,MAAM,mBAAmB;AAC/D,QAAI,sBAAsB,OAAO,uBAAuB,UAAU;AAC9D,UAAI,OAAsB;AAC1B,UAAI;AACA,cAAM,SAAS,KAAK,MAAM,kBAAkB;AAC5C,YAAI,MAAM,QAAQ,MAAM,GAAG;AACvB,iBAAO,YAAY,MAAM,KAAK;AAAA,QAClC,WAAW,OAAO,WAAW,UAAU;AACnC,iBAAO,UAAU;AAAA,QACrB;AAAA,MACJ,QAAQ;AACJ,eAAO;AAAA,MACX;AACA,UAAI,SAAS,CAAC,OAAO,WAAS,YAAO,MAAM,CAAC,MAAd,mBAAiB,UAAS,WAAW;AAC/D,eAAO,QAAQ,CAAC,EAAE,MAAM,UAAU,SAAS,KAAK,GAAG,IAAI,YAAO,UAAP,YAAgB,CAAC,CAAE;AAAA,MAC9E;AAAA,IACJ;AAIA,UAAM,kBAAiB,sBAAW,MAAM,eAAe,MAAhC,YAChB,WAAW,MAAM,wBAAwB,MADzB,YAEhB,WAAW,MAAM,iBAAiB;AACzC,QAAI,kBAAkB,OAAO,mBAAmB,UAAU;AACtD,YAAM,YAAY,wBAAwB,cAAc;AACxD,UAAI,WAAW;AACX,eAAO,SAAS,UAAU;AAC1B,YAAI,UAAU,cAAc;AACxB,iBAAO,eAAe,UAAU;AAAA,QACpC;AAAA,MACJ,OAAO;AAGH,eAAO,SAAS;AAAA,MACpB;AAAA,IACJ;AAIA,UAAM,cAAc,WAAW,0BAA0B;AACzD,QAAI,eAAe,OAAO,gBAAgB,YAAY,CAAC,OAAO,OAAO;AACjE,YAAM,WAAW,kBAAkB,WAAW;AAC9C,UAAI,UAAU;AACV,cAAM,eAAe,SAAS,OAAO,OAAK,EAAE,SAAS,MAAM;AAC3D,YAAI,aAAa,SAAS,GAAG;AACzB,iBAAO,QAAQ;AAAA,QACnB;AAAA,MACJ;AAAA,IACJ;AAGA,UAAM,cAAc,WAAW,cAAc;AAC7C,QAAI,eAAe,OAAO,gBAAgB,YAAY,CAAC,OAAO,QAAQ;AAClE,aAAO,SAAS;AAChB,UAAI;AACA,eAAO,eAAe,KAAK,MAAM,WAAW;AAAA,MAChD,QAAQ;AAAA,MAAe;AAAA,IAC3B;AAIA,UAAM,WAAW,WAAW,iBAAiB;AAC7C,QAAI,YAAY,OAAO,aAAa,YAAY,CAAC,OAAO,OAAO;AAC3D,UAAI;AACA,cAAM,QAAQ,KAAK,MAAM,QAAQ;AACjC,eAAO,QAAQ,CAAC,EAAE,MAAM,QAAQ,SAAS,KAAK,UAAU,KAAK,EAAE,CAAC;AAAA,MACpE,QAAQ;AAAA,MAAe;AAAA,IAC3B;AAGA,UAAM,YAAY,WAAW,kBAAkB;AAC/C,QAAI,aAAa,OAAO,cAAc,YAAY,CAAC,OAAO,QAAQ;AAC9D,aAAO,SAAS;AAChB,UAAI;AACA,eAAO,eAAe,KAAK,MAAM,SAAS;AAAA,MAC9C,QAAQ;AAAA,MAAe;AAAA,IAC3B;AAGA,UAAM,WAAW,WAAW,MAAM,SAAS;AAC3C,QAAI,YAAY,OAAO,aAAa,UAAU;AAC1C,aAAO,OAAO;AACd,YAAM,WAAqB;AAAA,QACvB,MAAM;AAAA,QACN,YAAY,WAAW,MAAM,YAAY,KAAK;AAAA,QAC9C;AAAA,QACA,MAAM,CAAC;AAAA,MACX;AACA,YAAM,WAAW,WAAW,MAAM,cAAc;AAChD,UAAI,YAAY,OAAO,aAAa,UAAU;AAC1C,YAAI;AAAE,mBAAS,OAAO,KAAK,MAAM,QAAQ;AAAA,QAAG,QAAQ;AAAE,mBAAS,OAAO,EAAE,KAAK,SAAS;AAAA,QAAG;AAAA,MAC7F;AACA,YAAM,aAAa,WAAW,MAAM,gBAAgB;AACpD,UAAI,cAAc,OAAO,eAAe,UAAU;AAC9C,iBAAS,SAAS;AAAA,MACtB;AACA,aAAO,YAAY,CAAC,QAAQ;AAAA,IAChC;AAGA,UAAM,iBAAiB,yBAAyB,UAAU;AAC1D,WAAO,OAAO,QAAQ,cAAc;AAGpC,UAAM,aAAa,cAAc,UAAU;AAC3C,QAAI,WAAW,YAAY,OAAO,KAAK,WAAW,QAAQ,EAAE,SAAS,GAAG;AACpE,aAAO,WAAW,EAAE,GAAG,OAAO,UAAU,GAAG,WAAW,SAAS;AAAA,IACnE;AACA,UAAM,aAAa,sBAAsB,UAAU;AACnD,QAAI,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACpC,aAAO,WAAW,EAAE,GAAG,OAAO,UAAU,GAAG,WAAW;AAAA,IAC1D;AAEA,WAAO;AAAA,EACX;AAGJ;AAlLa,qBAiLO,aAAa;;;AC5MjC,SAAS,iBAAiB,OAAgC;AAzG1D;AA0GE,MAAI,MAAM,gBAAgB,QAAW;AACnC,WAAO,MAAM;AAAA,EACf;AACA,MAAI,MAAM,aAAa,QAAW;AAEhC,WAAO,OAAO,MAAM,aAAa,WAAW,SAAS,MAAM,UAAU,EAAE,IAAI,MAAM;AAAA,EACnF;AACA,MAAI,MAAM,gBAAgB,QAAW;AACnC,WAAO,MAAM;AAAA,EACf;AACA,MAAI,MAAM,cAAc,QAAW;AACjC,WAAO,MAAM;AAAA,EACf;AACA,OAAI,WAAM,eAAN,mBAAkB,QAAQ;AAC5B,WAAO,MAAM,WAAW,OAAO,IAAI,gBAAgB;AAAA,EACrD;AACA,MAAI,MAAM,eAAe,QAAW;AAElC,WAAO,MAAM;AAAA,EACf;AACA,SAAO;AACT;AAKO,SAAS,sBAAsB,YAAmD;AACvF,MAAI,CAAC,cAAc,WAAW,WAAW,GAAG;AAC1C,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAA8B,CAAC;AACrC,aAAW,QAAQ,YAAY;AAE7B,QAAI,KAAK,OAAO,UAAU,KAAK,GAAG,GAAG;AACnC,aAAO,KAAK,GAAG,IAAI,iBAAiB,KAAK,KAAK;AAAA,IAChD;AAAA,EACF;AACA,SAAO;AACT;AAKO,SAAS,yBACd,eACqE;AAxJvE;AAyJE,QAAM,SAA8E,CAAC;AAGrF,QAAM,qBAAqB,uBAAsB,mBAAc,aAAd,mBAAwB,UAAU;AAGnF,aAAW,cAAc,cAAc,cAAc,CAAC,GAAG;AACvD,UAAM,QAAmB;AAAA,MACvB,OAAM,gBAAW,UAAX,mBAAkB;AAAA,MACxB,UAAS,gBAAW,UAAX,mBAAkB;AAAA,IAC7B;AAGA,eAAW,YAAY,WAAW,SAAS,CAAC,GAAG;AAE7C,YAAM,iBAAiB,sBAAsB,SAAS,UAAU;AAGhE,YAAM,UAAuB,SAAS,UAAU,CAAC,GAAG,IAAI,CAAC,eAAe;AAAA,QACtE,cAAc,UAAU;AAAA,QACxB,MAAM,UAAU;AAAA,QAChB,YAAY,sBAAsB,UAAU,UAAU;AAAA,MACxD,EAAE;AAGF,YAAM,SAAqB,SAAS,SAAS,CAAC,GAAG,IAAI,CAAC,cAAc;AAAA,QAClE,SAAS,SAAS;AAAA,QAClB,QAAQ,SAAS;AAAA,QACjB,YAAY,SAAS;AAAA,QACrB,YAAY,sBAAsB,SAAS,UAAU;AAAA,MACvD,EAAE;AAEF,YAAM,OAAiB;AAAA,QACrB,SAAS,SAAS;AAAA,QAClB,QAAQ,SAAS;AAAA,QACjB,cAAc,SAAS;AAAA,QACvB,YAAY,SAAS;AAAA,QACrB,MAAM,SAAS;AAAA,QACf,MAAM,SAAS;AAAA,QACf,mBAAmB,SAAS;AAAA,QAC5B,iBAAiB,SAAS;AAAA,QAC1B,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA,QAAQ,SAAS;AAAA,MACnB;AAEA,YAAM,WAAyB;AAAA,QAC7B,YAAY;AAAA,MACd;AAEA,aAAO,KAAK,EAAE,UAAU,OAAO,KAAK,CAAC;AAAA,IACvC;AAAA,EACF;AAEA,SAAO;AACT;;;AC9MO,IAAM,iBAAiB,CAAC,YAAY,OAAO,QAAQ,SAAS,aAAa,aAAa,WAAW;AAGxG,IAAM,cAAc,IAAI,IAAY,cAAc;AAGlD,IAAM,oBAAkD;AAAA,EACpD,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAChB;AAGA,IAAM,qBAAgF;AAAA,EAClF;AAAA,IACI,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,IAIL,KAAK;AAAA,MACD,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,qBAAqB;AAAA,MACrB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,IACvB;AAAA,EACJ;AAAA,EACA;AAAA,IACI,KAAK;AAAA;AAAA,IACL,KAAK,EAAE,OAAO,OAAO,QAAQ,QAAQ,SAAS,SAAS,YAAY,YAAY,QAAQ,WAAW;AAAA,EACtG;AAAA,EACA;AAAA,IACI,KAAK;AAAA;AAAA,IACL,KAAK,EAAE,OAAO,OAAO,cAAc,OAAO,aAAa,aAAa,QAAQ,QAAQ,SAAS,YAAY,aAAa,YAAY;AAAA,EACtI;AAAA,EACA;AAAA,IACI,KAAK;AAAA;AAAA,IACL,KAAK,EAAE,SAAS,OAAO,QAAQ,QAAQ,QAAQ,YAAY,aAAa,aAAa,YAAY,YAAY;AAAA,EACjH;AACJ;AAiBO,SAAS,oBACZ,YACA,eACY;AAEZ,MAAI,WAAW,gBAAgB,YAAY,IAAI,WAAW,YAAY,GAAG;AACrE,WAAO,WAAW;AAAA,EACtB;AAGA,QAAM,SAAS,cAAc,yBAAyB;AACtD,MAAI,QAAQ;AACR,UAAM,SAAS,kBAAkB,OAAO,MAAM,EAAE,YAAY,CAAC;AAC7D,QAAI,OAAQ,QAAO;AAAA,EACvB;AAGA,aAAW,EAAE,KAAK,IAAI,KAAK,oBAAoB;AAC3C,UAAM,MAAM,cAAc,GAAG;AAC7B,QAAI,KAAK;AACL,YAAM,SAAS,IAAI,OAAO,GAAG,CAAC;AAC9B,UAAI,OAAQ,QAAO;AAAA,IACvB;AAAA,EACJ;AAGA,QAAM,SAAS,cAAc,uBAAuB;AACpD,MAAI,QAAQ;AACR,UAAM,KAAK,OAAO,MAAM,EAAE,YAAY;AACtC,QAAI,OAAO,UAAU,OAAO,qBAAqB,OAAO,mBAAoB,QAAO;AACnF,QAAI,OAAO,aAAc,QAAO;AAAA,EACpC;AAGA,MAAI,WAAW,wCAA8B;AACzC,WAAO;AAAA,EACX;AAQA,MAAI,WAAW,OAAO;AAClB,WAAO;AAAA,EACX;AAGA,MAAI,WAAW,aAAa,WAAW,UAAU,SAAS,GAAG;AACzD,WAAO;AAAA,EACX;AAGA,QAAM,QAAQ,WAAW,QAAQ,IAAI,YAAY;AACjD,MAAI,sBAAsB,KAAK,IAAI,EAAG,QAAO;AAC7C,MAAI,SAAS,KAAK,IAAI,EAAG,QAAO;AAChC,MAAI,gBAAgB,KAAK,IAAI,EAAG,QAAO;AAGvC,SAAO;AACX;;;AChIO,IAAM,iBAAN,MAAqB;AAAA,EACxB,SAAS,MAAgB,YAA2C;AAIhE,QAAI,WAAW,eAAe,KAAK,WAAW,sBAAsB,KAAK,WAAW,sBAAsB,KAAK,WAAW,uBAAuB,GAAG;AAChJ;AAAA,IACJ;AAIA,QACI,WAAW,kBAAkB,KAC7B,WAAW,gBAAgB,KAC3B,WAAW,uBAAuB,KAClC,WAAW,qBAAqB,GAClC;AACE;AAAA,IACJ;AAGA,QAAI,KAAK,KAAK,WAAW,aAAa,KAAK,KAAK,KAAK,WAAW,WAAW,GAAG;AAC1E;AAAA,IACJ;AAGA;AAAA,EACJ;AACJ;AAEO,IAAM,iBAAiB,IAAI,eAAe;;;ACrBjD,SAAS,SAAS,MAAM,IAAI,iBAAiB,CAAC;AAC9C,SAAS,SAAS,kBAAkB,IAAI,kBAAkB,CAAC;AAC3D,SAAS,SAAS,aAAa,IAAI,qBAAqB,CAAC;AACzD,SAAS,SAAS,eAAe,IAAI,qBAAqB,CAAC;AAE3D,SAAS,WAAW,IAAI,qBAAqB,CAAC;AAU9C,IAAM,uBAA+C;AAAA,EACjD,KAAK;AAAA,EAAK,mBAAmB;AAAA,EAAK,OAAO;AAAA,EAAK,OAAO;AAAA,EACrD,KAAK;AAAA,EAAK,gBAAgB;AAAA,EAAK,IAAI;AAAA,EAAK,IAAI;AAAA,EAC5C,KAAK;AAAA,EAAK,mBAAmB;AAAA,EAAK,OAAO;AAAA,EAAK,OAAO;AACzD;AAEO,SAAS,wBAAwB,KAAiD;AAhCzF;AAiCI,MAAI,QAAQ,UAAa,QAAQ,QAAQ,QAAQ,IAAI;AACjD,WAAO;AAAA,EACX;AACA,QAAM,MAAM,OAAO,GAAG;AACtB,UAAO,0BAAqB,GAAG,MAAxB,YAA6B;AACxC;AAEO,SAAS,cACZ,UACA,OACA,MACc;AA5ClB;AA8CI,QAAM,gBAAgB;AAAA,IAClB,GAAI,SAAS,cAAc,CAAC;AAAA,IAC5B,GAAI,KAAK,cAAc,CAAC;AAAA,EAC5B;AAGA,QAAM,cAAc,SAAS,eAAe,MAAM,QAAQ,EAAE;AAC5D,QAAM,OAAO,cACP,YAAY,SAAS,MAAM,aAAa;AAK9C,QAAM,UAAU,OAAO,KAAK,iBAAiB;AAC7C,QAAM,QAAQ,OAAO,KAAK,eAAe;AACzC,QAAM,aAAa,UAAU,OAAO,GAAO;AAC3C,QAAM,mBAAmB,OAAO,UAAU,OAAO,GAAO,CAAC,IAAI;AAC7D,QAAM,WAAW,QAAQ,OAAO,GAAO;AACvC,QAAM,iBAAiB,OAAO,QAAQ,OAAO,GAAO,CAAC,IAAI;AACzD,QAAM,UAAU,OAAO,UAAU,IAAI;AACrC,QAAM,QAAQ,OAAO,QAAQ,IAAI;AAGjC,QAAM,aAA6B;AAAA;AAAA,IAE/B,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,cAAc,KAAK;AAAA,IACnB,YAAY,KAAK;AAAA;AAAA,IAGjB;AAAA;AAAA,IAGA,WAAW;AAAA,IACX,SAAS;AAAA,IACT,UAAU,QAAQ;AAAA;AAAA,IAGlB,MAAM,KAAK;AAAA,IACX,MAAM,KAAK,KAAK,SAAS;AAAA,IACzB,cAAa,cAAS,eAAT,mBAAsB;AAAA,IACnC,YAAY,yBAAwB,UAAK,WAAL,mBAAa,IAAI;AAAA,IACrD,gBAAe,UAAK,WAAL,mBAAa;AAAA;AAAA,IAG5B,oBAAoB,SAAS,cAAc,CAAC;AAAA,IAC5C,gBAAgB,KAAK,cAAc,CAAC;AAAA,IACpC,SAAS,KAAK,UAAU,CAAC,GAAG,IAAI,QAAM;AAAA,MAClC,WAAW,OAAO,OAAO,EAAE,YAAY,CAAC,IAAI;AAAA,MAC5C,MAAM,EAAE;AAAA,MACR,YAAY,EAAE,cAAc,CAAC;AAAA,IACjC,EAAE;AAAA,IACF,QAAQ,KAAK,SAAS,CAAC,GAAG,IAAI,QAAM;AAAA,MAChC,SAAS,EAAE;AAAA,MACX,QAAQ,EAAE;AAAA,MACV,YAAY,EAAE;AAAA,MACd,YAAY,EAAE;AAAA,IAClB,EAAE;AAAA,EACN;AAGA,MAAI,aAAa;AACb,UAAM,cAAc,YAAY,UAAU,MAAM,aAAa;AAC7D,WAAO,OAAO,YAAY,WAAW;AAAA,EACzC;AAIA,QAAM,sBAAsB,yBAAyB,aAAa;AAClE,SAAO,OAAO,YAAY,mBAAmB;AAK7C,MAAI,CAAC,WAAW,aAAa,cAAc,wBAAwB,GAAG;AAClE,eAAW,YAAY,OAAO,cAAc,wBAAwB,CAAC;AAAA,EACzE;AAGA,aAAW,eAAe,oBAAoB,YAAY,aAAa;AAEvE,SAAO;AACX;AAMO,SAAS,mBAAmB,eAAsD;AACvF,QAAM,kBAAoC,CAAC;AAE3C,aAAW,gBAAgB,eAAe;AACxC,UAAM,YAAY,yBAAyB,YAAY;AACvD,eAAW,EAAE,UAAU,OAAO,KAAK,KAAK,WAAW;AACjD,sBAAgB,KAAK,cAAc,UAAU,OAAO,IAAI,CAAC;AAAA,IAC3D;AAAA,EACF;AAEA,SAAO;AACT;;;AClGA,SAAS,QAAQ,GAAqB;AACpC,MAAI,MAAM,QAAQ,MAAM,OAAW,QAAO;AAC1C,MAAI,OAAO,MAAM,SAAU,QAAO,EAAE,SAAS;AAC7C,SAAO;AACT;AAOO,SAAS,cAAc,OAAwC;AA3DtE;AA4DE,QAAM,YAAW,WAAM,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,MAA7B,YAAkC,MAAM,CAAC;AAE1D,QAAM,kBAAkB,MACrB,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY,EACrC,KAAK,CAAC,GAAG,MAAM;AAhEpB,QAAAC,KAAAC;AAiEM,UAAM,MAAKD,MAAA,EAAE,cAAF,OAAAA,MAAe;AAC1B,UAAM,MAAKC,MAAA,EAAE,cAAF,OAAAA,MAAe;AAC1B,WAAO,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI;AAAA,EACtC,CAAC;AAEH,QAAM,QAAQ,QAAQ,qCAAU,KAAK,IACjC,qCAAU,SACV,qBAAgB,KAAK,CAAC,MAAM,QAAQ,EAAE,KAAK,CAAC,MAA5C,mBAA+C;AAEnD,QAAM,oBAAoB,CAAC,GAAG,eAAe,EAC1C,QAAQ,EACR,KAAK,CAAC,MAAM,QAAQ,EAAE,MAAM,CAAC;AAChC,QAAM,SAAS,QAAQ,qCAAU,MAAM,IACnC,qCAAU,SACV,uDAAmB;AAEvB,SAAO;AAAA,IACL,GAAI,QAAQ,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC;AAAA,IAClC,GAAI,QAAQ,MAAM,IAAI,EAAE,OAAO,IAAI,CAAC;AAAA,EACtC;AACF;","names":["yaml","import_js_yaml","yaml","path","SpanType","parsed","_a","_b"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/generate-unique-8-char-string.ts","../src/hmac-256-signature.ts","../src/serialize.ts","../src/generate-types.ts","../src/normalizer/types.ts","../src/normalizer/registry.ts","../src/normalizer/transformers/ai-sdk/version-detector.ts","../src/normalizer/extractors/token-parser.ts","../src/normalizer/utils/key-sanitizer.ts","../src/normalizer/extractors/metadata-parser.ts","../src/normalizer/transformers/ai-sdk/token-helpers.ts","../src/normalizer/transformers/ai-sdk/strategies/v4.ts","../src/normalizer/transformers/ai-sdk/strategies/v5.ts","../src/normalizer/transformers/ai-sdk/index.ts","../src/normalizer/transformers/mastra/index.ts","../src/normalizer/extractors/agentmark-parser.ts","../src/normalizer/transformers/agentmark/index.ts","../src/normalizer/transformers/otel-genai/index.ts","../src/normalizer/extractors/indexed-message-parser.ts","../src/normalizer/utils/coerce.ts","../src/normalizer/transformers/openinference/index.ts","../src/normalizer/transformers/openllmetry/index.ts","../src/normalizer/resolvers/semantic-kind-resolver.ts","../src/normalizer/transformers/dispatching/index.ts","../src/normalizer/converters/otlp-converter.ts","../src/normalizer/type-classifier.ts","../src/normalizer/index.ts","../src/trace-io.ts"],"sourcesContent":["export * from \"./generate-unique-8-char-string\";\nexport { createSignature, verifySignature } from \"./hmac-256-signature\";\nexport type * from \"./types\";\nexport * from \"./serialize\";\nexport { generateTypeDefinitions, fetchPromptsFrontmatter, findPromptFiles, type GenerateTypesLanguage } from \"./generate-types\";\nexport * from \"./normalizer\";\nexport * from \"./trace-io\";\n// `computeDatasetItemName` moved to @agentmark-ai/prompt-core (single canonical\n// implementation — prompt-core/src/webhook-runner.ts). The fork that lived here\n// had drifted: no unicode escaping and a different empty-input fallback.\n","export const generateUnique8CharString = () => {\n const timestamp = Date.now().toString(36); // Convert timestamp to base36 string\n const randomChars = Math.random().toString(36).substr(2, 6); // Generate random base36 string\n return timestamp + randomChars;\n};\n","const encoder = new TextEncoder();\n\nexport async function createSignature(secret: string = \"\", payload: string) {\n if (!secret) {\n secret = \"DEFAULT\";\n }\n\n const algorithm = { name: \"HMAC\", hash: { name: \"SHA-256\" } };\n\n const keyBytes = encoder.encode(secret);\n const extractable = false;\n const key = await crypto.subtle.importKey(\n \"raw\",\n keyBytes,\n algorithm,\n extractable,\n [\"sign\", \"verify\"]\n );\n\n const signature = await crypto.subtle.sign(\n algorithm,\n key,\n encoder.encode(payload)\n );\n\n return `sha256=${toHexString(signature)}`;\n}\n\nfunction toHexString(signature: ArrayBuffer) {\n return Array.from(new Uint8Array(signature))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport async function verifySignature(\n secret: string,\n header: string,\n payload: string\n) {\n if (!secret) {\n secret = \"DEFAULT\";\n }\n\n const parts = header.split(\"=\");\n const sigHex = parts[1]!;\n\n const algorithm = { name: \"HMAC\", hash: { name: \"SHA-256\" } };\n\n const keyBytes = encoder.encode(secret);\n const extractable = false;\n const key = await crypto.subtle.importKey(\n \"raw\",\n keyBytes,\n algorithm,\n extractable,\n [\"sign\", \"verify\"]\n );\n\n const sigBytes = hexToBytes(sigHex);\n const dataBytes = encoder.encode(payload);\n const equal = await crypto.subtle.verify(\n algorithm.name,\n key,\n sigBytes,\n dataBytes\n );\n\n return equal;\n}\n\nfunction hexToBytes(hex: string) {\n const len = hex.length / 2;\n const bytes = new Uint8Array(len);\n\n let index = 0;\n for (let i = 0; i < hex.length; i += 2) {\n const c = hex.slice(i, i + 2);\n const b = parseInt(c, 16);\n bytes[index] = b;\n index += 1;\n }\n\n return bytes;\n}\n","import yaml from \"js-yaml\";\n\nexport function toFrontMatter(content: { [key: string]: any }): string {\n // Serialize with js-yaml — the same library templatedx uses to read the\n // frontmatter back (`yaml.load` in ast-utils.ts) — so the output always\n // round-trips. A hand-rolled emitter cannot: prop values pulled from a trace\n // can be page markdown that starts with `` (a YAML tag indicator),\n // embeds quotes, or spans multiple lines, all of which need quoting or a\n // block scalar. `yaml.dump` applies those rules; bare interpolation did not.\n //\n // - lineWidth: -1 — never wrap long scalars (URLs, page content) so the\n // emitted value is stable and diff-friendly.\n // - noRefs: true — expand shared references instead of emitting `&anchor`\n // / `*alias`, which would be surprising in a prompt file.\n // - skipInvalid: true — drop non-representable values (e.g. `undefined`)\n // rather than throw in the save path; the old emitter\n // would have written the literal string \"undefined\".\n const body =\n Object.keys(content).length === 0\n ? \"\"\n : yaml.dump(content, { lineWidth: -1, noRefs: true, skipInvalid: true });\n\n return `---\\n${body}---\\n`;\n}\n","import * as fs from \"fs-extra\";\nimport path from \"path\";\nimport yaml from \"js-yaml\";\n\nfunction extractFrontmatter<T = any>(content: string): { attributes: T } {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) {\n return { attributes: {} as T };\n }\n const attributes = yaml.load(match[1]) as T;\n return { attributes: attributes || ({} as T) };\n}\n\n// Lazily load json-schema-to-typescript to avoid cwd access at startup\nlet _compile: ((schema: any, name: string, opts: any) => Promise<string>) | null = null;\nasync function getCompile() {\n if (_compile) return _compile;\n const mod = await import(\"json-schema-to-typescript\");\n // Support both ESM/CJS interop shapes\n const c = (mod as any).compile || (mod as any).default?.compile;\n _compile = c.bind(mod);\n return _compile!;\n}\n\ntype TextPromptFrontmatterV1_0 = {\n path: string;\n version: \"1.0\";\n text_config: {\n model_name: string;\n tools?: string[];\n };\n input_schema?: any;\n};\n\ntype ObjectPromptFrontmatterV1_0 = {\n path: string;\n version: \"1.0\";\n object_config: {\n model_name: string;\n schema: any;\n tools?: Record<string, any>;\n };\n input_schema?: any;\n};\n\ntype ImagePromptFrontmatterV1_0 = {\n path: string;\n version: \"1.0\";\n image_config: {\n model_name: string;\n tools?: Record<string, any>;\n };\n input_schema?: any;\n};\n\ntype PromptFrontmatterV0 = {\n path: string;\n metadata: {\n model?: {\n settings?: {\n schema?: any;\n tools?: Record<string, any>;\n };\n };\n };\n input_schema?: any;\n version?: \"0.0\";\n};\n\ntype PromptFrontmatter =\n | PromptFrontmatterV0\n | TextPromptFrontmatterV1_0\n | ObjectPromptFrontmatterV1_0\n | ImagePromptFrontmatterV1_0;\n\nfunction getInterfaceName(filePath: string): string {\n return filePath\n .replace(/\\.prompt\\.mdx$/, \"\")\n .split(\"/\")\n .map((part) => {\n // Handle snake_case, camelCase, and kebab-case\n return part\n .split(/[-_]|(?=[A-Z])/)\n .map(\n (word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n )\n .join(\"\")\n .replace(/[^a-zA-Z0-9]/g, \"\");\n })\n .join(\"$\");\n}\n\nfunction getToolInterfaceName(toolName: string): string {\n return toolName\n .split(/[-_]|(?=[A-Z])/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\"\");\n}\n\nexport async function findPromptFiles(dir: string): Promise<string[]> {\n const files = await fs.readdir(dir, { withFileTypes: true });\n let promptFiles: string[] = [];\n\n for (const file of files) {\n const fullPath = path.join(dir, file.name);\n if (file.isDirectory()) {\n promptFiles = promptFiles.concat(await findPromptFiles(fullPath));\n } else if (file.name.endsWith(\".prompt.mdx\")) {\n promptFiles.push(fullPath);\n }\n }\n\n return promptFiles;\n}\n\nasync function generateTypeDefinitionsV1_0(\n prompts:\n | TextPromptFrontmatterV1_0[]\n | ObjectPromptFrontmatterV1_0[]\n | ImagePromptFrontmatterV1_0[]\n): Promise<string> {\n const interfaces: string[] = [];\n const headerComment = `// Auto-generated types from AgentMark\n// Do not edit this file directly\n\n`;\n let output = \"\";\n const typeMapping: string[] = [];\n\n for (const prompt of prompts) {\n const { path: promptPath, input_schema } = prompt;\n const name = getInterfaceName(promptPath);\n try {\n let kind = \"text\";\n let output_schema = null;\n let hasTools = false;\n\n if (\"text_config\" in prompt) {\n kind = \"text\";\n hasTools = Array.isArray(prompt.text_config.tools)\n ? prompt.text_config.tools.length > 0\n : !!prompt.text_config.tools;\n } else if (\"object_config\" in prompt) {\n kind = \"object\";\n hasTools = Array.isArray(prompt.object_config.tools)\n ? prompt.object_config.tools.length > 0\n : !!prompt.object_config.tools;\n output_schema = prompt.object_config.schema;\n } else if (\"image_config\" in prompt) {\n kind = \"image\";\n hasTools = Array.isArray(prompt.image_config.tools)\n ? prompt.image_config.tools.length > 0\n : !!prompt.image_config.tools;\n }\n\n const compile = await getCompile();\n const inputInterface = input_schema\n ? await compile(input_schema, `${name}In`, {\n bannerComment: \"\",\n additionalProperties: false,\n })\n : `interface ${name}In { [key: string]: any }`;\n const outputInterface = output_schema\n ? await compile(output_schema, `${name}Out`, {\n bannerComment: \"\",\n additionalProperties: false,\n })\n : `type ${name}Out = string`;\n\n interfaces.push(\n inputInterface.replace(\"export interface\", \"interface\"),\n outputInterface\n .replace(\"export type\", \"type\")\n .replace(\"export interface\", \"interface\")\n );\n\n // MDX `tools` is a list of tool names (per 2026-03-13 doctrine).\n // Tool argument schemas live in the native SDK code, not in MDX\n // frontmatter — so we don't generate `Tools`/`XxxArgs` types here.\n output += `type ${name} = {\n kind: '${kind}';\n input: ${name}In;\n output: ${name}Out;${\n hasTools\n ? `\n tools?: string[];`\n : \"\"\n }\n};\\n\\n`;\n\n // Generate all path variants for type-safe access:\n // - \"greeting.prompt.mdx\" (full path)\n // - \"greeting.prompt\" (without .mdx)\n // - \"greeting\" (short name)\n typeMapping.push(` \"${promptPath}\": ${name}`);\n const withoutMdx = promptPath.replace(/\\.mdx$/, \"\");\n if (withoutMdx !== promptPath) {\n typeMapping.push(` \"${withoutMdx}\": ${name}`);\n }\n const shortName = promptPath.replace(/\\.prompt\\.mdx$/, \"\");\n if (shortName !== promptPath && shortName !== withoutMdx) {\n typeMapping.push(` \"${shortName}\": ${name}`);\n }\n } catch (error) {\n console.error(`Error processing ${promptPath}:`, error);\n interfaces.push(\n `interface ${name}In { [key: string]: any }\ntype ${name}Out = string`\n );\n }\n }\n\n output += `export default interface AgentmarkTypes {\n${typeMapping.join(\",\\n\")}\n}\\n`;\n\n return headerComment + interfaces.join(\"\\n\\n\") + \"\\n\\n\" + output;\n}\n\nasync function generateTypeDefinitionsV0(\n prompts: PromptFrontmatterV0[]\n): Promise<string> {\n const interfaces: string[] = [];\n const headerComment = `// Auto-generated types from AgentMark\n// Do not edit this file directly\n\n`;\n let output = \"\";\n const typeMapping: string[] = [];\n\n for (const prompt of prompts) {\n const { path: promptPath, metadata, input_schema } = prompt;\n const name = getInterfaceName(promptPath);\n\n try {\n const compile = await getCompile();\n const inputInterface = input_schema\n ? await compile(input_schema, `${name}In`, {\n bannerComment: \"\",\n additionalProperties: false,\n })\n : `interface ${name}In { [key: string]: any }`;\n\n const outputSchema = metadata?.model?.settings?.schema;\n\n const outputInterface = outputSchema\n ? await compile(outputSchema, `${name}Out`, {\n bannerComment: \"\",\n additionalProperties: false,\n })\n : `type ${name}Out = string`;\n\n interfaces.push(\n inputInterface.replace(\"export interface\", \"interface\"),\n outputInterface\n .replace(\"export type\", \"type\")\n .replace(\"export interface\", \"interface\")\n );\n\n output += `interface ${name} {\n input: ${name}In;\n output: ${name}Out;\n}\\n\\n`;\n\n // Generate all path variants for type-safe access:\n // - \"greeting.prompt.mdx\" (full path)\n // - \"greeting.prompt\" (without .mdx)\n // - \"greeting\" (short name)\n typeMapping.push(` \"${promptPath}\": ${name}`);\n const withoutMdx = promptPath.replace(/\\.mdx$/, \"\");\n if (withoutMdx !== promptPath) {\n typeMapping.push(` \"${withoutMdx}\": ${name}`);\n }\n const shortName = promptPath.replace(/\\.prompt\\.mdx$/, \"\");\n if (shortName !== promptPath && shortName !== withoutMdx) {\n typeMapping.push(` \"${shortName}\": ${name}`);\n }\n } catch (error: any) {\n console.error(`Error processing ${promptPath}:`, error);\n interfaces.push(\n `interface ${name}In { [key: string]: any }\ntype ${name}Out = string`\n );\n\n output += `interface ${name} {\n input: ${name}In;\n output: ${name}Out;\n}\\n\\n`;\n\n // Generate all path variants for type-safe access even on error\n typeMapping.push(` \"${promptPath}\": ${name}`);\n const withoutMdx = promptPath.replace(/\\.mdx$/, \"\");\n if (withoutMdx !== promptPath) {\n typeMapping.push(` \"${withoutMdx}\": ${name}`);\n }\n const shortName = promptPath.replace(/\\.prompt\\.mdx$/, \"\");\n if (shortName !== promptPath && shortName !== withoutMdx) {\n typeMapping.push(` \"${shortName}\": ${name}`);\n }\n }\n }\n\n output += `export default interface AgentmarkTypes {\n${typeMapping.join(\",\\n\")}\n}\\n`;\n\n return headerComment + interfaces.join(\"\\n\\n\") + \"\\n\\n\" + output;\n}\n\nconst isNewFormat = (frontmatter: any) => {\n return (\n frontmatter[\"text_config\"] ||\n frontmatter[\"object_config\"] ||\n frontmatter[\"image_config\"]\n );\n};\n\n// =============================================================================\n// Python TypedDict generation\n// =============================================================================\n\nfunction pythonPrimitiveType(schemaType: string): string {\n const map: Record<string, string> = {\n string: \"str\",\n number: \"float\",\n integer: \"int\",\n boolean: \"bool\",\n null: \"None\",\n };\n return map[schemaType] || \"Any\";\n}\n\nfunction propToPascal(prop: string): string {\n return prop\n .split(/[-_]/)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\"\");\n}\n\n/**\n * Recursively convert a JSON Schema to a Python type annotation string.\n * For nested object types, creates TypedDict classes and appends them to `collected`.\n */\nfunction schemaToPythonType(\n schema: any,\n parentClass: string,\n propKey: string,\n collected: string[]\n): string {\n if (!schema) return \"Any\";\n\n // anyOf / oneOf (commonly used for nullable types)\n const union = schema.anyOf || schema.oneOf;\n if (union) {\n const nullIdx = union.findIndex((v: any) => v.type === \"null\");\n const hasNull = nullIdx >= 0;\n const others = union.filter((_: any, i: number) => i !== nullIdx);\n\n if (hasNull && others.length === 1) {\n return `${schemaToPythonType(others[0], parentClass, propKey, collected)} | None`;\n }\n const parts = others.map((v: any, i: number) =>\n schemaToPythonType(v, parentClass, `${propKey}${i}`, collected)\n );\n if (hasNull) parts.push(\"None\");\n return parts.join(\" | \");\n }\n\n // Type arrays: [\"string\", \"null\"] → str | None\n if (Array.isArray(schema.type)) {\n const hasNull = schema.type.includes(\"null\");\n const nonNull = schema.type.filter((t: string) => t !== \"null\");\n\n // [\"object\", \"null\"] with properties → TypedDict | None\n if (nonNull.length === 1 && nonNull[0] === \"object\" && schema.properties) {\n const clsName = `${parentClass}${propToPascal(propKey)}`;\n collected.push(buildTypedDict(clsName, schema, collected));\n return hasNull ? `${clsName} | None` : clsName;\n }\n\n // [\"array\", \"null\"] with items → list[T] | None\n if (nonNull.length === 1 && nonNull[0] === \"array\" && schema.items) {\n const item = schemaToPythonType(\n schema.items,\n parentClass,\n propKey,\n collected\n );\n return hasNull ? `list[${item}] | None` : `list[${item}]`;\n }\n\n const base =\n nonNull.length === 1\n ? pythonPrimitiveType(nonNull[0])\n : nonNull.map(pythonPrimitiveType).join(\" | \");\n return hasNull ? `${base} | None` : base;\n }\n\n switch (schema.type) {\n case \"string\":\n case \"number\":\n case \"integer\":\n case \"boolean\":\n case \"null\":\n return pythonPrimitiveType(schema.type);\n\n case \"array\": {\n const item = schema.items\n ? schemaToPythonType(schema.items, parentClass, propKey, collected)\n : \"Any\";\n return `list[${item}]`;\n }\n\n case \"object\": {\n if (!schema.properties || Object.keys(schema.properties).length === 0) {\n return \"dict[str, Any]\";\n }\n const clsName = `${parentClass}${propToPascal(propKey)}`;\n collected.push(buildTypedDict(clsName, schema, collected));\n return clsName;\n }\n\n default:\n // No explicit type but has properties — treat as object\n if (schema.properties) {\n const clsName = `${parentClass}${propToPascal(propKey)}`;\n collected.push(buildTypedDict(clsName, schema, collected));\n return clsName;\n }\n return \"Any\";\n }\n}\n\n/**\n * Build a Python TypedDict class definition from an object JSON Schema.\n * Nested objects are extracted into separate classes and appended to `collected`.\n */\nfunction buildTypedDict(\n className: string,\n schema: any,\n collected: string[]\n): string {\n const props = schema.properties || {};\n const requiredSet = new Set<string>(schema.required || []);\n const lines: string[] = [];\n const desc = schema.description;\n\n if (desc) {\n lines.push(`class ${className}(TypedDict):`);\n lines.push(` \"\"\"${desc}\"\"\"`);\n } else {\n lines.push(`class ${className}(TypedDict):`);\n }\n\n const entries = Object.entries(props);\n if (entries.length === 0) {\n lines.push(\" pass\");\n return lines.join(\"\\n\");\n }\n\n for (const [key, propSchema] of entries) {\n const pyType = schemaToPythonType(\n propSchema as any,\n className,\n key,\n collected\n );\n const isRequired = requiredSet.has(key);\n const annotation = isRequired ? pyType : `NotRequired[${pyType}]`;\n const propDesc = (propSchema as any).description;\n\n if (propDesc) {\n const prefix = ` ${key}: ${annotation} # `;\n const maxDesc = 99 - prefix.length;\n if (maxDesc > 10) {\n const shortDesc =\n propDesc.length > maxDesc\n ? propDesc.substring(0, maxDesc - 3) + \"...\"\n : propDesc;\n lines.push(`${prefix}${shortDesc}`);\n } else {\n // Annotation itself is already near 100 chars — skip comment\n lines.push(` ${key}: ${annotation}`);\n }\n } else {\n lines.push(` ${key}: ${annotation}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction generatePythonToolTypes(tools: Record<string, any>): string | null {\n if (Object.keys(tools).length === 0) return null;\n\n const collected: string[] = [];\n\n for (const [toolName, schema] of Object.entries(tools)) {\n const argsName = `${getToolInterfaceName(toolName)}Args`;\n if (schema.parameters && schema.parameters.properties) {\n collected.push(buildTypedDict(argsName, schema.parameters, collected));\n } else {\n collected.push(`class ${argsName}(TypedDict):\\n pass`);\n }\n }\n\n const toolLines = Object.keys(tools)\n .map((name) => ` ${name}: ${getToolInterfaceName(name)}Args`)\n .join(\"\\n\");\n collected.push(`class Tools(TypedDict):\\n${toolLines}`);\n\n return collected.join(\"\\n\\n\\n\");\n}\n\nfunction buildPythonHeader(body: string): string {\n const imports: string[] = [\"TypedDict\"];\n if (body.includes(\"NotRequired[\")) imports.push(\"NotRequired\");\n if (body.includes(\"Literal[\")) imports.push(\"Literal\");\n if (/\\bAny\\b/.test(body)) imports.push(\"Any\");\n imports.sort();\n return `# Auto-generated types from AgentMark\n# Do not edit this file directly\n\nfrom __future__ import annotations\n\nfrom typing import ${imports.join(\", \")}\n\n\n`;\n}\n\nasync function generatePythonTypeDefinitionsV1_0(\n prompts: (\n | TextPromptFrontmatterV1_0\n | ObjectPromptFrontmatterV1_0\n | ImagePromptFrontmatterV1_0\n )[]\n): Promise<string> {\n\n const allClasses: string[] = [];\n const typeMapping: { path: string; name: string }[] = [];\n\n for (const prompt of prompts) {\n const { path: promptPath, input_schema } = prompt;\n const name = getInterfaceName(promptPath);\n\n try {\n let kind = \"text\";\n let outputSchema = null;\n let tools: any = {};\n\n if (\"text_config\" in prompt) {\n kind = \"text\";\n tools = prompt.text_config.tools || {};\n } else if (\"object_config\" in prompt) {\n kind = \"object\";\n tools = prompt.object_config.tools || {};\n outputSchema = prompt.object_config.schema;\n } else if (\"image_config\" in prompt) {\n kind = \"image\";\n tools = prompt.image_config.tools || {};\n }\n\n // Input class\n const inputCollected: string[] = [];\n if (input_schema && input_schema.properties) {\n inputCollected.push(\n buildTypedDict(`${name}In`, input_schema, inputCollected)\n );\n } else {\n inputCollected.push(`class ${name}In(TypedDict):\\n pass`);\n }\n allClasses.push(...inputCollected);\n\n // Output class\n const outputCollected: string[] = [];\n if (outputSchema && outputSchema.properties) {\n outputCollected.push(\n buildTypedDict(`${name}Out`, outputSchema, outputCollected)\n );\n } else if (kind === \"object\") {\n outputCollected.push(`class ${name}Out(TypedDict):\\n pass`);\n } else {\n outputCollected.push(`${name}Out = str`);\n }\n allClasses.push(...outputCollected);\n\n // Tool types\n if (Object.keys(tools).length > 0) {\n const toolOutput = generatePythonToolTypes(tools);\n if (toolOutput) allClasses.push(toolOutput);\n }\n\n // Prompt type class\n const toolsLine =\n Object.keys(tools).length > 0\n ? \"\\n tools: NotRequired[list[str]]\"\n : \"\";\n allClasses.push(\n `class ${name}(TypedDict):\\n` +\n ` kind: Literal['${kind}']\\n` +\n ` input: ${name}In\\n` +\n ` output: ${name}Out${toolsLine}`\n );\n\n // Path variants\n typeMapping.push({ path: promptPath, name });\n const withoutMdx = promptPath.replace(/\\.mdx$/, \"\");\n if (withoutMdx !== promptPath)\n typeMapping.push({ path: withoutMdx, name });\n const shortName = promptPath.replace(/\\.prompt\\.mdx$/, \"\");\n if (shortName !== promptPath && shortName !== withoutMdx) {\n typeMapping.push({ path: shortName, name });\n }\n } catch (error) {\n console.error(`Error processing ${promptPath}:`, error);\n allClasses.push(`class ${name}In(TypedDict):\\n pass`);\n allClasses.push(`${name}Out = str`);\n allClasses.push(\n `class ${name}(TypedDict):\\n` +\n ` kind: Literal['text']\\n` +\n ` input: ${name}In\\n` +\n ` output: ${name}Out`\n );\n typeMapping.push({ path: promptPath, name });\n const withoutMdx = promptPath.replace(/\\.mdx$/, \"\");\n if (withoutMdx !== promptPath)\n typeMapping.push({ path: withoutMdx, name });\n const shortName = promptPath.replace(/\\.prompt\\.mdx$/, \"\");\n if (shortName !== promptPath && shortName !== withoutMdx) {\n typeMapping.push({ path: shortName, name });\n }\n }\n }\n\n // AgentmarkTypes — functional form since keys contain hyphens\n const mappingLines = typeMapping\n .map(({ path, name }) => ` '${path}': ${name}`)\n .join(\",\\n\");\n\n allClasses.push(\n `AgentmarkTypes = TypedDict('AgentmarkTypes', {\\n${mappingLines},\\n})`\n );\n\n const body = allClasses.join(\"\\n\\n\\n\") + \"\\n\";\n return buildPythonHeader(body) + body;\n}\n\nasync function generatePythonTypeDefinitionsV0(\n prompts: PromptFrontmatterV0[]\n): Promise<string> {\n const allClasses: string[] = [];\n const typeMapping: { path: string; name: string }[] = [];\n\n for (const prompt of prompts) {\n const { path: promptPath, metadata, input_schema } = prompt;\n const name = getInterfaceName(promptPath);\n\n try {\n // Input class\n const inputCollected: string[] = [];\n if (input_schema && input_schema.properties) {\n inputCollected.push(\n buildTypedDict(`${name}In`, input_schema, inputCollected)\n );\n } else {\n inputCollected.push(`class ${name}In(TypedDict):\\n pass`);\n }\n allClasses.push(...inputCollected);\n\n // Output class\n const outputSchema = metadata?.model?.settings?.schema;\n const outputCollected: string[] = [];\n if (outputSchema && outputSchema.properties) {\n outputCollected.push(\n buildTypedDict(`${name}Out`, outputSchema, outputCollected)\n );\n } else {\n outputCollected.push(`${name}Out = str`);\n }\n allClasses.push(...outputCollected);\n\n // Prompt type class\n allClasses.push(\n `class ${name}(TypedDict):\\n` +\n ` input: ${name}In\\n` +\n ` output: ${name}Out`\n );\n\n // Path variants\n typeMapping.push({ path: promptPath, name });\n const withoutMdx = promptPath.replace(/\\.mdx$/, \"\");\n if (withoutMdx !== promptPath)\n typeMapping.push({ path: withoutMdx, name });\n const shortName = promptPath.replace(/\\.prompt\\.mdx$/, \"\");\n if (shortName !== promptPath && shortName !== withoutMdx) {\n typeMapping.push({ path: shortName, name });\n }\n } catch (error) {\n console.error(`Error processing ${promptPath}:`, error);\n allClasses.push(`class ${name}In(TypedDict):\\n pass`);\n allClasses.push(`${name}Out = str`);\n allClasses.push(\n `class ${name}(TypedDict):\\n` +\n ` input: ${name}In\\n` +\n ` output: ${name}Out`\n );\n typeMapping.push({ path: promptPath, name });\n const withoutMdx = promptPath.replace(/\\.mdx$/, \"\");\n if (withoutMdx !== promptPath)\n typeMapping.push({ path: withoutMdx, name });\n const shortName = promptPath.replace(/\\.prompt\\.mdx$/, \"\");\n if (shortName !== promptPath && shortName !== withoutMdx) {\n typeMapping.push({ path: shortName, name });\n }\n }\n }\n\n // AgentmarkTypes\n const mappingLines = typeMapping\n .map(({ path, name }) => ` '${path}': ${name}`)\n .join(\",\\n\");\n\n allClasses.push(\n `AgentmarkTypes = TypedDict('AgentmarkTypes', {\\n${mappingLines},\\n})`\n );\n\n const body = allClasses.join(\"\\n\\n\\n\") + \"\\n\";\n return buildPythonHeader(body) + body;\n}\n\nexport type GenerateTypesLanguage = \"typescript\" | \"python\";\n\nexport async function generateTypeDefinitions(\n prompts: PromptFrontmatter[],\n language: GenerateTypesLanguage = \"typescript\"\n): Promise<string> {\n if (language === \"python\") {\n if (prompts[0].version === \"1.0\") {\n return generatePythonTypeDefinitionsV1_0(prompts as any);\n }\n return generatePythonTypeDefinitionsV0(prompts as any);\n }\n if (prompts[0].version === \"1.0\") {\n return generateTypeDefinitionsV1_0(prompts as any);\n }\n return generateTypeDefinitionsV0(prompts as any);\n}\n\nexport async function fetchPromptsFrontmatter(options: {\n local?: number;\n rootDir?: string;\n}): Promise<PromptFrontmatter[]> {\n if (options.local) {\n const baseUrl = `http://localhost:${options.local}`;\n try {\n const pathsResponse = await fetch(`${baseUrl}/v1/prompts`);\n if (!pathsResponse.ok) {\n throw new Error(\n `Failed to fetch prompt paths: ${pathsResponse.statusText}`\n );\n }\n\n // Wire shape: `{ data: { paths } }` (canonical envelope). Tolerate\n // the older flat `{ paths }` shape for forward-compat with any\n // pinned mock servers / older fixtures still in the wild.\n // TODO(envelope-cleanup): drop the `?? body?.paths` fallback once the\n // OSS api-server cutover is fully rolled. Sister shims in\n // `cli/src/lib/api/prompts.ts` and `cli-src/runner-server.ts` —\n // remove all three together.\n const body = await pathsResponse.json();\n const paths: string[] = body?.data?.paths ?? body?.paths ?? [];\n\n return Promise.all(\n paths.map(async (promptPath: string) => {\n const templateResponse = await fetch(\n `${baseUrl}/v1/templates?path=${promptPath}`\n );\n if (!templateResponse.ok) {\n throw new Error(\n `Failed to fetch template ${promptPath}: ${templateResponse.statusText}`\n );\n }\n\n const { data: ast } = await templateResponse.json();\n const yamlNode = ast.children.find(\n (node: any) => node.type === \"yaml\"\n );\n if (!yamlNode) {\n throw new Error(`No YAML frontmatter found in ${promptPath}`);\n }\n\n const { parse: parseYaml } = await import(\"yaml\");\n const frontmatter = parseYaml(yamlNode.value);\n\n if (isNewFormat(frontmatter)) {\n return {\n path: promptPath,\n ...frontmatter,\n version: \"1.0\",\n };\n }\n\n return {\n path: promptPath,\n ...frontmatter,\n };\n })\n );\n } catch (error) {\n if (\n error instanceof TypeError &&\n error.message.includes(\"fetch failed\")\n ) {\n console.error(`Connection failed to ${baseUrl}.`);\n }\n console.error(\"\\nError details:\", error);\n throw error;\n }\n }\n\n if (options.rootDir) {\n if (!fs.existsSync(options.rootDir)) {\n throw new Error(`Directory not found at: ${options.rootDir}`);\n }\n\n const promptFiles = await findPromptFiles(options.rootDir);\n\n return Promise.all(\n promptFiles.map(async (file) => {\n const content = await fs.readFile(file, \"utf-8\");\n const { attributes } = extractFrontmatter(content);\n\n if (isNewFormat(attributes)) {\n return {\n path: path.relative(options.rootDir!, file),\n ...attributes,\n version: \"1.0\",\n };\n }\n return {\n path: path.relative(options.rootDir!, file),\n ...attributes,\n };\n })\n );\n }\n\n throw new Error(\"Either --local or --root-dir must be specified\");\n}\n\n","export enum SpanType {\n SPAN = 'SPAN',\n GENERATION = 'GENERATION',\n EVENT = 'EVENT',\n}\n\n/**\n * Standard message content part types\n */\nexport interface StandardTextContent {\n type: 'text';\n text: string;\n}\n\nexport interface StandardToolCallContent {\n type: 'tool-call';\n toolCallId: string;\n toolName: string;\n args: Record<string, any>; // Normalized field name (V4 uses 'args', V5 uses 'input' -> normalized to 'args')\n}\n\nexport interface StandardToolResultContent {\n type: 'tool-result';\n toolCallId: string;\n toolName: string;\n result: any; // Normalized field name (V4 uses 'result', V5 uses 'output.value' -> normalized to 'result')\n}\n\nexport type StandardMessageContent = \n | StandardTextContent \n | StandardToolCallContent \n | StandardToolResultContent\n | string; // Plain string content\n\n/**\n * Standard message type used throughout the normalizer.\n * Messages are normalized from V4/V5 formats to this standard format.\n * \n * Content can be:\n * - A plain string\n * - An array of content parts (text, tool-call, tool-result)\n */\nexport interface Message {\n role: string;\n content: StandardMessageContent | StandardMessageContent[];\n}\n\nexport interface ToolCall {\n type: string; // e.g., \"tool-call\"\n toolCallId: string;\n toolName: string;\n args: Record<string, any>; // Unified: v4 uses 'args', v5 uses 'input' (normalized to 'args')\n result?: string; // Tool execution result (JSON string for tool call execution spans)\n providerMetadata?: Record<string, any>; // v5 specific: provider-specific metadata\n}\n\n/**\n * A single document returned by a retriever / vector-store search, normalized\n * from instrumentation that carries documents per-index (OpenInference's\n * flattened `retrieval.documents.{i}.document.*`) or per-event (OpenLLMetry's\n * `db.query.result` span events). Stored under a span's `outputObject` as\n * `{ documents: RetrievalDocument[] }` so the UI can render a ranked panel\n * (relevance score / distance, content, metadata) instead of a single blob.\n */\nexport interface RetrievalDocument {\n id?: string;\n content?: string;\n /** Relevance/similarity score (higher = more relevant). */\n score?: number;\n /** Vector distance (lower = closer). Some stores report this instead of a score. */\n distance?: number;\n metadata?: Record<string, any>;\n}\n\nexport interface OtelScope {\n name?: string;\n version?: string;\n}\n\nexport interface OtelResource {\n attributes?: Record<string, any>;\n}\n\nexport interface OtelEvent {\n timeUnixNano: string;\n name: string;\n attributes?: Record<string, any>;\n}\n\nexport interface OtelLink {\n traceId: string;\n spanId: string;\n traceState?: string;\n attributes?: Record<string, any>;\n}\n\nexport interface OtelSpan {\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n traceState?: string;\n name: string;\n kind: number;\n startTimeUnixNano: string;\n endTimeUnixNano: string;\n attributes?: Record<string, any>;\n events?: OtelEvent[];\n links?: OtelLink[];\n status?: {\n code: number;\n message?: string;\n };\n}\n\nexport interface NormalizedSpan {\n // Identity\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n traceState?: string;\n\n // Core type and classification\n type: SpanType;\n\n // Timing\n startTime: number; // Unix timestamp in milliseconds\n endTime?: number; // Unix timestamp in milliseconds\n duration: number; // Duration in milliseconds\n\n // Span metadata\n name: string;\n kind: string;\n semanticKind?: string;\n serviceName?: string;\n statusCode: string;\n statusMessage?: string;\n\n // Normalized LLM generation fields\n model?: string;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n reasoningTokens?: number; // Add reasoning tokens\n cost?: number;\n\n // I/O fields\n input?: Message[]; // Array of messages passed to the model\n output?: string; // Plain text or JSON-stringified structured data\n outputObject?: Record<string, any>; // Structured object output (separate from text)\n toolCalls?: ToolCall[]; // Tool calls from the response\n finishReason?: string; // Unified finish reason (stop, tool-calls, length, etc.)\n settings?: { // Model generation settings\n temperature?: number;\n maxTokens?: number;\n topP?: number;\n presencePenalty?: number;\n frequencyPenalty?: number;\n };\n\n // Trace context fields\n sessionId?: string;\n sessionName?: string;\n userId?: string;\n traceName?: string;\n\n // Dataset/evaluation fields\n datasetRunId?: string;\n datasetRunName?: string;\n datasetPath?: string;\n datasetItemName?: string;\n datasetExpectedOutput?: string;\n datasetInput?: string;\n\n // Experiment identity (regression-gate baseline matching).\n // experimentKey: stable, composition-agnostic identity of the evaluation\n // (prompt/workflow/agent), set on the dataset-run root span.\n experimentKey?: string;\n\n // Prompt fields\n promptName?: string;\n props?: string; // Props/metadata from ai.telemetry.metadata.props\n\n // Version control fields.\n // commitSha: deployed-commit notion (pinned envs override it gateway-side).\n // sourceTreeHash: git tree hash of the code state the run executed against —\n // distinct from commitSha; the regression gate matches baselines on this.\n commitSha?: string;\n sourceTreeHash?: string;\n\n // Custom metadata fields (keys from metadata prefixes that don't map to known fields)\n metadata?: Record<string, string>;\n\n // Raw data for export/debug\n resourceAttributes: Record<string, any>;\n spanAttributes: Record<string, any>;\n events: Array<{ timestamp: number; name: string; attributes: Record<string, any> }>;\n links: Array<{ traceId: string; spanId: string; traceState?: string; attributes?: Record<string, any> }>;\n}\n\nexport interface AttributeExtractor {\n extractModel(attributes: Record<string, any>): string | undefined;\n extractInput(attributes: Record<string, any>): Message[] | undefined;\n extractOutput(attributes: Record<string, any>): string | undefined;\n extractTokens(attributes: Record<string, any>): { input?: number; output?: number; total?: number; reasoning?: number };\n extractMetadata(attributes: Record<string, any>): Partial<NormalizedSpan>;\n extractToolCalls(attributes: Record<string, any>): ToolCall[] | undefined;\n extractOutputObject(attributes: Record<string, any>): Record<string, any> | undefined;\n extractFinishReason(attributes: Record<string, any>): string | undefined;\n extractSettings(attributes: Record<string, any>): NormalizedSpan['settings'];\n}\n\nexport interface ScopeTransformer {\n // Classify the span type based on span and attributes\n classify(span: OtelSpan, attributes: Record<string, any>): SpanType;\n \n // Transform the span and extract normalized fields\n transform(span: OtelSpan, attributes: Record<string, any>): Partial<NormalizedSpan>;\n}\n","import { ScopeTransformer } from './types';\r\n\r\nexport class TransformerRegistry {\r\n private transformers: Map<string, ScopeTransformer> = new Map();\r\n private defaultTransformer: ScopeTransformer | null = null;\r\n\r\n register(scope: string, transformer: ScopeTransformer): void {\r\n this.transformers.set(scope, transformer);\r\n }\r\n\r\n setDefault(transformer: ScopeTransformer): void {\r\n this.defaultTransformer = transformer;\r\n }\r\n\r\n getTransformer(scope: string): ScopeTransformer | null {\r\n return this.transformers.get(scope) || this.defaultTransformer;\r\n }\r\n}\r\n\r\nexport const registry = new TransformerRegistry();\r\n","export type AiSdkVersion = 'v5' | 'v4' | 'unknown';\n\nexport function detectVersion(attributes: Record<string, any>): AiSdkVersion {\n // Check for V5 specific attributes (must be defined and not null)\n if (\n (attributes['ai.response.text'] !== undefined && attributes['ai.response.text'] !== null) ||\n (attributes['ai.response.toolCalls'] !== undefined && attributes['ai.response.toolCalls'] !== null) ||\n (attributes['ai.response.object'] !== undefined && attributes['ai.response.object'] !== null)\n ) {\n return 'v5';\n }\n\n // Check for V4 specific attributes (must be defined and not null)\n if (\n (attributes['ai.result.text'] !== undefined && attributes['ai.result.text'] !== null) ||\n (attributes['ai.result.toolCalls'] !== undefined && attributes['ai.result.toolCalls'] !== null) ||\n (attributes['ai.result.object'] !== undefined && attributes['ai.result.object'] !== null)\n ) {\n return 'v4';\n }\n\n // Also check for V4 prompt attributes (for error cases where result might not be present)\n if (\n (attributes['ai.prompt.messages'] !== undefined && attributes['ai.prompt.messages'] !== null) ||\n (attributes['ai.prompt'] !== undefined && attributes['ai.prompt'] !== null)\n ) {\n return 'v4';\n }\n\n // If we have generic gen_ai attributes but no specific SDK ones, it might be an older version or just generic OTel\n // But for the purpose of \"AI SDK\" transformer, we treat it as unknown if it doesn't match known patterns\n return 'unknown';\n}\n","export interface TokenKeys {\n inputKey?: string;\n outputKey?: string;\n totalKey?: string;\n promptKey?: string; // Legacy alias for input\n completionKey?: string; // Legacy alias for output\n reasoningKey?: string; \n}\n\nexport interface TokenCounts {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n reasoningTokens?: number;\n}\n\nexport function parseTokens(attributes: Record<string, any>, keys: TokenKeys): TokenCounts {\n const result: TokenCounts = {};\n\n // Helper to safely parse integer\n const parseIntSafe = (val: any): number | undefined => {\n if (typeof val === 'number') return Math.floor(val);\n if (typeof val === 'string') {\n // Handle JSON string format (e.g., from OTel SDK)\n try {\n const parsed = JSON.parse(val);\n if (typeof parsed === 'number') return Math.floor(parsed);\n if (parsed && typeof parsed.intValue === 'number') return Math.floor(parsed.intValue);\n } catch {\n // Not JSON, try direct parseInt\n }\n const parsed = parseInt(val, 10);\n return isNaN(parsed) ? undefined : parsed;\n }\n return undefined;\n };\n\n // Extract input tokens (check inputKey first, then promptKey)\n if (keys.inputKey && attributes[keys.inputKey] !== undefined) {\n result.inputTokens = parseIntSafe(attributes[keys.inputKey]);\n } else if (keys.promptKey && attributes[keys.promptKey] !== undefined) {\n result.inputTokens = parseIntSafe(attributes[keys.promptKey]);\n }\n\n // Extract output tokens (check outputKey first, then completionKey)\n if (keys.outputKey && attributes[keys.outputKey] !== undefined) {\n result.outputTokens = parseIntSafe(attributes[keys.outputKey]);\n } else if (keys.completionKey && attributes[keys.completionKey] !== undefined) {\n result.outputTokens = parseIntSafe(attributes[keys.completionKey]);\n }\n\n // Extract total tokens\n if (keys.totalKey && attributes[keys.totalKey] !== undefined) {\n result.totalTokens = parseIntSafe(attributes[keys.totalKey]);\n }\n\n // Calculate total if missing but input/output are present\n if (result.totalTokens === undefined && result.inputTokens !== undefined && result.outputTokens !== undefined) {\n result.totalTokens = result.inputTokens + result.outputTokens;\n }\n\n // Extract reasoning tokens\n if (keys.reasoningKey && attributes[keys.reasoningKey] !== undefined) {\n result.reasoningTokens = parseIntSafe(attributes[keys.reasoningKey]);\n }\n\n return result;\n}\n\n// Helper function to extract reasoning tokens from providerMetadata\nexport function extractReasoningFromProviderMetadata(attributes: Record<string, any>): number | undefined {\n const providerMetadata = attributes['ai.response.providerMetadata'];\n if (!providerMetadata) return undefined;\n\n try {\n const parsed = typeof providerMetadata === 'string' \n ? JSON.parse(providerMetadata) \n : providerMetadata;\n \n // Check OpenAI provider metadata\n if (parsed?.openai?.reasoningTokens !== undefined) {\n return typeof parsed.openai.reasoningTokens === 'number' \n ? parsed.openai.reasoningTokens \n : undefined;\n }\n } catch {\n // Invalid JSON, ignore\n }\n\n return undefined;\n}\n","/**\n * Key sanitization utilities to prevent prototype pollution attacks.\n *\n * These utilities filter out dangerous keys that could be used to\n * modify object prototypes when processing untrusted attribute data.\n */\n\n/**\n * Set of keys that could cause prototype pollution if used as object properties\n */\nexport const DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * Check if a key is safe to use as an object property.\n * Returns false for keys that could cause prototype pollution.\n *\n * @param key - The key to check\n * @returns true if the key is safe, false otherwise\n */\nexport function isSafeKey(key: string): boolean {\n return !DANGEROUS_KEYS.has(key);\n}\n","import { NormalizedSpan } from '../types';\nimport { isSafeKey } from '../utils/key-sanitizer';\n\n// Known metadata fields that should be excluded from custom metadata.\n//\n// NOTE: 'commit_sha' is deliberately NOT in this set. It IS promoted to the\n// typed NormalizedSpan.commitSha field by parseMetadata() below, but it is\n// ALSO allowed to flow into the custom metadata bucket because the OSS CLI's\n// SQLite trace schema has no dedicated CommitSha column (unlike production\n// ClickHouse). The CLI's experiments query reads commit_sha via:\n// MAX(json_extract(root.Metadata, '$.commit_sha'))\n// which only works if commit_sha is present in the Metadata JSON bucket.\n// Promoting it here would break the CLI's experiment comparison SHA display.\n//\n// History: commit 64a9333b2 removed 'commit_sha' from this set originally.\n// That removal was silently lost when PR #1754 was squash-merged, and was\n// subsequently re-added by PR #1797 (commit 405230643) without awareness\n// of 64a9333b2's dependency on it. Do NOT add 'commit_sha' back here without\n// first adding a dedicated CommitSha column to the CLI SQLite schema\n// (cli/cli-src/server/database/index.ts) and mapping span.commitSha in\n// normalizedSpanToSqliteRow (cli/cli-src/server/routes/traces/index.ts).\nconst KNOWN_METADATA_FIELDS = new Set([\n 'session_id',\n 'session_name',\n 'user_id',\n 'trace_name',\n 'dataset_run_id',\n 'dataset_run_name',\n 'dataset_path',\n 'dataset_item_name',\n 'dataset_expected_output',\n 'dataset_input',\n 'prompt_name',\n 'props',\n]);\n\nexport function parseMetadata(attributes: Record<string, any>, prefix: string = 'agentmark.metadata.'): Partial<NormalizedSpan> {\n const result: Partial<NormalizedSpan> = {};\n\n // Helper to get value with prefix\n const get = (key: string) => attributes[`${prefix}${key}`];\n\n // Session Context\n if (get('session_id')) result.sessionId = String(get('session_id'));\n if (get('session_name')) result.sessionName = String(get('session_name'));\n if (get('user_id')) result.userId = String(get('user_id'));\n if (get('trace_name')) result.traceName = String(get('trace_name'));\n\n // Dataset / Evaluation Context\n if (get('dataset_run_id')) result.datasetRunId = String(get('dataset_run_id'));\n if (get('dataset_run_name')) result.datasetRunName = String(get('dataset_run_name'));\n if (get('dataset_path')) result.datasetPath = String(get('dataset_path'));\n if (get('dataset_item_name')) result.datasetItemName = String(get('dataset_item_name'));\n if (get('dataset_expected_output')) result.datasetExpectedOutput = String(get('dataset_expected_output'));\n\n if (get('prompt_name')) result.promptName = String(get('prompt_name'));\n\n if (get('props')) result.props = String(get('props'));\n\n // Version Control\n if (get('commit_sha')) result.commitSha = String(get('commit_sha'));\n\n return result;\n}\n\n/**\n * Extracts custom metadata keys from attributes that start with the given prefix.\n * Excludes known metadata fields that are already extracted as normalized fields.\n * \n * @param attributes - The attributes to extract from\n * @param prefix - The prefix to look for (default: 'agentmark.metadata.')\n * @returns A record of custom metadata keys (with prefix stripped) to string values\n */\nexport function extractCustomMetadata(attributes: Record<string, any>, prefix: string = 'agentmark.metadata.'): Record<string, string> {\n const customMetadata: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(attributes)) {\n // Check if the key starts with the prefix\n if (key.startsWith(prefix)) {\n // Extract the metadata key by removing the prefix\n const metadataKey = key.slice(prefix.length);\n \n // Skip known fields, empty keys, and dangerous keys to prevent prototype pollution\n if (metadataKey && !KNOWN_METADATA_FIELDS.has(metadataKey) && isSafeKey(metadataKey)) {\n // Convert value to string (raw strings, no JSON parsing)\n customMetadata[metadataKey] = String(value);\n }\n }\n }\n\n return customMetadata;\n}\n","/**\n * AI SDK-specific token extraction helpers\n */\n\n/**\n * Extracts reasoning tokens from AI SDK's providerMetadata attribute.\n * This is a fallback when ai.usage.reasoningTokens is not directly available.\n */\nexport function extractReasoningFromProviderMetadata(attributes: Record<string, any>): number | undefined {\n const providerMetadata = attributes['ai.response.providerMetadata'];\n if (!providerMetadata) return undefined;\n\n try {\n const parsed = typeof providerMetadata === 'string' \n ? JSON.parse(providerMetadata) \n : providerMetadata;\n \n // Check OpenAI provider metadata\n if (parsed?.openai?.reasoningTokens !== undefined) {\n return typeof parsed.openai.reasoningTokens === 'number' \n ? parsed.openai.reasoningTokens \n : undefined;\n }\n } catch {\n // Invalid JSON, ignore\n }\n\n return undefined;\n}\n\n\n\n\n\n\n","import { \n AttributeExtractor, \n NormalizedSpan, \n Message, \n ToolCall,\n StandardMessageContent,\n StandardToolCallContent,\n StandardToolResultContent,\n} from '../../../types';\nimport { parseTokens } from '../../../extractors/token-parser';\nimport { parseMetadata, extractCustomMetadata } from '../../../extractors/metadata-parser';\nimport { extractReasoningFromProviderMetadata } from '../token-helpers';\n\nexport class AiSdkV4Strategy implements AttributeExtractor {\n /**\n * Normalize a content part from V4 format to standard format\n */\n private normalizeContentPart(part: any): StandardMessageContent {\n // Handle plain text parts\n if (typeof part === 'string') {\n return part;\n }\n\n if (!part || typeof part !== 'object') {\n return part;\n }\n\n const type = part.type;\n\n // Handle text content\n if (type === 'text') {\n return {\n type: 'text',\n text: part.text || '',\n };\n }\n\n // Handle tool-call content (V4 uses 'args')\n if (type === 'tool-call') {\n return {\n type: 'tool-call',\n toolCallId: part.toolCallId || '',\n toolName: part.toolName || '',\n args: part.args || {}, // V4 uses 'args' directly\n } as StandardToolCallContent;\n }\n\n // Handle tool-result content (V4 uses 'result')\n if (type === 'tool-result') {\n return {\n type: 'tool-result',\n toolCallId: part.toolCallId || '',\n toolName: part.toolName || '',\n result: part.result, // V4 uses 'result' directly\n } as StandardToolResultContent;\n }\n\n // Unknown type, return as-is\n return part;\n }\n\n /**\n * Normalize a single message from V4 format to standard format\n */\n private normalizeMessage(message: any): Message {\n if (!message || typeof message !== 'object') {\n return message;\n }\n\n const { role, content, ...rest } = message;\n\n // Normalize content\n let normalizedContent: StandardMessageContent | StandardMessageContent[];\n\n if (typeof content === 'string') {\n // Plain string content\n normalizedContent = content;\n } else if (Array.isArray(content)) {\n // Array of content parts - normalize each part\n normalizedContent = content.map((part) => this.normalizeContentPart(part));\n } else if (content && typeof content === 'object') {\n // Single content object - normalize it\n normalizedContent = this.normalizeContentPart(content);\n } else {\n normalizedContent = content;\n }\n\n return {\n role: role || '',\n content: normalizedContent,\n ...rest,\n };\n }\n\n /**\n * Normalize messages array from V4 format to standard format\n */\n private normalizeMessages(messages: any[]): Message[] {\n if (!Array.isArray(messages)) {\n return messages;\n }\n\n return messages.map((msg) => this.normalizeMessage(msg));\n }\n\n extractModel(attributes: Record<string, any>): string | undefined {\n return attributes['gen_ai.request.model'] || attributes['ai.model.id'];\n }\n\n extractInput(attributes: Record<string, any>): Message[] | undefined {\n // The assembled messages live on `ai.prompt.messages` (present on the\n // `.doGenerate` leaf spans). The parent `ai.*` wrapper spans carry\n // `ai.prompt` instead — and `ai.prompt` is NOT always `{ messages }`:\n // for a string `prompt:` call it's `{ prompt, system? }`. Coerce every\n // shape to a messages array so wrapper spans (and any string-prompt\n // generation) surface their input instead of rendering blank.\n const raw =\n attributes['ai.prompt.messages'] !== undefined\n ? attributes['ai.prompt.messages']\n : attributes['ai.prompt'];\n if (raw === undefined) {\n return undefined;\n }\n\n let value: any = raw;\n if (typeof value === 'string') {\n try {\n value = JSON.parse(value);\n } catch {\n // Not JSON — treat the raw string as the prompt text below.\n }\n }\n\n const messages = this.coerceToMessages(value);\n if (!messages) {\n return undefined;\n }\n return this.normalizeMessages(messages);\n }\n\n /**\n * Coerce the shapes `ai.prompt` / `ai.prompt.messages` can take into a\n * messages array: a raw array, `{ messages, system? }`,\n * `{ prompt, system? }` (string prompt), or a bare string.\n */\n private coerceToMessages(value: any): any[] | undefined {\n if (typeof value === 'string') {\n return [{ role: 'user', content: value }];\n }\n if (Array.isArray(value)) {\n return value;\n }\n if (value && typeof value === 'object') {\n if (Array.isArray(value.messages)) {\n return typeof value.system === 'string'\n ? [{ role: 'system', content: value.system }, ...value.messages]\n : value.messages;\n }\n if (typeof value.prompt === 'string') {\n const messages: any[] = [];\n if (typeof value.system === 'string') {\n messages.push({ role: 'system', content: value.system });\n }\n messages.push({ role: 'user', content: value.prompt });\n return messages;\n }\n }\n return undefined;\n }\n\n extractOutput(attributes: Record<string, any>): string | undefined {\n // V4 uses 'ai.result.*' but may also have 'ai.response.*' in some cases\n // Only return text, objects go to outputObject\n if (attributes['ai.result.text'] !== undefined) return attributes['ai.result.text'];\n // Fallback to ai.response.* for compatibility\n if (attributes['ai.response.text'] !== undefined) return attributes['ai.response.text'];\n return undefined;\n }\n\n extractOutputObject(attributes: Record<string, any>): Record<string, any> | undefined {\n // V4 uses 'ai.result.*' but may also have 'ai.response.*' in some cases\n let objValue: any;\n if (attributes['ai.result.object'] !== undefined) {\n objValue = attributes['ai.result.object'];\n } else if (attributes['ai.response.object'] !== undefined) {\n objValue = attributes['ai.response.object'];\n } else {\n return undefined;\n }\n\n // Parse if it's a string, otherwise use as-is\n if (typeof objValue === 'string') {\n try {\n return JSON.parse(objValue);\n } catch {\n return undefined;\n }\n }\n return objValue;\n }\n\n extractToolCalls(attributes: Record<string, any>): ToolCall[] | undefined {\n // V4 uses 'ai.result.toolCalls' (primary) or 'ai.response.toolCalls' (fallback)\n // Check these first as they take precedence over individual ai.toolCall.* attributes\n let toolCallsValue: any;\n if (attributes['ai.result.toolCalls'] !== undefined) {\n toolCallsValue = attributes['ai.result.toolCalls'];\n } else if (attributes['ai.response.toolCalls'] !== undefined) {\n toolCallsValue = attributes['ai.response.toolCalls'];\n } else {\n // Fallback: check for individual ai.toolCall.* attributes (for tool call execution spans)\n if (attributes['ai.toolCall.name'] !== undefined) {\n const toolCallId = attributes['ai.toolCall.id'];\n const toolName = attributes['ai.toolCall.name'];\n const argsValue = attributes['ai.toolCall.args'];\n const resultValue = attributes['ai.toolCall.result'];\n \n if (toolCallId && toolName) {\n let args: Record<string, any> = {};\n if (argsValue !== undefined) {\n if (typeof argsValue === 'string') {\n try {\n args = JSON.parse(argsValue);\n } catch {\n // If parsing fails, treat as empty object\n args = {};\n }\n } else if (typeof argsValue === 'object' && argsValue !== null) {\n args = argsValue;\n }\n }\n \n // Extract result - keep as string (JSON stringified) for UI compatibility\n let result: string | undefined;\n if (resultValue !== undefined) {\n if (typeof resultValue === 'string') {\n result = resultValue;\n } else {\n // If it's an object, stringify it\n try {\n result = JSON.stringify(resultValue);\n } catch {\n result = String(resultValue);\n }\n }\n }\n \n return [{\n type: 'tool-call',\n toolCallId: String(toolCallId),\n toolName: String(toolName),\n args,\n result,\n }];\n }\n }\n return undefined;\n }\n\n // Parse if it's a string, otherwise use as-is\n let toolCalls: any;\n if (typeof toolCallsValue === 'string') {\n try {\n toolCalls = JSON.parse(toolCallsValue);\n } catch {\n return undefined;\n }\n } else {\n toolCalls = toolCallsValue;\n }\n\n // Ensure it's an array\n if (!Array.isArray(toolCalls)) {\n return undefined;\n }\n\n // Normalize: map v4 'args' to unified 'args' field\n return toolCalls.map((tc: any) => ({\n type: tc.type || 'tool-call',\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: tc.args || tc.input || {}, // v4 uses 'args', normalize to 'args'\n }));\n }\n\n extractFinishReason(attributes: Record<string, any>): string | undefined {\n // V4: Check ai.result.finishReason (primary) or ai.response.finishReason (fallback) or gen_ai.response.finish_reasons (OTel)\n if (attributes['ai.result.finishReason'] !== undefined) {\n return String(attributes['ai.result.finishReason']);\n }\n if (attributes['ai.response.finishReason'] !== undefined) {\n return String(attributes['ai.response.finishReason']);\n }\n if (attributes['gen_ai.response.finish_reasons'] !== undefined) {\n const reasons = attributes['gen_ai.response.finish_reasons'];\n // OTel can be an array, take first element if array\n if (Array.isArray(reasons) && reasons.length > 0) {\n return String(reasons[0]);\n }\n return String(reasons);\n }\n return undefined;\n }\n\n extractSettings(attributes: Record<string, any>): NormalizedSpan['settings'] {\n const settings: NormalizedSpan['settings'] = {};\n\n // Check OTel keys first, then fallback to AI SDK keys\n if (attributes['gen_ai.request.temperature'] !== undefined || attributes['ai.settings.temperature'] !== undefined) {\n const value = attributes['gen_ai.request.temperature'] ?? attributes['ai.settings.temperature'];\n settings.temperature = typeof value === 'number' ? value : parseFloat(String(value));\n }\n\n if (attributes['gen_ai.request.max_tokens'] !== undefined || attributes['ai.settings.maxTokens'] !== undefined) {\n const value = attributes['gen_ai.request.max_tokens'] ?? attributes['ai.settings.maxTokens'];\n settings.maxTokens = typeof value === 'number' ? value : parseInt(String(value), 10);\n }\n\n if (attributes['gen_ai.request.top_p'] !== undefined || attributes['ai.settings.topP'] !== undefined) {\n const value = attributes['gen_ai.request.top_p'] ?? attributes['ai.settings.topP'];\n settings.topP = typeof value === 'number' ? value : parseFloat(String(value));\n }\n\n if (attributes['gen_ai.request.presence_penalty'] !== undefined || attributes['ai.settings.presencePenalty'] !== undefined) {\n const value = attributes['gen_ai.request.presence_penalty'] ?? attributes['ai.settings.presencePenalty'];\n settings.presencePenalty = typeof value === 'number' ? value : parseFloat(String(value));\n }\n\n if (attributes['gen_ai.request.frequency_penalty'] !== undefined || attributes['ai.settings.frequencyPenalty'] !== undefined) {\n const value = attributes['gen_ai.request.frequency_penalty'] ?? attributes['ai.settings.frequencyPenalty'];\n settings.frequencyPenalty = typeof value === 'number' ? value : parseFloat(String(value));\n }\n\n // Only return if at least one setting is present\n return Object.keys(settings).length > 0 ? settings : undefined;\n }\n\n extractTokens(attributes: Record<string, any>): { input?: number; output?: number; total?: number; reasoning?: number } {\n // V4 often uses legacy token keys\n const tokens = parseTokens(attributes, {\n inputKey: 'gen_ai.usage.prompt_tokens',\n outputKey: 'gen_ai.usage.completion_tokens',\n totalKey: 'gen_ai.usage.total_tokens',\n promptKey: 'ai.usage.promptTokens', // SDK specific fallback\n completionKey: 'ai.usage.completionTokens' // SDK specific fallback\n });\n\n // V4 reasoning tokens come from providerMetadata\n tokens.reasoningTokens = extractReasoningFromProviderMetadata(attributes);\n \n if (!tokens.reasoningTokens) {\n tokens.reasoningTokens = 0;\n }\n\n return {\n input: tokens.inputTokens,\n output: tokens.outputTokens,\n total: tokens.totalTokens,\n reasoning: tokens.reasoningTokens\n };\n }\n\n extractMetadata(attributes: Record<string, any>): Partial<NormalizedSpan> {\n // First try agentmark.metadata.* prefix\n const result = parseMetadata(attributes);\n \n // Also check for ai.telemetry.metadata.* attributes\n const aiTelemetryResult = parseMetadata(attributes, 'ai.telemetry.metadata.');\n \n // Extract custom metadata from both prefixes\n const agentmarkCustomMetadata = extractCustomMetadata(attributes, 'agentmark.metadata.');\n const aiTelemetryCustomMetadata = extractCustomMetadata(attributes, 'ai.telemetry.metadata.');\n \n // Merge custom metadata (ai.telemetry.metadata takes precedence if both exist)\n const mergedCustomMetadata = {\n ...agentmarkCustomMetadata,\n ...aiTelemetryCustomMetadata,\n };\n \n // Merge results (ai.telemetry.metadata takes precedence if both exist)\n return {\n ...result,\n ...aiTelemetryResult,\n // Only include metadata field if there are custom metadata keys\n ...(Object.keys(mergedCustomMetadata).length > 0 ? { metadata: mergedCustomMetadata } : {}),\n };\n }\n}\n","import { \n AttributeExtractor, \n NormalizedSpan, \n Message, \n ToolCall,\n StandardMessageContent,\n StandardToolCallContent,\n StandardToolResultContent,\n} from '../../../types';\nimport { parseTokens } from '../../../extractors/token-parser';\nimport { parseMetadata, extractCustomMetadata } from '../../../extractors/metadata-parser';\nimport { extractReasoningFromProviderMetadata } from '../token-helpers';\n\nexport class AiSdkV5Strategy implements AttributeExtractor {\n /**\n * Normalize a content part from V5 format to standard format\n */\n private normalizeContentPart(part: any): StandardMessageContent {\n // Handle plain text parts\n if (typeof part === 'string') {\n return part;\n }\n\n if (!part || typeof part !== 'object') {\n return part;\n }\n\n const type = part.type;\n\n // Handle text content\n if (type === 'text') {\n return {\n type: 'text',\n text: part.text || '',\n };\n }\n\n // Handle tool-call content (V5 uses 'input', normalize to 'args')\n if (type === 'tool-call') {\n return {\n type: 'tool-call',\n toolCallId: part.toolCallId || '',\n toolName: part.toolName || '',\n args: part.input || part.args || {}, // V5 uses 'input', normalize to 'args'\n } as StandardToolCallContent;\n }\n\n // Handle tool-result content (V5 uses 'output.value', normalize to 'result')\n if (type === 'tool-result') {\n let normalizedResult: any;\n\n // V5 uses output: {type, value} structure\n if (part.output !== undefined) {\n // Extract the value from the output wrapper\n if (typeof part.output === 'object' && part.output !== null) {\n // Handle output.value structure\n if ('value' in part.output) {\n normalizedResult = part.output.value;\n } else {\n // Fallback: use the whole output object\n normalizedResult = part.output;\n }\n } else {\n normalizedResult = part.output;\n }\n } else if (part.result !== undefined) {\n // Fallback to result if output is not present\n normalizedResult = part.result;\n } else {\n normalizedResult = undefined;\n }\n\n return {\n type: 'tool-result',\n toolCallId: part.toolCallId || '',\n toolName: part.toolName || '',\n result: normalizedResult,\n } as StandardToolResultContent;\n }\n\n // Unknown type, return as-is\n return part;\n }\n\n /**\n * Normalize a single message from V5 format to standard format\n */\n private normalizeMessage(message: any): Message {\n if (!message || typeof message !== 'object') {\n return message;\n }\n\n const { role, content, ...rest } = message;\n\n // Normalize content\n let normalizedContent: StandardMessageContent | StandardMessageContent[];\n\n if (typeof content === 'string') {\n // Plain string content\n normalizedContent = content;\n } else if (Array.isArray(content)) {\n // Array of content parts - normalize each part\n normalizedContent = content.map((part) => this.normalizeContentPart(part));\n } else if (content && typeof content === 'object') {\n // Single content object - normalize it\n normalizedContent = this.normalizeContentPart(content);\n } else {\n normalizedContent = content;\n }\n\n return {\n role: role || '',\n content: normalizedContent,\n ...rest,\n };\n }\n\n /**\n * Normalize messages array from V5 format to standard format\n */\n private normalizeMessages(messages: any[]): Message[] {\n if (!Array.isArray(messages)) {\n return messages;\n }\n\n return messages.map((msg) => this.normalizeMessage(msg));\n }\n\n extractModel(attributes: Record<string, any>): string | undefined {\n return attributes['gen_ai.request.model'] || attributes['ai.model.id'];\n }\n\n extractInput(attributes: Record<string, any>): Message[] | undefined {\n // The assembled messages live on `ai.prompt.messages` (present on the\n // `.doGenerate` leaf spans). The parent `ai.*` wrapper spans carry\n // `ai.prompt` instead — and `ai.prompt` is NOT always `{ messages }`:\n // for the common `generateText({ prompt: \"...\" })` call it's\n // `{ prompt, system? }`. Coerce every shape to a messages array via\n // `coerceToMessages` so wrapper spans (and any string-prompt\n // generation) surface their input instead of rendering blank.\n const raw =\n attributes['ai.prompt.messages'] !== undefined\n ? attributes['ai.prompt.messages']\n : attributes['ai.prompt'];\n if (raw === undefined) {\n return undefined;\n }\n\n let value: any = raw;\n if (typeof value === 'string') {\n try {\n value = JSON.parse(value);\n } catch {\n // Not JSON — treat the raw string as the prompt text below.\n }\n }\n\n const messages = this.coerceToMessages(value);\n if (!messages) {\n return undefined;\n }\n return this.normalizeMessages(messages);\n }\n\n /**\n * Coerce the shapes `ai.prompt` / `ai.prompt.messages` can take into a\n * messages array:\n * - `[ ...messages ]` — ai.prompt.messages (leaf spans)\n * - `{ messages: [...], system? }` — ai.prompt with messages\n * - `{ prompt: \"text\", system? }` — ai.prompt for a string prompt\n * (the parent wrapper spans)\n * - `\"text\"` — a bare (non-JSON) prompt string\n */\n private coerceToMessages(value: any): any[] | undefined {\n if (typeof value === 'string') {\n return [{ role: 'user', content: value }];\n }\n if (Array.isArray(value)) {\n return value;\n }\n if (value && typeof value === 'object') {\n if (Array.isArray(value.messages)) {\n return typeof value.system === 'string'\n ? [{ role: 'system', content: value.system }, ...value.messages]\n : value.messages;\n }\n if (typeof value.prompt === 'string') {\n const messages: any[] = [];\n if (typeof value.system === 'string') {\n messages.push({ role: 'system', content: value.system });\n }\n messages.push({ role: 'user', content: value.prompt });\n return messages;\n }\n }\n return undefined;\n }\n\n extractOutput(attributes: Record<string, any>): string | undefined {\n // V5 uses 'ai.response.*'\n // Only return text, objects go to outputObject\n if (attributes['ai.response.text'] !== undefined) return attributes['ai.response.text'];\n return undefined;\n }\n\n extractOutputObject(attributes: Record<string, any>): Record<string, any> | undefined {\n // V5 uses 'ai.response.object'\n if (attributes['ai.response.object'] === undefined) {\n return undefined;\n }\n\n const objValue = attributes['ai.response.object'];\n \n // Parse if it's a string, otherwise use as-is\n if (typeof objValue === 'string') {\n try {\n return JSON.parse(objValue);\n } catch {\n return undefined;\n }\n }\n \n // Return object directly (not stringified)\n if (typeof objValue === 'object' && objValue !== null) {\n return objValue;\n }\n return undefined;\n }\n\n extractToolCalls(attributes: Record<string, any>): ToolCall[] | undefined {\n // V5 uses 'ai.response.toolCalls' (for generation spans with tool calls)\n // Check this first as it takes precedence over individual ai.toolCall.* attributes\n if (attributes['ai.response.toolCalls'] !== undefined) {\n\n const toolCallsValue = attributes['ai.response.toolCalls'];\n\n // Parse if it's a string, otherwise use as-is\n let toolCalls: any;\n if (typeof toolCallsValue === 'string') {\n try {\n toolCalls = JSON.parse(toolCallsValue);\n } catch {\n return undefined;\n }\n } else {\n toolCalls = toolCallsValue;\n }\n\n // Ensure it's an array\n if (!Array.isArray(toolCalls)) {\n return undefined;\n }\n\n // Normalize: map v5 'input' to unified 'args' field\n return toolCalls.map((tc: any) => ({\n type: tc.type || 'tool-call',\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: tc.input || tc.args || {}, // v5 uses 'input', normalize to 'args'\n providerMetadata: tc.providerMetadata || tc.providerOptions,\n }));\n }\n\n // Fallback: check for individual ai.toolCall.* attributes (for tool call execution spans)\n if (attributes['ai.toolCall.name'] !== undefined) {\n const toolCallId = attributes['ai.toolCall.id'];\n const toolName = attributes['ai.toolCall.name'];\n const argsValue = attributes['ai.toolCall.args'];\n const resultValue = attributes['ai.toolCall.result'];\n \n if (toolCallId && toolName) {\n let args: Record<string, any> = {};\n if (argsValue !== undefined) {\n if (typeof argsValue === 'string') {\n try {\n args = JSON.parse(argsValue);\n } catch {\n // If parsing fails, treat as empty object\n args = {};\n }\n } else if (typeof argsValue === 'object' && argsValue !== null) {\n args = argsValue;\n }\n }\n \n // Extract result - keep as string (JSON stringified) for UI compatibility\n let result: string | undefined;\n if (resultValue !== undefined) {\n if (typeof resultValue === 'string') {\n result = resultValue;\n } else {\n // If it's an object, stringify it\n try {\n result = JSON.stringify(resultValue);\n } catch {\n result = String(resultValue);\n }\n }\n }\n \n return [{\n type: 'tool-call',\n toolCallId: String(toolCallId),\n toolName: String(toolName),\n args,\n result,\n }];\n }\n }\n\n return undefined;\n }\n\n extractFinishReason(attributes: Record<string, any>): string | undefined {\n // V5: Check ai.response.finishReason (primary) or gen_ai.response.finish_reasons (OTel)\n if (attributes['ai.response.finishReason'] !== undefined) {\n return String(attributes['ai.response.finishReason']);\n }\n if (attributes['gen_ai.response.finish_reasons'] !== undefined) {\n const reasons = attributes['gen_ai.response.finish_reasons'];\n // OTel can be an array, take first element if array\n if (Array.isArray(reasons) && reasons.length > 0) {\n return String(reasons[0]);\n }\n return String(reasons);\n }\n return undefined;\n }\n\n extractSettings(attributes: Record<string, any>): NormalizedSpan['settings'] {\n const settings: NormalizedSpan['settings'] = {};\n\n // Check OTel keys first, then fallback to AI SDK keys\n if (attributes['gen_ai.request.temperature'] !== undefined || attributes['ai.settings.temperature'] !== undefined) {\n const value = attributes['gen_ai.request.temperature'] ?? attributes['ai.settings.temperature'];\n settings.temperature = typeof value === 'number' ? value : parseFloat(String(value));\n }\n\n if (attributes['gen_ai.request.max_tokens'] !== undefined || attributes['ai.settings.maxTokens'] !== undefined) {\n const value = attributes['gen_ai.request.max_tokens'] ?? attributes['ai.settings.maxTokens'];\n settings.maxTokens = typeof value === 'number' ? value : parseInt(String(value), 10);\n }\n\n if (attributes['gen_ai.request.top_p'] !== undefined || attributes['ai.settings.topP'] !== undefined) {\n const value = attributes['gen_ai.request.top_p'] ?? attributes['ai.settings.topP'];\n settings.topP = typeof value === 'number' ? value : parseFloat(String(value));\n }\n\n if (attributes['gen_ai.request.presence_penalty'] !== undefined || attributes['ai.settings.presencePenalty'] !== undefined) {\n const value = attributes['gen_ai.request.presence_penalty'] ?? attributes['ai.settings.presencePenalty'];\n settings.presencePenalty = typeof value === 'number' ? value : parseFloat(String(value));\n }\n\n if (attributes['gen_ai.request.frequency_penalty'] !== undefined || attributes['ai.settings.frequencyPenalty'] !== undefined) {\n const value = attributes['gen_ai.request.frequency_penalty'] ?? attributes['ai.settings.frequencyPenalty'];\n settings.frequencyPenalty = typeof value === 'number' ? value : parseFloat(String(value));\n }\n\n // Only return if at least one setting is present\n return Object.keys(settings).length > 0 ? settings : undefined;\n }\n\n extractTokens(attributes: Record<string, any>): { input?: number; output?: number; total?: number; reasoning?: number } {\n // V5 aligns better with OTel GenAI conventions\n const tokens = parseTokens(attributes, {\n inputKey: 'gen_ai.usage.input_tokens',\n outputKey: 'gen_ai.usage.output_tokens',\n totalKey: 'gen_ai.usage.total_tokens',\n promptKey: 'ai.usage.promptTokens', // SDK specific fallback\n completionKey: 'ai.usage.completionTokens', // SDK specific fallback\n reasoningKey: 'ai.usage.reasoningTokens' // AI SDK v5 uses this\n });\n\n // Fallback to providerMetadata for reasoning tokens only if not already set\n // Note: We check for undefined explicitly to preserve 0 values\n if (tokens.reasoningTokens === undefined) {\n tokens.reasoningTokens = extractReasoningFromProviderMetadata(attributes);\n }\n \n if (!tokens.reasoningTokens) {\n tokens.reasoningTokens = 0;\n }\n\n return {\n input: tokens.inputTokens,\n output: tokens.outputTokens,\n total: tokens.totalTokens,\n reasoning: tokens.reasoningTokens\n };\n }\n\n extractMetadata(attributes: Record<string, any>): Partial<NormalizedSpan> {\n // First try agentmark.metadata.* prefix\n const result = parseMetadata(attributes);\n \n // Also check for ai.telemetry.metadata.* attributes\n const aiTelemetryResult = parseMetadata(attributes, 'ai.telemetry.metadata.');\n \n // Extract custom metadata from both prefixes\n const agentmarkCustomMetadata = extractCustomMetadata(attributes, 'agentmark.metadata.');\n const aiTelemetryCustomMetadata = extractCustomMetadata(attributes, 'ai.telemetry.metadata.');\n \n // Merge custom metadata (ai.telemetry.metadata takes precedence if both exist)\n const mergedCustomMetadata = {\n ...agentmarkCustomMetadata,\n ...aiTelemetryCustomMetadata,\n };\n \n // Merge results (ai.telemetry.metadata takes precedence if both exist)\n return {\n ...result,\n ...aiTelemetryResult,\n // Only include metadata field if there are custom metadata keys\n ...(Object.keys(mergedCustomMetadata).length > 0 ? { metadata: mergedCustomMetadata } : {}),\n };\n }\n}\n","import { NormalizedSpan, OtelSpan, ScopeTransformer, AttributeExtractor, SpanType } from '../../types';\nimport { detectVersion } from './version-detector';\nimport { AiSdkV4Strategy } from './strategies/v4';\nimport { AiSdkV5Strategy } from './strategies/v5';\n\nexport class AiSdkTransformer implements ScopeTransformer {\n private strategies: {\n v4: AttributeExtractor;\n v5: AttributeExtractor;\n };\n\n constructor() {\n this.strategies = {\n v4: new AiSdkV4Strategy(),\n v5: new AiSdkV5Strategy(),\n };\n }\n\n classify(span: OtelSpan, _attributes: Record<string, any>): SpanType {\n // Only specific generation spans are GENERATION:\n // - ai.generateText.doGenerate\n // - ai.streamText.doStream\n // - ai.generateObject.doGenerate\n // - ai.streamObject.doStream\n const isGenerationSpan = \n span.name === 'ai.generateText.doGenerate' ||\n span.name === 'ai.streamText.doStream' ||\n span.name === 'ai.generateObject.doGenerate' ||\n span.name === 'ai.streamObject.doStream';\n \n return isGenerationSpan ? SpanType.GENERATION : SpanType.SPAN;\n }\n\n transform(_span: OtelSpan, attributes: Record<string, any>): Partial<NormalizedSpan> {\n const version = detectVersion(attributes);\n\n const strategy = version === 'v5' ? this.strategies.v5 : this.strategies.v4;\n\n const tokens = strategy.extractTokens(attributes);\n const toolCalls = strategy.extractToolCalls(attributes);\n\n // Build result with standard fields\n const result: Partial<NormalizedSpan> = {\n model: strategy.extractModel(attributes),\n input: strategy.extractInput(attributes),\n output: strategy.extractOutput(attributes),\n outputObject: strategy.extractOutputObject(attributes),\n toolCalls,\n finishReason: strategy.extractFinishReason(attributes),\n settings: strategy.extractSettings(attributes),\n inputTokens: tokens.input,\n outputTokens: tokens.output,\n totalTokens: tokens.total,\n reasoningTokens: tokens.reasoning,\n\n ...strategy.extractMetadata(attributes),\n };\n\n // Override span name with tool name for tool call execution spans\n // This enables proper grouping by tool name in the workflow graph\n // (e.g., \"search_web\" instead of generic \"ai.toolCall\")\n const toolName = attributes['ai.toolCall.name'];\n if (toolName && typeof toolName === 'string') {\n result.name = toolName;\n }\n\n return result;\n }\n}\n","import { NormalizedSpan, OtelSpan, ScopeTransformer, SpanType, Message } from '../../types';\n\nexport class MastraTransformer implements ScopeTransformer {\n classify(span: OtelSpan, _attributes: Record<string, any>): SpanType {\n // Classify agent generation spans as GENERATION\n const isGenerationSpan = \n span.name === 'agent.streamLegacy' ||\n span.name === 'agent.stream' ||\n span.name === 'agent.streamObject' ||\n span.name === 'agent.generate' ||\n span.name === 'agent.generateObject';\n \n return isGenerationSpan ? SpanType.GENERATION : SpanType.SPAN;\n }\n\n transform(span: OtelSpan, attributes: Record<string, any>): Partial<NormalizedSpan> {\n const result: Partial<NormalizedSpan> = {};\n\n // Extract model from agent.resolveModelConfig.result or from current span\n const modelConfig = this.extractModelConfig(attributes, span);\n if (modelConfig?.modelId) {\n result.model = modelConfig.modelId;\n }\n\n // Extract input messages\n const input = this.extractInput(span, attributes);\n if (input) {\n result.input = input;\n }\n\n // Extract output and tokens from agent.stream.result or agent.streamLegacy.result\n const streamResult = this.extractStreamResult(span, attributes);\n if (streamResult) {\n if (streamResult.output) {\n result.output = streamResult.output;\n }\n if (streamResult.outputObject) {\n result.outputObject = streamResult.outputObject;\n }\n if (streamResult.usage) {\n result.inputTokens = streamResult.usage.promptTokens;\n result.outputTokens = streamResult.usage.completionTokens;\n result.totalTokens = streamResult.usage.totalTokens;\n }\n }\n\n // Extract trace name from agentmark.trace_name or componentName\n if (attributes['agentmark.trace_name']) {\n result.traceName = attributes['agentmark.trace_name'] as string;\n } else if (attributes['componentName']) {\n result.traceName = attributes['componentName'] as string;\n }\n\n // Extract settings from model config\n if (modelConfig?.settings) {\n result.settings = modelConfig.settings;\n }\n\n return result;\n }\n\n private extractModelConfig(\n attributes: Record<string, any>,\n _span: OtelSpan\n ): { modelId?: string; provider?: string; settings?: any } | null {\n // Try to find model config in resolveModelConfig.result attribute\n // This might be in a sibling span, so we check current span first\n const resolveModelConfigResult = attributes['agent.resolveModelConfig.result'];\n if (resolveModelConfigResult) {\n try {\n const config = typeof resolveModelConfigResult === 'string' \n ? JSON.parse(resolveModelConfigResult) \n : resolveModelConfigResult;\n \n if (config.modelId) {\n return {\n modelId: config.modelId,\n provider: config.config?.provider,\n settings: config.settings,\n };\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n // Also check prepareLLMOptions.result for model info\n const prepareLLMOptionsResult = attributes['agent.prepareLLMOptions.result'];\n if (prepareLLMOptionsResult) {\n try {\n const result = typeof prepareLLMOptionsResult === 'string'\n ? JSON.parse(prepareLLMOptionsResult)\n : prepareLLMOptionsResult;\n \n if (result.llm?.name) {\n // This gives us the LLM component name, but not the model ID\n // Model ID would be in resolveModelConfig\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n return null;\n }\n\n private extractInput(span: OtelSpan, attributes: Record<string, any>): Message[] | undefined {\n // Try to extract messages from various agent span attributes\n const spanName = span.name;\n \n // Check for argument.0 which typically contains messages\n const argument0 = attributes[`${spanName}.argument.0`] || \n attributes['agent.prepareLLMOptions.argument.0'] ||\n attributes['agent.stream.argument.0'] ||\n attributes['agent.streamLegacy.argument.0'];\n \n if (argument0) {\n try {\n const messages = typeof argument0 === 'string' ? JSON.parse(argument0) : argument0;\n if (Array.isArray(messages)) {\n return messages as Message[];\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n return undefined;\n }\n\n private extractStreamResult(\n span: OtelSpan,\n attributes: Record<string, any>\n ): { output?: string; outputObject?: any; usage?: { promptTokens?: number; completionTokens?: number; totalTokens?: number } } | null {\n const spanName = span.name;\n \n // Check for result attribute\n const resultAttr = attributes[`${spanName}.result`] ||\n attributes['agent.stream.result'] ||\n attributes['agent.streamLegacy.result'] ||\n attributes['agent.streamObject.result'];\n \n if (resultAttr) {\n try {\n const result = typeof resultAttr === 'string' ? JSON.parse(resultAttr) : resultAttr;\n \n const extracted: any = {};\n \n // Extract usage/tokens\n if (result.usage) {\n extracted.usage = {\n promptTokens: result.usage.promptTokens,\n completionTokens: result.usage.completionTokens,\n totalTokens: result.usage.totalTokens,\n };\n }\n \n // Extract output object\n if (result.object) {\n extracted.outputObject = result.object;\n extracted.output = JSON.stringify(result.object);\n } else if (result.text) {\n extracted.output = result.text;\n } else if (result.response) {\n // Sometimes response is nested\n if (typeof result.response === 'string') {\n extracted.output = result.response;\n } else {\n extracted.output = JSON.stringify(result.response);\n extracted.outputObject = result.response;\n }\n }\n \n return extracted;\n } catch {\n // Ignore parse errors\n }\n }\n\n return null;\n }\n}\n\n","import { NormalizedSpan } from '../types';\n\n/**\n * Parse attributes with 'agentmark.' prefix (not 'agentmark.metadata.')\n * These are direct context attributes set by the AgentMark SDK.\n * \n * @param attributes - The attributes to extract from\n * @param prefix - The prefix to look for (default: 'agentmark.')\n * @returns Partial NormalizedSpan with extracted fields in camelCase\n */\nexport function parseAgentMarkAttributes(\n attributes: Record<string, any>, \n prefix: string = 'agentmark.'\n): Partial<NormalizedSpan> {\n const result: Partial<NormalizedSpan> = {};\n\n // Helper to get value with prefix\n const get = (key: string) => attributes[`${prefix}${key}`];\n\n // Session Context\n if (get('session_id')) result.sessionId = String(get('session_id'));\n if (get('session_name')) result.sessionName = String(get('session_name'));\n if (get('user_id')) result.userId = String(get('user_id'));\n if (get('trace_name')) result.traceName = String(get('trace_name'));\n\n // Prompt Context\n if (get('prompt_name')) result.promptName = String(get('prompt_name'));\n // Template variables. Only `agentmark.props` populates `result.props`\n // — never fall back to `agentmark.input`. The two attributes have\n // different semantics:\n // `agentmark.props` = frontmatter template variables. Set by\n // spans that ran a templated prompt (e.g.\n // invoke_agent in traced.py).\n // `agentmark.input` = arbitrary input data (dataset rows on a\n // wrapper span, chat messages on a generation\n // span, tool args on an execute_tool span).\n // Backfilling props from input would mis-label every wrapper / tool /\n // generation span as \"has template variables\", which the trace\n // drawer's Test Prompt button reads as \"this is a prompt invocation\n // you can re-run\". The asymmetry is intentional: AgentMarkTransformer\n // already does the safe direction (`props -> input`) at\n // transformers/agentmark/index.ts:258.\n if (get('props')) result.props = String(get('props'));\n\n // Span Kind (set by @traced decorator / traced() wrapper)\n // Route to semanticKind — keep kind as OTel-only (see Hazard 1 in issue #1817)\n if (get('span.kind')) result.semanticKind = String(get('span.kind'));\n\n // Dataset / Evaluation Context\n if (get('dataset_run_id')) result.datasetRunId = String(get('dataset_run_id'));\n if (get('dataset_run_name')) result.datasetRunName = String(get('dataset_run_name'));\n if (get('dataset_item_name')) result.datasetItemName = String(get('dataset_item_name'));\n if (get('dataset_expected_output')) result.datasetExpectedOutput = String(get('dataset_expected_output'));\n if (get('dataset_input')) result.datasetInput = String(get('dataset_input'));\n if (get('dataset_path')) result.datasetPath = String(get('dataset_path'));\n\n // Experiment identity (regression-gate baseline matching).\n if (get('experiment_key')) result.experimentKey = String(get('experiment_key'));\n if (get('source_tree_hash')) result.sourceTreeHash = String(get('source_tree_hash'));\n\n return result;\n}\n\n","import { NormalizedSpan, OtelSpan, ScopeTransformer, SpanType, Message, ToolCall } from '../../types';\nimport { parseAgentMarkAttributes } from '../../extractors/agentmark-parser';\nimport { parseMetadata, extractCustomMetadata } from '../../extractors/metadata-parser';\n\n/**\n * GenAI Semantic Convention attribute names.\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/\n */\nconst GenAIAttributes = {\n SYSTEM: 'gen_ai.system',\n OPERATION_NAME: 'gen_ai.operation.name',\n REQUEST_MODEL: 'gen_ai.request.model',\n REQUEST_MAX_TOKENS: 'gen_ai.request.max_tokens',\n REQUEST_TEMPERATURE: 'gen_ai.request.temperature',\n REQUEST_INPUT: 'gen_ai.request.input',\n RESPONSE_ID: 'gen_ai.response.id',\n RESPONSE_MODEL: 'gen_ai.response.model',\n RESPONSE_OUTPUT: 'gen_ai.response.output',\n RESPONSE_FINISH_REASONS: 'gen_ai.response.finish_reasons',\n USAGE_INPUT_TOKENS: 'gen_ai.usage.input_tokens',\n USAGE_OUTPUT_TOKENS: 'gen_ai.usage.output_tokens',\n TOOL_NAME: 'gen_ai.tool.name',\n TOOL_CALL_ID: 'gen_ai.tool.call.id',\n TOOL_INPUT: 'gen_ai.tool.input',\n TOOL_OUTPUT: 'gen_ai.tool.output',\n\n // Spec replacement for the deprecated gen_ai.system attribute.\n PROVIDER_NAME: 'gen_ai.provider.name',\n\n // Vendor-namespaced IO keys (dual-emitted by observe()/setInput()/\n // setOutput() alongside the deprecated gen_ai.request.input /\n // gen_ai.response.output during the OTel GenAI spec migration).\n AM_REQUEST_INPUT: 'agentmark.request.input',\n AM_RESPONSE_OUTPUT: 'agentmark.response.output',\n\n // Standard OTel GenAI semconv content keys (spec status: Development).\n // Accepted as fallbacks so spec-conformant instrumentation routed to\n // this transformer doesn't silently lose IO data on ingest.\n // https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/\n INPUT_MESSAGES: 'gen_ai.input.messages',\n OUTPUT_MESSAGES: 'gen_ai.output.messages',\n SYSTEM_INSTRUCTIONS: 'gen_ai.system_instructions',\n\n // Legacy (pre-1.27) OTel GenAI content keys.\n LEGACY_PROMPT: 'gen_ai.prompt',\n LEGACY_COMPLETION: 'gen_ai.completion',\n\n // Legacy OTel GenAI usage keys (pre input_tokens/output_tokens rename).\n USAGE_PROMPT_TOKENS: 'gen_ai.usage.prompt_tokens',\n USAGE_COMPLETION_TOKENS: 'gen_ai.usage.completion_tokens',\n} as const;\n\n/**\n * Parse a free-form serialized input value into normalized Messages.\n * Handles a JSON {role, content} messages array, or any other string\n * (wrapped as a single user message — backwards compatible).\n */\nfunction parseLooseInput(raw: string): Message[] {\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed) && parsed.length > 0) {\n const isMessagesArray = parsed.every(\n (item: unknown) =>\n item &&\n typeof item === 'object' &&\n 'role' in item &&\n 'content' in item\n );\n if (isMessagesArray) {\n return parsed as Message[];\n }\n }\n } catch {\n // Not valid JSON — fall through to plain-text handling.\n }\n return [{ role: 'user', content: raw }];\n}\n\n/**\n * Extract text content from an OTel GenAI spec parts array\n * ({type: \"text\", content} | {type: \"tool_call\", ...} | ...).\n */\nfunction specPartsToText(parts: any[]): string {\n return parts\n .filter((p: any) => p && p.type === 'text' && typeof p.content === 'string')\n .map((p: any) => p.content)\n .join('\\n');\n}\n\n/**\n * Parse spec-shaped gen_ai.input.messages / gen_ai.output.messages\n * ({role, parts: [...]}) into normalized {role, content} Messages.\n * Returns null when the value is not a non-empty spec messages array.\n */\nfunction parseSpecMessages(raw: string): Message[] | null {\n try {\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed) || parsed.length === 0) return null;\n const messages: Message[] = [];\n for (const msg of parsed) {\n if (!msg || !msg.role) continue;\n if (typeof msg.content === 'string') {\n messages.push({ role: msg.role, content: msg.content });\n } else if (Array.isArray(msg.parts)) {\n const text = specPartsToText(msg.parts);\n if (text) messages.push({ role: msg.role, content: text });\n }\n }\n return messages.length > 0 ? messages : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Extract the text of gen_ai.system_instructions — either a plain string\n * or a JSON array of spec parts ([{type: \"text\", content}]).\n */\nfunction parseSystemInstructions(raw: string): string | null {\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n const text = specPartsToText(parsed);\n return text || null;\n }\n if (typeof parsed === 'string') return parsed || null;\n } catch {\n // Not JSON — treat the raw value as the instruction text.\n }\n return raw || null;\n}\n\n/**\n * Standard span names following OpenTelemetry GenAI semantic conventions.\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/\n *\n * Span naming convention: `{operation_name}` or `{operation_name} {target}`\n * - chat / chat {model} - LLM chat completion (GENERATION)\n * - execute_tool / execute_tool {tool_name} - Tool execution (SPAN)\n * - invoke_agent / invoke_agent {agent_name} - Agent invocation (SPAN)\n */\nconst SpanNames = {\n // OTEL GenAI standard operation names (these can be followed by model/tool/agent name)\n CHAT: 'chat',\n EXECUTE_TOOL: 'execute_tool',\n INVOKE_AGENT: 'invoke_agent',\n\n // Legacy span names (for backwards compatibility)\n SESSION: 'gen_ai.session',\n TOOL_CALL: 'gen_ai.tool.call',\n SUBAGENT: 'gen_ai.subagent',\n CONVERSATION: 'gen_ai.conversation',\n LLM_TURN: 'gen_ai.llm.turn',\n} as const;\n\n/**\n * Operation names per OTEL GenAI semantic conventions.\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/\n */\nconst OperationNames = {\n CHAT: 'chat',\n EMBEDDINGS: 'embeddings',\n TEXT_COMPLETION: 'text_completion',\n GENERATE_CONTENT: 'generate_content',\n EXECUTE_TOOL: 'execute_tool',\n CREATE_AGENT: 'create_agent',\n INVOKE_AGENT: 'invoke_agent',\n} as const;\n\n/**\n * Transformer for AgentMark spans emitted via OTEL.\n * Handles GenAI semantic convention attributes and classifies spans.\n *\n * Classification rules (per OTEL GenAI conventions):\n * - GENERATION: Spans that represent actual LLM API calls (chat, text_completion)\n * - SPAN: All other spans (tool execution, agent invocation, grouping spans)\n *\n * Only spans that send requests to the LLM should be GENERATION type.\n * Wrapper/grouping spans like conversations are regular SPAN type.\n */\nexport class AgentMarkTransformer implements ScopeTransformer {\n /**\n * Classify the span type based on span name and attributes.\n *\n * GENERATION type (actual LLM calls):\n * - Spans starting with \"chat \" (OTEL convention)\n * - gen_ai.llm.turn spans (legacy traced module)\n * - gen_ai.session spans (legacy hooks) - these wrap LLM calls\n * - Spans with gen_ai.operation.name = \"chat\" or \"text_completion\"\n *\n * SPAN type (everything else):\n * - gen_ai.conversation (grouping span)\n * - execute_tool / gen_ai.tool.call (tool execution)\n * - invoke_agent / gen_ai.subagent (agent invocation)\n */\n classify(span: OtelSpan, attributes: Record<string, any>): SpanType {\n const operationName = attributes[GenAIAttributes.OPERATION_NAME];\n\n // Check operation name first (OTEL standard)\n if (operationName === OperationNames.CHAT || operationName === OperationNames.TEXT_COMPLETION) {\n return SpanType.GENERATION;\n }\n\n // Embedding operations are generations too (they have tokens/cost)\n if (operationName === OperationNames.EMBEDDINGS) {\n return SpanType.GENERATION;\n }\n\n // OTEL convention: \"chat\" or \"chat {model}\" format\n if (span.name === SpanNames.CHAT || span.name.startsWith(SpanNames.CHAT + ' ')) {\n return SpanType.GENERATION;\n }\n\n // LLM turn spans represent actual LLM responses (GENERATION) - legacy\n if (span.name === SpanNames.LLM_TURN) {\n return SpanType.GENERATION;\n }\n\n // Legacy session spans (these wrapped LLM interactions)\n if (span.name === SpanNames.SESSION) {\n return SpanType.GENERATION;\n }\n\n // Tool calls are not LLM generations (execute_tool or execute_tool {name})\n if (span.name === SpanNames.EXECUTE_TOOL ||\n span.name.startsWith(SpanNames.EXECUTE_TOOL + ' ') ||\n span.name.startsWith(SpanNames.TOOL_CALL)) {\n return SpanType.SPAN;\n }\n\n // Agent invocations are not direct LLM calls (invoke_agent or invoke_agent {name})\n if (span.name === SpanNames.INVOKE_AGENT ||\n span.name.startsWith(SpanNames.INVOKE_AGENT + ' ')) {\n return SpanType.SPAN;\n }\n\n // Legacy conversation/subagent spans are grouping spans, not LLM calls\n if (span.name === SpanNames.CONVERSATION || span.name === SpanNames.SUBAGENT) {\n return SpanType.SPAN;\n }\n\n // Fallback: check for LLM-specific attributes that indicate generation.\n // gen_ai.system is deprecated in the OTel GenAI spec in favor of\n // gen_ai.provider.name — accept either.\n if (attributes[GenAIAttributes.SYSTEM] === 'anthropic' ||\n attributes[GenAIAttributes.PROVIDER_NAME] === 'anthropic') {\n // Has usage tokens AND response output = likely an LLM generation\n if (attributes[GenAIAttributes.USAGE_INPUT_TOKENS] !== undefined &&\n attributes[GenAIAttributes.RESPONSE_OUTPUT] !== undefined) {\n return SpanType.GENERATION;\n }\n }\n\n return SpanType.SPAN;\n }\n\n /**\n * Transform the span and extract normalized fields from GenAI attributes.\n */\n transform(_span: OtelSpan, attributes: Record<string, any>): Partial<NormalizedSpan> {\n const result: Partial<NormalizedSpan> = {};\n\n // Model (prefer response model over request model)\n const responseModel = attributes[GenAIAttributes.RESPONSE_MODEL];\n const requestModel = attributes[GenAIAttributes.REQUEST_MODEL];\n if (responseModel) {\n result.model = String(responseModel);\n } else if (requestModel) {\n result.model = String(requestModel);\n }\n\n // Token usage. The current spec keys (input_tokens / output_tokens)\n // win; the legacy prompt_tokens / completion_tokens names are\n // accepted as fallbacks for older OTel GenAI emitters.\n const inputTokens = attributes[GenAIAttributes.USAGE_INPUT_TOKENS]\n ?? attributes[GenAIAttributes.USAGE_PROMPT_TOKENS];\n const outputTokens = attributes[GenAIAttributes.USAGE_OUTPUT_TOKENS]\n ?? attributes[GenAIAttributes.USAGE_COMPLETION_TOKENS];\n if (typeof inputTokens === 'number') {\n result.inputTokens = inputTokens;\n }\n if (typeof outputTokens === 'number') {\n result.outputTokens = outputTokens;\n }\n if (result.inputTokens !== undefined && result.outputTokens !== undefined) {\n result.totalTokens = result.inputTokens + result.outputTokens;\n }\n\n // Cost from agentmark.usage.cost_usd attribute\n const costUsd = attributes['agentmark.usage.cost_usd'];\n if (typeof costUsd === 'number' && costUsd > 0) {\n result.cost = costUsd;\n }\n\n // Finish reason (stored as JSON array per OTEL spec)\n const finishReasons = attributes[GenAIAttributes.RESPONSE_FINISH_REASONS];\n if (finishReasons) {\n try {\n const reasons = JSON.parse(finishReasons);\n if (Array.isArray(reasons) && reasons.length > 0) {\n result.finishReason = String(reasons[0]);\n }\n } catch {\n // If not valid JSON, use as-is\n result.finishReason = String(finishReasons);\n }\n }\n\n // Settings from request attributes\n const maxTokens = attributes[GenAIAttributes.REQUEST_MAX_TOKENS];\n const temperature = attributes[GenAIAttributes.REQUEST_TEMPERATURE];\n if (maxTokens !== undefined || temperature !== undefined) {\n result.settings = {};\n if (typeof maxTokens === 'number') {\n result.settings.maxTokens = maxTokens;\n }\n if (typeof temperature === 'number') {\n result.settings.temperature = temperature;\n }\n }\n\n // Input. Precedence (additive — AgentMark keys always win over the\n // standard-spec fallbacks, so existing traffic is byte-identical):\n // 1. gen_ai.request.input (deprecated AgentMark key, still emitted)\n // 2. agentmark.request.input (vendor-namespaced replacement)\n // 3. gen_ai.input.messages (OTel GenAI spec shape, {role, parts[]})\n // 4. gen_ai.prompt (legacy OTel GenAI key)\n // The agentmark.input / agentmark.props fallback below also outranks\n // the spec keys (3/4) — every agentmark.* key wins over spec fallbacks.\n const requestInput = attributes[GenAIAttributes.REQUEST_INPUT]\n ?? attributes[GenAIAttributes.AM_REQUEST_INPUT];\n const hasAgentmarkInput = Boolean(\n attributes['agentmark.input'] ?? attributes['agentmark.props']\n );\n if (requestInput && typeof requestInput === 'string') {\n result.input = parseLooseInput(requestInput);\n } else if (!hasAgentmarkInput) {\n const inputMessages = attributes[GenAIAttributes.INPUT_MESSAGES];\n if (inputMessages && typeof inputMessages === 'string') {\n const messages = parseSpecMessages(inputMessages);\n if (messages) result.input = messages;\n }\n if (!result.input) {\n const legacyPrompt = attributes[GenAIAttributes.LEGACY_PROMPT];\n if (legacyPrompt && typeof legacyPrompt === 'string') {\n result.input = parseLooseInput(legacyPrompt);\n }\n }\n }\n\n // gen_ai.system_instructions (OTel GenAI spec): fold into the input\n // messages as a leading system message — matching how our SDKs embed\n // the system prompt as messages[0] in gen_ai.request.input.\n const systemInstructions = attributes[GenAIAttributes.SYSTEM_INSTRUCTIONS];\n if (systemInstructions && typeof systemInstructions === 'string' && !hasAgentmarkInput) {\n const text = parseSystemInstructions(systemInstructions);\n if (text && (!result.input || result.input[0]?.role !== 'system')) {\n result.input = [{ role: 'system', content: text }, ...(result.input ?? [])];\n }\n }\n\n // Output. Precedence mirrors input:\n // 1. gen_ai.response.output (deprecated AgentMark key, still emitted)\n // 2. agentmark.response.output (vendor-namespaced replacement)\n // 3. gen_ai.output.messages (OTel GenAI spec shape)\n // 4. gen_ai.completion (legacy OTel GenAI key)\n // The agentmark.output fallback below also outranks the spec keys.\n const responseOutput = attributes[GenAIAttributes.RESPONSE_OUTPUT]\n ?? attributes[GenAIAttributes.AM_RESPONSE_OUTPUT];\n const hasAgentmarkOutput = Boolean(attributes['agentmark.output']);\n if (responseOutput && typeof responseOutput === 'string') {\n result.output = responseOutput;\n try {\n result.outputObject = JSON.parse(responseOutput);\n } catch { /* not JSON, keep as text only */ }\n } else if (!hasAgentmarkOutput) {\n const outputMessages = attributes[GenAIAttributes.OUTPUT_MESSAGES];\n if (outputMessages && typeof outputMessages === 'string') {\n const messages = parseSpecMessages(outputMessages);\n if (messages) {\n result.output = messages.map((m) => m.content).join('\\n');\n }\n }\n if (result.output === undefined) {\n const legacyCompletion = attributes[GenAIAttributes.LEGACY_COMPLETION];\n if (legacyCompletion && typeof legacyCompletion === 'string') {\n result.output = legacyCompletion;\n try {\n result.outputObject = JSON.parse(legacyCompletion);\n } catch { /* not JSON, keep as text only */ }\n }\n }\n }\n\n // Fallback: agentmark.input / agentmark.output (set by SDK's set_input/set_output)\n // Also accept the legacy `agentmark.props` key as a fallback. Pre-2026-05\n // adapter wrappers set props instead of input; the OtelGenAiTransformer\n // already accepted both, this transformer didn't, which caused\n // experiment wrapper spans (emitted under the \"agentmark\" scope) to\n // render with empty Input panels in the trace drawer despite the\n // adapter setting the attribute. Defense-in-depth: tolerate either\n // key here so any external caller still using the legacy attribute\n // works without forcing them to migrate.\n const amInput = attributes['agentmark.input'] ?? attributes['agentmark.props'];\n if (amInput && typeof amInput === 'string' && !result.input) {\n // The WebhookRunner writes agentmark.input as a JSON messages\n // array ({role, content} pairs). Parse it so the wrapper span's\n // input renders as messages, mirroring the REQUEST_INPUT\n // handling above; anything else stays a single user message.\n let parsedMessages: Message[] | null = null;\n try {\n const parsed = JSON.parse(amInput);\n if (\n Array.isArray(parsed) &&\n parsed.length > 0 &&\n parsed.every(\n (item: unknown) =>\n item &&\n typeof item === 'object' &&\n 'role' in item &&\n 'content' in item\n )\n ) {\n parsedMessages = parsed as Message[];\n }\n } catch { /* not JSON — fall through to plain text */ }\n result.input = parsedMessages ?? [{ role: 'user', content: amInput }];\n }\n const amOutput = attributes['agentmark.output'];\n if (amOutput && typeof amOutput === 'string' && !result.output) {\n result.output = amOutput;\n try {\n result.outputObject = JSON.parse(amOutput);\n } catch { /* ignore */ }\n }\n\n // Tool call spans: extract tool info\n const toolName = attributes[GenAIAttributes.TOOL_NAME];\n const toolCallId = attributes[GenAIAttributes.TOOL_CALL_ID];\n const toolInput = attributes[GenAIAttributes.TOOL_INPUT];\n const toolOutput = attributes[GenAIAttributes.TOOL_OUTPUT];\n\n if (toolName && typeof toolName === 'string') {\n // Override name with tool name for better grouping\n result.name = toolName;\n\n // Build tool call info\n const toolCall: ToolCall = {\n type: 'tool-call',\n toolCallId: typeof toolCallId === 'string' ? toolCallId : '',\n toolName: toolName,\n args: {},\n };\n\n // Parse tool input (JSON string)\n if (toolInput && typeof toolInput === 'string') {\n try {\n toolCall.args = JSON.parse(toolInput);\n } catch {\n // If not valid JSON, store as raw value\n toolCall.args = { raw: toolInput };\n }\n }\n\n // Parse tool output (JSON string)\n if (toolOutput && typeof toolOutput === 'string') {\n toolCall.result = toolOutput;\n }\n\n result.toolCalls = [toolCall];\n }\n\n // Extract agentmark-specific attributes (prompt_name, props, session_id, etc.)\n // First extract from agentmark.* prefix (direct attributes)\n const agentmarkAttrs = parseAgentMarkAttributes(attributes);\n\n // Also extract from agentmark.metadata.* prefix (for custom metadata passed via telemetry)\n const metadataAttrs = parseMetadata(attributes, 'agentmark.metadata.');\n\n // Extract custom metadata keys (anything not in known fields)\n const customMetadata = extractCustomMetadata(attributes, 'agentmark.metadata.');\n\n return {\n ...result,\n ...metadataAttrs, // agentmark.metadata.* values (lower priority)\n ...agentmarkAttrs, // agentmark.* values (higher priority)\n // Only include metadata field if there are custom metadata keys\n ...(Object.keys(customMetadata).length > 0 ? { metadata: customMetadata } : {}),\n };\n }\n}\n\n/**\n * The scope name used by AgentMark's OTEL tracer.\n * Used by the registry to route spans to this transformer.\n */\nexport const AGENTMARK_SCOPE_NAME = 'agentmark';\n\n// Backwards compatibility export\nexport { AgentMarkTransformer as ClaudeAgentTransformer };\n","/**\n * Transformer for the official OTel GenAI Semantic Conventions (v1.37.0+).\n *\n * Handles attribute names:\n * gen_ai.input.messages — JSON array of input messages ({role, parts[]})\n * gen_ai.output.messages — JSON array of output messages ({role, parts[], finish_reason})\n * gen_ai.system_instructions — JSON array of system instruction parts\n *\n * Used by frameworks that follow the official spec:\n * - Pydantic AI (scope: \"pydantic-ai\")\n * - Any future OTel-compliant GenAI instrumentation\n *\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/\n */\n\nimport { NormalizedSpan, OtelSpan, ScopeTransformer, SpanType, Message, ToolCall } from '../../types';\nimport { parseAgentMarkAttributes } from '../../extractors/agentmark-parser';\nimport { parseMetadata, extractCustomMetadata } from '../../extractors/metadata-parser';\n\nconst Attrs = {\n // Standard OTel GenAI attributes\n SYSTEM: 'gen_ai.system',\n PROVIDER_NAME: 'gen_ai.provider.name',\n OPERATION_NAME: 'gen_ai.operation.name',\n REQUEST_MODEL: 'gen_ai.request.model',\n REQUEST_MAX_TOKENS: 'gen_ai.request.max_tokens',\n REQUEST_TEMPERATURE: 'gen_ai.request.temperature',\n RESPONSE_ID: 'gen_ai.response.id',\n RESPONSE_MODEL: 'gen_ai.response.model',\n RESPONSE_FINISH_REASONS: 'gen_ai.response.finish_reasons',\n USAGE_INPUT_TOKENS: 'gen_ai.usage.input_tokens',\n USAGE_OUTPUT_TOKENS: 'gen_ai.usage.output_tokens',\n\n // v1.37.0+ content attributes (canonical OTel GenAI semantic conventions).\n // SDKs that emit the AgentMark-scoped equivalents (`gen_ai.request.input`\n // / `gen_ai.response.output`) are\n // also accepted here as fallbacks so an SDK picking either key set\n // doesn't silently lose IO data on ingest. The canonical pair always wins\n // when both are present.\n INPUT_MESSAGES: 'gen_ai.input.messages',\n OUTPUT_MESSAGES: 'gen_ai.output.messages',\n REQUEST_INPUT_FALLBACK: 'gen_ai.request.input',\n RESPONSE_OUTPUT_FALLBACK: 'gen_ai.response.output',\n SYSTEM_INSTRUCTIONS: 'gen_ai.system_instructions',\n TOOL_DEFINITIONS: 'gen_ai.tool.definitions',\n\n // Legacy (pre-1.27) OTel GenAI content keys, accepted as last-resort\n // fallbacks below the canonical and AgentMark-scoped keys.\n LEGACY_PROMPT: 'gen_ai.prompt',\n LEGACY_COMPLETION: 'gen_ai.completion',\n\n // Legacy OTel GenAI usage keys (pre input_tokens/output_tokens rename).\n USAGE_PROMPT_TOKENS: 'gen_ai.usage.prompt_tokens',\n USAGE_COMPLETION_TOKENS: 'gen_ai.usage.completion_tokens',\n\n // Tool call attributes (v1.37.0+)\n TOOL_NAME: 'gen_ai.tool.name',\n TOOL_CALL_ID: 'gen_ai.tool.call.id',\n TOOL_CALL_ARGS: 'gen_ai.tool.call.arguments',\n TOOL_CALL_RESULT: 'gen_ai.tool.call.result',\n} as const;\n\n/**\n * Extract text content from a parts array.\n * OTel GenAI v1.37.0 messages use: {role, parts: [{type: \"text\", content: \"...\"}]}\n */\nfunction partsToText(parts: any[]): string {\n return parts\n .filter((p: any) => p.type === 'text' && p.content)\n .map((p: any) => p.content)\n .join('\\n');\n}\n\n/**\n * Convert OTel GenAI messages ({role, parts[]}) to normalized Messages ({role, content}).\n */\nfunction normalizeMessages(raw: string): Message[] | null {\n try {\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed) || parsed.length === 0) return null;\n\n const messages: Message[] = [];\n for (const msg of parsed) {\n if (!msg.role) continue;\n if (msg.content && typeof msg.content === 'string') {\n // Already in {role, content} format\n messages.push(msg);\n } else if (msg.parts && Array.isArray(msg.parts)) {\n // OTel v1.37.0 format: {role, parts: [{type, content}]}\n const text = partsToText(msg.parts);\n if (text) {\n messages.push({ role: msg.role, content: text });\n }\n }\n }\n return messages.length > 0 ? messages : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Extract structured output from OTel GenAI output messages.\n * Pydantic AI structured output comes as a tool_call with name \"final_result\".\n */\nfunction extractStructuredOutput(raw: string): { output: string; outputObject?: any } | null {\n try {\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return null;\n\n for (const msg of parsed) {\n for (const part of (msg.parts || [])) {\n if (part.type === 'tool_call' && part.arguments) {\n // Structured output via tool call (e.g., final_result)\n return {\n output: JSON.stringify(part.arguments),\n outputObject: part.arguments,\n };\n }\n }\n }\n // No tool calls — check for text output\n for (const msg of parsed) {\n const text = partsToText(msg.parts || []);\n if (text) return { output: text };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport class OtelGenAiTransformer implements ScopeTransformer {\n\n classify(span: OtelSpan, attributes: Record<string, any>): SpanType {\n // \"chat {model}\" spans with usage tokens are GENERATION\n if (span.name.startsWith('chat ')) return SpanType.GENERATION;\n // \"invoke_agent\" or \"agent run\" spans are parent SPAN\n if (span.name.startsWith('invoke_agent') || span.name === 'agent run') return SpanType.SPAN;\n // \"execute_tool\" spans\n if (span.name.startsWith('execute_tool') || span.name.startsWith('running ')) return SpanType.SPAN;\n // Fallback: check for token usage\n if (attributes[Attrs.USAGE_INPUT_TOKENS] !== undefined) return SpanType.GENERATION;\n return SpanType.SPAN;\n }\n\n transform(span: OtelSpan, attributes: Record<string, any>): Partial<NormalizedSpan> {\n const result: Partial<NormalizedSpan> = {};\n\n // Model\n const model = attributes[Attrs.RESPONSE_MODEL] || attributes[Attrs.REQUEST_MODEL];\n if (model && typeof model === 'string') {\n result.model = model;\n }\n\n // Tokens — current spec keys win; legacy prompt_tokens /\n // completion_tokens names accepted as fallbacks for older emitters.\n const inputTokens = attributes[Attrs.USAGE_INPUT_TOKENS]\n ?? attributes[Attrs.USAGE_PROMPT_TOKENS];\n const outputTokens = attributes[Attrs.USAGE_OUTPUT_TOKENS]\n ?? attributes[Attrs.USAGE_COMPLETION_TOKENS];\n if (typeof inputTokens === 'number') result.inputTokens = inputTokens;\n if (typeof outputTokens === 'number') result.outputTokens = outputTokens;\n if (result.inputTokens !== undefined && result.outputTokens !== undefined) {\n result.totalTokens = result.inputTokens + result.outputTokens;\n }\n\n // Finish reason\n const finishReasons = attributes[Attrs.RESPONSE_FINISH_REASONS];\n if (Array.isArray(finishReasons) && finishReasons.length > 0) {\n result.finishReason = finishReasons[0];\n }\n\n // Temperature\n const temperature = attributes[Attrs.REQUEST_TEMPERATURE];\n if (typeof temperature === 'number') {\n result.settings = { ...result.settings, temperature };\n }\n\n // Input messages — canonical OTel GenAI key (gen_ai.input.messages).\n // Fall back to the AgentMark-scoped equivalent (gen_ai.request.input)\n // so SDKs that picked the older key set don't lose IO data on ingest.\n const inputMessages = attributes[Attrs.INPUT_MESSAGES]\n ?? attributes[Attrs.REQUEST_INPUT_FALLBACK]\n ?? attributes[Attrs.LEGACY_PROMPT];\n if (inputMessages && typeof inputMessages === 'string') {\n const messages = normalizeMessages(inputMessages);\n if (messages) result.input = messages;\n }\n\n // gen_ai.system_instructions: fold into the input messages as a\n // leading system message — matching how AgentMark SDKs embed the\n // system prompt as messages[0] of the input.\n const systemInstructions = attributes[Attrs.SYSTEM_INSTRUCTIONS];\n if (systemInstructions && typeof systemInstructions === 'string') {\n let text: string | null = null;\n try {\n const parsed = JSON.parse(systemInstructions);\n if (Array.isArray(parsed)) {\n text = partsToText(parsed) || null;\n } else if (typeof parsed === 'string') {\n text = parsed || null;\n }\n } catch {\n text = systemInstructions;\n }\n if (text && (!result.input || result.input[0]?.role !== 'system')) {\n result.input = [{ role: 'system', content: text }, ...(result.input ?? [])];\n }\n }\n\n // Output messages — canonical OTel GenAI key (gen_ai.output.messages),\n // with gen_ai.response.output as a fallback for older SDK emitters.\n const outputMessages = attributes[Attrs.OUTPUT_MESSAGES]\n ?? attributes[Attrs.RESPONSE_OUTPUT_FALLBACK]\n ?? attributes[Attrs.LEGACY_COMPLETION];\n if (outputMessages && typeof outputMessages === 'string') {\n const extracted = extractStructuredOutput(outputMessages);\n if (extracted) {\n result.output = extracted.output;\n if (extracted.outputObject) {\n result.outputObject = extracted.outputObject;\n }\n } else {\n // Not a spec messages array — the legacy gen_ai.completion\n // key (and some emitters' response.output) carry plain text.\n result.output = outputMessages;\n }\n }\n\n // Pydantic AI agent run span: extract user prompt from all_messages\n // when gen_ai.input.messages is not available (agent run spans don't have it)\n const allMessages = attributes['pydantic_ai.all_messages'];\n if (allMessages && typeof allMessages === 'string' && !result.input) {\n const messages = normalizeMessages(allMessages);\n if (messages) {\n const userMessages = messages.filter(m => m.role === 'user');\n if (userMessages.length > 0) {\n result.input = userMessages;\n }\n }\n }\n\n // Pydantic AI agent span: final_result attribute contains structured output\n const finalResult = attributes['final_result'];\n if (finalResult && typeof finalResult === 'string' && !result.output) {\n result.output = finalResult;\n try {\n result.outputObject = JSON.parse(finalResult);\n } catch { /* ignore */ }\n }\n\n // AgentMark props: the original prompt input (set by the adapter)\n // This is the semantic input that maps to the prompt's input_schema.\n const propsStr = attributes['agentmark.props'];\n if (propsStr && typeof propsStr === 'string' && !result.input) {\n try {\n const props = JSON.parse(propsStr);\n result.input = [{ role: 'user', content: JSON.stringify(props) }];\n } catch { /* ignore */ }\n }\n\n // AgentMark output: structured result (set by the adapter)\n const outputStr = attributes['agentmark.output'];\n if (outputStr && typeof outputStr === 'string' && !result.output) {\n result.output = outputStr;\n try {\n result.outputObject = JSON.parse(outputStr);\n } catch { /* ignore */ }\n }\n\n // Tool execution spans\n const toolName = attributes[Attrs.TOOL_NAME];\n if (toolName && typeof toolName === 'string') {\n result.name = toolName;\n const toolCall: ToolCall = {\n type: 'tool-call',\n toolCallId: attributes[Attrs.TOOL_CALL_ID] || '',\n toolName,\n args: {},\n };\n const toolArgs = attributes[Attrs.TOOL_CALL_ARGS];\n if (toolArgs && typeof toolArgs === 'string') {\n try { toolCall.args = JSON.parse(toolArgs); } catch { toolCall.args = { raw: toolArgs }; }\n }\n const toolResult = attributes[Attrs.TOOL_CALL_RESULT];\n if (toolResult && typeof toolResult === 'string') {\n toolCall.result = toolResult;\n }\n result.toolCalls = [toolCall];\n }\n\n // Parse agentmark.* attributes if present\n const agentmarkAttrs = parseAgentMarkAttributes(attributes);\n Object.assign(result, agentmarkAttrs);\n\n // Metadata\n const parsedMeta = parseMetadata(attributes);\n if (parsedMeta.metadata && Object.keys(parsedMeta.metadata).length > 0) {\n result.metadata = { ...result.metadata, ...parsedMeta.metadata };\n }\n const customMeta = extractCustomMetadata(attributes);\n if (Object.keys(customMeta).length > 0) {\n result.metadata = { ...result.metadata, ...customMeta };\n }\n\n return result;\n }\n\n static readonly SCOPE_NAME = 'pydantic-ai';\n}\n","import { Message, StandardMessageContent, ToolCall } from '../types';\n\n/**\n * Shared parser for the \"flattened indexed message\" attribute shape used by\n * both OpenInference and OpenLLMetry/Traceloop. Neither emits a single JSON\n * messages array (the way OTel GenAI v1.37+ does with `gen_ai.input.messages`);\n * instead they explode each message into one attribute per field, indexed by\n * position:\n *\n * OpenInference:\n * llm.input_messages.0.message.role = \"user\"\n * llm.input_messages.0.message.content = \"hello\"\n * llm.output_messages.0.message.tool_calls.0.tool_call.function.name = \"search\"\n * llm.output_messages.0.message.tool_calls.0.tool_call.function.arguments = \"{...}\"\n *\n * OpenLLMetry / Traceloop:\n * gen_ai.prompt.0.role = \"user\"\n * gen_ai.prompt.0.content = \"hello\"\n * gen_ai.completion.0.tool_calls.0.name = \"search\"\n * gen_ai.completion.0.tool_calls.0.arguments = \"{...}\"\n *\n * The two differ only in path fragments (a `message.` infix, a `tool_call.`\n * infix, `function.name` vs `name`), so one config-driven parser serves both.\n */\nexport interface IndexedMessageConfig {\n /** Attribute prefix that precedes the integer index, e.g. \"llm.input_messages\". */\n prefix: string;\n /** Path fragment between the index and the per-message fields. OpenInference uses\n * \"message.\" (so keys read `…0.message.role`); OpenLLMetry uses \"\" (`…0.role`). */\n messageInfix: string;\n /** Field name for the role. Default \"role\". */\n roleKey?: string;\n /** Field name for scalar text content. Default \"content\". */\n contentKey?: string;\n /** Multi-part content list field (OpenInference `contents`), read when the scalar\n * content field is absent. Each part lives at\n * `${base}${contentsKey}.${j}.${contentsPartInfix}text`. Omit to disable. */\n contentsKey?: string;\n /** Path fragment after the contents index, e.g. \"message_content.\" for OpenInference. */\n contentsPartInfix?: string;\n /** Tool-call sub-shape. Omit if the source never carries tool calls. */\n toolCalls?: {\n /** Array field name under a message, e.g. \"tool_calls\". */\n arrayKey: string;\n /** Fragment between the tool-call index and its fields. OpenInference uses\n * \"tool_call.\" ; OpenLLMetry uses \"\". */\n infix: string;\n /** Relative key to the call id, e.g. \"id\". */\n idKey: string;\n /** Relative key to the tool name. OpenInference \"function.name\"; OpenLLMetry \"name\". */\n nameKey: string;\n /** Relative key to the JSON-string arguments. OpenInference \"function.arguments\";\n * OpenLLMetry \"arguments\". */\n argsKey: string;\n };\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Collect the distinct, ascending integer indices that appear immediately after\n * `prefix.` across the attribute keys. Tolerant of gaps and arbitrary key order\n * (a span may emit message 2 before message 0); we never assume a dense 0..n.\n * Exported so transformers can reuse it for non-message indexed groups\n * (e.g. OpenInference `retrieval.documents.{i}.*`).\n */\nexport function collectIndices(attributes: Record<string, any>, prefix: string): number[] {\n const re = new RegExp(`^${escapeRegExp(prefix)}\\\\.(\\\\d+)\\\\.`);\n const seen = new Set<number>();\n for (const key of Object.keys(attributes)) {\n const match = re.exec(key);\n if (match) seen.add(Number(match[1]));\n }\n return [...seen].sort((a, b) => a - b);\n}\n\n/** Parse a JSON-string arguments value into an object, mirroring the convention\n * used elsewhere (parse; on failure keep the raw text under `raw`). */\nfunction parseArgs(raw: any): Record<string, any> {\n if (raw === undefined || raw === null) return {};\n if (typeof raw === 'object') return raw as Record<string, any>;\n if (typeof raw === 'string') {\n try {\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === 'object' ? parsed : { raw };\n } catch {\n return { raw };\n }\n }\n return { raw };\n}\n\n/** Read the tool calls attached to the message rooted at `messageBase`. */\nfunction readMessageToolCalls(\n attributes: Record<string, any>,\n messageBase: string,\n config: IndexedMessageConfig,\n): ToolCall[] {\n const tc = config.toolCalls;\n if (!tc) return [];\n const arrayPrefix = `${messageBase}${tc.arrayKey}`;\n const indices = collectIndices(attributes, arrayPrefix);\n const calls: ToolCall[] = [];\n for (const j of indices) {\n const base = `${arrayPrefix}.${j}.${tc.infix}`;\n const name = attributes[`${base}${tc.nameKey}`];\n if (name === undefined) continue;\n const id = attributes[`${base}${tc.idKey}`];\n const args = parseArgs(attributes[`${base}${tc.argsKey}`]);\n calls.push({\n type: 'tool-call',\n toolCallId: id !== undefined ? String(id) : '',\n toolName: String(name),\n args,\n });\n }\n return calls;\n}\n\n/** Join the multi-part `contents` list of a message into text, when present. */\nfunction readContentsText(\n attributes: Record<string, any>,\n messageBase: string,\n config: IndexedMessageConfig,\n): string | undefined {\n if (!config.contentsKey) return undefined;\n const contentsPrefix = `${messageBase}${config.contentsKey}`;\n const indices = collectIndices(attributes, contentsPrefix);\n if (indices.length === 0) return undefined;\n const partInfix = config.contentsPartInfix ?? '';\n const parts: string[] = [];\n for (const j of indices) {\n const text = attributes[`${contentsPrefix}.${j}.${partInfix}text`];\n if (typeof text === 'string' && text.length > 0) parts.push(text);\n }\n return parts.length > 0 ? parts.join('\\n') : undefined;\n}\n\n/**\n * Parse the flattened indexed messages under `config.prefix` into normalized\n * Messages. A message that carries tool calls gets an array content of a text\n * part (when present) followed by `tool-call` parts, so conversation history is\n * preserved with full fidelity; a text-only message gets a plain string content.\n * Returns `undefined` when no messages are present (lets callers fall through to\n * other extraction paths).\n */\nexport function parseIndexedMessages(\n attributes: Record<string, any>,\n config: IndexedMessageConfig,\n): Message[] | undefined {\n const indices = collectIndices(attributes, config.prefix);\n if (indices.length === 0) return undefined;\n\n const roleKey = config.roleKey ?? 'role';\n const contentKey = config.contentKey ?? 'content';\n const messages: Message[] = [];\n\n for (const i of indices) {\n // `i` is always a decimal integer (collectIndices matches /^\\d+\\./), so\n // the constructed key is never a prototype-pollution vector and the\n // attribute lookups below are reads, not writes.\n const base = `${config.prefix}.${i}.${config.messageInfix}`;\n\n const role = attributes[`${base}${roleKey}`];\n const scalarContent = attributes[`${base}${contentKey}`];\n const text =\n typeof scalarContent === 'string'\n ? scalarContent\n : scalarContent !== undefined\n ? String(scalarContent)\n : readContentsText(attributes, base, config);\n const toolCalls = readMessageToolCalls(attributes, base, config);\n\n // Skip wholly empty positions (no role, no text, no tool calls).\n if (role === undefined && text === undefined && toolCalls.length === 0) continue;\n\n let content: StandardMessageContent | StandardMessageContent[];\n if (toolCalls.length > 0) {\n const parts: StandardMessageContent[] = [];\n if (text) parts.push({ type: 'text', text });\n for (const call of toolCalls) {\n parts.push({\n type: 'tool-call',\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n args: call.args,\n });\n }\n content = parts;\n } else {\n content = text ?? '';\n }\n\n messages.push({ role: role !== undefined ? String(role) : 'user', content });\n }\n\n return messages.length > 0 ? messages : undefined;\n}\n\n/**\n * Flatten every tool call across the indexed messages under `config.prefix` into\n * a span-level ToolCall[]. Used for the response side, where OpenInference and\n * OpenLLMetry place the assistant's tool calls inside `output_messages` /\n * `gen_ai.completion` and AgentMark surfaces them as `span.toolCalls`.\n */\nexport function extractIndexedToolCalls(\n attributes: Record<string, any>,\n config: IndexedMessageConfig,\n): ToolCall[] | undefined {\n if (!config.toolCalls) return undefined;\n const indices = collectIndices(attributes, config.prefix);\n const calls: ToolCall[] = [];\n for (const i of indices) {\n const base = `${config.prefix}.${i}.${config.messageInfix}`;\n calls.push(...readMessageToolCalls(attributes, base, config));\n }\n return calls.length > 0 ? calls : undefined;\n}\n\n/**\n * Collapse normalized messages into a single plain-text string (text parts only,\n * newline-joined). Tool-call parts are intentionally dropped — they travel\n * separately via `extractIndexedToolCalls`. Returns `undefined` when there is no\n * text to show.\n */\nexport function messagesToPlainText(messages: Message[] | undefined): string | undefined {\n if (!messages || messages.length === 0) return undefined;\n const chunks: string[] = [];\n for (const msg of messages) {\n if (typeof msg.content === 'string') {\n if (msg.content.length > 0) chunks.push(msg.content);\n } else if (Array.isArray(msg.content)) {\n for (const part of msg.content) {\n if (typeof part === 'string') {\n if (part.length > 0) chunks.push(part);\n } else if (part.type === 'text' && part.text.length > 0) {\n chunks.push(part.text);\n }\n }\n }\n }\n return chunks.length > 0 ? chunks.join('\\n') : undefined;\n}\n","/**\n * Coerce an attribute value to a finite number, or `undefined` when it can't be.\n *\n * OTLP attribute values arrive as numbers (intValue/doubleValue) but JSON\n * serializers and some instrumentors stringify them, so a token count or a\n * temperature may be `12` or `\"12\"`. Non-numeric strings (`\"abc\"`), booleans,\n * objects, null and undefined all yield `undefined` so callers can treat\n * \"absent\" and \"unparseable\" uniformly.\n */\nexport function toNumber(value: unknown): number | undefined {\n if (typeof value === 'number') return Number.isFinite(value) ? value : undefined;\n if (typeof value === 'string') {\n const n = Number(value);\n return Number.isFinite(n) ? n : undefined;\n }\n return undefined;\n}\n","/**\n * Transformer for the OpenInference semantic conventions — the instrumentation\n * standard maintained by Arize and used by ~30 auto-instrumentors (LangChain,\n * LlamaIndex, OpenAI Agents SDK, CrewAI, DSPy, Haystack, smolagents, Bedrock,\n * Anthropic, Google ADK, Instructor, MCP, Guardrails, …). Those instrumentors\n * each set their own OTel scope name, so this transformer is reached via the\n * attribute-signature dispatcher rather than a scope registration (see the\n * DispatchingTransformer).\n *\n * Span *classification* (openinference.span.kind → SpanKind) is already handled\n * by resolveSemanticKind; this transformer fills the gap that left the IO,\n * model, and token fields empty, because the default OTel-GenAI transformer only\n * reads `gen_ai.*` keys and OpenInference uses an entirely different shape.\n *\n * @see https://github.com/Arize-ai/openinference/blob/main/spec/semantic_conventions.md\n */\n\nimport { NormalizedSpan, OtelSpan, ScopeTransformer, SpanType, RetrievalDocument } from '../../types';\nimport {\n IndexedMessageConfig,\n parseIndexedMessages,\n extractIndexedToolCalls,\n messagesToPlainText,\n collectIndices,\n} from '../../extractors/indexed-message-parser';\nimport { toNumber } from '../../utils/coerce';\n\nconst Attrs = {\n SPAN_KIND: 'openinference.span.kind',\n MODEL: 'llm.model_name',\n PROVIDER: 'llm.provider',\n SYSTEM: 'llm.system',\n INVOCATION_PARAMETERS: 'llm.invocation_parameters',\n TOKEN_PROMPT: 'llm.token_count.prompt',\n TOKEN_COMPLETION: 'llm.token_count.completion',\n TOKEN_TOTAL: 'llm.token_count.total',\n TOKEN_REASONING: 'llm.token_count.completion_details.reasoning',\n INPUT_VALUE: 'input.value',\n INPUT_MIME: 'input.mime_type',\n OUTPUT_VALUE: 'output.value',\n OUTPUT_MIME: 'output.mime_type',\n TOOL_NAME: 'tool.name',\n SESSION_ID: 'session.id',\n USER_ID: 'user.id',\n METADATA: 'metadata',\n} as const;\n\nconst INPUT_MESSAGES: IndexedMessageConfig = {\n prefix: 'llm.input_messages',\n messageInfix: 'message.',\n contentsKey: 'contents',\n contentsPartInfix: 'message_content.',\n toolCalls: {\n arrayKey: 'tool_calls',\n infix: 'tool_call.',\n idKey: 'id',\n nameKey: 'function.name',\n argsKey: 'function.arguments',\n },\n};\n\nconst OUTPUT_MESSAGES: IndexedMessageConfig = {\n ...INPUT_MESSAGES,\n prefix: 'llm.output_messages',\n};\n\nconst RETRIEVAL_PREFIX = 'retrieval.documents';\n\n/** Parse `llm.invocation_parameters` (a JSON string) into normalized settings. */\nfunction extractSettings(attributes: Record<string, any>): NormalizedSpan['settings'] {\n const raw = attributes[Attrs.INVOCATION_PARAMETERS];\n if (raw === undefined) return undefined;\n let parsed: any;\n if (typeof raw === 'string') {\n try {\n parsed = JSON.parse(raw);\n } catch {\n return undefined;\n }\n } else if (typeof raw === 'object' && raw !== null) {\n parsed = raw;\n } else {\n return undefined;\n }\n if (!parsed || typeof parsed !== 'object') return undefined;\n\n const settings: NonNullable<NormalizedSpan['settings']> = {};\n const temperature = toNumber(parsed.temperature);\n const maxTokens = toNumber(parsed.max_tokens ?? parsed.maxTokens ?? parsed.max_completion_tokens);\n const topP = toNumber(parsed.top_p ?? parsed.topP);\n const presencePenalty = toNumber(parsed.presence_penalty ?? parsed.presencePenalty);\n const frequencyPenalty = toNumber(parsed.frequency_penalty ?? parsed.frequencyPenalty);\n if (temperature !== undefined) settings.temperature = temperature;\n if (maxTokens !== undefined) settings.maxTokens = maxTokens;\n if (topP !== undefined) settings.topP = topP;\n if (presencePenalty !== undefined) settings.presencePenalty = presencePenalty;\n if (frequencyPenalty !== undefined) settings.frequencyPenalty = frequencyPenalty;\n return Object.keys(settings).length > 0 ? settings : undefined;\n}\n\n/**\n * CHAIN / TOOL / AGENT spans carry generic IO via `input.value` / `output.value`\n * with a mime hint rather than structured messages. Honor the mime: JSON output\n * populates outputObject (+ a stringified output); text stays text.\n */\nfunction extractGenericInput(attributes: Record<string, any>): Partial<NormalizedSpan> {\n const value = attributes[Attrs.INPUT_VALUE];\n if (value === undefined) return {};\n const mime = attributes[Attrs.INPUT_MIME];\n if (mime === 'application/json' && typeof value === 'string') {\n try {\n const parsed = JSON.parse(value);\n // A JSON array of {role, content} is a messages array; anything else\n // is opaque request data, surfaced as a single user message.\n if (Array.isArray(parsed) && parsed.every((m) => m && typeof m === 'object' && 'role' in m)) {\n return { input: parsed };\n }\n return { input: [{ role: 'user', content: JSON.stringify(parsed) }] };\n } catch {\n /* fall through to raw string */\n }\n }\n return { input: [{ role: 'user', content: String(value) }] };\n}\n\nfunction extractGenericOutput(attributes: Record<string, any>): Partial<NormalizedSpan> {\n const value = attributes[Attrs.OUTPUT_VALUE];\n if (value === undefined) return {};\n const mime = attributes[Attrs.OUTPUT_MIME];\n if (mime === 'application/json' && typeof value === 'string') {\n try {\n const parsed = JSON.parse(value);\n return { output: JSON.stringify(parsed), outputObject: parsed };\n } catch {\n /* fall through to raw string */\n }\n }\n return { output: String(value) };\n}\n\n/** Parse a `metadata` attribute that may arrive as a JSON string or an object. */\nfunction parseDocumentMetadata(raw: any): Record<string, any> | undefined {\n let parsed: any = raw;\n if (typeof raw === 'string') {\n try {\n parsed = JSON.parse(raw);\n } catch {\n return undefined;\n }\n }\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) return parsed;\n return undefined;\n}\n\n/**\n * Extract retriever documents from OpenInference's flattened attributes,\n * preserving per-document id, relevance score, and metadata. Returns one\n * structured entry per `retrieval.documents.{i}.*` index that carries any field.\n */\nfunction extractRetrievalDocuments(attributes: Record<string, any>): RetrievalDocument[] {\n const docs: RetrievalDocument[] = [];\n for (const i of collectIndices(attributes, RETRIEVAL_PREFIX)) {\n const base = `${RETRIEVAL_PREFIX}.${i}.document`;\n const doc: RetrievalDocument = {};\n\n const id = attributes[`${base}.id`];\n if (id !== undefined && id !== null && String(id).length > 0) doc.id = String(id);\n\n const content = attributes[`${base}.content`];\n if (typeof content === 'string' && content.length > 0) doc.content = content;\n\n const score = toNumber(attributes[`${base}.score`]);\n if (score !== undefined) doc.score = score;\n\n const metadata = parseDocumentMetadata(attributes[`${base}.metadata`]);\n if (metadata !== undefined) doc.metadata = metadata;\n\n if (Object.keys(doc).length > 0) docs.push(doc);\n }\n return docs;\n}\n\n/** Join document contents into a readable, searchable text output. */\nexport function retrievalDocumentsToText(documents: RetrievalDocument[]): string | undefined {\n const text = documents\n .map((d) => d.content)\n .filter((c): c is string => typeof c === 'string' && c.length > 0)\n .join('\\n\\n');\n return text.length > 0 ? text : undefined;\n}\n\nexport class OpenInferenceTransformer implements ScopeTransformer {\n classify(_span: OtelSpan, attributes: Record<string, any>): SpanType {\n const kind = attributes[Attrs.SPAN_KIND];\n if (typeof kind === 'string' && kind.toUpperCase() === 'LLM') return SpanType.GENERATION;\n // Fallback: a span carrying token counts is a generation even if the\n // kind attribute is missing/non-standard.\n if (attributes[Attrs.TOKEN_PROMPT] !== undefined || attributes[Attrs.TOKEN_COMPLETION] !== undefined) {\n return SpanType.GENERATION;\n }\n return SpanType.SPAN;\n }\n\n transform(_span: OtelSpan, attributes: Record<string, any>): Partial<NormalizedSpan> {\n const result: Partial<NormalizedSpan> = {};\n\n // Model\n const model = attributes[Attrs.MODEL];\n if (typeof model === 'string' && model.length > 0) result.model = model;\n\n // Tokens\n const inputTokens = toNumber(attributes[Attrs.TOKEN_PROMPT]);\n const outputTokens = toNumber(attributes[Attrs.TOKEN_COMPLETION]);\n const totalTokens = toNumber(attributes[Attrs.TOKEN_TOTAL]);\n const reasoningTokens = toNumber(attributes[Attrs.TOKEN_REASONING]);\n if (inputTokens !== undefined) result.inputTokens = inputTokens;\n if (outputTokens !== undefined) result.outputTokens = outputTokens;\n if (totalTokens !== undefined) {\n result.totalTokens = totalTokens;\n } else if (inputTokens !== undefined && outputTokens !== undefined) {\n result.totalTokens = inputTokens + outputTokens;\n }\n if (reasoningTokens !== undefined) result.reasoningTokens = reasoningTokens;\n\n // Settings\n const settings = extractSettings(attributes);\n if (settings) result.settings = settings;\n\n // Input: structured messages first, generic input.value as fallback.\n const inputMessages = parseIndexedMessages(attributes, INPUT_MESSAGES);\n if (inputMessages) {\n result.input = inputMessages;\n } else {\n Object.assign(result, extractGenericInput(attributes));\n }\n\n // Output: structured messages first; tool calls always extracted.\n const outputMessages = parseIndexedMessages(attributes, OUTPUT_MESSAGES);\n const toolCalls = extractIndexedToolCalls(attributes, OUTPUT_MESSAGES);\n if (toolCalls) result.toolCalls = toolCalls;\n if (outputMessages) {\n const text = messagesToPlainText(outputMessages);\n if (text) result.output = text;\n } else {\n Object.assign(result, extractGenericOutput(attributes));\n }\n\n // Retrieval spans: surface documents as a structured outputObject (rich\n // per-document rendering: id / score / content / metadata) and, when no\n // other output was produced, a joined-text output (search + fallback).\n const documents = extractRetrievalDocuments(attributes);\n if (documents.length > 0) {\n if (result.outputObject === undefined) result.outputObject = { documents };\n if (result.output === undefined) {\n const text = retrievalDocumentsToText(documents);\n if (text) result.output = text;\n }\n }\n\n // Tool-execution spans: name the span after the tool for graph grouping.\n const toolName = attributes[Attrs.TOOL_NAME];\n if (typeof toolName === 'string' && toolName.length > 0) result.name = toolName;\n\n // Trace context\n const sessionId = attributes[Attrs.SESSION_ID];\n if (sessionId !== undefined) result.sessionId = String(sessionId);\n const userId = attributes[Attrs.USER_ID];\n if (userId !== undefined) result.userId = String(userId);\n\n // Metadata blob (JSON map of arbitrary keys)\n const metadataRaw = attributes[Attrs.METADATA];\n if (metadataRaw !== undefined) {\n let parsed: any = metadataRaw;\n if (typeof metadataRaw === 'string') {\n try {\n parsed = JSON.parse(metadataRaw);\n } catch {\n parsed = undefined;\n }\n }\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n const metadata: Record<string, string> = {};\n for (const [k, v] of Object.entries(parsed)) {\n metadata[k] = typeof v === 'string' ? v : JSON.stringify(v);\n }\n if (Object.keys(metadata).length > 0) result.metadata = metadata;\n }\n }\n\n return result;\n }\n}\n","/**\n * Transformer for the OpenLLMetry / Traceloop conventions (which OpenLIT also\n * largely follows). These instrumentors back the AutoGen, Semantic Kernel, and\n * Agno integrations, among others. Like OpenInference, each emits its own OTel\n * scope name, so this transformer is reached via the attribute-signature\n * dispatcher rather than a scope registration.\n *\n * Tokens and model already partly resolve through the default OTel-GenAI\n * transformer's legacy `gen_ai.usage.prompt_tokens` fallbacks; the gap this\n * closes is the IO, which OpenLLMetry flattens into indexed\n * `gen_ai.prompt.{i}.*` / `gen_ai.completion.{i}.*` attributes (and, for\n * workflow/task spans, `traceloop.entity.input/output`) rather than the\n * `gen_ai.input.messages` JSON array the default transformer expects.\n *\n * @see https://www.traceloop.com/docs/openllmetry/privacy/traces\n */\n\nimport { NormalizedSpan, OtelSpan, ScopeTransformer, SpanType, Message, RetrievalDocument } from '../../types';\nimport { parseTokens } from '../../extractors/token-parser';\nimport {\n IndexedMessageConfig,\n parseIndexedMessages,\n extractIndexedToolCalls,\n messagesToPlainText,\n} from '../../extractors/indexed-message-parser';\nimport { toNumber } from '../../utils/coerce';\n\nconst Attrs = {\n SPAN_KIND: 'traceloop.span.kind',\n REQUEST_MODEL: 'gen_ai.request.model',\n RESPONSE_MODEL: 'gen_ai.response.model',\n REQUEST_TEMPERATURE: 'gen_ai.request.temperature',\n REQUEST_MAX_TOKENS: 'gen_ai.request.max_tokens',\n REQUEST_TOP_P: 'gen_ai.request.top_p',\n REQUEST_PRESENCE_PENALTY: 'gen_ai.request.presence_penalty',\n REQUEST_FREQUENCY_PENALTY: 'gen_ai.request.frequency_penalty',\n RESPONSE_FINISH_REASON: 'gen_ai.response.finish_reason',\n TOTAL_TOKENS_ALT: 'llm.usage.total_tokens',\n ENTITY_INPUT: 'traceloop.entity.input',\n ENTITY_OUTPUT: 'traceloop.entity.output',\n ENTITY_NAME: 'traceloop.entity.name',\n ASSOCIATION_PREFIX: 'traceloop.association.properties.',\n} as const;\n\nconst PROMPT_MESSAGES: IndexedMessageConfig = {\n prefix: 'gen_ai.prompt',\n messageInfix: '',\n toolCalls: { arrayKey: 'tool_calls', infix: '', idKey: 'id', nameKey: 'name', argsKey: 'arguments' },\n};\n\nconst COMPLETION_MESSAGES: IndexedMessageConfig = {\n ...PROMPT_MESSAGES,\n prefix: 'gen_ai.completion',\n};\n\nfunction extractSettings(attributes: Record<string, any>): NormalizedSpan['settings'] {\n const settings: NonNullable<NormalizedSpan['settings']> = {};\n const temperature = toNumber(attributes[Attrs.REQUEST_TEMPERATURE]);\n const maxTokens = toNumber(attributes[Attrs.REQUEST_MAX_TOKENS]);\n const topP = toNumber(attributes[Attrs.REQUEST_TOP_P]);\n const presencePenalty = toNumber(attributes[Attrs.REQUEST_PRESENCE_PENALTY]);\n const frequencyPenalty = toNumber(attributes[Attrs.REQUEST_FREQUENCY_PENALTY]);\n if (temperature !== undefined) settings.temperature = temperature;\n if (maxTokens !== undefined) settings.maxTokens = maxTokens;\n if (topP !== undefined) settings.topP = topP;\n if (presencePenalty !== undefined) settings.presencePenalty = presencePenalty;\n if (frequencyPenalty !== undefined) settings.frequencyPenalty = frequencyPenalty;\n return Object.keys(settings).length > 0 ? settings : undefined;\n}\n\n/**\n * Workflow / task spans carry IO as `traceloop.entity.input` /\n * `traceloop.entity.output` JSON strings rather than chat messages. Surface the\n * input as a single user message and the output as text (+ outputObject when the\n * payload is a JSON object).\n */\nfunction extractEntityInput(attributes: Record<string, any>): Message[] | undefined {\n const raw = attributes[Attrs.ENTITY_INPUT];\n if (raw === undefined) return undefined;\n const text = typeof raw === 'string' ? raw : JSON.stringify(raw);\n return [{ role: 'user', content: text }];\n}\n\nfunction extractEntityOutput(attributes: Record<string, any>): Partial<NormalizedSpan> {\n const raw = attributes[Attrs.ENTITY_OUTPUT];\n if (raw === undefined) return {};\n if (typeof raw === 'string') {\n try {\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return { output: raw, outputObject: parsed };\n }\n } catch {\n /* plain text */\n }\n return { output: raw };\n }\n const result: Partial<NormalizedSpan> = { output: JSON.stringify(raw) };\n if (typeof raw === 'object' && raw !== null) result.outputObject = raw as Record<string, any>;\n return result;\n}\n\n/**\n * Best-effort fallback for emitters (notably OpenLIT) that record prompt /\n * completion content in span *events* instead of attributes. Reads the first\n * event attribute holding `gen_ai.prompt` / `gen_ai.completion` content.\n */\nfunction extractFromEvents(\n events: OtelSpan['events'],\n attrKey: string,\n): string | undefined {\n if (!events) return undefined;\n for (const event of events) {\n const value = event.attributes?.[attrKey] ?? event.attributes?.['content'];\n if (typeof value === 'string' && value.length > 0) return value;\n }\n return undefined;\n}\n\n/** Parse a result-event `metadata` value that may be a JSON string or object. */\nfunction parseResultMetadata(raw: any): Record<string, any> | undefined {\n let parsed: any = raw;\n if (typeof raw === 'string') {\n try {\n parsed = JSON.parse(raw);\n } catch {\n return undefined;\n }\n }\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) return parsed;\n return undefined;\n}\n\nconst VECTOR_RESULT_EVENT_NAMES = new Set(['db.query.result', 'db.search.result']);\n\n/**\n * Vector-store instrumentation (Pinecone, Chroma, Marqo, Milvus, …) records one\n * span EVENT per returned match — named `db.query.result` / `db.search.result`\n * — carrying that match's id, relevance score OR vector distance, content\n * (`document`), and metadata. Stores differ in which fields they populate AND in\n * the attribute prefix (Chroma → `db.query.result.{distance,document,metadata}`;\n * Milvus → `db.search.result.{distance,entity}`), so both prefixes and both\n * score/distance are honored. Milvus packs the matched row (content + user\n * fields) into a single `entity` value — recovered into metadata so nothing is\n * lost, since we can't reliably know which entity field is the \"content\".\n * Returns matches in event (rank) order as structured RetrievalDocuments.\n *\n * Verified live against real Traceloop instrumentation for Chroma (full) and\n * Milvus (`entity` recovery); Qdrant/LanceDB/Weaviate instrumentors emit no\n * per-match result data at all, so those spans classify as retrieval but carry\n * no documents (nothing to extract).\n */\nfunction extractVectorResultDocuments(events: OtelSpan['events']): RetrievalDocument[] {\n if (!events) return [];\n const docs: RetrievalDocument[] = [];\n for (const event of events) {\n if (!VECTOR_RESULT_EVENT_NAMES.has(event.name)) continue;\n const a = event.attributes ?? {};\n const get = (field: string) =>\n a[`db.query.result.${field}`] ?? a[`db.search.result.${field}`];\n\n const doc: RetrievalDocument = {};\n const id = get('id');\n if (id !== undefined && id !== null && String(id).length > 0) doc.id = String(id);\n const content = get('document');\n if (typeof content === 'string' && content.length > 0) doc.content = content;\n const score = toNumber(get('score'));\n if (score !== undefined) doc.score = score;\n const distance = toNumber(get('distance'));\n if (distance !== undefined) doc.distance = distance;\n\n let metadata = parseResultMetadata(get('metadata'));\n // Milvus carries the matched row in `entity` rather than `metadata`; it\n // may be JSON or a Python-repr dict string. Parse what we can, else keep\n // the raw value so the content/fields stay visible in the UI.\n if (metadata === undefined) {\n const entity = get('entity');\n if (entity !== undefined && entity !== null && String(entity).length > 0) {\n metadata = parseResultMetadata(entity) ?? { entity: String(entity) };\n }\n }\n if (metadata !== undefined) doc.metadata = metadata;\n\n if (Object.keys(doc).length > 0) docs.push(doc);\n }\n return docs;\n}\n\nfunction extractFinishReason(attributes: Record<string, any>): string | undefined {\n const direct = attributes[Attrs.RESPONSE_FINISH_REASON];\n if (direct !== undefined) {\n return Array.isArray(direct) ? String(direct[0]) : String(direct);\n }\n const indexed = attributes['gen_ai.completion.0.finish_reason'];\n if (indexed !== undefined) return String(indexed);\n return undefined;\n}\n\nexport class OpenLLMetryTransformer implements ScopeTransformer {\n classify(_span: OtelSpan, attributes: Record<string, any>): SpanType {\n const kind = attributes[Attrs.SPAN_KIND];\n if (typeof kind === 'string' && kind.toUpperCase() === 'LLM') return SpanType.GENERATION;\n if (\n attributes['gen_ai.usage.prompt_tokens'] !== undefined ||\n attributes['gen_ai.usage.completion_tokens'] !== undefined ||\n attributes['gen_ai.usage.input_tokens'] !== undefined\n ) {\n return SpanType.GENERATION;\n }\n return SpanType.SPAN;\n }\n\n transform(span: OtelSpan, attributes: Record<string, any>): Partial<NormalizedSpan> {\n const result: Partial<NormalizedSpan> = {};\n\n // Model (response model preferred, request model fallback)\n const model = attributes[Attrs.RESPONSE_MODEL] ?? attributes[Attrs.REQUEST_MODEL];\n if (typeof model === 'string' && model.length > 0) result.model = model;\n\n // Tokens — current spec keys with legacy prompt/completion fallbacks.\n const tokens = parseTokens(attributes, {\n inputKey: 'gen_ai.usage.input_tokens',\n outputKey: 'gen_ai.usage.output_tokens',\n totalKey: 'gen_ai.usage.total_tokens',\n promptKey: 'gen_ai.usage.prompt_tokens',\n completionKey: 'gen_ai.usage.completion_tokens',\n });\n if (tokens.inputTokens !== undefined) result.inputTokens = tokens.inputTokens;\n if (tokens.outputTokens !== undefined) result.outputTokens = tokens.outputTokens;\n if (tokens.totalTokens !== undefined) {\n result.totalTokens = tokens.totalTokens;\n } else {\n const altTotal = toNumber(attributes[Attrs.TOTAL_TOKENS_ALT]);\n if (altTotal !== undefined) result.totalTokens = altTotal;\n }\n\n // Settings\n const settings = extractSettings(attributes);\n if (settings) result.settings = settings;\n\n // Finish reason\n const finishReason = extractFinishReason(attributes);\n if (finishReason) result.finishReason = finishReason;\n\n // Input: indexed prompt messages → entity input → event content.\n const promptMessages = parseIndexedMessages(attributes, PROMPT_MESSAGES);\n if (promptMessages) {\n result.input = promptMessages;\n } else {\n const entityInput = extractEntityInput(attributes);\n if (entityInput) {\n result.input = entityInput;\n } else {\n const eventPrompt = extractFromEvents(span.events, 'gen_ai.prompt');\n if (eventPrompt) result.input = [{ role: 'user', content: eventPrompt }];\n }\n }\n\n // Output: indexed completion messages → entity output → event content.\n const completionMessages = parseIndexedMessages(attributes, COMPLETION_MESSAGES);\n const toolCalls = extractIndexedToolCalls(attributes, COMPLETION_MESSAGES);\n if (toolCalls) result.toolCalls = toolCalls;\n if (completionMessages) {\n const text = messagesToPlainText(completionMessages);\n if (text) result.output = text;\n } else {\n const entityOutput = extractEntityOutput(attributes);\n if (entityOutput.output !== undefined) {\n Object.assign(result, entityOutput);\n } else {\n const eventCompletion = extractFromEvents(span.events, 'gen_ai.completion');\n if (eventCompletion) result.output = eventCompletion;\n }\n }\n\n // Vector-store query spans: results arrive as `db.query.result` span\n // events (one per match). Surface them as a structured outputObject for\n // the ranked-documents panel, plus joined text for search/fallback.\n if (result.outputObject === undefined) {\n const documents = extractVectorResultDocuments(span.events);\n if (documents.length > 0) {\n result.outputObject = { documents };\n if (result.output === undefined) {\n const text = documents\n .map((d) => d.content)\n .filter((c): c is string => typeof c === 'string' && c.length > 0)\n .join('\\n\\n');\n if (text) result.output = text;\n }\n }\n }\n\n // Workflow/task entity name → trace name\n const entityName = attributes[Attrs.ENTITY_NAME];\n if (typeof entityName === 'string' && entityName.length > 0) result.traceName = entityName;\n\n // Association properties → session/user/metadata\n const metadata: Record<string, string> = {};\n for (const [key, value] of Object.entries(attributes)) {\n if (!key.startsWith(Attrs.ASSOCIATION_PREFIX)) continue;\n const prop = key.slice(Attrs.ASSOCIATION_PREFIX.length);\n if (prop === 'session_id') {\n result.sessionId = String(value);\n } else if (prop === 'user_id') {\n result.userId = String(value);\n } else if (prop) {\n metadata[prop] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n if (Object.keys(metadata).length > 0) result.metadata = metadata;\n\n return result;\n }\n}\n","import { NormalizedSpan, SpanType } from '../types';\n\n/** Valid semantic kind values. */\nexport const SEMANTIC_KINDS = ['function', 'llm', 'tool', 'agent', 'retrieval', 'embedding', 'guardrail'] as const;\nexport type SemanticKind = typeof SEMANTIC_KINDS[number];\n\nconst VALID_KINDS = new Set<string>(SEMANTIC_KINDS);\n\n/** OpenInference span.kind → AgentMark semantic kind. */\nconst OPENINFERENCE_MAP: Record<string, SemanticKind> = {\n 'CHAIN': 'function',\n 'LLM': 'llm',\n 'TOOL': 'tool',\n 'AGENT': 'agent',\n 'RETRIEVER': 'retrieval',\n 'EMBEDDING': 'embedding',\n 'GUARDRAIL': 'guardrail',\n 'RERANKER': 'retrieval',\n};\n\n/**\n * Vector-store `db.system` values (lowercased) that OpenLLMetry / OTel emit.\n * A query against one of these is a retrieval, not a plain SQL query — the\n * casing varies by instrumentor (Pinecone=\"Pinecone\", chroma=\"chroma\"), so we\n * compare lowercased.\n */\nconst VECTOR_DB_SYSTEMS = new Set<string>([\n 'pinecone',\n 'qdrant',\n 'weaviate',\n 'milvus',\n 'chroma',\n 'chromadb',\n 'marqo',\n 'lancedb',\n]);\n\n/** Span events that carry per-match vector-store results (OpenLLMetry). */\nconst VECTOR_RESULT_EVENT_NAMES = new Set<string>(['db.query.result', 'db.search.result']);\n\n/**\n * True when a span looks like a vector-store query: a recognized vector-DB\n * `db.system`, any `db.vector.query.*` attribute, or `db.query.result` /\n * `db.search.result` events. Distinguishes a vector search from a plain SQL\n * query (which carries none of these). Shared by the semantic-kind resolver\n * (→ classifies as \"retrieval\") and the dispatching transformer (→ routes to\n * the OpenLLMetry extractor so the result events become documents).\n */\nexport function hasVectorStoreSignature(\n attributes: Record<string, any>,\n events?: ReadonlyArray<{ name: string }>,\n): boolean {\n const dbSystem = attributes['db.system'] ?? attributes['db.system.name'];\n if (typeof dbSystem === 'string' && VECTOR_DB_SYSTEMS.has(dbSystem.toLowerCase())) return true;\n if (Object.keys(attributes).some((k) => k.startsWith('db.vector.query.'))) return true;\n if (events?.some((e) => VECTOR_RESULT_EVENT_NAMES.has(e.name))) return true;\n return false;\n}\n\n/** Framework-specific attribute mappings (checked in order). */\nconst FRAMEWORK_MAPPINGS: Array<{ key: string; map: Record<string, SemanticKind> }> = [\n {\n key: 'ai.operationId', // Vercel AI SDK\n // The AI SDK emits ai.operationId WITH the \"ai.\" prefix (e.g.\n // \"ai.generateText\"); accept both prefixed and unprefixed so generation\n // wrappers resolve to \"llm\" instead of falling through to \"function\".\n map: {\n 'embed': 'embedding',\n 'ai.embed': 'embedding',\n 'generateText': 'llm',\n 'ai.generateText': 'llm',\n 'streamText': 'llm',\n 'ai.streamText': 'llm',\n 'generateObject': 'llm',\n 'ai.generateObject': 'llm',\n 'streamObject': 'llm',\n 'ai.streamObject': 'llm',\n },\n },\n {\n key: 'traceloop.span.kind', // Traceloop / OpenLLMetry\n map: { 'LLM': 'llm', 'TOOL': 'tool', 'AGENT': 'agent', 'WORKFLOW': 'function', 'TASK': 'function' },\n },\n {\n key: 'langchain.run_type', // LangChain via OTLP\n map: { 'llm': 'llm', 'chat_model': 'llm', 'retriever': 'retrieval', 'tool': 'tool', 'chain': 'function', 'embedding': 'embedding' },\n },\n {\n key: 'genkit:type', // Firebase Genkit\n map: { 'model': 'llm', 'tool': 'tool', 'flow': 'function', 'retriever': 'retrieval', 'embedder': 'embedding' },\n },\n];\n\n/**\n * Resolve the semantic kind of a span using a 9-level priority chain.\n *\n * Priority:\n * 1. normalized.semanticKind (from agentmark.span.kind attribute) — if valid\n * 2. openinference.span.kind attribute\n * 3. Framework-specific attributes (Vercel AI SDK, Traceloop, LangChain, Genkit)\n * 4. gen_ai.operation.name → llm/embedding\n * 5. Type = GENERATION → llm\n * 6. Carries a model (gen_ai.request.model) → llm — vendor-neutral generation\n * signal; catches model calls the framework maps above don't name.\n * 7. Has non-empty ToolCalls → tool\n * 8. Name-based heuristics\n * 9. Default → function\n */\nexport function resolveSemanticKind(\n normalized: Partial<NormalizedSpan> & { type: SpanType; name: string },\n allAttributes: Record<string, any>,\n): SemanticKind {\n // 1. Explicit agentmark.span.kind (already parsed into semanticKind)\n if (normalized.semanticKind && VALID_KINDS.has(normalized.semanticKind)) {\n return normalized.semanticKind as SemanticKind;\n }\n\n // 2. OpenInference span.kind attribute\n const oiKind = allAttributes['openinference.span.kind'];\n if (oiKind) {\n const mapped = OPENINFERENCE_MAP[String(oiKind).toUpperCase()];\n if (mapped) return mapped;\n }\n\n // 3. Framework-specific attributes\n for (const { key, map } of FRAMEWORK_MAPPINGS) {\n const val = allAttributes[key];\n if (val) {\n const mapped = map[String(val)];\n if (mapped) return mapped;\n }\n }\n\n // 3b. Vector-store query spans (OpenLLMetry: Pinecone/Chroma/Qdrant/…).\n // Signalled by a recognized vector-DB `db.system`, vector-specific query\n // attributes, or per-match result events. Kept distinct from a plain SQL\n // query (which stays \"function\") so it renders with the documents panel.\n if (hasVectorStoreSignature(allAttributes, normalized.events)) {\n return 'retrieval';\n }\n\n // 4. gen_ai.operation.name\n const opName = allAttributes['gen_ai.operation.name'];\n if (opName) {\n const op = String(opName).toLowerCase();\n if (op === 'chat' || op === 'text_completion' || op === 'generate_content') return 'llm';\n if (op === 'embeddings') return 'embedding';\n }\n\n // 5. Type = GENERATION → llm\n if (normalized.type === SpanType.GENERATION) {\n return 'llm';\n }\n\n // 6. Carries a model (OTel gen_ai.request.model) → llm. Vendor-neutral\n // generation signal that catches model calls the framework maps above don't\n // name (e.g. the Vercel ai.generateText wrapper, whose ai.operationId the\n // map may not cover). A span with a resolved model is a model call —\n // including an LLM that also requested tools — so this is checked before the\n // ToolCalls heuristic.\n if (normalized.model) {\n return 'llm';\n }\n\n // 7. Has non-empty ToolCalls → tool\n if (normalized.toolCalls && normalized.toolCalls.length > 0) {\n return 'tool';\n }\n\n // 8. Name-based heuristics\n const name = (normalized.name || '').toLowerCase();\n if (/retriev|search|rag/i.test(name)) return 'retrieval';\n if (/embed/i.test(name)) return 'embedding';\n if (/guard|safety/i.test(name)) return 'guardrail';\n\n // 9. Default\n return 'function';\n}\n","/**\n * Default transformer that routes a span to the right extractor by sniffing its\n * attribute signature, instead of by OTel scope name.\n *\n * The registry dispatches scope → transformer by exact match, which works for\n * SDKs that emit one stable scope (Vercel AI SDK = \"ai\", Mastra =\n * \"default-tracer\", …). But the OpenInference and OpenLLMetry ecosystems each\n * span dozens of instrumentor scope names\n * (`openinference.instrumentation.langchain`,\n * `@arizeai/openinference-instrumentation-openai`, `opentelemetry.instrumentation.openai`, …),\n * so per-scope registration doesn't scale. This transformer is registered as the\n * registry *default* (replacing the bare OTel-GenAI default) and picks the\n * extractor from unambiguous attribute markers, falling back to the OTel GenAI\n * semantic conventions when nothing framework-specific is present.\n *\n * classify() and transform() must agree on the chosen extractor, so both call\n * the single `select()` method.\n */\n\nimport { NormalizedSpan, OtelSpan, ScopeTransformer, SpanType } from '../../types';\nimport { OpenInferenceTransformer } from '../openinference';\nimport { OpenLLMetryTransformer } from '../openllmetry';\nimport { OtelGenAiTransformer } from '../otel-genai';\nimport { hasVectorStoreSignature } from '../../resolvers/semantic-kind-resolver';\n\nconst OPENINFERENCE_INDEXED = /^llm\\.(input_messages|output_messages|token_count)\\./;\nconst OPENLLMETRY_INDEXED = /^gen_ai\\.(prompt|completion)\\.\\d+\\./;\n\nfunction isOpenInference(attributes: Record<string, any>): boolean {\n if (attributes['openinference.span.kind'] !== undefined) return true;\n if (attributes['llm.model_name'] !== undefined) return true;\n for (const key of Object.keys(attributes)) {\n if (OPENINFERENCE_INDEXED.test(key)) return true;\n }\n return false;\n}\n\nfunction isOpenLLMetry(attributes: Record<string, any>): boolean {\n for (const key of Object.keys(attributes)) {\n if (key.startsWith('traceloop.')) return true;\n if (OPENLLMETRY_INDEXED.test(key)) return true;\n }\n return false;\n}\n\nexport class DispatchingTransformer implements ScopeTransformer {\n private readonly openInference = new OpenInferenceTransformer();\n private readonly openLLMetry = new OpenLLMetryTransformer();\n private readonly otelGenAi = new OtelGenAiTransformer();\n\n /** Choose the extractor for a span from its attribute/event signature.\n * OpenInference is checked before OpenLLMetry because its markers (`llm.*`,\n * `openinference.span.kind`) are more specific. Vector-store query spans\n * route to the OpenLLMetry extractor — they may carry no `traceloop.*`\n * marker (a bare Pinecone span is just `db.system` + `db.query.result`\n * events), so without this they'd fall through to the OTel-GenAI catch-all\n * and their result documents would be dropped. The bare OTel GenAI\n * transformer is the final catch-all. */\n select(attributes: Record<string, any>, span?: OtelSpan): ScopeTransformer {\n if (isOpenInference(attributes)) return this.openInference;\n if (isOpenLLMetry(attributes)) return this.openLLMetry;\n if (hasVectorStoreSignature(attributes, span?.events)) return this.openLLMetry;\n return this.otelGenAi;\n }\n\n classify(span: OtelSpan, attributes: Record<string, any>): SpanType {\n return this.select(attributes, span).classify(span, attributes);\n }\n\n transform(span: OtelSpan, attributes: Record<string, any>): Partial<NormalizedSpan> {\n return this.select(attributes, span).transform(span, attributes);\n }\n}\n","import { OtelResource, OtelScope, OtelSpan, OtelEvent, OtelLink } from '../types';\nimport { isSafeKey } from '../utils/key-sanitizer';\n\n/**\n * OTLP attribute value types\n */\nexport interface OtlpAttributeValue {\n stringValue?: string;\n intValue?: string | number;\n doubleValue?: number;\n boolValue?: boolean;\n arrayValue?: {\n values?: OtlpAttributeValue[];\n };\n bytesValue?: string | Uint8Array;\n}\n\n/**\n * OTLP attribute structure\n */\nexport interface OtlpAttribute {\n key: string;\n value: OtlpAttributeValue;\n}\n\n/**\n * Raw OTLP span structure\n */\nexport interface OtlpSpan {\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n traceState?: string;\n name: string;\n kind: number;\n startTimeUnixNano: string;\n endTimeUnixNano: string;\n attributes?: OtlpAttribute[];\n events?: OtlpEvent[];\n links?: OtlpLink[];\n status?: {\n code: number;\n message?: string;\n };\n droppedAttributesCount?: number;\n droppedEventsCount?: number;\n droppedLinksCount?: number;\n}\n\n/**\n * Raw OTLP event structure\n */\nexport interface OtlpEvent {\n timeUnixNano: string;\n name: string;\n attributes?: OtlpAttribute[];\n droppedAttributesCount?: number;\n}\n\n/**\n * Raw OTLP link structure\n */\nexport interface OtlpLink {\n traceId: string;\n spanId: string;\n traceState?: string;\n attributes?: OtlpAttribute[];\n droppedAttributesCount?: number;\n}\n\n/**\n * Raw OTLP resource structure\n */\nexport interface OtlpResource {\n attributes?: OtlpAttribute[];\n droppedAttributesCount?: number;\n}\n\n/**\n * Raw OTLP scope structure\n */\nexport interface OtlpScope {\n name?: string;\n version?: string;\n}\n\n/**\n * Raw OTLP scope spans structure\n */\nexport interface OtlpScopeSpans {\n scope?: OtlpScope;\n spans: OtlpSpan[];\n}\n\n/**\n * Raw OTLP resource spans structure\n */\nexport interface OtlpResourceSpans {\n resource?: OtlpResource;\n scopeSpans: OtlpScopeSpans[];\n}\n\n/**\n * Convert OTLP attribute value to JavaScript value\n */\nfunction convertOtlpValue(value: OtlpAttributeValue): any {\n if (value.stringValue !== undefined) {\n return value.stringValue;\n }\n if (value.intValue !== undefined) {\n // OTLP intValue can be string or number\n return typeof value.intValue === 'string' ? parseInt(value.intValue, 10) : value.intValue;\n }\n if (value.doubleValue !== undefined) {\n return value.doubleValue;\n }\n if (value.boolValue !== undefined) {\n return value.boolValue;\n }\n if (value.arrayValue?.values) {\n return value.arrayValue.values.map(convertOtlpValue);\n }\n if (value.bytesValue !== undefined) {\n // Return as-is for bytes, caller can handle if needed\n return value.bytesValue;\n }\n return undefined;\n}\n\n/**\n * Convert OTLP attribute array to flat Record<string, any>\n */\nexport function convertOtlpAttributes(attributes?: OtlpAttribute[]): Record<string, any> {\n if (!attributes || attributes.length === 0) {\n return {};\n }\n\n const result: Record<string, any> = {};\n for (const attr of attributes) {\n // Skip dangerous keys to prevent prototype pollution\n if (attr.key && isSafeKey(attr.key)) {\n result[attr.key] = convertOtlpValue(attr.value);\n }\n }\n return result;\n}\n\n/**\n * Extract resource, scope, and span from OTLP structure\n */\nexport function extractResourceScopeSpan(\n resourceSpans: OtlpResourceSpans\n): Array<{ resource: OtelResource; scope: OtelScope; span: OtelSpan }> {\n const result: Array<{ resource: OtelResource; scope: OtelScope; span: OtelSpan }> = [];\n\n // Convert resource attributes\n const resourceAttributes = convertOtlpAttributes(resourceSpans.resource?.attributes);\n\n // Process each scope spans\n for (const scopeSpans of resourceSpans.scopeSpans || []) {\n const scope: OtelScope = {\n name: scopeSpans.scope?.name,\n version: scopeSpans.scope?.version,\n };\n\n // Process each span\n for (const otlpSpan of scopeSpans.spans || []) {\n // Convert span attributes\n const spanAttributes = convertOtlpAttributes(otlpSpan.attributes);\n\n // Convert events\n const events: OtelEvent[] = (otlpSpan.events || []).map((otlpEvent) => ({\n timeUnixNano: otlpEvent.timeUnixNano,\n name: otlpEvent.name,\n attributes: convertOtlpAttributes(otlpEvent.attributes),\n }));\n\n // Convert links\n const links: OtelLink[] = (otlpSpan.links || []).map((otlpLink) => ({\n traceId: otlpLink.traceId,\n spanId: otlpLink.spanId,\n traceState: otlpLink.traceState,\n attributes: convertOtlpAttributes(otlpLink.attributes),\n }));\n\n const span: OtelSpan = {\n traceId: otlpSpan.traceId,\n spanId: otlpSpan.spanId,\n parentSpanId: otlpSpan.parentSpanId,\n traceState: otlpSpan.traceState,\n name: otlpSpan.name,\n kind: otlpSpan.kind,\n startTimeUnixNano: otlpSpan.startTimeUnixNano,\n endTimeUnixNano: otlpSpan.endTimeUnixNano,\n attributes: spanAttributes,\n events,\n links,\n status: otlpSpan.status,\n };\n\n const resource: OtelResource = {\n attributes: resourceAttributes,\n };\n\n result.push({ resource, scope, span });\n }\n }\n\n return result;\n}\n\n","import { OtelSpan, SpanType } from './types';\r\n\r\nexport class TypeClassifier {\r\n classify(span: OtelSpan, attributes: Record<string, any>): SpanType {\r\n // 1. Check for GenAI semantic conventions\r\n // OTel GenAI semantic conventions use gen_ai.system (deprecated) /\r\n // gen_ai.provider.name (its spec replacement) as strong indicators\r\n if (attributes['gen_ai.system'] || attributes['gen_ai.provider.name'] || attributes['gen_ai.request.model'] || attributes['gen_ai.operation.name']) {\r\n return SpanType.GENERATION;\r\n }\r\n\r\n // 2. Check for AI SDK generation indicators (Vercel AI SDK)\r\n // Vercel AI SDK uses specific span names or attributes\r\n if (\r\n attributes['ai.response.text'] ||\r\n attributes['ai.result.text'] ||\r\n attributes['ai.response.toolCalls'] ||\r\n attributes['ai.result.toolCalls']\r\n ) {\r\n return SpanType.GENERATION;\r\n }\r\n\r\n // Check span name for common patterns if no attributes match\r\n if (span.name.startsWith('ai.generate') || span.name.startsWith('ai.stream')) {\r\n return SpanType.GENERATION;\r\n }\r\n\r\n // Default to SPAN\r\n return SpanType.SPAN;\r\n }\r\n}\r\n\r\nexport const typeClassifier = new TypeClassifier();\r\n","import { NormalizedSpan, OtelResource, OtelScope, OtelSpan, SpanType } from './types';\nimport { registry } from './registry';\nimport { AiSdkTransformer } from './transformers/ai-sdk';\nimport { MastraTransformer } from './transformers/mastra';\nimport { AgentMarkTransformer } from './transformers/agentmark';\nimport { OtelGenAiTransformer } from './transformers/otel-genai';\nimport { DispatchingTransformer } from './transformers/dispatching';\nimport { OtlpResourceSpans, extractResourceScopeSpan } from './converters/otlp-converter';\nimport { parseAgentMarkAttributes } from './extractors/agentmark-parser';\nimport { resolveSemanticKind } from './resolvers/semantic-kind-resolver';\n\n// Register scope-specific transformers\nregistry.register('ai', new AiSdkTransformer()); // Vercel AI SDK\nregistry.register('default-tracer', new MastraTransformer()); // Mastra\nregistry.register('agentmark', new AgentMarkTransformer()); // AgentMark SDK\nregistry.register('pydantic-ai', new OtelGenAiTransformer()); // Pydantic AI\n// Default: signature-dispatching transformer. Routes OpenInference- and\n// OpenLLMetry-instrumented spans (which each emit dozens of distinct scope\n// names, so can't be scope-registered) to their extractors by attribute shape,\n// and falls back to the official OTel GenAI semconv v1.37+ when neither matches.\nregistry.setDefault(new DispatchingTransformer());\n\n/**\n * OTLP status.code arrives in different encodings depending on the SDK's\n * JSON serializer: the numeric enum value (0/1/2), the proto enum name\n * ('STATUS_CODE_ERROR'), or a short name ('Error', 'OK'). Normalize to the\n * canonical numeric strings '0' (Unset) / '1' (Ok) / '2' (Error) so every\n * downstream store (gateway ClickHouse rows, CLI local SQLite) gets one\n * vocabulary. Unknown values pass through unchanged.\n */\nconst OTLP_STATUS_CODE_MAP: Record<string, string> = {\n '0': '0', STATUS_CODE_UNSET: '0', UNSET: '0', Unset: '0',\n '1': '1', STATUS_CODE_OK: '1', OK: '1', Ok: '1',\n '2': '2', STATUS_CODE_ERROR: '2', ERROR: '2', Error: '2',\n};\n\nexport function normalizeOtlpStatusCode(raw: string | number | undefined | null): string {\n if (raw === undefined || raw === null || raw === '') {\n return '0';\n }\n const key = String(raw);\n return OTLP_STATUS_CODE_MAP[key] ?? key;\n}\n\nexport function normalizeSpan(\n resource: OtelResource,\n scope: OtelScope,\n span: OtelSpan\n): NormalizedSpan {\n // 1. Merge attributes (Resource + Span)\n const allAttributes = {\n ...(resource.attributes || {}),\n ...(span.attributes || {}),\n };\n\n // 2. Get transformer and classify span type\n const transformer = registry.getTransformer(scope.name || '');\n const type = transformer\n ? transformer.classify(span, allAttributes)\n : SpanType.SPAN; // Default if no transformer\n\n // Timing (convert nanoseconds string to milliseconds number)\n // Use BigInt division to preserve precision, then add remainder for decimals\n const startNs = BigInt(span.startTimeUnixNano);\n const endNs = BigInt(span.endTimeUnixNano);\n const startMsInt = startNs / BigInt(1000000);\n const startMsRemainder = Number(startNs % BigInt(1000000)) / 1000000;\n const endMsInt = endNs / BigInt(1000000);\n const endMsRemainder = Number(endNs % BigInt(1000000)) / 1000000;\n const startMs = Number(startMsInt) + startMsRemainder;\n const endMs = Number(endMsInt) + endMsRemainder;\n\n // 3. Initialize base normalized span\n const normalized: NormalizedSpan = {\n // Identity\n traceId: span.traceId,\n spanId: span.spanId,\n parentSpanId: span.parentSpanId,\n traceState: span.traceState,\n\n // Type\n type,\n\n // Timing (convert nanoseconds to milliseconds: divide by 1,000,000)\n startTime: startMs,\n endTime: endMs,\n duration: endMs - startMs,\n\n // Metadata\n name: span.name,\n kind: span.kind.toString(),\n serviceName: resource.attributes?.['service.name'] as string | undefined,\n statusCode: normalizeOtlpStatusCode(span.status?.code),\n statusMessage: span.status?.message,\n\n // Raw Data\n resourceAttributes: resource.attributes || {},\n spanAttributes: span.attributes || {},\n events: (span.events || []).map(e => ({\n timestamp: Number(BigInt(e.timeUnixNano)) / 1000000,\n name: e.name,\n attributes: e.attributes || {}\n })),\n links: (span.links || []).map(l => ({\n traceId: l.traceId,\n spanId: l.spanId,\n traceState: l.traceState,\n attributes: l.attributes\n })),\n };\n\n // 4. Apply Scope-Specific Transformation\n if (transformer) {\n const transformed = transformer.transform(span, allAttributes);\n Object.assign(normalized, transformed);\n }\n\n // 5. Parse agentmark.* attributes (direct SDK context attributes)\n // These take precedence over metadata.* attributes if both exist\n const agentMarkAttributes = parseAgentMarkAttributes(allAttributes);\n Object.assign(normalized, agentMarkAttributes);\n\n // 5b. Standard OTel GenAI conversation id (gen_ai.conversation.id) as a\n // sessionId fallback. agentmark.session_id always wins when present —\n // this only fills the gap for spec-conformant emitters.\n if (!normalized.sessionId && allAttributes['gen_ai.conversation.id']) {\n normalized.sessionId = String(allAttributes['gen_ai.conversation.id']);\n }\n\n // 6. Resolve semantic kind from all available attribute sources\n normalized.semanticKind = resolveSemanticKind(normalized, allAttributes);\n\n return normalized;\n}\n\n/**\n * Normalize spans from raw OTLP resourceSpans structure\n * This is a higher-level API that accepts raw OTLP format and handles conversion internally\n */\nexport function normalizeOtlpSpans(resourceSpans: OtlpResourceSpans[]): NormalizedSpan[] {\n const normalizedSpans: NormalizedSpan[] = [];\n\n for (const resourceSpan of resourceSpans) {\n const extracted = extractResourceScopeSpan(resourceSpan);\n for (const { resource, scope, span } of extracted) {\n normalizedSpans.push(normalizeSpan(resource, scope, span));\n }\n }\n\n return normalizedSpans;\n}\n\nexport * from './types';\nexport * from './registry';\nexport * from './type-classifier';\nexport * from './converters/otlp-converter';\nexport { parseTokens } from './extractors/token-parser';\nexport * from './extractors/metadata-parser';\nexport * from './extractors/agentmark-parser';\nexport * from './extractors/indexed-message-parser';\nexport * from './resolvers/semantic-kind-resolver';\nexport * from './transformers/ai-sdk';\nexport * from './transformers/ai-sdk/token-helpers';\nexport * from './transformers/ai-sdk/version-detector';\nexport * from './transformers/mastra';\nexport * from './transformers/agentmark';\nexport * from './transformers/otel-genai';\nexport * from './transformers/openinference';\nexport * from './transformers/openllmetry';\nexport * from './transformers/dispatching';\n","/**\n * Canonical trace-level input/output derivation — the ONE definition of\n * \"what is a trace's input and output\", shared by every read path that\n * projects spans into a trace summary: the cloud gateway's\n * `transformTraceDetail`, the local CLI's `mapRawTraceToDetail`\n * (`GET /v1/traces/:id`), and the CLI's dataset import-from-traces source\n * mapper. Before this helper existed each call site had its own semantics\n * (root span vs first/last GENERATION span), so the same trace answered\n * differently depending on which endpoint you asked.\n *\n * Layered semantics, per-field:\n *\n * 1. **Root span first.** The WebhookRunner owns the prompt (root) span and\n * records `agentmark.input` / `agentmark.output` on it — the true\n * end-to-end request/response boundary. When the root span carries a\n * value, it wins.\n * 2. **GENERATION fallback.** Traces emitted without the runner (third-party\n * OTEL instrumentation pointed straight at the collector, or pre-runner\n * SDK versions) have no root-span I/O. Fall back to the first GENERATION\n * span's input and the last GENERATION span's output, in timestamp order\n * — the model's view of the run.\n *\n * Fields resolve independently: a trace whose root span has only an output\n * (e.g. written by an older runner that recorded output but not input)\n * gets its input from the GENERATION fallback.\n */\n\n/** Minimal span projection the derivation needs — both the camelCase\n * service-layer `Span` and mapped wire spans satisfy it. */\nexport interface TraceIOSpan {\n /** null/undefined/'' parent marks a root span. */\n parentId?: string | null;\n /** Span classification; only 'GENERATION' participates in the fallback. */\n type?: string | null;\n /** Sort key for first/last GENERATION. ISO strings and epoch numbers both\n * order correctly under `<`. */\n timestamp?: string | number;\n input?: unknown;\n output?: unknown;\n}\n\nexport interface TraceIO {\n input?: unknown;\n output?: unknown;\n}\n\n/** Truthy-and-nonempty check that keeps non-string payloads (objects from\n * already-parsed wire spans) while rejecting '', null, undefined. */\nfunction present(v: unknown): boolean {\n if (v === null || v === undefined) return false;\n if (typeof v === \"string\") return v.length > 0;\n return true;\n}\n\n/**\n * Derive trace-level input/output from a trace's spans. Returns each field\n * only when a value exists — callers spread the result so absent fields stay\n * absent on the wire (`{...deriveTraceIO(spans)}`).\n */\nexport function deriveTraceIO(spans: readonly TraceIOSpan[]): TraceIO {\n const rootSpan = spans.find((s) => !s.parentId) ?? spans[0];\n\n const generationSpans = spans\n .filter((s) => s.type === \"GENERATION\")\n .sort((a, b) => {\n const ta = a.timestamp ?? 0;\n const tb = b.timestamp ?? 0;\n return ta < tb ? -1 : ta > tb ? 1 : 0;\n });\n\n const input = present(rootSpan?.input)\n ? rootSpan?.input\n : generationSpans.find((s) => present(s.input))?.input;\n\n const lastGenWithOutput = [...generationSpans]\n .reverse()\n .find((s) => present(s.output));\n const output = present(rootSpan?.output)\n ? rootSpan?.output\n : lastGenWithOutput?.output;\n\n return {\n ...(present(input) ? { input } : {}),\n ...(present(output) ? { output } : {}),\n };\n}\n"],"mappings":"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","names":["yaml","import_js_yaml","yaml","path","SpanType","parsed","Attrs","Attrs","extractSettings","_a","VECTOR_RESULT_EVENT_NAMES","_a","_b"]}
|