@agentmark-ai/shared-utils 0.3.1 → 0.3.2
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 +23 -1
- package/dist/index.d.ts +23 -1
- package/dist/index.js +87 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +85 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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/type-classifier.ts","../src/normalizer/index.ts"],"sourcesContent":["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","export function toFrontMatter(content: { [key: string]: any }): string {\n function jsonToFrontMatter(json: { [key: string]: any }, indent = 0) {\n let frontMatter = \"\";\n const indentation = \" \".repeat(indent);\n\n for (const key in json) {\n if (Object.prototype.hasOwnProperty.call(json, key)) {\n const value = json[key];\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n frontMatter += `${indentation}${key}:\\n`;\n frontMatter += jsonToFrontMatter(value, indent + 1);\n } else if (Array.isArray(value)) {\n frontMatter += `${indentation}${key}:\\n`;\n value.forEach((item) => {\n if (typeof item === \"object\") {\n frontMatter += `${indentation}-\\n`;\n frontMatter += jsonToFrontMatter(item, indent + 2);\n } else {\n frontMatter += `${indentation}- ${item}\\n`;\n }\n });\n } else {\n frontMatter += `${indentation}${key}: ${value}\\n`;\n }\n }\n }\n\n return frontMatter;\n }\n\n return `---\\n${jsonToFrontMatter(content)}---\\n`;\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 let tools: any = {};\n try {\n let kind = \"text\";\n let output_schema = null;\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 output_schema = prompt.object_config.schema;\n } else if (\"image_config\" in prompt) {\n kind = \"image\";\n tools = 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 toolTypes = await generateToolTypes(tools);\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 output += toolTypes || \"\";\n\n output += `type ${name} = {\n kind: '${kind}';\n input: ${name}In;\n output: ${name}Out;${\n toolTypes\n ? `\n tools?: Array<keyof Tools>;`\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 const { paths } = await pathsResponse.json();\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\nasync function generateToolTypes(tools: Record<string, any>) {\n const toolArgTypes: string[] = [];\n\n for (const [toolName, schema] of Object.entries(tools)) {\n const typeName = `${getToolInterfaceName(toolName)}Args`;\n\n try {\n const compile = await getCompile();\n const argInterface = schema.parameters\n ? await compile(schema.parameters, typeName, {\n bannerComment: \"\",\n additionalProperties: false,\n })\n : `type ${typeName} = { ${Object.entries(schema.parameters || {})\n .map(([key]) => `${key}: any`)\n .join(\"; \")} };`;\n\n toolArgTypes.push(\n argInterface\n .replace(\"export type\", \"type\")\n .replace(\"export interface\", \"interface\")\n );\n } catch (error) {\n console.error(`Error processing tool ${toolName}:`, error);\n toolArgTypes.push(`type ${typeName} = { [key: string]: any };`);\n }\n }\n\n if (Object.keys(tools).length > 0) {\n // Generate the Tools interface that combines all tool types\n const toolsInterface = `export interface Tools {\n${Object.keys(tools)\n .map(\n (toolName) =>\n ` ${toolName}: { args: ${getToolInterfaceName(toolName)}Args };`\n )\n .join(\"\\n\")}\n}`;\n\n return toolArgTypes.join(\"\\n\\n\") + \"\\n\\n\" + toolsInterface + \"\\n\\n\";\n }\n\n return null;\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 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 // Prompt fields\n promptName?: string;\n props?: string; // Props/metadata from ai.telemetry.metadata.props\n\n // Version control field\n commitSha?: 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\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 'commit_sha',\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 // V4 can have input in ai.prompt.messages or ai.prompt\n let messagesValue: any;\n \n if (attributes['ai.prompt.messages'] !== undefined) {\n messagesValue = attributes['ai.prompt.messages'];\n } else if (attributes['ai.prompt'] !== undefined) {\n const promptValue = attributes['ai.prompt'];\n // ai.prompt might be a JSON string with a messages property\n if (typeof promptValue === 'string') {\n try {\n const parsed = JSON.parse(promptValue);\n messagesValue = parsed.messages || parsed;\n } catch {\n return undefined;\n }\n } else {\n messagesValue = promptValue.messages || promptValue;\n }\n } else {\n return undefined;\n }\n \n // Parse if it's a string, otherwise use as-is\n let messages: any;\n if (typeof messagesValue === 'string') {\n try {\n messages = JSON.parse(messagesValue);\n } catch {\n return undefined;\n }\n } else {\n messages = messagesValue;\n }\n \n // Ensure it's an array\n if (!Array.isArray(messages)) {\n return undefined;\n }\n \n // Normalize messages from V4 format to standard format\n return this.normalizeMessages(messages);\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 // V5 uses ai.prompt.messages, but also fallback to ai.prompt for compatibility\n let messagesValue: any;\n \n if (attributes['ai.prompt.messages'] !== undefined) {\n messagesValue = attributes['ai.prompt.messages'];\n } else if (attributes['ai.prompt'] !== undefined) {\n const promptValue = attributes['ai.prompt'];\n // ai.prompt might be a JSON string with a messages property\n if (typeof promptValue === 'string') {\n try {\n const parsed = JSON.parse(promptValue);\n messagesValue = parsed.messages || parsed;\n } catch {\n return undefined;\n }\n } else {\n messagesValue = promptValue.messages || promptValue;\n }\n } else {\n return undefined;\n }\n \n // Parse if it's a string, otherwise use as-is\n let messages: any;\n if (typeof messagesValue === 'string') {\n try {\n messages = JSON.parse(messagesValue);\n } catch {\n return undefined;\n }\n } else {\n messages = messagesValue;\n }\n \n // Ensure it's an array\n if (!Array.isArray(messages)) {\n return undefined;\n }\n \n // Normalize messages from V5 format to standard format\n return this.normalizeMessages(messages);\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 if (get('props')) result.props = String(get('props'));\n\n // Span Kind (set by @traced decorator / traced() wrapper)\n if (get('span.kind')) result.kind = 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 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} as const;\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 // 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 if (attributes[GenAIAttributes.SYSTEM] === '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\n const inputTokens = attributes[GenAIAttributes.USAGE_INPUT_TOKENS];\n const outputTokens = attributes[GenAIAttributes.USAGE_OUTPUT_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/Output\n const requestInput = attributes[GenAIAttributes.REQUEST_INPUT];\n if (requestInput && typeof requestInput === 'string') {\n // Try to parse as JSON messages array first (new format from traced wrapper)\n try {\n const parsed = JSON.parse(requestInput);\n if (Array.isArray(parsed) && parsed.length > 0) {\n // Validate it looks like a messages array\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 result.input = parsed as Message[];\n } else {\n // Not a messages array, treat as plain text\n result.input = [{ role: 'user', content: requestInput }];\n }\n } else {\n // Empty array or not an array, treat as plain text\n result.input = [{ role: 'user', content: requestInput }];\n }\n } catch {\n // Not valid JSON, treat as plain text (backwards compatibility)\n result.input = [{ role: 'user', content: requestInput }];\n }\n }\n\n const responseOutput = attributes[GenAIAttributes.RESPONSE_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 }\n\n // Fallback: agentmark.input / agentmark.output (set by SDK's set_input/set_output)\n const amInput = attributes['agentmark.input'];\n if (amInput && typeof amInput === 'string' && !result.input) {\n result.input = [{ 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\n INPUT_MESSAGES: 'gen_ai.input.messages',\n OUTPUT_MESSAGES: 'gen_ai.output.messages',\n SYSTEM_INSTRUCTIONS: 'gen_ai.system_instructions',\n TOOL_DEFINITIONS: 'gen_ai.tool.definitions',\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\n const inputTokens = attributes[Attrs.USAGE_INPUT_TOKENS];\n const outputTokens = attributes[Attrs.USAGE_OUTPUT_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 (gen_ai.input.messages)\n const inputMessages = attributes[Attrs.INPUT_MESSAGES];\n if (inputMessages && typeof inputMessages === 'string') {\n const messages = normalizeMessages(inputMessages);\n if (messages) result.input = messages;\n }\n\n // Output messages (gen_ai.output.messages)\n const outputMessages = attributes[Attrs.OUTPUT_MESSAGES];\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 }\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 { 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 as a strong indicator\r\n if (attributes['gen_ai.system'] || 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';\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\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: span.status?.code.toString() || '0',\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 // 6. Extract Tenant/App ID from Resource Attributes if not already set\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 './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"],"mappings":"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","names":["path","SpanType","parsed"]}
|
|
1
|
+
{"version":3,"sources":["../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"],"sourcesContent":["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","export function toFrontMatter(content: { [key: string]: any }): string {\n function jsonToFrontMatter(json: { [key: string]: any }, indent = 0) {\n let frontMatter = \"\";\n const indentation = \" \".repeat(indent);\n\n for (const key in json) {\n if (Object.prototype.hasOwnProperty.call(json, key)) {\n const value = json[key];\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n frontMatter += `${indentation}${key}:\\n`;\n frontMatter += jsonToFrontMatter(value, indent + 1);\n } else if (Array.isArray(value)) {\n frontMatter += `${indentation}${key}:\\n`;\n value.forEach((item) => {\n if (typeof item === \"object\") {\n frontMatter += `${indentation}-\\n`;\n frontMatter += jsonToFrontMatter(item, indent + 2);\n } else {\n frontMatter += `${indentation}- ${item}\\n`;\n }\n });\n } else {\n frontMatter += `${indentation}${key}: ${value}\\n`;\n }\n }\n }\n\n return frontMatter;\n }\n\n return `---\\n${jsonToFrontMatter(content)}---\\n`;\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 let tools: any = {};\n try {\n let kind = \"text\";\n let output_schema = null;\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 output_schema = prompt.object_config.schema;\n } else if (\"image_config\" in prompt) {\n kind = \"image\";\n tools = 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 toolTypes = await generateToolTypes(tools);\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 output += toolTypes || \"\";\n\n output += `type ${name} = {\n kind: '${kind}';\n input: ${name}In;\n output: ${name}Out;${\n toolTypes\n ? `\n tools?: Array<keyof Tools>;`\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 const { paths } = await pathsResponse.json();\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\nasync function generateToolTypes(tools: Record<string, any>) {\n const toolArgTypes: string[] = [];\n\n for (const [toolName, schema] of Object.entries(tools)) {\n const typeName = `${getToolInterfaceName(toolName)}Args`;\n\n try {\n const compile = await getCompile();\n const argInterface = schema.parameters\n ? await compile(schema.parameters, typeName, {\n bannerComment: \"\",\n additionalProperties: false,\n })\n : `type ${typeName} = { ${Object.entries(schema.parameters || {})\n .map(([key]) => `${key}: any`)\n .join(\"; \")} };`;\n\n toolArgTypes.push(\n argInterface\n .replace(\"export type\", \"type\")\n .replace(\"export interface\", \"interface\")\n );\n } catch (error) {\n console.error(`Error processing tool ${toolName}:`, error);\n toolArgTypes.push(`type ${typeName} = { [key: string]: any };`);\n }\n }\n\n if (Object.keys(tools).length > 0) {\n // Generate the Tools interface that combines all tool types\n const toolsInterface = `export interface Tools {\n${Object.keys(tools)\n .map(\n (toolName) =>\n ` ${toolName}: { args: ${getToolInterfaceName(toolName)}Args };`\n )\n .join(\"\\n\")}\n}`;\n\n return toolArgTypes.join(\"\\n\\n\") + \"\\n\\n\" + toolsInterface + \"\\n\\n\";\n }\n\n return null;\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 // Prompt fields\n promptName?: string;\n props?: string; // Props/metadata from ai.telemetry.metadata.props\n\n // Version control field\n commitSha?: 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 // V4 can have input in ai.prompt.messages or ai.prompt\n let messagesValue: any;\n \n if (attributes['ai.prompt.messages'] !== undefined) {\n messagesValue = attributes['ai.prompt.messages'];\n } else if (attributes['ai.prompt'] !== undefined) {\n const promptValue = attributes['ai.prompt'];\n // ai.prompt might be a JSON string with a messages property\n if (typeof promptValue === 'string') {\n try {\n const parsed = JSON.parse(promptValue);\n messagesValue = parsed.messages || parsed;\n } catch {\n return undefined;\n }\n } else {\n messagesValue = promptValue.messages || promptValue;\n }\n } else {\n return undefined;\n }\n \n // Parse if it's a string, otherwise use as-is\n let messages: any;\n if (typeof messagesValue === 'string') {\n try {\n messages = JSON.parse(messagesValue);\n } catch {\n return undefined;\n }\n } else {\n messages = messagesValue;\n }\n \n // Ensure it's an array\n if (!Array.isArray(messages)) {\n return undefined;\n }\n \n // Normalize messages from V4 format to standard format\n return this.normalizeMessages(messages);\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 // V5 uses ai.prompt.messages, but also fallback to ai.prompt for compatibility\n let messagesValue: any;\n \n if (attributes['ai.prompt.messages'] !== undefined) {\n messagesValue = attributes['ai.prompt.messages'];\n } else if (attributes['ai.prompt'] !== undefined) {\n const promptValue = attributes['ai.prompt'];\n // ai.prompt might be a JSON string with a messages property\n if (typeof promptValue === 'string') {\n try {\n const parsed = JSON.parse(promptValue);\n messagesValue = parsed.messages || parsed;\n } catch {\n return undefined;\n }\n } else {\n messagesValue = promptValue.messages || promptValue;\n }\n } else {\n return undefined;\n }\n \n // Parse if it's a string, otherwise use as-is\n let messages: any;\n if (typeof messagesValue === 'string') {\n try {\n messages = JSON.parse(messagesValue);\n } catch {\n return undefined;\n }\n } else {\n messages = messagesValue;\n }\n \n // Ensure it's an array\n if (!Array.isArray(messages)) {\n return undefined;\n }\n \n // Normalize messages from V5 format to standard format\n return this.normalizeMessages(messages);\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 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 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} as const;\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 if (attributes[GenAIAttributes.SYSTEM] === '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\n const inputTokens = attributes[GenAIAttributes.USAGE_INPUT_TOKENS];\n const outputTokens = attributes[GenAIAttributes.USAGE_OUTPUT_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/Output\n const requestInput = attributes[GenAIAttributes.REQUEST_INPUT];\n if (requestInput && typeof requestInput === 'string') {\n // Try to parse as JSON messages array first (new format from traced wrapper)\n try {\n const parsed = JSON.parse(requestInput);\n if (Array.isArray(parsed) && parsed.length > 0) {\n // Validate it looks like a messages array\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 result.input = parsed as Message[];\n } else {\n // Not a messages array, treat as plain text\n result.input = [{ role: 'user', content: requestInput }];\n }\n } else {\n // Empty array or not an array, treat as plain text\n result.input = [{ role: 'user', content: requestInput }];\n }\n } catch {\n // Not valid JSON, treat as plain text (backwards compatibility)\n result.input = [{ role: 'user', content: requestInput }];\n }\n }\n\n const responseOutput = attributes[GenAIAttributes.RESPONSE_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 }\n\n // Fallback: agentmark.input / agentmark.output (set by SDK's set_input/set_output)\n const amInput = attributes['agentmark.input'];\n if (amInput && typeof amInput === 'string' && !result.input) {\n result.input = [{ 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\n INPUT_MESSAGES: 'gen_ai.input.messages',\n OUTPUT_MESSAGES: 'gen_ai.output.messages',\n SYSTEM_INSTRUCTIONS: 'gen_ai.system_instructions',\n TOOL_DEFINITIONS: 'gen_ai.tool.definitions',\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\n const inputTokens = attributes[Attrs.USAGE_INPUT_TOKENS];\n const outputTokens = attributes[Attrs.USAGE_OUTPUT_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 (gen_ai.input.messages)\n const inputMessages = attributes[Attrs.INPUT_MESSAGES];\n if (inputMessages && typeof inputMessages === 'string') {\n const messages = normalizeMessages(inputMessages);\n if (messages) result.input = messages;\n }\n\n // Output messages (gen_ai.output.messages)\n const outputMessages = attributes[Attrs.OUTPUT_MESSAGES];\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 }\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 map: {\n 'embed': 'embedding',\n 'ai.embed': 'embedding',\n 'generateText': 'llm',\n 'streamText': 'llm',\n 'generateObject': 'llm',\n '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 an 8-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. Has non-empty ToolCalls → tool\n * 7. Name-based heuristics\n * 8. 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. Has non-empty ToolCalls → tool\n if (normalized.toolCalls && normalized.toolCalls.length > 0) {\n return 'tool';\n }\n\n // 7. 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 // 8. 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 as a strong indicator\r\n if (attributes['gen_ai.system'] || 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\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: span.status?.code.toString() || '0',\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 // 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"],"mappings":"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","names":["path","SpanType","parsed"]}
|