neatlogs 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/init.ts","../src/core/span-processor.ts","../src/core/logger.ts","../src/core/instrumentation-scope-parser.ts","../src/span-kinds/constants.ts","../src/span-kinds/mapping.ts","../src/config/model_defaults.json","../src/config/defaults-enricher.ts","../src/core/attribute-processor.ts","../src/core/mask.ts","../src/prompt/template.ts","../src/core/context.ts","../src/decorators/base.ts","../src/core/crewai-task-registry.ts","../src/config/attribute-mapping.json","../src/config/attribute-mapper.ts","../src/core/filtering-exporter.ts","../src/core/exporter.ts","../src/core/log-exporter.ts","../node_modules/@opentelemetry/core/src/trace/suppress-tracing.ts","../node_modules/@opentelemetry/core/src/ExportResult.ts","../src/core/log.ts","../src/instrumentation/registry.ts","../src/instrumentation/manager.ts","../src/prompt/client.ts","../src/version.ts","../src/decorators/orchestration.ts","../src/mastra.ts","../src/ai-sdk.ts","../src/core/llm-binder.ts"],"sourcesContent":["/**\n * Neatlogs TypeScript SDK\n *\n * OpenTelemetry-native observability for LLM applications.\n *\n * @example\n * ```typescript\n * import { init, span, shutdown } from 'neatlogs';\n *\n * async function main() {\n * await init({ apiKey: process.env.NEATLOGS_API_KEY, instrumentations: ['openai'] });\n *\n * const myWorkflow = span({ kind: 'WORKFLOW' }, async (query: string) => {\n * // your LLM code here\n * });\n *\n * await myWorkflow('Hello!');\n * await shutdown();\n * }\n * main().catch(console.error);\n * ```\n */\n\n// Lifecycle\nexport { init, flush, shutdown, isDebugEnabled, getSessionConfig } from './init.js';\n\n// Instrumentation\nexport { span, Span } from './decorators/index.js';\nexport { trace } from './core/context.js';\nexport { log } from './core/log.js';\n\n// Prompt management\nexport { PromptTemplate, UserPromptTemplate } from './prompt/template.js';\nexport {\n PromptClient,\n PromptHandle,\n PromptClientError,\n PromptApiError,\n PromptNotFoundError,\n getPrompt,\n fetchPrompt,\n listPrompts,\n createPrompt,\n updatePrompt,\n saveAsVersion,\n deletePrompt,\n removeTag,\n} from './prompt/client.js';\n\n// Mastra integration\nexport { getMastraObservability } from './mastra.js';\n\n// Vercel AI SDK integration\nexport { wrapAISDK, createAITelemetry } from './ai-sdk.js';\n\n// Utilities\nexport { bindTemplates } from './core/llm-binder.js';\nexport { registerCrewaiTask } from './core/crewai-task-registry.js';\n\n// Types\nexport type {\n InitOptions,\n SpanOptions,\n TraceOptions,\n SpanKind,\n MaskFunction,\n CachedPrompt,\n PromptMessage,\n} from './types.js';\n\n// Version\nexport { __version__ } from './version.js';\n","/**\n * Neatlogs SDK initialisation, flush, and shutdown.\n *\n * Port of Python neatlogs/init.py to TypeScript.\n *\n * `init()` sets up the OTel TracerProvider, MeterProvider, LoggerProvider,\n * span processors, exporters, and instrumentation.\n * `flush()` and `shutdown()` handle graceful cleanup.\n */\n\nimport { randomBytes } from 'node:crypto';\nimport * as path from 'node:path';\n\nimport { trace, metrics } from '@opentelemetry/api';\nimport { logs } from '@opentelemetry/api-logs';\nimport { Resource } from '@opentelemetry/resources';\nimport { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';\nimport { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport { MeterProvider } from '@opentelemetry/sdk-metrics';\nimport { LoggerProvider, SimpleLogRecordProcessor, BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-proto';\n\nimport { NeatlogsSpanProcessor } from './core/span-processor.js';\nimport { FilteringExporter } from './core/filtering-exporter.js';\nimport { NeatlogsExporter } from './core/exporter.js';\nimport { NeatlogsLogExporter } from './core/log-exporter.js';\nimport { _setOtelLogger } from './core/log.js';\nimport { _setSessionConfig } from './core/context.js';\nimport { getLogger, enableDebugLogging } from './core/logger.js';\nimport { InstrumentationManager } from './instrumentation/manager.js';\nimport { PromptClient, setSharedClient } from './prompt/client.js';\nimport { __version__ } from './version.js';\nimport type { InitOptions } from './types.js';\n\nconst logger = getLogger();\n\n// ---------------------------------------------------------------------------\n// Module-level state\n// ---------------------------------------------------------------------------\n\nlet _initialized = false;\nlet _tracerProvider: NodeTracerProvider | null = null;\nlet _meterProvider: MeterProvider | null = null;\nlet _logProvider: LoggerProvider | null = null;\nlet _logSpanExporter: NeatlogsExporter | null = null;\nlet _spanProcessor: NeatlogsSpanProcessor | null = null;\nlet _debugMode = false;\n\n// Track signal handlers so we can remove them in shutdown()\nlet _sigHandlersRegistered = false;\nconst _shutdownOnSignal = () => {\n shutdown().catch(() => {});\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a non-empty workflow name; derive from process.argv when omitted.\n */\nfunction _resolveWorkflowName(workflowName?: string): string {\n const provided = (workflowName ?? '').trim();\n if (provided) return provided;\n\n const argv1 = process.argv[1] ?? '';\n const base = path.basename(argv1, path.extname(argv1));\n const slug = base\n .replace(/[^a-zA-Z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .toLowerCase();\n\n if (slug && !['node', 'ts-node', 'tsx', 'npx', '-e'].includes(slug)) {\n return slug;\n }\n\n return 'neatlogs-app';\n}\n\n/**\n * Generate a short random hex string.\n */\nfunction _randomHex(bytes: number): string {\n return randomBytes(bytes).toString('hex');\n}\n\n// ---------------------------------------------------------------------------\n// init()\n// ---------------------------------------------------------------------------\n\n/**\n * Initialise the Neatlogs SDK.\n *\n * Sets up OTel TracerProvider, MeterProvider, LoggerProvider, span processors,\n * exporters and auto-instrumentation. Returns a Promise because library\n * instrumentation uses dynamic `import()`.\n */\nexport async function init(options: InitOptions = {}): Promise<void> {\n // 1. Guard double-init\n if (_initialized) {\n logger.warn('Neatlogs already initialized, skipping re-initialization');\n return;\n }\n\n // 2. Resolve API key\n let resolvedKey: string;\n if (options.apiKey && options.apiKey.trim()) {\n resolvedKey = options.apiKey.trim();\n } else {\n resolvedKey = (process.env.NEATLOGS_API_KEY ?? '').trim();\n }\n\n // 3. Resolve disableExport\n let disableExportResolved =\n !!options.disableExport ||\n ['true', '1', 'yes'].includes(\n (process.env.NEATLOGS_DISABLE_EXPORT ?? '').toLowerCase(),\n );\n\n if (!resolvedKey) {\n disableExportResolved = true;\n resolvedKey = 'disabled';\n if (options.debug) {\n logger.warn(\n 'No NEATLOGS_API_KEY set; HTTP export disabled. ' +\n 'Set NEATLOGS_API_KEY (or pass apiKey) to send spans to the backend.',\n );\n }\n }\n\n // 4. Debug mode\n if (options.debug) {\n enableDebugLogging();\n }\n _debugMode = options.debug ?? false;\n\n // 5. Resolve workflow name\n const resolvedWorkflowName = _resolveWorkflowName(options.workflowName);\n\n // 6. Resolve session ID\n let sessionId: string | undefined = options.sessionId;\n if (!sessionId && options.autoSession) {\n sessionId = `session_${Date.now()}_${_randomHex(4)}`;\n if (options.debug) {\n logger.debug(`Auto-generated session_id: ${sessionId}`);\n }\n }\n\n // 7. Parse base URL from endpoint\n const endpoint =\n options.endpoint ??\n 'https://staging-cloud.neatlogs.com/api/data/v4/batch';\n const baseUrl = new URL(endpoint).origin;\n\n // 8. Set session config\n _setSessionConfig({\n sessionId,\n userId: options.userId,\n workflowName: resolvedWorkflowName,\n _apiKey: resolvedKey,\n _baseUrl: baseUrl,\n });\n\n // 8b. Initialize shared PromptClient so module-level helpers work after init()\n if (resolvedKey && resolvedKey !== 'disabled') {\n setSharedClient(new PromptClient({ baseUrl, apiKey: resolvedKey }));\n }\n\n // 9. Build OTel Resource\n const resourceAttrs: Record<string, string | number | boolean> = {\n [ATTR_SERVICE_NAME]: options.workflowName || 'neatlogs-app',\n 'service.version': __version__,\n 'neatlogs.workflow_name': resolvedWorkflowName,\n };\n if (sessionId) resourceAttrs['session.id'] = sessionId;\n if (options.userId) resourceAttrs['user.id'] = options.userId;\n\n const tags = options.tags;\n if (tags !== undefined) {\n if (!Array.isArray(tags) || !tags.every((t) => typeof t === 'string')) {\n throw new Error('tags must be a list of strings');\n }\n resourceAttrs['neatlogs.tags'] = tags.join(',');\n }\n\n if (options.pii !== undefined) {\n resourceAttrs['neatlogs.pii.enabled'] =\n options.pii === false ? 'false' : 'true';\n }\n\n if (options.piiSpanTypes !== undefined) {\n resourceAttrs['neatlogs.pii.span_types'] = options.piiSpanTypes.join(',');\n }\n\n const resource = new Resource(resourceAttrs);\n\n // 10. Create TracerProvider\n const provider = new NodeTracerProvider({\n resource,\n spanLimits: { attributeCountLimit: 10_000 },\n });\n\n // 11. Add NeatlogsSpanProcessor\n _spanProcessor = new NeatlogsSpanProcessor({\n sampleRate: options.sampleRate ?? 1.0,\n debug: options.debug ?? false,\n mask: options.mask,\n });\n provider.addSpanProcessor(_spanProcessor);\n\n // 12. Add BatchSpanProcessor + OTLPSpanExporter (if export enabled)\n if (!disableExportResolved) {\n const tracesEndpoint = endpoint.endsWith('/v1/traces')\n ? endpoint\n : `${baseUrl}/v1/traces`;\n\n const otlpExporter = new FilteringExporter(\n new OTLPTraceExporter({\n url: tracesEndpoint,\n headers: { 'x-api-key': resolvedKey },\n }),\n );\n\n const batchProcessor = new BatchSpanProcessor(otlpExporter, {\n maxExportBatchSize: options.batchSize ?? 100,\n scheduledDelayMillis: (options.flushInterval ?? 5) * 1000,\n });\n provider.addSpanProcessor(batchProcessor);\n\n if (options.debug) {\n logger.debug(`OTLP trace exporter configured: ${tracesEndpoint}`);\n }\n } else if (options.debug) {\n logger.debug('Export disabled — spans will not be sent to backend');\n }\n\n // 13. Register provider globally\n provider.register();\n _tracerProvider = provider;\n\n if (options.debug) {\n logger.debug('Neatlogs tracer provider initialized');\n }\n\n // 14. Set up MeterProvider\n try {\n _meterProvider = new MeterProvider({ resource });\n metrics.setGlobalMeterProvider(_meterProvider);\n if (options.debug) {\n logger.debug('Neatlogs meter provider initialized');\n }\n } catch {\n // MeterProvider is optional — skip gracefully\n if (options.debug) {\n logger.debug('MeterProvider not available — skipping');\n }\n }\n\n // 15. Set up LoggerProvider (if captureLogs)\n const captureLogs = options.captureLogs ?? false;\n if (captureLogs) {\n _logSpanExporter = new NeatlogsExporter({\n baseUrl,\n apiKey: resolvedKey,\n batchSize: options.batchSize ?? 100,\n flushIntervalMs: (options.flushInterval ?? 5) * 1000,\n disableExport: disableExportResolved,\n });\n\n _logProvider = new LoggerProvider({ resource });\n\n // File-based log exporter (for NEATLOGS_LOG_LOGS env var)\n _logProvider.addLogRecordProcessor(\n new SimpleLogRecordProcessor(new NeatlogsLogExporter(_logSpanExporter)),\n );\n\n // OTLP log export to /v1/logs (same pattern as Python SDK)\n if (!disableExportResolved) {\n const logsEndpoint = endpoint.endsWith('/v1/logs')\n ? endpoint\n : `${baseUrl}/v1/logs`;\n const otlpLogExporter = new OTLPLogExporter({\n url: logsEndpoint,\n headers: resolvedKey ? { 'x-api-key': resolvedKey } : undefined,\n });\n _logProvider.addLogRecordProcessor(\n new BatchLogRecordProcessor(otlpLogExporter),\n );\n if (options.debug) {\n logger.debug(`OTLP log exporter configured: ${logsEndpoint}`);\n }\n }\n\n logs.setGlobalLoggerProvider(_logProvider);\n\n // Wire the OTel logger for neatlogs.log() function\n const otelLogger = _logProvider.getLogger('neatlogs');\n _setOtelLogger(otelLogger, options.debug ?? false);\n\n if (options.debug) {\n logger.debug(`Neatlogs log capture enabled (endpoint: ${baseUrl}/v1/logs)`);\n }\n } else if (options.debug) {\n logger.debug('Log capture disabled (pass captureLogs: true to enable)');\n }\n\n // 16. Instrument libraries\n const manager = new InstrumentationManager({\n provider,\n debug: options.debug,\n });\n\n if (options.instrumentations?.length) {\n await manager.instrument(options.instrumentations);\n if (options.debug) {\n logger.debug(`Instrumented libraries: ${manager.instrumented.join(', ')}`);\n }\n }\n\n // 17. Register shutdown handlers\n if (!_sigHandlersRegistered) {\n process.on('beforeExit', _shutdownOnSignal);\n process.on('SIGTERM', _shutdownOnSignal);\n process.on('SIGINT', _shutdownOnSignal);\n _sigHandlersRegistered = true;\n }\n\n // 18. Mark as initialised\n _initialized = true;\n\n if (options.debug) {\n logger.info('Neatlogs SDK initialized successfully');\n logger.info(`Endpoint: ${endpoint}`);\n logger.info(`Workflow: ${resolvedWorkflowName}`);\n logger.info(`Session: ${sessionId ?? '(none)'}`);\n logger.info(`User: ${options.userId ?? '(none)'}`);\n logger.info(`Tags: ${tags ?? []}`);\n logger.info(`Instrumentations: ${manager.instrumented.join(', ') || '(none)'}`);\n logger.info(`Sample Rate: ${options.sampleRate ?? 1.0}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// flush()\n// ---------------------------------------------------------------------------\n\n/**\n * Flush all pending spans, metrics, and log records.\n *\n * @returns true if all providers flushed successfully\n */\nexport async function flush(): Promise<boolean> {\n let success = true;\n\n if (_tracerProvider) {\n try {\n logger.debug('Flushing tracer provider...');\n await _tracerProvider.forceFlush();\n logger.debug('Tracer provider flushed successfully');\n } catch (e) {\n logger.error(`Error flushing spans: ${e}`);\n success = false;\n }\n }\n\n if (_meterProvider) {\n try {\n logger.debug('Flushing meter provider...');\n await _meterProvider.forceFlush();\n logger.debug('Meter provider flushed successfully');\n } catch (e) {\n logger.error(`Error flushing metrics: ${e}`);\n success = false;\n }\n }\n\n if (_logSpanExporter) {\n try {\n logger.debug('Flushing log span exporter...');\n await _logSpanExporter.flush();\n logger.debug('Log span exporter flushed successfully');\n } catch (e) {\n logger.error(`Error flushing logs: ${e}`);\n success = false;\n }\n }\n\n return success;\n}\n\n// ---------------------------------------------------------------------------\n// shutdown()\n// ---------------------------------------------------------------------------\n\n/**\n * Shutdown the SDK and flush all pending spans, metrics, and log records.\n *\n * Resets all module-level state so `init()` can be called again.\n *\n * @returns true if all providers shut down successfully\n */\nexport async function shutdown(): Promise<boolean> {\n // Remove signal handlers\n if (_sigHandlersRegistered) {\n process.removeListener('beforeExit', _shutdownOnSignal);\n process.removeListener('SIGTERM', _shutdownOnSignal);\n process.removeListener('SIGINT', _shutdownOnSignal);\n _sigHandlersRegistered = false;\n }\n\n let success = true;\n\n if (_tracerProvider) {\n try {\n logger.debug('Shutting down tracer provider...');\n await _tracerProvider.shutdown();\n logger.debug('Tracer provider shut down successfully');\n } catch (e) {\n logger.error(`Error shutting down tracer provider: ${e}`);\n success = false;\n }\n }\n\n if (_meterProvider) {\n try {\n logger.debug('Shutting down meter provider...');\n await _meterProvider.shutdown();\n logger.debug('Meter provider shut down successfully');\n } catch (e) {\n logger.error(`Error shutting down meter provider: ${e}`);\n success = false;\n }\n }\n\n if (_logProvider) {\n try {\n logger.debug('Shutting down log provider...');\n await _logProvider.shutdown();\n logger.debug('Log provider shut down successfully');\n } catch (e) {\n logger.error(`Error shutting down log provider: ${e}`);\n success = false;\n }\n }\n\n if (_logSpanExporter) {\n try {\n logger.debug('Shutting down log span exporter...');\n await _logSpanExporter.shutdown();\n logger.debug('Log span exporter shut down successfully');\n } catch (e) {\n logger.error(`Error shutting down log span exporter: ${e}`);\n success = false;\n }\n }\n\n // Reset all module-level state\n _initialized = false;\n _tracerProvider = null;\n _meterProvider = null;\n _logProvider = null;\n _logSpanExporter = null;\n _spanProcessor = null;\n _debugMode = false;\n\n // Reset session config\n _setSessionConfig({});\n\n logger.info('Neatlogs SDK shutdown complete');\n return success;\n}\n\n// ---------------------------------------------------------------------------\n// getTracerProvider()\n// ---------------------------------------------------------------------------\n\n/**\n * Return the active TracerProvider. Throws if init() has not been called.\n */\nexport function getTracerProvider(): NodeTracerProvider {\n if (!_tracerProvider) {\n throw new Error(\n 'Neatlogs is not initialized. Call init() before accessing the TracerProvider.',\n );\n }\n return _tracerProvider;\n}\n\n// ---------------------------------------------------------------------------\n// isDebugEnabled()\n// ---------------------------------------------------------------------------\n\n/**\n * Return true if neatlogs was initialised with `debug: true`.\n */\nexport function isDebugEnabled(): boolean {\n return _debugMode;\n}\n\n// ---------------------------------------------------------------------------\n// Re-export getSessionConfig from context\n// ---------------------------------------------------------------------------\n\nexport { getSessionConfig } from './core/context.js';\n","/**\n * NeatlogsSpanProcessor — attribute normalization and file logging.\n *\n * Port of Python neatlogs/core/span_processor.py\n *\n * Sits between span creation and export, normalizing attributes and handling\n * file logging. The downstream BatchSpanProcessor + OTLPSpanExporter handles\n * actual transport.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { performance } from 'node:perf_hooks';\n\nimport {\n context as otelContext,\n trace as otelTrace,\n TraceFlags,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { Context, HrTime, SpanContext } from '@opentelemetry/api';\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport type { Span as SdkSpan, SpanProcessor } from '@opentelemetry/sdk-trace-base';\n\nimport { UnifiedAttributeProcessor } from './attribute-processor.js';\nimport type { SpanDict } from './attribute-processor.js';\nimport { applyMask } from './mask.js';\nimport { getLogger } from './logger.js';\nimport { PromptContext, UserPromptContext } from '../prompt/template.js';\nimport {\n PROMPT_VARIABLES_KEY,\n PROMPT_TEMPLATE_KEY,\n PROMPT_VERSION_KEY,\n USER_PROMPT_TEMPLATE_KEY,\n USER_PROMPT_VARIABLES_KEY,\n} from './context.js';\nimport { popEntry } from './crewai-task-registry.js';\nimport type { MaskFunction } from '../types.js';\nimport { AttributeMapper } from '../config/attribute-mapper.js';\n\nconst logger = getLogger();\n\nfunction resolveLogFilePath(configuredPath: string): string {\n return path.isAbsolute(configuredPath)\n ? configuredPath\n : path.join(process.cwd(), configuredPath);\n}\n\nfunction createLogStream(configuredPath: string): fs.WriteStream | null {\n const logPath = resolveLogFilePath(configuredPath);\n let fd: number | null = null;\n\n try {\n fs.mkdirSync(path.dirname(logPath), { recursive: true });\n fd = fs.openSync(logPath, 'a');\n const stream = fs.createWriteStream(logPath, { fd, autoClose: true });\n fd = null;\n stream.on('error', (error) => {\n logger.warn(`Failed to write span log file ${logPath}: ${error}`);\n stream.destroy();\n });\n return stream;\n } catch (error) {\n if (fd !== null) {\n try {\n fs.closeSync(fd);\n } catch {\n // ignore cleanup failure; the open error below is the actionable one.\n }\n }\n logger.warn(`Failed to open span log file ${logPath}: ${error}`);\n return null;\n }\n}\n\nconst CLOSE_STREAM_TIMEOUT_MS = 5_000;\n\nasync function closeLogStream(\n stream: fs.WriteStream | null,\n description: string,\n): Promise<void> {\n if (!stream || stream.destroyed || stream.writableEnded) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n let settled = false;\n const settle = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n stream.off('close', closeHandler);\n stream.off('error', errorHandler);\n resolve();\n };\n\n const closeHandler = settle;\n const errorHandler = (error: Error) => {\n logger.warn(`Failed to close ${description} log file handle: ${error}`);\n settle();\n };\n const timer = setTimeout(() => {\n logger.warn(\n `Timed out waiting for ${description} log stream to close; destroying`,\n );\n stream.destroy();\n settle();\n }, CLOSE_STREAM_TIMEOUT_MS);\n\n stream.once('close', closeHandler);\n stream.once('error', errorHandler);\n\n try {\n stream.end();\n } catch (error) {\n logger.warn(`Failed to close ${description} log file handle: ${error}`);\n settle();\n }\n });\n}\n\n// ────────────────────────────────────────────────────────\n// LLM span detection patterns\n// ────────────────────────────────────────────────────────\n\nconst LLM_NAME_PATTERNS = /chat|completion|generate|embedding/i;\n\n// ────────────────────────────────────────────────────────\n// Performance stats\n// ────────────────────────────────────────────────────────\n\ninterface PerfStats {\n onStartTime: number;\n onEndTime: number;\n spansProcessed: number;\n spansExported: number;\n}\n\n// ────────────────────────────────────────────────────────\n// Helper: convert HrTime ([seconds, nanoseconds]) to ns\n// ────────────────────────────────────────────────────────\n\nfunction hrTimeToNanos(hr: HrTime): number {\n return hr[0] * 1_000_000_000 + hr[1];\n}\n\n// ────────────────────────────────────────────────────────\n// Helper: convert ReadableSpan to JSON-serializable dict\n//\n// When includeScope=true, includes instrumentation_scope\n// and uses `status.message` (for the UnifiedAttributeProcessor).\n// When false (default), uses `status.description` for\n// backward-compatible raw logging.\n// ────────────────────────────────────────────────────────\n\nexport function spanToDict(\n span: ReadableSpan,\n options?: { includeScope?: boolean },\n): Record<string, any> {\n const ctx = span.spanContext();\n const includeScope = options?.includeScope ?? false;\n\n const dict: Record<string, any> = {\n trace_id: ctx.traceId,\n span_id: ctx.spanId,\n parent_span_id: span.parentSpanId ?? null,\n name: span.name,\n kind: span.kind,\n start_time: hrTimeToNanos(span.startTime),\n end_time: hrTimeToNanos(span.endTime),\n attributes: { ...span.attributes },\n resource: span.resource?.attributes ? { ...span.resource.attributes } : {},\n status: includeScope\n ? { code: span.status.code, message: span.status.message ?? undefined }\n : { code: span.status.code, description: span.status.message ?? null },\n events: span.events\n ? span.events.map((e) => ({\n name: e.name,\n timestamp: hrTimeToNanos(e.time),\n attributes: e.attributes ? { ...e.attributes } : {},\n }))\n : [],\n };\n\n if (includeScope) {\n dict.instrumentation_scope = span.instrumentationLibrary\n ? {\n name: span.instrumentationLibrary.name,\n version: span.instrumentationLibrary.version,\n }\n : null;\n }\n\n return dict;\n}\n\n// ────────────────────────────────────────────────────────\n// Constructor options\n// ────────────────────────────────────────────────────────\n\nexport interface NeatlogsSpanProcessorOptions {\n sampleRate?: number;\n debug?: boolean;\n mask?: MaskFunction;\n /** Pre-built AttributeMapper. If not supplied, a default mapper is created. */\n mapper?: AttributeMapper;\n}\n\n// ────────────────────────────────────────────────────────\n// NeatlogsSpanProcessor\n// ────────────────────────────────────────────────────────\n\nexport class NeatlogsSpanProcessor implements SpanProcessor {\n private readonly sampleRate: number;\n private readonly debug: boolean;\n private readonly mask: MaskFunction | undefined;\n private readonly unifiedProcessor: UnifiedAttributeProcessor;\n\n private perfStats: PerfStats;\n private _retrieversToSuppress: Set<string>;\n\n // File logging\n private _logRawSpansEnabled: boolean;\n private _logProcessedSpansEnabled: boolean;\n private _rawLogStream: fs.WriteStream | null;\n private _processedLogStream: fs.WriteStream | null;\n\n constructor(opts: NeatlogsSpanProcessorOptions = {}) {\n this.sampleRate = opts.sampleRate ?? 1.0;\n this.debug = opts.debug ?? false;\n this.mask = opts.mask;\n\n this.unifiedProcessor = new UnifiedAttributeProcessor(\n opts.mapper ?? new AttributeMapper(),\n this.debug,\n );\n\n this._logRawSpansEnabled = false;\n this._logProcessedSpansEnabled = false;\n this._rawLogStream = null;\n this._processedLogStream = null;\n\n this._initFileLogging();\n\n this.perfStats = {\n onStartTime: 0,\n onEndTime: 0,\n spansProcessed: 0,\n spansExported: 0,\n };\n\n this._retrieversToSuppress = new Set<string>();\n }\n\n // ── File logging init ─────────────────────────────────\n\n private _initFileLogging(): void {\n // Raw OTel span JSON (before attribute normalization)\n this._logRawSpansEnabled =\n this.debug ||\n ['true', '1', 'yes'].includes(\n (process.env.NEATLOGS_LOG_RAW_SPANS ?? '').toLowerCase(),\n );\n\n if (this._logRawSpansEnabled) {\n const rawPath =\n process.env.NEATLOGS_LOG_RAW_SPANS_FILE ?? 'spans_raw_optimized.log';\n this._rawLogStream = createLogStream(rawPath);\n if (this._rawLogStream) {\n logger.info(\n `Raw span logging enabled: ${resolveLogFilePath(rawPath)}`,\n );\n }\n }\n\n // Processed span dict (after normalization)\n this._logProcessedSpansEnabled = ['true', '1', 'yes'].includes(\n (process.env.NEATLOGS_LOG_SPANS ?? '').toLowerCase(),\n );\n\n if (this._logProcessedSpansEnabled) {\n const processedPath =\n process.env.NEATLOGS_LOG_SPANS_FILE ?? 'spans_optimized.log';\n this._processedLogStream = createLogStream(processedPath);\n if (this._processedLogStream) {\n logger.info(\n `Processed span logging enabled: ${resolveLogFilePath(processedPath)}`,\n );\n }\n }\n }\n\n // ── SpanProcessor.onStart ─────────────────────────────\n\n onStart(span: SdkSpan, parentContext: Context): void {\n const startTime = performance.now();\n try {\n const attrs = (span as any).attributes ?? {};\n const spanKind = attrs['openinference.span.kind'] as string | undefined;\n const spanName: string =\n typeof (span as any).name === 'string' ? (span as any).name : '';\n\n const isLlmSpan =\n spanKind === 'LLM' || LLM_NAME_PATTERNS.test(spanName);\n\n if (!isLlmSpan) return;\n\n // Read context values\n const ctx = otelContext.active();\n let variablesJson = ctx.getValue(PROMPT_VARIABLES_KEY) as\n | string\n | undefined;\n let template = ctx.getValue(PROMPT_TEMPLATE_KEY) as string | undefined;\n const versionVal = ctx.getValue(PROMPT_VERSION_KEY) as\n | string\n | undefined;\n let userTemplate = ctx.getValue(USER_PROMPT_TEMPLATE_KEY) as\n | string\n | undefined;\n let userVariablesJson = ctx.getValue(USER_PROMPT_VARIABLES_KEY) as\n | string\n | undefined;\n\n // Fall back to PromptContext / UserPromptContext\n if (!variablesJson) {\n const captured = PromptContext.getVariables();\n if (captured) {\n variablesJson = JSON.stringify(captured);\n }\n }\n\n if (!template) {\n const captured = PromptContext.getTemplate();\n if (captured) {\n template = captured;\n }\n }\n\n if (!userTemplate) {\n const captured = UserPromptContext.getTemplate();\n if (captured) {\n userTemplate = captured;\n }\n }\n\n if (!userVariablesJson) {\n const captured = UserPromptContext.getVariables();\n if (captured) {\n userVariablesJson = JSON.stringify(captured);\n }\n }\n\n if (this.debug) {\n logger.debug(\n `[SpanProcessor.onStart] LLM span '${spanName}' starting`,\n );\n logger.debug(` variables_json from context: ${variablesJson}`);\n logger.debug(` template from context: ${template}`);\n logger.debug(` version from context: ${versionVal}`);\n logger.debug(` user_template from context: ${userTemplate}`);\n logger.debug(\n ` user_variables_json from context: ${userVariablesJson}`,\n );\n }\n\n if (variablesJson) {\n span.setAttribute('llm.prompt_template_variables', variablesJson);\n }\n if (template) {\n span.setAttribute('llm.prompt_template', template);\n }\n if (versionVal) {\n span.setAttribute('llm.prompt_template.version', versionVal);\n }\n if (userTemplate) {\n span.setAttribute('llm.user_prompt_template', userTemplate);\n }\n if (userVariablesJson) {\n span.setAttribute(\n 'llm.user_prompt_template_variables',\n userVariablesJson,\n );\n }\n } finally {\n this.perfStats.onStartTime += performance.now() - startTime;\n }\n }\n\n // ── SpanProcessor.onEnd ───────────────────────────────\n\n onEnd(span: ReadableSpan): void {\n // Skip internal completion markers — they only need to be exported as-is\n if (span.name === 'neatlogs.trace.complete') {\n return;\n }\n\n\n const startTime = performance.now();\n this.perfStats.spansProcessed += 1;\n\n try {\n if (this.debug) {\n logger.debug(`[SpanProcessor.onEnd] Span ending: ${span.name}`);\n }\n\n // 1. Log raw OTel span (before any processing)\n if (this._rawLogStream && !this._rawLogStream.destroyed) {\n try {\n this._rawLogStream.write(\n JSON.stringify(spanToDict(span)) + '\\n',\n );\n } catch (e) {\n logger.warn(`Failed to write span to raw log file: ${e}`);\n }\n }\n\n // Sample rate check\n if (this.sampleRate < 1.0 && Math.random() > this.sampleRate) {\n return;\n }\n\n // 2. Process and normalize attributes\n const spanDict = spanToDict(span, { includeScope: true }) as SpanDict;\n const unifiedAttrs = this.unifiedProcessor.normalize(spanDict);\n\n // 3. Filter large tokenized arrays for EMBEDDING/VECTOR_STORE spans\n let nlKind = unifiedAttrs['neatlogs.span.kind'] as string | undefined;\n if (nlKind === 'embedding' || nlKind === 'vector_store') {\n const skipOutput =\n unifiedAttrs['neatlogs._skip_output_value'] === true;\n const keysToRemove: string[] = [];\n\n for (const key of Object.keys(unifiedAttrs)) {\n if (\n key.includes('input_messages') ||\n key.includes('output_messages') ||\n key.includes('gen_ai.prompt') ||\n key.includes('gen_ai.completion') ||\n key.includes('.content')\n ) {\n keysToRemove.push(key);\n } else if (\n key === 'neatlogs.embedding.output' ||\n (skipOutput && key === 'neatlogs.embedding.input')\n ) {\n keysToRemove.push(key);\n }\n }\n\n for (const key of keysToRemove) {\n delete unifiedAttrs[key];\n }\n\n if (this.debug && keysToRemove.length > 0) {\n logger.debug(\n `[EMBEDDING Filter] Removed ${keysToRemove.length} large attribute keys ` +\n `from ${nlKind} span (skip_output=${skipOutput})`,\n );\n }\n }\n\n // 4. Filter prompt template keys for non-LLM spans\n nlKind = unifiedAttrs['neatlogs.span.kind'] as string | undefined;\n if (\n nlKind !== 'llm' &&\n nlKind !== 'embedding' &&\n nlKind !== 'crewai_task' &&\n span.name !== 'PromptTemplate'\n ) {\n delete unifiedAttrs['neatlogs.llm.prompt_template'];\n delete unifiedAttrs['neatlogs.llm.prompt_template_variables'];\n delete unifiedAttrs['neatlogs.llm.prompt_template.version'];\n }\n\n // PromptTemplate spans → internal\n if (span.name === 'PromptTemplate') {\n if (unifiedAttrs['neatlogs.internal'] === undefined) {\n unifiedAttrs['neatlogs.internal'] = true;\n }\n unifiedAttrs['neatlogs.span.kind'] = 'Neatlogs.INTERNAL';\n }\n\n // 4b. Retriever span dedup\n if (nlKind === 'retriever') {\n const isInternal = unifiedAttrs['neatlogs.internal'] === true;\n if (isInternal && span.parentSpanId) {\n this._retrieversToSuppress.add(span.parentSpanId);\n }\n const spanId = span.spanContext().spanId;\n if (this._retrieversToSuppress.has(spanId)) {\n this._retrieversToSuppress.delete(spanId);\n unifiedAttrs['neatlogs.internal'] = true;\n if (this.debug) {\n logger.debug(\n `[Retriever Merge] Marked OI retriever '${span.name}' as internal ` +\n `(had neatlogs retriever child)`,\n );\n }\n }\n }\n\n // 5. Build resource attributes\n const resourceAttrs: Record<string, any> = {};\n if (span.resource?.attributes) {\n for (const [key, value] of Object.entries(span.resource.attributes)) {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n resourceAttrs[key] = value;\n } else if (Array.isArray(value)) {\n resourceAttrs[key] = [...value];\n } else {\n resourceAttrs[key] = String(value);\n }\n }\n\n if (this.debug && 'neatlogs.tags' in resourceAttrs) {\n logger.debug(\n `[Tags] Span ${span.name}: resource.neatlogs.tags = ${resourceAttrs['neatlogs.tags']}`,\n );\n }\n }\n\n // Format IDs — JS OTel SDK already provides hex strings\n const traceId = span.spanContext().traceId;\n const spanId = span.spanContext().spanId;\n let parentSpanId: string | null = span.parentSpanId ?? null;\n\n // Detect self-parenting\n if (parentSpanId === spanId) {\n if (this.debug) {\n logger.warn(\n `[SpanProcessor] Detected self-parenting span. ` +\n `trace_id=${traceId} span_id=${spanId} name=${span.name}. ` +\n `Setting parent_span_id=None.`,\n );\n }\n parentSpanId = null;\n }\n\n // 6. Build span_data dict\n const kindValue = (unifiedAttrs['neatlogs.span.kind'] as string) ?? 'UNKNOWN';\n const startTimeNs = hrTimeToNanos(span.startTime);\n const endTimeNs = hrTimeToNanos(span.endTime);\n\n let spanData: Record<string, any> = {\n trace_id: traceId,\n span_id: spanId,\n parent_span_id: parentSpanId,\n name: span.name,\n kind: kindValue || 'UNKNOWN',\n start_time: startTimeNs,\n end_time: endTimeNs,\n duration_ns: endTimeNs > 0 ? endTimeNs - startTimeNs : null,\n attributes: unifiedAttrs,\n resource: { attributes: resourceAttrs },\n status: {\n code: SpanStatusCode[span.status.code] ?? String(span.status.code),\n description: span.status.message ?? null,\n },\n events: span.events\n ? span.events.map((e) => ({\n name: e.name,\n timestamp: hrTimeToNanos(e.time),\n attributes: e.attributes ? { ...e.attributes } : {},\n }))\n : [],\n };\n\n // 7. Post-processing: framework span name normalization, CrewAI tasks, model resolution\n let results = this._normalizeFrameworkSpanNames([spanData]);\n spanData = results[0] ?? spanData;\n results = this._injectCrewaiTaskTemplates([spanData]);\n spanData = results[0] ?? spanData;\n this._resolveActualModelName(spanData);\n\n // 7b. Apply mask — if mask returns null, drop the span entirely\n const maskedSpanData = applyMask(spanData, this.mask ?? null);\n if (maskedSpanData === null) {\n // Mark the OTel span so the FilteringExporter can skip it\n try {\n const spanAttrs = (span as any).attributes ?? (span as any)._attributes;\n if (spanAttrs != null) {\n spanAttrs['neatlogs.dropped'] = true;\n }\n } catch {\n // Best-effort — if write-back fails, span may still export\n }\n return;\n }\n spanData = maskedSpanData;\n\n // 7c. Write normalized neatlogs.* attributes back to the OTel span\n const finalAttrs = (spanData.attributes ?? {}) as Record<string, any>;\n try {\n const spanAttrs = (span as any).attributes ?? (span as any)._attributes;\n if (spanAttrs != null) {\n for (const [k, v] of Object.entries(finalAttrs)) {\n if (\n typeof v === 'string' ||\n typeof v === 'number' ||\n typeof v === 'boolean'\n ) {\n spanAttrs[k] = v;\n } else if (\n Array.isArray(v) &&\n v.every(\n (i: any) =>\n typeof i === 'string' ||\n typeof i === 'number' ||\n typeof i === 'boolean',\n )\n ) {\n spanAttrs[k] = [...v];\n }\n }\n }\n } catch (wbExc) {\n if (this.debug) {\n logger.debug(\n `[SpanProcessor] Attr write-back failed: ${wbExc}`,\n );\n }\n }\n\n // 8. Log processed span dict (mask already applied in step 7b)\n if (this._processedLogStream && !this._processedLogStream.destroyed) {\n try {\n this._processedLogStream.write(\n JSON.stringify(spanData) + '\\n',\n );\n } catch (e) {\n logger.warn(`Failed to write span to processed log file: ${e}`);\n }\n }\n\n this.perfStats.spansExported += 1;\n\n // Emit completion marker when a root span ends\n if (!span.parentSpanId) {\n this._emitCompletionMarker(span, traceId, resourceAttrs);\n }\n } finally {\n this.perfStats.onEndTime += performance.now() - startTime;\n }\n }\n\n // ── Completion marker ─────────────────────────────────\n\n private _emitCompletionMarker(\n rootSpan: ReadableSpan,\n traceId: string,\n resourceAttrs: Record<string, any>,\n ): void {\n try {\n const spanCtx: SpanContext = {\n traceId: rootSpan.spanContext().traceId,\n spanId: rootSpan.spanContext().spanId,\n isRemote: false,\n traceFlags: TraceFlags.SAMPLED,\n };\n\n // Use wrapSpanContext to create a non-recording span from context\n const wrappedSpan = otelTrace.wrapSpanContext(spanCtx);\n const ctx = otelTrace.setSpan(otelContext.active(), wrappedSpan);\n\n const tracer = otelTrace.getTracer('neatlogs.internal');\n const marker = tracer.startSpan('neatlogs.trace.complete', undefined, ctx);\n marker.setAttribute('neatlogs.trace.complete', true);\n marker.setAttribute('neatlogs.internal', true);\n marker.setAttribute('neatlogs.span.kind', 'Neatlogs.INTERNAL');\n\n // Copy resource tags\n if (resourceAttrs['neatlogs.tags']) {\n marker.setAttribute('neatlogs.tags', resourceAttrs['neatlogs.tags']);\n }\n\n marker.end();\n\n if (this.debug) {\n logger.debug(\n `[SpanProcessor] Emitted completion marker for trace ${traceId}`,\n );\n }\n } catch (e) {\n logger.warn(`[SpanProcessor] Failed to emit completion marker: ${e}`);\n }\n }\n\n // ── Framework span name normalization ─────────────────\n\n private _normalizeFrameworkSpanNames(\n spans: Record<string, any>[],\n ): Record<string, any>[] {\n for (const s of spans) {\n const name: string = s.name ?? '';\n const kind: string =\n s.kind ?? s.attributes?.['neatlogs.span.kind'] ?? '';\n\n if (kind !== 'task' || !name.endsWith('.task')) {\n continue;\n }\n\n const attrs: Record<string, any> = s.attributes ?? {};\n if (!Object.keys(attrs).some((k) => k.startsWith('neatlogs.crewai.'))) {\n continue;\n }\n\n let desc = name.slice(0, -'.task'.length).trimEnd();\n while (desc.endsWith('.')) {\n desc = desc.slice(0, -1).trimEnd();\n }\n\n if (desc) {\n if (attrs['neatlogs.task.description'] === undefined) {\n attrs['neatlogs.task.description'] = desc;\n }\n }\n\n s.name = 'crewai.task';\n s.attributes = attrs;\n }\n\n return spans;\n }\n\n // ── CrewAI task template injection ────────────────────\n\n private _injectCrewaiTaskTemplates(\n spans: Record<string, any>[],\n ): Record<string, any>[] {\n for (const s of spans) {\n const attrs: Record<string, any> = s.attributes ?? {};\n const taskId = attrs['neatlogs.task.id'];\n if (!taskId) continue;\n\n const entry = popEntry(String(taskId));\n if (!entry) continue;\n\n const [tplStr, varsJson] = entry;\n attrs['neatlogs.task.user_prompt_template'] = tplStr;\n if (varsJson) {\n attrs['neatlogs.task.user_prompt_template_variables'] = varsJson;\n }\n attrs['neatlogs.span.kind'] = 'crewai_task';\n s.attributes = attrs;\n }\n\n return spans;\n }\n\n // ── Resolve actual model name from LLM output ────────\n // LangChain/Azure spans report deployment names (e.g., \"gpt-3.5-turbo\") as\n // the model name. The actual resolved model (e.g., \"gpt-5-nano-2025-08-07\")\n // is buried in the LLM output JSON at response_metadata.model_name.\n\n private _resolveActualModelName(spanData: Record<string, any>): void {\n const attrs: Record<string, any> = spanData.attributes ?? {};\n const kind = attrs['neatlogs.span.kind'];\n if (kind !== 'llm') return;\n\n const currentModel = attrs['neatlogs.llm.model_name'] as string | undefined;\n if (!currentModel) return;\n\n const llmOutput = attrs['neatlogs.llm.output'] as string | undefined;\n if (!llmOutput) return;\n\n try {\n const output = JSON.parse(llmOutput);\n\n // LangChain format: generations[0][0].message.kwargs.response_metadata.model_name\n const generations = output?.generations;\n if (Array.isArray(generations) && generations[0]?.[0]) {\n const respMeta = generations[0][0]?.message?.kwargs?.response_metadata;\n if (respMeta?.model_name && respMeta.model_name !== currentModel) {\n attrs['neatlogs.llm.model_name'] = respMeta.model_name;\n if (this.debug) {\n logger.debug(\n `[ModelResolve] LangChain span: ${currentModel} → ${respMeta.model_name}`,\n );\n }\n return;\n }\n }\n\n // Vercel AI SDK / direct OpenAI format: model field at top level of response\n if (output?.model && output.model !== currentModel) {\n attrs['neatlogs.llm.model_name'] = output.model;\n if (this.debug) {\n logger.debug(\n `[ModelResolve] Direct response: ${currentModel} → ${output.model}`,\n );\n }\n }\n } catch (e: unknown) {\n logger.warn(`[ModelResolve] Failed to parse LLM output for model extraction: ${e}`);\n }\n }\n\n // ── forceFlush / shutdown ─────────────────────────────\n\n async forceFlush(): Promise<void> {\n // Flushing is handled by BatchSpanProcessor downstream.\n }\n\n async shutdown(): Promise<void> {\n this._logPerformanceStats();\n\n await closeLogStream(this._rawLogStream, 'raw');\n this._rawLogStream = null;\n\n await closeLogStream(this._processedLogStream, 'processed');\n this._processedLogStream = null;\n }\n\n // ── Performance stats ─────────────────────────────────\n\n private _logPerformanceStats(): void {\n if (!this.debug) return;\n\n const stats = this.perfStats;\n if (stats.spansProcessed === 0) return;\n\n const totalTime = stats.onStartTime + stats.onEndTime;\n const avgMs = totalTime / stats.spansProcessed;\n\n try {\n logger.info(\n `Neatlogs overhead: ${totalTime.toFixed(2)}ms total, ${avgMs.toFixed(3)}ms/span ` +\n `(${stats.spansProcessed} spans processed, ` +\n `${stats.spansExported} spans logged)`,\n );\n } catch {\n // ignore\n }\n }\n\n // ── Accessors for testing ─────────────────────────────\n\n /** @internal — exposed for testing */\n get _perfStats(): PerfStats {\n return this.perfStats;\n }\n\n /** @internal — exposed for testing */\n get _suppressedRetrievers(): Set<string> {\n return this._retrieversToSuppress;\n }\n}\n","/**\n * Centralized logging configuration for Neatlogs SDK.\n * Provides structured logging with configurable levels.\n */\n\ntype LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'NONE';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n DEBUG: 0,\n INFO: 1,\n WARN: 2,\n ERROR: 3,\n NONE: 4,\n};\n\nlet _logLevel: LogLevel = 'INFO';\nlet _disabled = false;\n\nfunction _getConfiguredLevel(): LogLevel {\n const envLevel = process.env.NEATLOGS_LOG_LEVEL?.toUpperCase();\n if (envLevel && envLevel in LOG_LEVELS) {\n return envLevel as LogLevel;\n }\n return 'INFO';\n}\n\n// Initialize from env on first import\n_logLevel = _getConfiguredLevel();\n\nexport function getLogger() {\n return {\n debug(message: string, ...args: any[]) {\n if (!_disabled && LOG_LEVELS[_logLevel] <= LOG_LEVELS.DEBUG) {\n console.debug(`[neatlogs] ${message}`, ...args);\n }\n },\n info(message: string, ...args: any[]) {\n if (!_disabled && LOG_LEVELS[_logLevel] <= LOG_LEVELS.INFO) {\n console.info(`[neatlogs] ${message}`, ...args);\n }\n },\n warn(message: string, ...args: any[]) {\n if (!_disabled && LOG_LEVELS[_logLevel] <= LOG_LEVELS.WARN) {\n console.warn(`[neatlogs] ${message}`, ...args);\n }\n },\n error(message: string, ...args: any[]) {\n if (!_disabled && LOG_LEVELS[_logLevel] <= LOG_LEVELS.ERROR) {\n console.error(`[neatlogs] ${message}`, ...args);\n }\n },\n };\n}\n\nexport function setLogLevel(level: LogLevel): void {\n _logLevel = level;\n}\n\nexport function enableDebugLogging(): void {\n _logLevel = 'DEBUG';\n}\n\nexport function disableLogging(): void {\n _disabled = true;\n}\n\nexport function enableLogging(): void {\n _disabled = false;\n}\n","/**\n * Framework and platform detection from instrumentation scope.\n *\n * Parses OpenTelemetry instrumentation_scope.name to extract:\n * - Provider: LLM provider (openai, anthropic, google, etc.)\n * - Framework: Orchestration framework (langchain, llamaindex, crewai, etc.)\n * - Platform: Cloud platform (bedrock, vertex_ai, azure_openai, etc.)\n *\n * Port of Python neatlogs/core/instrumentation_scope_parser.py\n */\n\n// ────────────────────────────────────────────────────────\n// Types\n// ────────────────────────────────────────────────────────\n\nexport interface ScopeInfo {\n provider?: string;\n framework?: string;\n platform?: string;\n}\n\n// ────────────────────────────────────────────────────────\n// Scope-name → provider / framework / platform tables\n// ────────────────────────────────────────────────────────\n\nconst SCOPE_PATTERNS: Record<string, ScopeInfo> = {\n // Neatlogs custom instrumentations\n '@neatlogs/instrumentation-google-genai': { provider: 'google', framework: 'google_genai' },\n '@neatlogs/instrumentation-mastra': { framework: 'mastra' },\n '@neatlogs/instrumentation-ai-sdk': { framework: 'ai_sdk' },\n\n // Vercel AI SDK native scope (the `ai` package emits this directly)\n ai: { framework: 'ai_sdk' },\n\n // OpenInference instrumentations (npm @arizeai scope names)\n '@arizeai/openinference-instrumentation-openai': { provider: 'openai', framework: 'openai' },\n '@arizeai/openinference-instrumentation-anthropic': { provider: 'anthropic', framework: 'anthropic' },\n '@arizeai/openinference-instrumentation-langchain': { framework: 'langchain' },\n '@arizeai/openinference-instrumentation-bedrock': { provider: 'bedrock', platform: 'bedrock', framework: 'bedrock' },\n '@arizeai/openinference-instrumentation-vertexai': { provider: 'vertex_ai', platform: 'vertex_ai', framework: 'vertex_ai' },\n '@arizeai/openinference-instrumentation-mistralai': { provider: 'mistral', framework: 'mistral' },\n '@arizeai/openinference-instrumentation-cohere': { provider: 'cohere', framework: 'cohere' },\n '@arizeai/openinference-instrumentation-groq': { provider: 'groq', framework: 'groq' },\n '@arizeai/openinference-instrumentation-llama-index': { framework: 'llamaindex' },\n '@arizeai/openinference-instrumentation-llamaindex': { framework: 'llamaindex' },\n '@arizeai/openinference-instrumentation-crewai': { framework: 'crewai' },\n '@arizeai/openinference-instrumentation-haystack': { framework: 'haystack' },\n '@arizeai/openinference-instrumentation-dspy': { framework: 'dspy' },\n '@arizeai/openinference-instrumentation-beeai': { framework: 'beeai' },\n '@arizeai/openinference-instrumentation-mcp': { framework: 'mcp' },\n '@arizeai/openinference-instrumentation-claude-agent-sdk': { framework: 'claude_agent_sdk' },\n\n // OpenInference instrumentations (Python-style scope names)\n 'openinference.instrumentation.openai': { provider: 'openai', framework: 'openai' },\n 'openinference.instrumentation.anthropic': { provider: 'anthropic', framework: 'anthropic' },\n 'openinference.instrumentation.google_genai': { provider: 'google', framework: 'google_genai' },\n 'openinference.instrumentation.bedrock': { provider: 'bedrock', platform: 'bedrock', framework: 'bedrock' },\n 'openinference.instrumentation.vertexai': { provider: 'vertex_ai', platform: 'vertex_ai', framework: 'vertex_ai' },\n 'openinference.instrumentation.mistralai': { provider: 'mistral', framework: 'mistral' },\n 'openinference.instrumentation.cohere': { provider: 'cohere', framework: 'cohere' },\n 'openinference.instrumentation.groq': { provider: 'groq', framework: 'groq' },\n\n // OpenInference frameworks (Python-style scope names)\n 'openinference.instrumentation.mastra': { framework: 'mastra' },\n 'openinference.instrumentation.langchain': { framework: 'langchain' },\n 'openinference.instrumentation.llama_index': { framework: 'llamaindex' },\n 'openinference.instrumentation.llamaindex': { framework: 'llamaindex' },\n 'openinference.instrumentation.crewai': { framework: 'crewai' },\n 'openinference.instrumentation.haystack': { framework: 'haystack' },\n 'openinference.instrumentation.dspy': { framework: 'dspy' },\n\n // OpenLLMetry (Traceloop) instrumentations\n 'opentelemetry.instrumentation.openai': { provider: 'openai', framework: 'openai' },\n 'opentelemetry.instrumentation.anthropic': { provider: 'anthropic', framework: 'anthropic' },\n 'opentelemetry.instrumentation.google_generativeai': { provider: 'google', framework: 'google_genai' },\n 'opentelemetry.instrumentation.bedrock': { provider: 'bedrock', platform: 'bedrock', framework: 'bedrock' },\n 'opentelemetry.instrumentation.vertexai': { provider: 'vertex_ai', platform: 'vertex_ai', framework: 'vertex_ai' },\n 'opentelemetry.instrumentation.cohere': { provider: 'cohere', framework: 'cohere' },\n 'opentelemetry.instrumentation.mistralai': { provider: 'mistral', framework: 'mistral' },\n\n // OpenLLMetry frameworks\n 'opentelemetry.instrumentation.langchain': { framework: 'langchain' },\n 'opentelemetry.instrumentation.llamaindex': { framework: 'llamaindex' },\n 'opentelemetry.instrumentation.crewai': { framework: 'crewai' },\n 'opentelemetry.instrumentation.haystack': { framework: 'haystack' },\n\n // Native framework telemetry\n 'haystack.telemetry': { framework: 'haystack' },\n crewai: { framework: 'crewai' },\n langchain: { framework: 'langchain' },\n llama_index: { framework: 'llamaindex' },\n};\n\n// gen_ai.system → neatlogs.provider mapping\nconst GEN_AI_SYSTEM_TO_PROVIDER: Record<string, string> = {\n openai: 'openai',\n anthropic: 'anthropic',\n google: 'google',\n vertex_ai: 'vertex_ai',\n bedrock: 'bedrock',\n azure_openai: 'openai', // Azure OpenAI uses OpenAI provider\n cohere: 'cohere',\n mistral: 'mistral',\n groq: 'groq',\n};\n\n// ────────────────────────────────────────────────────────\n// Public API\n// ────────────────────────────────────────────────────────\n\n/**\n * Parse instrumentation scope name to extract provider/framework/platform.\n *\n * @param scopeName - The instrumentation_scope.name from the span\n * @returns Dictionary with detected: provider, framework, platform (if found)\n *\n * @example\n * parseInstrumentationScope('openinference.instrumentation.openai')\n * // → { provider: 'openai' }\n *\n * parseInstrumentationScope('openinference.instrumentation.langchain')\n * // → { framework: 'langchain' }\n *\n * parseInstrumentationScope('opentelemetry.instrumentation.bedrock')\n * // → { provider: 'bedrock', platform: 'bedrock' }\n */\nexport function parseInstrumentationScope(scopeName: string | null | undefined): ScopeInfo {\n if (!scopeName) return {};\n\n const scopeLower = scopeName.toLowerCase();\n\n // Direct exact match\n if (scopeLower in SCOPE_PATTERNS) {\n return { ...SCOPE_PATTERNS[scopeLower] };\n }\n\n // Prefix match (handles versioned scopes like \"openinference.instrumentation.openai.v1\")\n for (const [pattern, info] of Object.entries(SCOPE_PATTERNS)) {\n if (scopeLower.startsWith(pattern)) {\n return { ...info };\n }\n }\n\n // Fuzzy extraction as fallback\n const result: ScopeInfo = {};\n\n // Check for framework indicators\n if (scopeLower.includes('langchain')) {\n result.framework = 'langchain';\n } else if (scopeLower.includes('llama') || scopeLower.includes('llamaindex')) {\n result.framework = 'llamaindex';\n } else if (scopeLower.includes('crewai') || scopeLower.includes('crew')) {\n result.framework = 'crewai';\n } else if (scopeLower.includes('haystack')) {\n result.framework = 'haystack';\n } else if (scopeLower.includes('dspy')) {\n result.framework = 'dspy';\n } else if (scopeLower.includes('vercel-ai') || scopeLower.includes('ai-sdk')) {\n result.framework = 'ai_sdk';\n }\n\n // Check for provider indicators\n if (scopeLower.includes('openai')) {\n result.provider = 'openai';\n if (scopeLower.includes('azure')) {\n result.platform = 'azure_openai';\n }\n } else if (scopeLower.includes('anthropic') || scopeLower.includes('claude')) {\n result.provider = 'anthropic';\n } else if (\n scopeLower.includes('google') ||\n scopeLower.includes('gemini') ||\n scopeLower.includes('genai')\n ) {\n result.provider = 'google';\n } else if (scopeLower.includes('bedrock')) {\n result.provider = 'bedrock';\n result.platform = 'bedrock';\n } else if (scopeLower.includes('vertex')) {\n result.platform = 'vertex_ai';\n // Vertex can host multiple providers, default to google\n if (!result.provider) {\n result.provider = 'vertex_ai';\n }\n } else if (scopeLower.includes('mistral')) {\n result.provider = 'mistral';\n } else if (scopeLower.includes('cohere')) {\n result.provider = 'cohere';\n } else if (scopeLower.includes('groq')) {\n result.provider = 'groq';\n }\n\n return result;\n}\n\n/**\n * Enrich attributes with framework/platform/provider detected from instrumentation scope.\n *\n * Modifies attrs **in-place** by adding:\n * - neatlogs.instrumentation.name\n * - neatlogs.provider\n * - neatlogs.framework\n * - neatlogs.platform\n *\n * Logic:\n * 1. Parse current span's scope → gives provider/platform\n * 2. Parse parent span's scope (if provided) → gives orchestrating framework\n * 3. Only set attributes if not already present (explicit attrs take precedence)\n * 4. Cross-reference with gen_ai.system / model name patterns\n */\nexport function enrichWithScopeDetection(\n attrs: Record<string, any>,\n scopeName: string | null | undefined,\n parentScopeName: string | null | undefined = null,\n): void {\n // Store original instrumentation scope info\n if (scopeName) {\n if (!('neatlogs.instrumentation.name' in attrs)) {\n attrs['neatlogs.instrumentation.name'] = scopeName;\n }\n }\n\n // Parse current span's scope\n const currentInfo = parseInstrumentationScope(scopeName);\n\n // Set provider (from current span's scope)\n if (currentInfo.provider && !('neatlogs.provider' in attrs)) {\n attrs['neatlogs.provider'] = currentInfo.provider;\n }\n\n // Set platform (from current span's scope)\n if (currentInfo.platform && !('neatlogs.platform' in attrs)) {\n attrs['neatlogs.platform'] = currentInfo.platform;\n }\n\n // Set framework — prioritize parent scope, fallback to current scope\n if (parentScopeName) {\n const parentInfo = parseInstrumentationScope(parentScopeName);\n if (parentInfo.framework && !('neatlogs.framework' in attrs)) {\n attrs['neatlogs.framework'] = parentInfo.framework;\n }\n }\n\n // If no framework from parent, check current scope\n if (!('neatlogs.framework' in attrs) && currentInfo.framework) {\n attrs['neatlogs.framework'] = currentInfo.framework;\n }\n\n // Cross-reference with gen_ai.system if available\n const genAiSystem = (attrs['gen_ai.system'] ?? '').toLowerCase();\n if (genAiSystem && !('neatlogs.provider' in attrs)) {\n const mapped = GEN_AI_SYSTEM_TO_PROVIDER[genAiSystem];\n if (mapped) {\n attrs['neatlogs.provider'] = mapped;\n }\n }\n\n // Detect platform from model name patterns (e.g., \"anthropic.claude-3-5-sonnet-v1:0\" → Bedrock)\n const llmModel: string = attrs['llm.model_name'] ?? '';\n if (llmModel && !('neatlogs.platform' in attrs)) {\n if (\n llmModel.startsWith('anthropic.') ||\n llmModel.startsWith('meta.') ||\n llmModel.startsWith('amazon.')\n ) {\n attrs['neatlogs.platform'] = 'bedrock';\n } else if (llmModel.toLowerCase().includes('azure')) {\n attrs['neatlogs.platform'] = 'azure_openai';\n }\n }\n}\n\n/**\n * Get the effective provider to use for pricing lookups.\n *\n * Logic:\n * 1. Use neatlogs.platform if it's set (bedrock/vertex_ai/azure_openai)\n * 2. Otherwise use neatlogs.provider\n * 3. Fallback to gen_ai.system or llm.system\n */\nexport function getEffectiveProviderForPricing(attrs: Record<string, any>): string {\n // Platform takes precedence for pricing (different pricing on cloud platforms)\n const platform = (attrs['neatlogs.platform'] ?? '').toLowerCase();\n if (platform) {\n const platformPricingMap: Record<string, string> = {\n bedrock: 'bedrock',\n vertex_ai: 'vertex_ai',\n azure_openai: 'azure_openai',\n };\n if (platform in platformPricingMap) {\n return platformPricingMap[platform];\n }\n }\n\n // Use detected provider\n const provider = (attrs['neatlogs.provider'] ?? '').toLowerCase();\n if (provider) {\n return provider;\n }\n\n // Fallback to gen_ai.system or llm.system\n return (attrs['gen_ai.system'] ?? attrs['llm.system'] ?? '').toLowerCase();\n}\n\n/**\n * Get the effective provider to use for defaults lookups.\n *\n * Currently uses the same logic as pricing. Exported as a separate\n * name so callers express intent (defaults vs pricing) even though\n * the implementation is shared.\n */\nexport const getEffectiveProviderForDefaults = getEffectiveProviderForPricing;\n","/**\n * Shared constants for vector DB systems and retrieval operations.\n *\n * Used by both attribute-processor.ts and mapping.ts to avoid\n * divergent keyword lists.\n */\n\n/** Known vector database system identifiers. */\nexport const VECTOR_DB_SYSTEMS = new Set([\n 'chroma',\n 'chromadb',\n 'pinecone',\n 'qdrant',\n 'milvus',\n 'marqo',\n 'weaviate',\n 'lancedb',\n 'astra',\n 'pgvector',\n 'elasticsearch',\n]);\n\n/** Operations that indicate a retrieval / read from a vector DB. */\nexport const RETRIEVAL_OPS = [\n 'query',\n 'search',\n 'get',\n 'fetch',\n 'find',\n 'retrieve',\n 'scroll',\n 'peek',\n 'discover',\n 'recommend',\n 'aggregate',\n 'hybrid_search',\n 'select',\n];\n\n/** Operations that indicate a write to a vector DB. */\nexport const WRITE_OPS = [\n 'upsert',\n 'insert',\n 'add',\n 'update',\n 'delete',\n 'create',\n 'drop',\n 'put',\n 'set',\n 'upload',\n 'index',\n];\n\n/** Vector DB names used for span-name-based inference. */\nexport const VECTOR_DB_NAMES = [\n 'chroma',\n 'pinecone',\n 'weaviate',\n 'qdrant',\n 'milvus',\n 'lancedb',\n 'marqo',\n 'astra',\n];\n","/**\n * Span kind constants and inference from span names.\n * Mirrors Python span_kinds/mapping.py.\n */\n\nimport type { SpanKind } from '../types.js';\nimport { VECTOR_DB_NAMES, RETRIEVAL_OPS } from './constants.js';\n\n/** All valid span kinds for the span() decorator. */\nexport const VALID_SPAN_KINDS = new Set<SpanKind>([\n 'WORKFLOW',\n 'AGENT',\n 'CHAIN',\n 'TOOL',\n 'RETRIEVER',\n 'EMBEDDING',\n 'MCP_TOOL',\n 'GUARDRAIL',\n]);\n\n/** Extended span kinds that can appear in processed spans (from OpenInference). */\nexport const ALL_SPAN_KINDS = new Set<string>([\n ...VALID_SPAN_KINDS,\n 'LLM',\n 'RERANKER',\n 'EVALUATOR',\n 'VECTOR_STORE',\n]);\n\n/**\n * Infer OpenInference span kind from span name.\n * Distinguishes RETRIEVER (read ops) vs VECTOR_STORE (write ops) for vector DBs.\n */\nexport function inferSpanKindFromName(spanName: string): string {\n const nameLower = spanName.toLowerCase();\n\n // LLM operations\n if (\n ['openai', 'anthropic', 'cohere', 'bedrock', 'chat', 'completion', 'llm', 'gemini', 'google_genai'].some(\n (kw) => nameLower.includes(kw),\n )\n ) {\n return 'LLM';\n }\n\n // Embedding operations\n if (nameLower.includes('embed')) {\n return 'EMBEDDING';\n }\n\n // Vector DB: Distinguish RETRIEVER (read) vs VECTOR_STORE (write)\n if (VECTOR_DB_NAMES.some((db) => nameLower.includes(db))) {\n if (RETRIEVAL_OPS.some((kw) => nameLower.includes(kw))) {\n return 'RETRIEVER';\n }\n return 'VECTOR_STORE';\n }\n\n // Generic retrieval\n if (['retriev', 'search', 'query'].some((kw) => nameLower.includes(kw))) {\n return 'RETRIEVER';\n }\n\n // Reranker\n if (nameLower.includes('rerank')) {\n return 'RERANKER';\n }\n\n // Agent\n if (nameLower.includes('agent')) {\n return 'AGENT';\n }\n\n // Tool/function\n if (['tool', 'function'].some((kw) => nameLower.includes(kw))) {\n return 'TOOL';\n }\n\n // Guardrail\n if (['guardrail', 'validate', 'moderate', 'safety'].some((kw) => nameLower.includes(kw))) {\n return 'GUARDRAIL';\n }\n\n // Evaluator\n if (['evaluat', 'score', 'metric'].some((kw) => nameLower.includes(kw))) {\n return 'EVALUATOR';\n }\n\n // Default\n return 'CHAIN';\n}\n","{\n \"openai\": {\n \"chat.completions\": {\n \"gpt-5.2\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-5.1\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-5\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-5-mini\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0\n },\n \"gpt-5-nano\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0\n },\n \"gpt-4.1\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-4.1-mini\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0\n },\n \"gpt-4o\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-4o-mini\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0\n },\n \"o4-mini\": {\n \"max_completion_tokens\": null\n },\n \"o3\": {\n \"max_completion_tokens\": null\n },\n \"o3-mini\": {\n \"max_completion_tokens\": null\n },\n \"o1\": {\n \"max_completion_tokens\": null\n },\n \"o1-mini\": {\n \"max_completion_tokens\": null\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"stream\": false\n }\n },\n \"embeddings\": {\n \"_default\": {\n \"encoding_format\": \"float\",\n \"dimensions\": null\n }\n }\n },\n \"anthropic\": {\n \"messages\": {\n \"claude-opus-4-6\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-opus-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-opus-4-1\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"claude-opus-4\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"claude-sonnet-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-sonnet-4\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-haiku-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-3-5-sonnet\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false,\n \"stop_sequences\": null\n },\n \"claude-3-5-haiku\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"claude-3-opus\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"claude-3-haiku\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"stream\": false\n }\n }\n },\n \"cohere\": {\n \"chat\": {\n \"_default\": {\n \"temperature\": 0.3,\n \"p\": 0.75,\n \"k\": 0,\n \"max_tokens\": null,\n \"safety_mode\": \"CONTEXTUAL\"\n }\n },\n \"generate\": {\n \"_default\": {\n \"temperature\": 0.9,\n \"p\": null,\n \"k\": 0,\n \"max_tokens\": null,\n \"safety_mode\": \"CONTEXTUAL\"\n }\n }\n },\n \"google\": {\n \"generateContent\": {\n \"gemini-2.5-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.5-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.0-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.0-flash-lite\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.0-flash-thinking\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 64,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.5-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.94,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"stop_sequences\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.5-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.0-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n }\n }\n },\n \"vertex_ai\": {\n \"generateContent\": {\n \"gemini-2.5-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.5-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.0-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.5-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.94,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.5-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n }\n }\n },\n \"bedrock\": {\n \"_note\": \"Claude Sonnet 4.5 and Haiku 4.5 on Bedrock: Use EITHER temperature OR top_p, not both\",\n \"messages\": {\n \"anthropic.claude-sonnet-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-haiku-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-3-5-sonnet-20241022\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-3-5-sonnet-20240620\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null,\n \"stop_sequences\": null\n },\n \"anthropic.claude-3-5-haiku-20241022\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-3-opus\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-3-haiku\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"meta.llama3\": {\n \"temperature\": 0.5,\n \"top_p\": 0.9,\n \"max_gen_len\": null\n },\n \"mistral.mistral-7b-instruct\": {\n \"temperature\": 0.5,\n \"top_p\": 0.9,\n \"top_k\": 50,\n \"max_tokens\": null\n },\n \"amazon.titan-text\": {\n \"temperature\": 0.7,\n \"topP\": 0.9,\n \"maxTokenCount\": null\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0\n }\n }\n },\n \"groq\": {\n \"chat.completions\": {\n \"llama-3.3-70b-versatile\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 1024,\n \"stream\": false\n },\n \"llama-3.1-70b-versatile\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 1024,\n \"stream\": false\n },\n \"mixtral-8x7b-32768\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 1024,\n \"stream\": false\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 1024,\n \"stream\": false\n }\n }\n },\n \"deepseek\": {\n \"chat.completions\": {\n \"deepseek-chat\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 4096,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"stream\": false\n },\n \"deepseek-reasoner\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"stream\": false\n }\n }\n },\n \"mistral\": {\n \"chat\": {\n \"mistral-large-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null,\n \"safe_prompt\": false\n },\n \"mistral-small-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"pixtral-large-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"pixtral-12b-2409\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"codestral-latest\": {\n \"temperature\": 0.0,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"ministral-8b-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"ministral-3b-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0\n }\n }\n },\n \"ollama\": {\n \"generate\": {\n \"_default\": {\n \"temperature\": 0.8,\n \"top_k\": 40,\n \"top_p\": 0.9,\n \"num_predict\": -1,\n \"repeat_penalty\": 1.1,\n \"stream\": false\n }\n },\n \"chat\": {\n \"_default\": {\n \"temperature\": 0.8,\n \"top_k\": 40,\n \"top_p\": 0.9,\n \"num_predict\": -1,\n \"stream\": false\n }\n }\n },\n \"together\": {\n \"chat.completions\": {\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 0.7,\n \"top_k\": 50,\n \"max_tokens\": 512,\n \"stream\": false\n }\n },\n \"completions\": {\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 0.7,\n \"top_k\": 50,\n \"max_tokens\": 128\n }\n }\n },\n \"replicate\": {\n \"predictions\": {\n \"meta/llama-2\": {\n \"temperature\": 0.75,\n \"top_p\": 0.9,\n \"max_new_tokens\": 500\n },\n \"meta/llama-3\": {\n \"temperature\": 0.75,\n \"top_p\": 0.9,\n \"max_new_tokens\": 500\n },\n \"_default\": {\n \"temperature\": 0.75,\n \"top_p\": 0.9\n }\n }\n },\n \"huggingface\": {\n \"text_generation\": {\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_new_tokens\": null,\n \"do_sample\": true\n }\n },\n \"conversational\": {\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_length\": null\n }\n }\n },\n \"azure_openai\": {\n \"chat.completions\": {\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false\n }\n }\n },\n \"aleph_alpha\": {\n \"completion\": {\n \"_default\": {\n \"temperature\": 0.0,\n \"top_p\": 0.0,\n \"top_k\": 0,\n \"maximum_tokens\": 64\n }\n }\n },\n \"watsonx\": {\n \"generate\": {\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"top_k\": 50,\n \"max_new_tokens\": 200\n }\n }\n },\n \"writer\": {\n \"completion\": {\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": 1024\n }\n }\n }\n}\n","/**\n * Model defaults enricher for invocation parameters.\n *\n * Loads defaults from config/model_defaults.json and intelligently merges\n * them with explicitly set parameters.\n */\n\nimport { getLogger } from '../core/logger.js';\nimport modelDefaultsConfig from './model_defaults.json';\n\nconst logger = getLogger();\n\n/**\n * Get default parameters for a specific provider/operation/model.\n */\nexport function getDefaults(\n provider: string,\n operation: string,\n model: string,\n): Record<string, any> {\n const defaultsData = modelDefaultsConfig as Record<string, any>;\n\n const providerData = defaultsData[provider.toLowerCase()] ?? {};\n const operationData = providerData[operation] ?? {};\n\n if (Object.keys(operationData).length === 0) {\n return {};\n }\n\n // Exact match\n if (model in operationData) {\n return { ...operationData[model] };\n }\n\n // Prefix match\n for (const [modelKey, defaults] of Object.entries(operationData)) {\n if (modelKey !== '_default' && model.startsWith(modelKey)) {\n logger.debug(`Matched model '${model}' to defaults for '${modelKey}'`);\n return { ...(defaults as Record<string, any>) };\n }\n }\n\n // Default fallback\n if ('_default' in operationData) {\n logger.debug(`Using _default for ${provider}/${operation}/${model}`);\n return { ...operationData._default };\n }\n\n return {};\n}\n\n/**\n * Enrich invocation parameters with model defaults.\n *\n * Merges default parameters from model_defaults.json with explicitly captured\n * parameters. Explicit parameters always take precedence.\n *\n * Modifies mergedAttrs in-place.\n */\nexport function enrichInvocationParameters(\n mergedAttrs: Record<string, any>,\n enableEnrichment = true,\n): void {\n if (!enableEnrichment) return;\n\n const spanKind = mergedAttrs['openinference.span.kind'];\n if (spanKind !== 'LLM' && spanKind !== 'EMBEDDING') return;\n\n const provider = (mergedAttrs['llm.system'] ?? '').toLowerCase();\n const model =\n spanKind === 'EMBEDDING'\n ? mergedAttrs['embedding.model_name'] ?? ''\n : mergedAttrs['llm.model_name'] ?? '';\n\n if (!provider || !model) return;\n\n let operation: string | undefined;\n if (spanKind === 'LLM') {\n operation = provider === 'openai' ? 'chat.completions' : 'messages';\n } else if (spanKind === 'EMBEDDING') {\n operation = 'embeddings';\n }\n\n if (!operation) return;\n\n const defaults = getDefaults(provider, operation, model);\n if (Object.keys(defaults).length === 0) {\n logger.debug(`No defaults found for ${provider}/${operation}/${model}`);\n return;\n }\n\n const existingParamsStr = mergedAttrs['llm.invocation_parameters'] ?? '{}';\n let existingParams: Record<string, any>;\n try {\n existingParams =\n typeof existingParamsStr === 'string'\n ? JSON.parse(existingParamsStr)\n : existingParamsStr;\n } catch {\n existingParams = {};\n }\n\n const enrichedParams = { ...defaults, ...existingParams };\n mergedAttrs['llm.invocation_parameters'] = JSON.stringify(enrichedParams);\n\n logger.debug(\n `Enriched params for ${provider}/${model}: added ${Object.keys(defaults).length} defaults`,\n );\n}\n","/**\n * Unified Attribute Processor — the core normalization pipeline.\n *\n * Port of Python neatlogs/core/attribute_processor.py\n *\n * Receives a span dict (already serialized from an OTel ReadableSpan) and\n * produces a normalized dict with neatlogs.* attributes.\n *\n * The processor handles three conventions:\n * - OpenInference (llm.*, embedding.*, openinference.*)\n * - OpenLLMetry (gen_ai.*, traceloop.*)\n * - Raw OTel (http.*, db.*, etc.)\n */\n\nimport { getLogger } from './logger.js';\nimport { enrichWithScopeDetection } from './instrumentation-scope-parser.js';\nimport { inferSpanKindFromName } from '../span-kinds/mapping.js';\nimport { enrichInvocationParameters } from '../config/defaults-enricher.js';\nimport { VECTOR_DB_SYSTEMS, RETRIEVAL_OPS, WRITE_OPS } from '../span-kinds/constants.js';\nimport type { AttributeMapper } from '../config/attribute-mapper.js';\n\nconst logger = getLogger();\n\n// ────────────────────────────────────────────────────────\n// Regular expressions\n// ────────────────────────────────────────────────────────\n\n/** Matches Python object repr strings like `<function BaseTool.<lambda> at 0x110107be0>` */\nconst PYTHON_REPR_RE = /^<[A-Za-z_].*?\\bat\\s+0x[0-9a-fA-F]+>$/;\n\n// Tool-call extraction from OpenInference output messages\nconst OI_TOOL_RE =\n /^llm\\.output_messages\\.(\\d+)\\.message\\.tool_calls\\.(\\d+)\\.tool_call\\.function\\.(name|arguments)$/;\nconst OI_TOOL_ID_RE =\n /^llm\\.output_messages\\.(\\d+)\\.message\\.tool_calls\\.(\\d+)\\.tool_call\\.id$/;\n\n// Tool definitions\nconst OI_SCHEMA_RE = /^llm\\.tools\\.(\\d+)\\.tool\\.json_schema$/;\nconst OL_FN_RE = /^llm\\.request\\.functions\\.(\\d+)\\.(name|description|input_schema)$/;\n\n// Input message tool fields\nconst INPUT_MSG_TOOL_RE = /^llm\\.input_messages\\.(\\d+)\\.message\\.(tool_call_id|name)$/;\n\n// Maps neatlogs.provider → neatlogs.llm.system\nconst PROVIDER_TO_SYSTEM: Record<string, string> = {\n openai: 'openai',\n azure: 'openai',\n azure_openai: 'openai',\n anthropic: 'anthropic',\n cohere: 'cohere',\n mistral: 'mistralai',\n mistralai: 'mistralai',\n google: 'google',\n vertex_ai: 'vertexai',\n groq: 'groq',\n xai: 'xai',\n deepseek: 'deepseek',\n};\n\n// ────────────────────────────────────────────────────────\n// Helpers\n// ────────────────────────────────────────────────────────\n\nfunction isPythonRepr(s: string): boolean {\n return PYTHON_REPR_RE.test(s.trim());\n}\n\n/** Recursively remove Python object repr strings from a parsed JSON structure. */\nfunction cleanPythonReprs(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n\n if (Array.isArray(obj)) {\n return obj\n .filter((item) => !(typeof item === 'string' && isPythonRepr(item)))\n .map((item) => cleanPythonReprs(item));\n }\n\n if (typeof obj === 'object') {\n const cleaned: Record<string, any> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (typeof v === 'string' && isPythonRepr(v)) continue;\n cleaned[k] = cleanPythonReprs(v);\n }\n return cleaned;\n }\n\n return obj;\n}\n\nfunction safeParse(val: string): any {\n try {\n return JSON.parse(val);\n } catch {\n return undefined;\n }\n}\n\nfunction safeStringify(val: any): string {\n try {\n return JSON.stringify(val);\n } catch {\n return String(val);\n }\n}\n\n// ────────────────────────────────────────────────────────\n// Span dict shape\n// ────────────────────────────────────────────────────────\n\nexport interface SpanDict {\n name: string;\n kind: number | string;\n trace_id: string;\n span_id: string;\n parent_span_id?: string | null;\n start_time: number | string;\n end_time: number | string;\n status?: { code?: number | string; message?: string };\n attributes: Record<string, any>;\n resource?: Record<string, any>;\n instrumentation_scope?: { name?: string; version?: string } | null;\n events?: Array<{\n name: string;\n timestamp: number | string;\n attributes: Record<string, any>;\n }>;\n}\n\n// ────────────────────────────────────────────────────────\n// UnifiedAttributeProcessor\n// ────────────────────────────────────────────────────────\n\nexport class UnifiedAttributeProcessor {\n private mapper: AttributeMapper;\n private debug: boolean;\n\n constructor(mapper: AttributeMapper, debug = false) {\n this.mapper = mapper;\n this.debug = debug;\n }\n\n // ── Public entry point ──────────────────────────────\n\n /**\n * Normalize a raw span dict into the neatlogs.* namespace.\n *\n * Steps:\n * 1. Merge resource + span attributes\n * 2. Detect framework/provider/platform from instrumentation scope\n * 3. Normalize vendor conventions (tool calls, tool defs, MCP, vector DB, etc.)\n * 4. Extract operational metrics (duration, TTFT)\n * 5. Upcycle events (retriever docs, embedding dimensions)\n * 6. Enrich invocation parameters with model defaults\n * 7. Apply namespace mapping via AttributeMapper\n * 8. Fill provider / system gaps\n * 9. Add intermediate ReAct steps\n * 10. Filter embedding vectors if applicable\n */\n normalize(spanDict: SpanDict): Record<string, any> {\n // 1. Merge resource + span attributes\n const resAttrs = spanDict.resource ?? {};\n const attrs: Record<string, any> = { ...resAttrs, ...spanDict.attributes };\n\n // Add span name for downstream processing\n attrs['_span_name'] = spanDict.name;\n\n // 2. Detect framework/provider/platform from instrumentation scope\n const scopeName = spanDict.instrumentation_scope?.name ?? null;\n enrichWithScopeDetection(attrs, scopeName, null);\n\n if (this.debug) {\n logger.debug(\n `[ScopeDetection] trace_id=${spanDict.trace_id} span_id=${spanDict.span_id} ` +\n `span_name=${spanDict.name} scope=${scopeName} ` +\n `framework=${attrs['neatlogs.framework'] ?? ''} ` +\n `provider=${attrs['neatlogs.provider'] ?? ''} ` +\n `platform=${attrs['neatlogs.platform'] ?? ''}`,\n );\n }\n\n // 3. Normalize vendor conventions\n this.normalizeConventions(spanDict, attrs);\n\n // 4. Extract operational metrics\n const computedMetrics = this.extractOperationalMetrics(spanDict, attrs);\n Object.assign(attrs, computedMetrics);\n\n // 5. Upcycle events\n const eventAttrs = this.upcycleEvents(spanDict);\n Object.assign(attrs, eventAttrs);\n\n // 6. Enrich invocation parameters\n try {\n enrichInvocationParameters(attrs, true);\n } catch (e: any) {\n logger.warn(`Failed to enrich invocation parameters: ${e?.message ?? e}`);\n }\n\n // 7. Apply namespace mapping\n const unified = this.applyNamespaceMapping(attrs);\n\n // 8. Add intermediate ReAct steps\n this.addIntermediateSteps(unified);\n\n // 9. Filter embedding vectors\n const spanKind = (unified['neatlogs.span.kind'] ?? '').toLowerCase();\n if (spanKind === 'embedding' || spanKind === 'vector_store') {\n return this.filterEmbeddingVectors(unified);\n }\n\n return unified;\n }\n\n // ── Convention normalization ────────────────────────\n\n private normalizeConventions(spanDict: SpanDict, attrs: Record<string, any>): void {\n // Detect HTTP spans\n if (this.isHttpLikeSpanKind(spanDict.kind) && this.looksLikeHttp(attrs)) {\n attrs['openinference.span.kind'] = 'HTTP';\n }\n\n // CrewAI fallback: if no span kind and has crewai.crew.* attrs → CHAIN\n if (\n !('openinference.span.kind' in attrs) &&\n Object.keys(attrs).some((k) => k.startsWith('crewai.crew.'))\n ) {\n attrs['openinference.span.kind'] = 'CHAIN';\n }\n\n // CrewAI token usage fallback\n this.addCrewaiTokenUsageFallback(attrs);\n\n // Reasoning tokens from output.value\n this.addReasoningTokensFromOutputValue(attrs);\n\n // CrewAI kickoff telemetry\n this.addCrewaiKickoffTelemetry(attrs);\n\n // Vercel AI SDK ai.* normalization MUST run before extractToolCalls so\n // the exploded llm.output_messages.0.message.tool_calls.* keys get\n // collapsed into the canonical llm.tool_calls.{i}.* shape that\n // attribute-mapping.json understands.\n this.extractVercelAiSdkAttrs(attrs);\n\n // Extract tool calls from output messages (OpenInference format)\n this.extractToolCalls(attrs);\n\n // Extract tool_call_id and name from input messages (tool response messages)\n for (const [k, v] of Object.entries(attrs)) {\n const m = INPUT_MSG_TOOL_RE.exec(k);\n if (m) {\n const [, msgIdx, field] = m;\n attrs[`llm.input_messages.${msgIdx}.${field}`] = v;\n }\n }\n\n // Extract invalid_tool_calls from output\n this.extractInvalidToolCalls(attrs);\n\n // Extract tool_call_id from tool output (for TOOL kind spans)\n this.extractToolCallIdFromOutput(attrs);\n\n // Extract tool definitions\n this.extractToolDefinitions(attrs);\n\n // Detect vector DB span kind from db.system\n this.detectVectorDbSpanKind(attrs);\n\n // Parse traceloop.entity.input for MCP signals\n this.parseMcpFromTraceloop(attrs);\n\n // Process MCP-specific signals\n this.processMcpSignals(attrs);\n\n // Handle EMBEDDING spans\n this.handleEmbeddingSpans(attrs);\n\n // Handle vector DB doc attributes\n this.handleVectorDbDocAttributes(attrs);\n\n // Extract LangChain metadata (ls_*) into standard positions\n this.extractLangchainMetadata(attrs);\n }\n\n private extractToolCalls(attrs: Record<string, any>): void {\n const toolCalls: Record<number, Record<string, any>> = {};\n const keysToRemove: string[] = [];\n\n for (const [k, v] of Object.entries(attrs)) {\n let m = OI_TOOL_RE.exec(k);\n if (m) {\n const [, , callIdxStr, field] = m;\n const idx = parseInt(callIdxStr, 10);\n if (!toolCalls[idx]) toolCalls[idx] = {};\n toolCalls[idx][field] = v;\n keysToRemove.push(k);\n continue;\n }\n\n m = OI_TOOL_ID_RE.exec(k);\n if (m) {\n const [, , callIdxStr] = m;\n const idx = parseInt(callIdxStr, 10);\n if (!toolCalls[idx]) toolCalls[idx] = {};\n toolCalls[idx]['id'] = v;\n keysToRemove.push(k);\n continue;\n }\n }\n\n for (const idx of Object.keys(toolCalls).map(Number).sort((a, b) => a - b)) {\n const tc = toolCalls[idx];\n if (tc.id !== undefined) attrs[`llm.tool_calls.${idx}.id`] = tc.id;\n if (tc.name !== undefined) attrs[`llm.tool_calls.${idx}.name`] = tc.name;\n if (tc.arguments !== undefined) attrs[`llm.tool_calls.${idx}.arguments`] = tc.arguments;\n }\n\n for (const k of keysToRemove) {\n delete attrs[k];\n }\n }\n\n private extractInvalidToolCalls(attrs: Record<string, any>): void {\n const llmOutput = attrs['llm.output'] ?? attrs['output.value'];\n if (!llmOutput || typeof llmOutput !== 'string') return;\n\n try {\n const outputData = JSON.parse(llmOutput);\n if (typeof outputData === 'object' && outputData !== null && !Array.isArray(outputData)) {\n const generations = outputData.generations;\n if (\n Array.isArray(generations) &&\n generations.length > 0 &&\n Array.isArray(generations[0]) &&\n generations[0].length > 0\n ) {\n const message = generations[0][0]?.message;\n const invalidCalls = message?.invalid_tool_calls;\n if (Array.isArray(invalidCalls) && invalidCalls.length > 0) {\n attrs['llm.invalid_tool_calls'] = JSON.stringify(invalidCalls);\n }\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n private extractToolCallIdFromOutput(attrs: Record<string, any>): void {\n const toolOutput = attrs['tool.output'] ?? attrs['output.value'];\n if (!toolOutput || typeof toolOutput !== 'string') return;\n\n try {\n const outputData = JSON.parse(toolOutput);\n if (typeof outputData === 'object' && outputData !== null && !Array.isArray(outputData)) {\n const toolCallId = outputData.tool_call_id ?? outputData.toolCallId;\n if (toolCallId) {\n attrs['tool_call_id'] = toolCallId;\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n private extractToolDefinitions(attrs: Record<string, any>): void {\n const toolDefs: Record<number, Record<string, any>> = {};\n const keysToRemove: string[] = [];\n\n for (const [k, v] of Object.entries(attrs)) {\n let m = OL_FN_RE.exec(k);\n if (m) {\n const [, idxStr, field] = m;\n const idx = parseInt(idxStr, 10);\n if (!toolDefs[idx]) toolDefs[idx] = {};\n toolDefs[idx][field] = v;\n keysToRemove.push(k);\n continue;\n }\n\n m = OI_SCHEMA_RE.exec(k);\n if (m) {\n const idx = parseInt(m[1], 10);\n let schema = v;\n if (typeof schema === 'string') {\n schema = safeParse(schema) ?? null;\n }\n if (typeof schema === 'object' && schema !== null) {\n if (!toolDefs[idx]) toolDefs[idx] = {};\n const td = toolDefs[idx];\n if (!td.name) td.name = schema.name;\n if (!td.description) td.description = schema.description;\n if (!td.input_schema) td.input_schema = schema.input_schema ?? schema.parameters;\n }\n keysToRemove.push(k);\n }\n }\n\n for (const idx of Object.keys(toolDefs).map(Number).sort((a, b) => a - b)) {\n const td = toolDefs[idx];\n if (td.name !== undefined && td.name !== null) {\n if (!('llm.tools.' + idx + '.name' in attrs)) {\n attrs[`llm.tools.${idx}.name`] = td.name;\n }\n }\n if (td.description !== undefined && td.description !== null) {\n if (!('llm.tools.' + idx + '.description' in attrs)) {\n attrs[`llm.tools.${idx}.description`] = td.description;\n }\n }\n if (td.input_schema !== undefined && td.input_schema !== null) {\n let val = td.input_schema;\n if (typeof val !== 'string') {\n val = safeStringify(val);\n }\n if (!('llm.tools.' + idx + '.input_schema' in attrs)) {\n attrs[`llm.tools.${idx}.input_schema`] = val;\n }\n }\n }\n\n for (const k of keysToRemove) {\n delete attrs[k];\n }\n }\n\n private detectVectorDbSpanKind(attrs: Record<string, any>): void {\n if ('openinference.span.kind' in attrs) return;\n\n const dbSystem = attrs['db.system'];\n if (typeof dbSystem !== 'string') return;\n\n if (!VECTOR_DB_SYSTEMS.has(dbSystem.toLowerCase())) return;\n\n const dbOperation = (attrs['db.operation'] ?? '').toLowerCase();\n const spanName = (attrs['_span_name'] ?? '').toLowerCase();\n\n let isRetrieval = false;\n if (dbOperation) {\n isRetrieval = RETRIEVAL_OPS.some((op) => dbOperation.includes(op));\n } else {\n isRetrieval = RETRIEVAL_OPS.some((op) => spanName.includes(op));\n }\n\n attrs['openinference.span.kind'] = isRetrieval ? 'RETRIEVER' : 'VECTOR_STORE';\n }\n\n private parseMcpFromTraceloop(attrs: Record<string, any>): void {\n const rawInput = attrs['traceloop.entity.input'];\n if (rawInput === undefined || rawInput === null) return;\n\n try {\n const entityInput = typeof rawInput === 'string' ? JSON.parse(rawInput) : rawInput;\n if (typeof entityInput !== 'object' || entityInput === null || Array.isArray(entityInput))\n return;\n\n if ('method' in entityInput) {\n attrs['mcp.method.name'] = entityInput.method;\n }\n if ('params' in entityInput) {\n attrs['mcp.request.argument'] = JSON.stringify(entityInput.params);\n }\n if ('tool_name' in entityInput) {\n attrs['mcp.tool.name'] = entityInput.tool_name;\n if (\n 'arguments' in entityInput &&\n typeof entityInput.arguments === 'object' &&\n entityInput.arguments !== null\n ) {\n attrs['mcp.tool.arguments'] = JSON.stringify(entityInput.arguments);\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n private processMcpSignals(attrs: Record<string, any>): void {\n const hasMcpSignal =\n (typeof attrs['mcp.method.name'] === 'string' && !!attrs['mcp.method.name']) ||\n (typeof attrs['mcp.tool.name'] === 'string' && !!attrs['mcp.tool.name']) ||\n 'mcp.request.argument' in attrs ||\n 'mcp.tool.arguments' in attrs;\n\n if (hasMcpSignal && 'traceloop.entity.output' in attrs && !('mcp.response.value' in attrs)) {\n attrs['mcp.response.value'] = attrs['traceloop.entity.output'];\n }\n\n // MCP initialize response\n if (attrs['mcp.method.name'] === 'initialize' && 'traceloop.entity.output' in attrs) {\n try {\n const output =\n typeof attrs['traceloop.entity.output'] === 'string'\n ? JSON.parse(attrs['traceloop.entity.output'])\n : attrs['traceloop.entity.output'];\n\n if (output && typeof output === 'object') {\n if ('protocolVersion' in output) {\n attrs['mcp.protocol_version'] = output.protocolVersion;\n }\n if ('serverInfo' in output && typeof output.serverInfo === 'object') {\n const info = output.serverInfo;\n attrs['mcp.server.name'] = info.name ?? '';\n attrs['mcp.server.version'] = info.version ?? '';\n }\n if ('capabilities' in output) {\n attrs['mcp.server.capabilities'] = JSON.stringify(output.capabilities).slice(0, 2000);\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n // MCP tools/list response\n if (attrs['mcp.method.name'] === 'tools/list' && 'traceloop.entity.output' in attrs) {\n try {\n const output =\n typeof attrs['traceloop.entity.output'] === 'string'\n ? JSON.parse(attrs['traceloop.entity.output'])\n : attrs['traceloop.entity.output'];\n\n if (output && typeof output === 'object' && Array.isArray(output.tools)) {\n const tools: any[] = output.tools;\n attrs['mcp.tools.count'] = tools.length;\n const toolNames = tools.filter((t) => 'name' in t).map((t) => t.name);\n attrs['mcp.tools.names'] = JSON.stringify(toolNames);\n }\n } catch {\n // ignore parse errors\n }\n }\n }\n\n private handleEmbeddingSpans(attrs: Record<string, any>): void {\n const spanKind = (attrs['openinference.span.kind'] ?? '').toUpperCase();\n if (spanKind !== 'EMBEDDING') return;\n\n const embeddings: Array<{ index: number; text: any }> = [];\n for (const [key, value] of Object.entries(attrs)) {\n if (key.startsWith('embedding.embeddings.') && key.endsWith('.embedding.text')) {\n const parts = key.split('.');\n if (parts.length >= 3) {\n const index = parseInt(parts[2], 10);\n if (!isNaN(index)) {\n embeddings.push({ index, text: value });\n }\n }\n }\n }\n\n if (embeddings.length > 0) {\n embeddings.sort((a, b) => a.index - b.index);\n attrs['embeddings_data'] = JSON.stringify(embeddings);\n }\n\n // Only skip output if it's a REAL embedding operation from OpenLLMetry\n const hasEmbeddingAttrs = Object.keys(attrs).some(\n (k) => k.startsWith('embedding.') || k.startsWith('gen_ai.embedding'),\n );\n if (hasEmbeddingAttrs) {\n attrs['neatlogs._skip_output_value'] = true;\n }\n }\n\n /**\n * Extract vendor-specific keys from attrs into a plain object,\n * mapping each source key to a short target name.\n */\n private _extractKeys(\n attrs: Record<string, any>,\n keyMap: Record<string, string>,\n ): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [srcKey, tgtName] of Object.entries(keyMap)) {\n if (srcKey in attrs) {\n result[tgtName] = attrs[srcKey];\n }\n }\n return result;\n }\n\n private handleVectorDbDocAttributes(attrs: Record<string, any>): void {\n const dbSystem = (attrs['db.system'] ?? '').toLowerCase();\n\n if (dbSystem === 'chroma') {\n const docKeyMap: Record<string, string> = {\n 'db.chroma.add.ids_count': 'ids_count',\n 'db.chroma.add.embeddings_count': 'embeddings_count',\n 'db.chroma.add.metadatas_count': 'metadatas_count',\n 'db.chroma.add.documents_count': 'documents_count',\n 'db.chroma.upsert.ids_count': 'ids_count',\n 'db.chroma.upsert.embeddings_count': 'embeddings_count',\n 'db.chroma.upsert.metadatas_count': 'metadatas_count',\n 'db.chroma.upsert.documents_count': 'documents_count',\n 'db.chroma.query.n_results': 'requested_top_k',\n 'db.chroma.query.include': 'include',\n };\n const docAttrs = this._extractKeys(attrs, docKeyMap);\n if (Object.keys(docAttrs).length > 0) {\n attrs['document_attributes'] = JSON.stringify(docAttrs);\n }\n } else if (dbSystem === 'marqo') {\n const inputKeyMap: Record<string, string> = {\n 'marqo.limit': 'limit',\n 'marqo.hits_count': 'hits_count',\n 'marqo.filter': 'filter',\n };\n const inputParams = this._extractKeys(attrs, inputKeyMap);\n if (Object.keys(inputParams).length > 0) {\n attrs['retrieval_input_params'] = JSON.stringify(inputParams);\n }\n const docKeyMap: Record<string, string> = {\n 'marqo.document_count': 'document_count',\n 'marqo.items_processed': 'items_processed',\n };\n const docAttrs = this._extractKeys(attrs, docKeyMap);\n if (Object.keys(docAttrs).length > 0) {\n attrs['document_attributes'] = JSON.stringify(docAttrs);\n }\n } else if (dbSystem === 'qdrant') {\n const docKeyMap: Record<string, string> = {\n 'qdrant.upsert.points_count': 'points_count',\n };\n const docAttrs = this._extractKeys(attrs, docKeyMap);\n if (Object.keys(docAttrs).length > 0) {\n attrs['document_attributes'] = JSON.stringify(docAttrs);\n }\n } else if (dbSystem === 'milvus') {\n const docKeyMap: Record<string, string> = {\n 'db.milvus.insert.data_count': 'insert.data_count',\n 'db.milvus.search.data_count': 'search.data_count',\n 'db.milvus.search.limit': 'search.limit',\n 'db.milvus.search.output_fields_count': 'search.output_fields_count',\n 'db.milvus.search.result_count': 'search.result_count',\n 'db.milvus.search.filter': 'search.filter',\n };\n const docAttrs = this._extractKeys(attrs, docKeyMap);\n if (Object.keys(docAttrs).length > 0) {\n attrs['document_attributes'] = JSON.stringify(docAttrs);\n }\n }\n }\n\n // ── LangChain metadata extraction ───────────────────\n\n /**\n * LangChain instrumentation puts model info in `metadata` as a JSON string\n * with `ls_provider`, `ls_model_name`, `ls_temperature`, `ls_max_tokens`.\n * Extract these into standard positions when the standard attributes are missing.\n */\n private extractLangchainMetadata(attrs: Record<string, any>): void {\n const raw = attrs['metadata'];\n if (!raw || typeof raw !== 'string') return;\n\n let meta: Record<string, any>;\n try {\n meta = JSON.parse(raw);\n } catch {\n return;\n }\n if (typeof meta !== 'object' || meta === null) return;\n\n // ls_model_name → llm.model_name\n if (meta.ls_model_name && !attrs['llm.model_name']) {\n attrs['llm.model_name'] = meta.ls_model_name;\n }\n\n // ls_provider → llm.system (used by defaults enricher and provider detection)\n if (meta.ls_provider && !attrs['llm.system']) {\n const providerMap: Record<string, string> = {\n google_genai: 'google',\n openai: 'openai',\n anthropic: 'anthropic',\n };\n attrs['llm.system'] = providerMap[meta.ls_provider] ?? meta.ls_provider;\n }\n\n // ls_temperature / ls_max_tokens → merge into invocation_parameters\n const hasTemp = meta.ls_temperature !== undefined;\n const hasMaxTokens = meta.ls_max_tokens !== undefined;\n if (hasTemp || hasMaxTokens) {\n let existing: Record<string, any> = {};\n try {\n existing = JSON.parse(attrs['llm.invocation_parameters'] ?? '{}');\n } catch {\n existing = {};\n }\n if (hasTemp && !('temperature' in existing)) {\n existing['temperature'] = meta.ls_temperature;\n }\n if (hasMaxTokens && !('max_tokens' in existing)) {\n existing['max_tokens'] = meta.ls_max_tokens;\n }\n // Also inject model if missing\n if (meta.ls_model_name && !('model' in existing)) {\n existing['model'] = meta.ls_model_name;\n }\n attrs['llm.invocation_parameters'] = JSON.stringify(existing);\n }\n }\n\n // ── Vercel AI SDK extraction ───────────────────────\n\n /**\n * The Vercel AI SDK emits its own `ai.*` namespace alongside `gen_ai.*`. Map\n * the AI-SDK-specific keys onto the canonical `llm.*` / `gen_ai.*` / `tool.*`\n * keys that the existing pipeline already understands. Span-kind inference\n * runs first so downstream `applyNamespaceMapping` resolves it correctly.\n */\n private extractVercelAiSdkAttrs(attrs: Record<string, any>): void {\n const spanName: string = attrs['_span_name'] ?? '';\n const isAiSdkSpan =\n spanName.startsWith('ai.') ||\n 'ai.model.id' in attrs ||\n 'ai.toolCall.name' in attrs;\n\n if (!isAiSdkSpan) return;\n\n // Span-kind inference (only when not already set)\n if (!('openinference.span.kind' in attrs)) {\n if (spanName === 'ai.toolCall') {\n attrs['openinference.span.kind'] = 'TOOL';\n } else if (spanName.startsWith('ai.embed')) {\n attrs['openinference.span.kind'] = 'EMBEDDING';\n } else if (spanName.startsWith('ai.rerank')) {\n attrs['openinference.span.kind'] = 'RERANKER';\n } else if (spanName.endsWith('.doStream') || spanName.endsWith('.doGenerate') || spanName.endsWith('.doRerank') || spanName.endsWith('.doEmbed')) {\n // Actual provider API calls (ai.streamText.doStream, ai.generateText.doGenerate, etc.)\n if (spanName.includes('embed')) {\n attrs['openinference.span.kind'] = 'EMBEDDING';\n } else if (spanName.includes('rerank')) {\n attrs['openinference.span.kind'] = 'RERANKER';\n } else {\n attrs['openinference.span.kind'] = 'LLM';\n }\n } else if (spanName === 'ai.generateText' || spanName === 'ai.streamText' || spanName === 'ai.generateObject' || spanName === 'ai.streamObject') {\n // Top-level AI SDK orchestration spans (multi-step loops)\n attrs['openinference.span.kind'] = 'CHAIN';\n }\n }\n\n // Model id / provider\n if ('ai.model.id' in attrs && !('llm.model_name' in attrs)) {\n attrs['llm.model_name'] = attrs['ai.model.id'];\n }\n if ('ai.model.provider' in attrs && !('llm.provider' in attrs)) {\n // ai.model.provider is e.g. \"openai.chat\" — take the leading segment\n const raw = String(attrs['ai.model.provider']);\n attrs['llm.provider'] = raw.split('.')[0];\n }\n\n // Token usage\n if ('ai.usage.promptTokens' in attrs && !('llm.token_count.prompt' in attrs)) {\n attrs['llm.token_count.prompt'] = attrs['ai.usage.promptTokens'];\n }\n if ('ai.usage.completionTokens' in attrs && !('llm.token_count.completion' in attrs)) {\n attrs['llm.token_count.completion'] = attrs['ai.usage.completionTokens'];\n }\n if ('ai.usage.totalTokens' in attrs && !('llm.token_count.total' in attrs)) {\n attrs['llm.token_count.total'] = attrs['ai.usage.totalTokens'];\n }\n\n // Settings → gen_ai.request.*\n const settingMap: Record<string, string> = {\n 'ai.settings.temperature': 'gen_ai.request.temperature',\n 'ai.settings.maxTokens': 'gen_ai.request.max_tokens',\n 'ai.settings.topP': 'gen_ai.request.top_p',\n 'ai.settings.topK': 'gen_ai.request.top_k',\n 'ai.settings.frequencyPenalty': 'gen_ai.request.frequency_penalty',\n 'ai.settings.presencePenalty': 'gen_ai.request.presence_penalty',\n 'ai.settings.stopSequences': 'gen_ai.request.stop_sequences',\n };\n for (const [src, tgt] of Object.entries(settingMap)) {\n if (src in attrs && !(tgt in attrs)) {\n attrs[tgt] = attrs[src];\n }\n }\n\n // Build llm.invocation_parameters from gen_ai.request.* if not already set\n if (!('llm.invocation_parameters' in attrs)) {\n const params: Record<string, any> = {};\n if ('gen_ai.request.temperature' in attrs) params.temperature = attrs['gen_ai.request.temperature'];\n if ('gen_ai.request.max_tokens' in attrs) params.max_tokens = attrs['gen_ai.request.max_tokens'];\n if ('gen_ai.request.top_p' in attrs) params.top_p = attrs['gen_ai.request.top_p'];\n if ('gen_ai.request.top_k' in attrs) params.top_k = attrs['gen_ai.request.top_k'];\n if ('gen_ai.request.frequency_penalty' in attrs) params.frequency_penalty = attrs['gen_ai.request.frequency_penalty'];\n if ('gen_ai.request.presence_penalty' in attrs) params.presence_penalty = attrs['gen_ai.request.presence_penalty'];\n if ('gen_ai.request.stop_sequences' in attrs) params.stop_sequences = attrs['gen_ai.request.stop_sequences'];\n if (Object.keys(params).length > 0) {\n attrs['llm.invocation_parameters'] = JSON.stringify(params);\n }\n }\n\n // Operation id → gen_ai.operation.name (helps RERANKER detection)\n if ('ai.operationId' in attrs && !('gen_ai.operation.name' in attrs)) {\n attrs['gen_ai.operation.name'] = attrs['ai.operationId'];\n }\n\n // Response text → output message 0\n if (\n 'ai.response.text' in attrs &&\n !('llm.output_messages.0.message.content' in attrs)\n ) {\n attrs['llm.output_messages.0.message.role'] = 'assistant';\n attrs['llm.output_messages.0.message.content'] = attrs['ai.response.text'];\n }\n\n // Response finish reason / id\n if ('ai.response.finishReason' in attrs && !('llm.response.finish_reason' in attrs)) {\n attrs['llm.response.finish_reason'] = attrs['ai.response.finishReason'];\n }\n if ('ai.response.id' in attrs && !('gen_ai.response.id' in attrs)) {\n attrs['gen_ai.response.id'] = attrs['ai.response.id'];\n }\n\n // Prompt messages → exploded indexed keys\n const rawMessages = attrs['ai.prompt.messages'];\n if (typeof rawMessages === 'string') {\n try {\n const parsed = JSON.parse(rawMessages);\n if (Array.isArray(parsed)) {\n parsed.forEach((msg, i) => {\n if (msg && typeof msg === 'object') {\n if (typeof msg.role === 'string') {\n attrs[`llm.input_messages.${i}.message.role`] = msg.role;\n }\n if (typeof msg.content === 'string') {\n attrs[`llm.input_messages.${i}.message.content`] = msg.content;\n } else if (msg.content !== undefined) {\n attrs[`llm.input_messages.${i}.message.content`] = JSON.stringify(msg.content);\n }\n }\n });\n }\n } catch {\n // Leave the raw string in place if parse fails\n }\n }\n\n // Response toolCalls → exploded under output message 0\n const rawToolCalls = attrs['ai.response.toolCalls'];\n if (typeof rawToolCalls === 'string') {\n try {\n const parsed = JSON.parse(rawToolCalls);\n if (Array.isArray(parsed)) {\n parsed.forEach((tc, i) => {\n if (tc && typeof tc === 'object') {\n if (tc.toolName !== undefined) {\n attrs[`llm.output_messages.0.message.tool_calls.${i}.tool_call.function.name`] = tc.toolName;\n }\n if (tc.args !== undefined) {\n const argStr =\n typeof tc.args === 'string' ? tc.args : JSON.stringify(tc.args);\n attrs[`llm.output_messages.0.message.tool_calls.${i}.tool_call.function.arguments`] = argStr;\n }\n if (tc.toolCallId !== undefined) {\n attrs[`llm.output_messages.0.message.tool_calls.${i}.tool_call.id`] = tc.toolCallId;\n }\n }\n });\n }\n } catch {\n // Ignore parse failure\n }\n }\n\n // Embedding input: Vercel AI SDK JSON.stringify()s each value for OTel transport — unwrap\n if ('ai.value' in attrs && typeof attrs['ai.value'] === 'string') {\n try { attrs['ai.value'] = JSON.parse(attrs['ai.value']); } catch {}\n }\n if ('ai.values' in attrs && Array.isArray(attrs['ai.values'])) {\n attrs['ai.values'] = JSON.stringify(attrs['ai.values'].map((v: unknown) => {\n if (typeof v === 'string') { try { return JSON.parse(v); } catch {} }\n return v;\n }));\n }\n\n // Tool span attributes\n if (spanName === 'ai.toolCall') {\n if ('ai.toolCall.name' in attrs && !('tool.name' in attrs)) {\n attrs['tool.name'] = attrs['ai.toolCall.name'];\n }\n // Normalize args/result to JSON strings so downstream parsers\n // (e.g. extractToolCallIdFromOutput) can JSON.parse them safely.\n if ('ai.toolCall.args' in attrs && !('input.value' in attrs)) {\n const raw = attrs['ai.toolCall.args'];\n attrs['input.value'] = typeof raw === 'string' ? raw : JSON.stringify(raw);\n }\n if ('ai.toolCall.result' in attrs && !('output.value' in attrs)) {\n const raw = attrs['ai.toolCall.result'];\n attrs['output.value'] = typeof raw === 'string' ? raw : JSON.stringify(raw);\n }\n }\n }\n\n // ── CrewAI-specific ─────────────────────────────────\n\n private addCrewaiTokenUsageFallback(attrs: Record<string, any>): void {\n const usage = attrs['neatlogs.crew.token_usage'];\n if (typeof usage !== 'string' || !usage) return;\n\n if (\n 'llm.token_count.prompt' in attrs ||\n 'llm.token_count.completion' in attrs ||\n 'llm.token_count.total' in attrs\n ) {\n return;\n }\n\n const parsed: Record<string, number> = {};\n const re = /([a-zA-Z_]+)=(\\d+)/g;\n let match: RegExpExecArray | null;\n while ((match = re.exec(usage)) !== null) {\n parsed[match[1]] = parseInt(match[2], 10);\n }\n\n if ('prompt_tokens' in parsed) {\n attrs['llm.token_count.prompt'] = parsed['prompt_tokens'];\n }\n if ('completion_tokens' in parsed) {\n attrs['llm.token_count.completion'] = parsed['completion_tokens'];\n }\n if ('total_tokens' in parsed) {\n attrs['llm.token_count.total'] = parsed['total_tokens'];\n }\n if ('cached_prompt_tokens' in parsed) {\n attrs['llm.token_count.prompt_details.cache_read'] = parsed['cached_prompt_tokens'];\n }\n }\n\n private addReasoningTokensFromOutputValue(attrs: Record<string, any>): void {\n if ('llm.token_count.completion_details.reasoning' in attrs) return;\n if ('llm.usage.reasoning_tokens' in attrs) return;\n\n const outputValue = attrs['output.value'];\n if (typeof outputValue !== 'string') return;\n\n try {\n const parsed = JSON.parse(outputValue);\n const usage = parsed?.usage ?? {};\n const details = usage.completion_tokens_details ?? {};\n const reasoning = details.reasoning_tokens;\n if (reasoning && reasoning > 0) {\n attrs['llm.token_count.completion_details.reasoning'] = reasoning;\n }\n } catch {\n // ignore\n }\n }\n\n private addCrewaiKickoffTelemetry(attrs: Record<string, any>): void {\n const spanName = String(attrs['_span_name'] ?? '');\n if (!(spanName.startsWith('Crew_') && spanName.endsWith('.kickoff'))) return;\n\n if (!('crew_number_of_tasks' in attrs)) {\n const count = this.coerceCollectionCount(attrs['crew_tasks']);\n if (count !== null) {\n attrs['crew_number_of_tasks'] = count;\n }\n }\n\n if (!('crew_number_of_agents' in attrs)) {\n const count = this.coerceCollectionCount(attrs['crew_agents']);\n if (count !== null) {\n attrs['crew_number_of_agents'] = count;\n }\n }\n }\n\n private coerceCollectionCount(value: any): number | null {\n if (value === null || value === undefined) return null;\n\n if (typeof value === 'boolean') return value ? 1 : 0;\n if (typeof value === 'number') {\n return Number.isFinite(value) ? Math.floor(value) : null;\n }\n if (Array.isArray(value)) return value.length;\n if (typeof value === 'object' && value !== null) return Object.keys(value).length;\n\n if (typeof value === 'string') {\n const s = value.trim();\n if (!s) return null;\n\n // Direct integer string\n if (/^\\d+$/.test(s)) {\n return parseInt(s, 10);\n }\n\n // Try JSON parse\n try {\n const parsed = JSON.parse(s);\n if (Array.isArray(parsed)) return parsed.length;\n if (typeof parsed === 'object' && parsed !== null) return Object.keys(parsed).length;\n } catch {\n // ignore\n }\n }\n\n return null;\n }\n\n // ── Operational metrics ─────────────────────────────\n\n private extractOperationalMetrics(\n spanDict: SpanDict,\n attrs: Record<string, any>,\n ): Record<string, any> {\n const computed: Record<string, any> = {};\n\n const startTime =\n typeof spanDict.start_time === 'number' ? spanDict.start_time : Number(spanDict.start_time);\n const endTime =\n typeof spanDict.end_time === 'number' ? spanDict.end_time : Number(spanDict.end_time);\n\n const durationNs = endTime - startTime;\n computed['neatlogs.metrics.duration_ms'] = durationNs / 1_000_000;\n\n // Skip event-based TTFT computation if already set live by streaming patch\n if (attrs['neatlogs.llm.metrics.ttft_ms'] !== undefined) {\n return computed;\n }\n\n // Google GenAI emits \"gen_ai.content.chunk\" on every text chunk — use for TTFT\n const chunkTimestamps: number[] = [];\n if (spanDict.events) {\n for (const event of spanDict.events) {\n if (event.name === 'gen_ai.content.chunk') {\n const ts =\n typeof event.timestamp === 'number' ? event.timestamp : Number(event.timestamp);\n chunkTimestamps.push(ts);\n }\n }\n }\n\n if (chunkTimestamps.length > 0) {\n const firstNs = chunkTimestamps[0];\n const ttftMs = Math.round(((firstNs - startTime) / 1_000_000) * 1000) / 1000;\n computed['neatlogs.llm.metrics.ttft_ms'] = ttftMs;\n\n if (chunkTimestamps.length >= 2) {\n const lastNs = chunkTimestamps[chunkTimestamps.length - 1];\n const stgMs = Math.round(((lastNs - firstNs) / 1_000_000) * 1000) / 1000;\n computed['neatlogs.llm.metrics.streaming_time_to_generate_ms'] = stgMs;\n }\n }\n\n return computed;\n }\n\n // ── Event upcycling ─────────────────────────────────\n\n private upcycleEvents(spanDict: SpanDict): Record<string, any> {\n const upcycled: Record<string, any> = {};\n const retrieverDocs: Array<Record<string, any>> = [];\n\n if (!spanDict.events) return upcycled;\n\n for (const event of spanDict.events) {\n const eAttrs = event.attributes ?? {};\n\n if (event.name === 'db.query.result') {\n const doc: Record<string, any> = {\n timestamp: String(event.timestamp),\n };\n if ('db.query.result.id' in eAttrs) doc['id'] = eAttrs['db.query.result.id'];\n if ('db.query.result.distance' in eAttrs)\n doc['distance'] = eAttrs['db.query.result.distance'];\n if ('db.query.result.document' in eAttrs)\n doc['document'] = eAttrs['db.query.result.document'];\n if ('db.query.result.metadata' in eAttrs) {\n const metadata = eAttrs['db.query.result.metadata'];\n if (typeof metadata === 'string') {\n doc['metadata'] = safeParse(metadata) ?? String(metadata);\n } else {\n doc['metadata'] = metadata;\n }\n }\n for (const field of ['_id', 'title', 'text', 'category', '_score']) {\n if (field in eAttrs) doc[field] = eAttrs[field];\n }\n retrieverDocs.push(doc);\n } else if (event.name === 'db.search.result') {\n const doc: Record<string, any> = {\n timestamp: String(event.timestamp),\n };\n if ('db.search.query.id' in eAttrs) doc['query_id'] = eAttrs['db.search.query.id'];\n if ('db.search.result.id' in eAttrs) doc['result_id'] = eAttrs['db.search.result.id'];\n if ('db.search.result.distance' in eAttrs)\n doc['distance'] = eAttrs['db.search.result.distance'];\n if ('db.search.result.entity' in eAttrs)\n doc['entity'] = eAttrs['db.search.result.entity'];\n retrieverDocs.push(doc);\n } else if (event.name === 'db.query.embeddings') {\n const vector =\n eAttrs['db.query.embeddings.vector'] ?? eAttrs['vector'];\n if (vector && (Array.isArray(vector) || ArrayBuffer.isView(vector))) {\n upcycled['neatlogs.db.query.embeddings.dimension'] = (vector as any).length;\n if (this.debug) {\n logger.debug(`Calculated embedding dimension: ${(vector as any).length}`);\n }\n }\n }\n }\n\n if (retrieverDocs.length > 0) {\n upcycled['retrieval_documents'] = JSON.stringify(retrieverDocs);\n }\n\n return upcycled;\n }\n\n // ── Namespace mapping ───────────────────────────────\n\n private applyNamespaceMapping(attrs: Record<string, any>): Record<string, any> {\n // Use the AttributeMapper for the heavy lifting\n const unified = this.mapper.mapAttributes(attrs);\n\n // Ensure neatlogs.span.kind is meaningful (not 'unknown')\n const currentKind = unified['neatlogs.span.kind'];\n if (!currentKind || currentKind === 'unknown') {\n const oiKind = attrs['openinference.span.kind'];\n if (oiKind) {\n unified['neatlogs.span.kind'] = String(oiKind).toLowerCase();\n } else {\n // Fallback: infer from span name — skip for framework-internal spans (e.g. next.js routes)\n const scopeName = attrs['neatlogs.instrumentation.name'] ?? '';\n const spanName = attrs['_span_name'] ?? '';\n if (spanName && scopeName !== 'next.js') {\n const inferred = inferSpanKindFromName(spanName).toLowerCase();\n unified['neatlogs.span.kind'] = inferred;\n }\n }\n }\n\n // Detect RERANKER operations (only infer if kind wasn't explicitly set)\n const llmRequestType = (attrs['llm.request.type'] ?? '').toLowerCase();\n const genAiOperation = (attrs['gen_ai.operation.name'] ?? '').toLowerCase();\n const spanNameLower = (attrs['_span_name'] ?? '').toLowerCase();\n const hasExplicitKind = 'openinference.span.kind' in attrs || 'traceloop.span.kind' in attrs;\n\n if (\n !hasExplicitKind && (\n llmRequestType === 'rerank' ||\n genAiOperation === 'rerank' ||\n spanNameLower.includes('rerank')\n )\n ) {\n unified['neatlogs.span.kind'] = 'reranker';\n }\n\n // Remove vectordb.embedding_model for non-vector span kinds\n const spanKind = (\n attrs['neatlogs.span.kind'] ?? attrs['openinference.span.kind'] ?? ''\n ).toLowerCase();\n if (!['embedding', 'retriever', 'vector_store'].includes(spanKind)) {\n delete unified['neatlogs.vectordb.embedding_model'];\n }\n\n if (this.debug) {\n logger.debug(\n `[ScopeDetectionFinal] span_name=${attrs['_span_name']} ` +\n `scope=${attrs['neatlogs.instrumentation.name']} ` +\n `framework=${unified['neatlogs.framework']}`,\n );\n }\n\n // Fill provider/system gaps\n this.fillProviderGaps(attrs, unified);\n\n return unified;\n }\n\n // ── Provider/system gap filling ─────────────────────\n\n private fillProviderGaps(attrs: Record<string, any>, unified: Record<string, any>): void {\n // --- neatlogs.llm.provider ---\n if (!unified['neatlogs.llm.provider']) {\n const scopeProvider = unified['neatlogs.provider'] ?? attrs['neatlogs.provider'] ?? '';\n if (scopeProvider) {\n unified['neatlogs.llm.provider'] = scopeProvider;\n } else {\n const model = String(\n attrs['llm.model_name'] ??\n attrs['gen_ai.request.model'] ??\n attrs['llm.model'] ??\n '',\n );\n const inferred = this.inferProviderFromModel(model);\n if (inferred) {\n unified['neatlogs.llm.provider'] = inferred;\n }\n }\n }\n\n // --- neatlogs.llm.system ---\n if (!unified['neatlogs.llm.system']) {\n const provider = (\n unified['neatlogs.llm.provider'] ??\n unified['neatlogs.provider'] ??\n ''\n ).toLowerCase();\n const system = PROVIDER_TO_SYSTEM[provider] ?? '';\n if (system) {\n unified['neatlogs.llm.system'] = system;\n }\n }\n }\n\n private inferProviderFromModel(model: string): string {\n if (!model) return '';\n const m = model.toLowerCase();\n\n // OpenAI model families\n if (/^(gpt-|o1-|o3-|o4-|text-embedding-|text-davinci-)/.test(m)) return 'openai';\n // Anthropic\n if (m.startsWith('claude-')) return 'anthropic';\n // Google\n if (m.startsWith('gemini-') || m.startsWith('gemma-')) return 'google';\n // Mistral\n if (m.startsWith('mistral-') || m.startsWith('mixtral-')) return 'mistralai';\n // Cohere\n if (m.startsWith('command-') || m.startsWith('embed-english') || m.startsWith('embed-multilingual'))\n return 'cohere';\n // Bedrock model IDs\n if (\n m.startsWith('anthropic.') ||\n m.startsWith('meta.') ||\n m.startsWith('amazon.') ||\n m.startsWith('nova-') ||\n m.startsWith('titan-')\n )\n return 'aws';\n // xAI\n if (m.startsWith('grok-')) return 'xai';\n // DeepSeek\n if (m.startsWith('deepseek-')) return 'deepseek';\n\n return '';\n }\n\n // ── Intermediate ReAct steps ────────────────────────\n\n private addIntermediateSteps(unified: Record<string, any>): void {\n if ('neatlogs.llm.intermediate_steps' in unified) return;\n if (String(unified['neatlogs.span.kind'] ?? '').toLowerCase() !== 'llm') return;\n\n const steps = this.extractReactStepsFromMessages(unified);\n if (steps.length === 0) return;\n\n unified['neatlogs.llm.intermediate_steps'] = JSON.stringify(steps);\n }\n\n private extractReactStepsFromMessages(unified: Record<string, any>): Array<Record<string, string>> {\n // Try output messages first\n const outputTexts = this.collectRoleTexts(\n unified,\n 'neatlogs.llm.output_messages',\n 'assistant',\n );\n const steps = this.parseReactSteps(outputTexts);\n if (steps.length > 0) return steps;\n\n // Fallback to input messages\n const inputTexts = this.collectRoleTexts(\n unified,\n 'neatlogs.llm.input_messages',\n 'assistant',\n );\n return this.parseReactSteps(inputTexts);\n }\n\n private collectRoleTexts(\n unified: Record<string, any>,\n prefix: string,\n role: string,\n ): string[] {\n const idxRe = new RegExp(`^${escapeRegExp(prefix)}\\\\.(\\\\d+)\\\\.content$`);\n const idxs = new Set<number>();\n for (const k of Object.keys(unified)) {\n const m = idxRe.exec(k);\n if (m) {\n idxs.add(parseInt(m[1], 10));\n }\n }\n\n const texts: string[] = [];\n for (const i of [...idxs].sort((a, b) => a - b)) {\n const r = unified[`${prefix}.${i}.role`];\n if (typeof r !== 'string' || r.toLowerCase() !== role) continue;\n const c = unified[`${prefix}.${i}.content`];\n if (typeof c === 'string' && c.toLowerCase().includes('thought:')) {\n texts.push(c.slice(0, 20000));\n }\n }\n return texts;\n }\n\n private parseReactSteps(texts: string[]): Array<Record<string, string>> {\n if (texts.length === 0) return [];\n\n const markerRe = /(?:^|\\n)\\s*(Thought|Context|Action|Action Input|Observation|Final Answer)\\s*:\\s*/gim;\n\n const allSteps: Array<Record<string, string>> = [];\n\n for (const text of texts) {\n const matches: Array<{ label: string; start: number; matchStart: number }> = [];\n let m: RegExpExecArray | null;\n // Reset lastIndex for global regex\n markerRe.lastIndex = 0;\n while ((m = markerRe.exec(text)) !== null) {\n matches.push({\n label: m[1].trim().toLowerCase(),\n start: m.index + m[0].length,\n matchStart: m.index,\n });\n }\n\n if (matches.length === 0) continue;\n\n let cur: Record<string, string> = {};\n\n const commit = () => {\n if (Object.keys(cur).length === 0) return;\n if (!Object.values(cur).some((v) => v)) {\n cur = {};\n return;\n }\n if (allSteps.length > 0) {\n const last = allSteps[allSteps.length - 1];\n if (JSON.stringify(last) === JSON.stringify(cur)) {\n cur = {};\n return;\n }\n }\n allSteps.push(cur);\n cur = {};\n };\n\n for (let idx = 0; idx < matches.length; idx++) {\n const { label, start: contentStart } = matches[idx];\n const contentEnd = idx + 1 < matches.length ? matches[idx + 1].matchStart : text.length;\n const value = text.slice(contentStart, contentEnd).trim();\n\n if (label === 'thought' && Object.keys(cur).length > 0) {\n commit();\n }\n\n if (label === 'thought') {\n cur['thought'] = truncate(value, 600);\n } else if (label === 'context') {\n cur['context'] = truncate(value, 500);\n } else if (label === 'action') {\n cur['action'] = truncate(value, 200);\n } else if (label === 'action input') {\n cur['action_input'] = truncate(value, 1000);\n } else if (label === 'observation') {\n cur['observation'] = truncate(value, 500);\n } else if (label === 'final answer') {\n cur['final_answer'] = truncate(value, 1200);\n }\n }\n\n commit();\n }\n\n return allSteps;\n }\n\n // ── I/O sanitization ────────────────────────────────\n\n /**\n * Remove Python object reprs from input.value / output.value JSON strings.\n * Also drops the top-level \"self\" key that CrewAI injects.\n */\n sanitizeIoValue(val: any): any {\n if (typeof val !== 'string') return val;\n\n try {\n const parsed = JSON.parse(val);\n const cleaned = cleanPythonReprs(parsed);\n if (typeof cleaned === 'object' && cleaned !== null && !Array.isArray(cleaned)) {\n delete cleaned['self'];\n }\n if (JSON.stringify(cleaned) !== JSON.stringify(parsed)) {\n return JSON.stringify(cleaned);\n }\n } catch {\n // not JSON, return as-is\n }\n return val;\n }\n\n // ── Embedding vector filter ─────────────────────────\n\n private filterEmbeddingVectors(attrs: Record<string, any>): Record<string, any> {\n const filtered: Record<string, any> = {};\n for (const [key, value] of Object.entries(attrs)) {\n // Skip embedding vector keys\n if (key.includes('.embedding.vector') || key.includes('.embeddings.') || key === 'ai.embeddings' || key === 'ai.embedding') {\n if (this.debug) {\n logger.debug(`[FILTER] Dropped embedding vector key: ${key}`);\n }\n continue;\n }\n\n // Skip large arrays (likely embedding vectors)\n if ((Array.isArray(value) || ArrayBuffer.isView(value)) && (value as any).length > 1000) {\n if (this.debug) {\n logger.debug(`[FILTER] Dropped large array (${(value as any).length} elements): ${key}`);\n }\n continue;\n }\n\n filtered[key] = value;\n }\n return filtered;\n }\n\n // ── Helpers ─────────────────────────────────────────\n\n private looksLikeHttp(attrs: Record<string, any>): boolean {\n for (const k of ['http.method', 'http.url', 'http.status_code', 'http.route']) {\n if (k in attrs) return true;\n }\n return Object.keys(attrs).some((key) => key.startsWith('http.'));\n }\n\n /**\n * Check if the raw span kind indicates CLIENT (OTel SpanKind.CLIENT = 3).\n */\n private isHttpLikeSpanKind(kind: number | string): boolean {\n if (typeof kind === 'number') return kind === 3; // SpanKind.CLIENT = 3\n return String(kind).toUpperCase() === 'CLIENT';\n }\n}\n\n// ────────────────────────────────────────────────────────\n// Utility functions\n// ────────────────────────────────────────────────────────\n\nfunction truncate(val: string, maxLen: number): string {\n val = (val ?? '').trim();\n if (val.length <= maxLen) return val;\n return val.slice(0, maxLen) + `...(truncated,len=${val.length})`;\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","/**\n * PII masking support for Neatlogs spans.\n *\n * Users supply a callable that receives the full span dict and returns\n * the (possibly modified) span dict. Return null to drop the span entirely.\n */\n\nimport type { MaskFunction } from '../types.js';\nimport { getLogger } from './logger.js';\n\nconst logger = getLogger();\n\n/** Module-level registry: key -> mask function */\nconst _MASK_REGISTRY = new Map<string, MaskFunction>();\n\nlet _nextId = 0;\n\n/**\n * Register a mask function and return its lookup key.\n */\nexport function registerMask(fn: MaskFunction): string {\n const key = String(++_nextId);\n _MASK_REGISTRY.set(key, fn);\n return key;\n}\n\n/**\n * Apply the effective mask function to span data.\n *\n * Per-span mask (stored in attributes[\"neatlogs.mask_id\"]) takes\n * precedence over the global mask. Returns the (possibly modified) dict.\n */\nexport function applyMask(\n spanData: Record<string, any>,\n globalMask: MaskFunction | null | undefined,\n): Record<string, any> | null {\n const maskId = spanData?.attributes?.['neatlogs.mask_id'];\n let maskFn: MaskFunction | undefined | null = null;\n\n if (maskId) {\n maskFn = _MASK_REGISTRY.get(String(maskId)) ?? null;\n }\n\n if (!maskFn) {\n maskFn = globalMask ?? null;\n }\n\n if (!maskFn) {\n return spanData;\n }\n\n try {\n const result = maskFn(spanData);\n // null means \"drop this span entirely\"; undefined means \"keep original\"\n if (result === null) return null;\n return result !== undefined ? result : spanData;\n } catch (exc) {\n logger.warn(\n `mask callable raised an exception for span '${spanData?.name}': ${exc} — original span data will be exported unchanged.`,\n );\n return spanData;\n }\n}\n\n/**\n * Clear all registered masks. Used for testing.\n * @internal\n */\nexport function _clearMaskRegistry(): void {\n _MASK_REGISTRY.clear();\n _nextId = 0;\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport type { PromptMessage } from '../types.js';\n\n// ---------------------------------------------------------------------------\n// Async-local context for system prompts\n// ---------------------------------------------------------------------------\n\ninterface PromptContextData {\n template: string;\n variables: Record<string, any>;\n}\n\nconst _promptStorage = new AsyncLocalStorage<PromptContextData>();\n\n/**\n * Manages system prompt metadata in async-local context for automatic tracing.\n */\nexport class PromptContext {\n /**\n * Store system prompt template and variables in context.\n */\n static set(template: string, variables: Record<string, any>): void {\n // enterWith mutates the current async context in-place\n _promptStorage.enterWith({ template, variables });\n }\n\n /**\n * Retrieve system prompt template from context.\n */\n static getTemplate(): string | undefined {\n return _promptStorage.getStore()?.template;\n }\n\n /**\n * Retrieve system prompt variables from context.\n */\n static getVariables(): Record<string, any> | undefined {\n return _promptStorage.getStore()?.variables;\n }\n\n /**\n * Clear system prompt context.\n */\n static clear(): void {\n _promptStorage.enterWith(undefined as unknown as PromptContextData);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Async-local context for user prompts\n// ---------------------------------------------------------------------------\n\nconst _userPromptStorage = new AsyncLocalStorage<PromptContextData>();\n\n/**\n * Manages user/human prompt metadata in async-local context for automatic tracing.\n */\nexport class UserPromptContext {\n /**\n * Store user prompt template and variables in context.\n */\n static set(template: string, variables: Record<string, any>): void {\n _userPromptStorage.enterWith({ template, variables });\n }\n\n /**\n * Retrieve user prompt template from context.\n */\n static getTemplate(): string | undefined {\n return _userPromptStorage.getStore()?.template;\n }\n\n /**\n * Retrieve user prompt variables from context.\n */\n static getVariables(): Record<string, any> | undefined {\n return _userPromptStorage.getStore()?.variables;\n }\n\n /**\n * Clear user prompt context.\n */\n static clear(): void {\n _userPromptStorage.enterWith(undefined as unknown as PromptContextData);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shared context setter type for the base template class\n// ---------------------------------------------------------------------------\n\ninterface ContextSetter {\n set(template: string, variables: Record<string, any>): void;\n}\n\n// ---------------------------------------------------------------------------\n// BasePromptTemplate — shared logic for system and user prompts\n// ---------------------------------------------------------------------------\n\nconst VARIABLE_PATTERN = /\\{\\{(\\w+)\\}\\}/g;\n\n/**\n * Base class for prompt templates with `{{variable}}` placeholders.\n *\n * Extracts variables, compiles templates, and renders strings.\n * Subclasses only need to specify the context class and display name.\n */\nabstract class BasePromptTemplate {\n protected readonly _template: string | PromptMessage[];\n protected readonly _variables: string[];\n\n /**\n * @param template - Either a string with `{{variable}}` placeholders or\n * an array of `PromptMessage` objects whose `content` fields contain placeholders.\n */\n constructor(template: string | PromptMessage[]) {\n this._template = template;\n this._variables = this._extractVariables();\n }\n\n /** List of unique variable names found in this template. */\n get variables(): string[] {\n return this._variables;\n }\n\n /** The raw template (string or message array). */\n get template(): string | PromptMessage[] {\n return this._template;\n }\n\n /** The context class to store template/variables for automatic tracing. */\n protected abstract get _contextSetter(): ContextSetter;\n\n /** Display name for toString(). */\n protected abstract get _displayName(): string;\n\n /**\n * Compile the prompt template with the given variables.\n *\n * @param variables - Key/value pairs to substitute for `{{key}}` placeholders.\n * @returns The rendered string or rendered message array.\n * @throws {Error} If any required variables are missing.\n */\n compile(variables?: Record<string, any>): string | PromptMessage[] {\n const vars = variables ?? {};\n\n const missing = this._variables.filter((v) => !(v in vars));\n if (missing.length > 0) {\n throw new Error(\n `Missing required variables: ${missing.join(', ')}. Template requires: ${this._variables.join(', ')}`,\n );\n }\n\n this._contextSetter.set(\n typeof this._template === 'string'\n ? this._template\n : this._template.map((msg) => `${msg.role}: ${msg.content}`).join('\\n'),\n vars,\n );\n\n if (typeof this._template === 'string') {\n return this._renderString(this._template, vars);\n }\n\n return this._template.map((msg) => ({\n role: msg.role,\n content: this._renderString(msg.content, vars),\n }));\n }\n\n /**\n * Replace `{{key}}` placeholders in a string with the corresponding values.\n */\n _renderString(text: string, variables: Record<string, any>): string {\n let result = text;\n for (const [key, value] of Object.entries(variables)) {\n result = result.replaceAll(`{{${key}}}`, String(value));\n }\n return result;\n }\n\n toString(): string {\n if (typeof this._template === 'string') {\n return this._template.length > 50\n ? `${this._displayName}('${this._template.slice(0, 50)}...')`\n : `${this._displayName}('${this._template}')`;\n }\n return `${this._displayName}(${this._template.length} messages, variables=${JSON.stringify(this._variables)})`;\n }\n\n // ---- private ----\n\n private _extractVariables(): string[] {\n if (typeof this._template === 'string') {\n return [...new Set(Array.from(this._template.matchAll(VARIABLE_PATTERN), (m) => m[1]))];\n }\n\n const found: string[] = [];\n for (const msg of this._template) {\n if (msg.content) {\n for (const match of msg.content.matchAll(VARIABLE_PATTERN)) {\n found.push(match[1]);\n }\n }\n }\n return [...new Set(found)];\n }\n}\n\n// ---------------------------------------------------------------------------\n// PromptTemplate — system/AI instruction prompt\n// ---------------------------------------------------------------------------\n\n/**\n * Template for the system/AI instruction prompt with `{{variable}}` placeholders.\n */\nexport class PromptTemplate extends BasePromptTemplate {\n protected get _contextSetter(): ContextSetter {\n return PromptContext;\n }\n\n protected get _displayName(): string {\n return 'PromptTemplate';\n }\n}\n\n// ---------------------------------------------------------------------------\n// UserPromptTemplate — user/human turn prompt\n// ---------------------------------------------------------------------------\n\n/**\n * Template for the user/human turn prompt with `{{variable}}` placeholders.\n *\n * Identical to {@link PromptTemplate} but stores context in {@link UserPromptContext}.\n */\nexport class UserPromptTemplate extends BasePromptTemplate {\n protected get _contextSetter(): ContextSetter {\n return UserPromptContext;\n }\n\n protected get _displayName(): string {\n return 'UserPromptTemplate';\n }\n}\n","/**\n * Context wrapper for manual span creation.\n *\n * Provides the `trace()` function — the TypeScript equivalent of the Python\n * `trace()` context manager. Creates an OTel span, sets prompt template/variable\n * context, and executes the user callback within the span.\n *\n * @example\n * ```typescript\n * await trace({ name: 'my-trace' }, async (span) => {\n * // user code runs here with the span active\n * });\n * ```\n */\n\nimport {\n trace as otelTrace,\n context as otelContext,\n createContextKey,\n ROOT_CONTEXT,\n SpanStatusCode,\n type Span,\n} from '@opentelemetry/api';\nimport { PromptContext, UserPromptContext, PromptTemplate, UserPromptTemplate } from '../prompt/template.js';\nimport { registerMask } from './mask.js';\n\nimport { getLogger } from './logger.js';\nimport { safeJsonDumps, serializeObj } from '../decorators/base.js';\nimport type { TraceOptions, MaskFunction } from '../types.js';\n\nconst logger = getLogger();\n\n// ---------------------------------------------------------------------------\n// Module-level session config (set by init.ts via _setSessionConfig)\n// ---------------------------------------------------------------------------\n\nlet _sessionConfig: Record<string, any> = {};\n\n/**\n * Set the session configuration. Called by init() during SDK setup.\n * @internal\n */\nexport function _setSessionConfig(config: Record<string, any>): void {\n _sessionConfig = config;\n}\n\n/**\n * Get a copy of the current session configuration.\n */\nexport function getSessionConfig(): Record<string, any> {\n return { ..._sessionConfig };\n}\n\n// ---------------------------------------------------------------------------\n// OTel context keys for prompt data propagation\n// ---------------------------------------------------------------------------\n\nexport const PROMPT_VARIABLES_KEY = createContextKey('neatlogs.prompt_variables');\nexport const PROMPT_TEMPLATE_KEY = createContextKey('neatlogs.prompt_template');\nexport const PROMPT_VERSION_KEY = createContextKey('neatlogs.prompt_version');\nexport const USER_PROMPT_TEMPLATE_KEY = createContextKey('neatlogs.user_prompt_template');\nexport const USER_PROMPT_VARIABLES_KEY = createContextKey('neatlogs.user_prompt_variables');\n\n// ---------------------------------------------------------------------------\n// Known TraceOptions keys (not forwarded as extra span attributes)\n// ---------------------------------------------------------------------------\n\nconst KNOWN_OPTION_KEYS = new Set([\n 'name',\n 'kind',\n 'input',\n 'promptTemplate',\n 'promptVariables',\n 'userPromptTemplate',\n 'userPromptVariables',\n 'version',\n 'mask',\n 'attributes',\n]);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Set standard and extra attributes on a span.\n * @internal\n */\nexport function _setSpanAttributes(\n span: Span,\n kind: string | undefined,\n attributes: Record<string, any>,\n): void {\n span.setAttribute('neatlogs.internal', true);\n span.setAttribute('openinference.span.kind', kind ?? 'CHAIN');\n\n for (const [key, value] of Object.entries(attributes)) {\n span.setAttribute(key, value);\n }\n}\n\n/**\n * After the user callback completes, capture prompt variables that were\n * set by PromptTemplate.compile() / UserPromptTemplate.compile() and\n * record them as span attributes.\n * @internal\n */\nexport function _finalizePromptCapture(\n span: Span,\n isPromptTemplateObj: boolean,\n isUserPromptTemplateObj: boolean,\n): void {\n if (isPromptTemplateObj) {\n const capturedVars = PromptContext.getVariables();\n if (capturedVars) {\n span.setAttribute(\n 'llm.prompt_template_variables',\n JSON.stringify(capturedVars),\n );\n logger.debug(\n `[trace] Auto-captured variables from PromptContext: ${Object.keys(capturedVars).join(', ')}`,\n );\n }\n }\n\n if (isUserPromptTemplateObj) {\n const capturedUserVars = UserPromptContext.getVariables();\n if (capturedUserVars) {\n span.setAttribute(\n 'llm.user_prompt_template_variables',\n JSON.stringify(capturedUserVars),\n );\n logger.debug(\n `[trace] Auto-captured variables from UserPromptContext: ${Object.keys(capturedUserVars).join(', ')}`,\n );\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main trace() function\n// ---------------------------------------------------------------------------\n\n/**\n * Async callback wrapper for manual span creation with prompt tracking.\n *\n * Creates an OTel span, optionally sets prompt template/variable context,\n * and executes the provided callback within the span.\n *\n * **Session-Aware Trace Creation:**\n * - If `session_id` is set in init() AND no active parent span exists,\n * this creates a NEW root trace (for multi-turn conversations).\n * - Otherwise, creates a normal child span within the existing trace.\n *\n * @param options - Trace configuration options\n * @param fn - Callback that receives the active span\n * @returns The return value of the callback\n *\n * @example\n * ```typescript\n * // Basic usage\n * await trace({ name: 'my-pipeline' }, async (span) => {\n * await step1();\n * await step2();\n * });\n *\n * // With prompt template\n * const template = new PromptTemplate('Hello {{name}}');\n * await trace({ name: 'prompt', promptTemplate: template }, async (span) => {\n * const rendered = template.compile({ name: 'world' });\n * // ...\n * });\n * ```\n */\nexport async function trace<T>(\n options: TraceOptions,\n fn: (span: Span) => T | Promise<T>,\n): Promise<T> {\n const {\n name,\n kind,\n input,\n promptTemplate,\n promptVariables,\n userPromptTemplate,\n userPromptVariables,\n version,\n mask,\n attributes: explicitAttributes,\n ...extraOptions\n } = options;\n\n const sessionConfig = getSessionConfig();\n const sessionId = sessionConfig.sessionId;\n\n // Determine whether we are inside an existing active trace\n const currentSpan = otelTrace.getSpan(otelContext.active());\n const isInActiveTrace = currentSpan !== undefined && currentSpan.isRecording();\n const shouldCreateRootTrace = !!sessionId && !isInActiveTrace;\n\n // ---------------------------------------------------------------------------\n // Process prompt templates\n // ---------------------------------------------------------------------------\n\n let templateString: string | undefined;\n let isPromptTemplateObj = false;\n\n if (promptTemplate !== undefined) {\n if (promptTemplate instanceof PromptTemplate) {\n isPromptTemplateObj = true;\n const t = promptTemplate.template;\n templateString = typeof t === 'string' ? t : JSON.stringify(t);\n logger.debug(\n `[trace] Using PromptTemplate object with variables: ${promptTemplate.variables.join(', ')}`,\n );\n } else if (typeof promptTemplate === 'string') {\n templateString = promptTemplate;\n } else {\n const t = promptTemplate.template;\n templateString = typeof t === 'string' ? t : JSON.stringify(t);\n }\n }\n\n let userTemplateString: string | undefined;\n let isUserPromptTemplateObj = false;\n\n if (userPromptTemplate !== undefined) {\n if (userPromptTemplate instanceof UserPromptTemplate) {\n isUserPromptTemplateObj = true;\n const t = userPromptTemplate.template;\n userTemplateString = typeof t === 'string' ? t : JSON.stringify(t);\n logger.debug(\n `[trace] Using UserPromptTemplate object with variables: ${userPromptTemplate.variables.join(', ')}`,\n );\n } else if (typeof userPromptTemplate === 'string') {\n userTemplateString = userPromptTemplate;\n } else {\n const t = userPromptTemplate.template;\n userTemplateString = typeof t === 'string' ? t : JSON.stringify(t);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Build OTel context with prompt values\n // ---------------------------------------------------------------------------\n\n let ctx = otelContext.active();\n\n const variablesJson = promptVariables ? JSON.stringify(promptVariables) : undefined;\n const userVariablesJson = userPromptVariables ? JSON.stringify(userPromptVariables) : undefined;\n\n if (variablesJson) {\n ctx = ctx.setValue(PROMPT_VARIABLES_KEY, variablesJson);\n logger.debug(`[trace] Set neatlogs.prompt_variables in context: ${variablesJson}`);\n }\n if (templateString) {\n ctx = ctx.setValue(PROMPT_TEMPLATE_KEY, templateString);\n logger.debug(`[trace] Set neatlogs.prompt_template in context: ${templateString}`);\n }\n if (userVariablesJson) {\n ctx = ctx.setValue(USER_PROMPT_VARIABLES_KEY, userVariablesJson);\n logger.debug(`[trace] Set neatlogs.user_prompt_variables in context: ${userVariablesJson}`);\n }\n if (userTemplateString) {\n ctx = ctx.setValue(USER_PROMPT_TEMPLATE_KEY, userTemplateString);\n logger.debug(`[trace] Set neatlogs.user_prompt_template in context: ${userTemplateString}`);\n }\n if (version) {\n ctx = ctx.setValue(PROMPT_VERSION_KEY, version);\n logger.debug(`[trace] Set neatlogs.prompt_version in context: ${version}`);\n }\n\n // ---------------------------------------------------------------------------\n // Collect extra attributes (non-standard option keys)\n // ---------------------------------------------------------------------------\n\n const extraAttributes: Record<string, any> = { ...(explicitAttributes ?? {}) };\n for (const [key, value] of Object.entries(extraOptions)) {\n if (!KNOWN_OPTION_KEYS.has(key)) {\n extraAttributes[key] = value;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Create span and execute callback\n // ---------------------------------------------------------------------------\n\n const tracer = otelTrace.getTracer('neatlogs.trace');\n\n const spanCallback = async (span: Span): Promise<T> => {\n _setSpanAttributes(span, kind, extraAttributes);\n\n if (input !== undefined && input !== null) {\n span.setAttribute('input.value', safeJsonDumps(serializeObj(input)));\n }\n\n if (mask) {\n const maskId = registerMask(mask);\n span.setAttribute('neatlogs.mask_id', maskId);\n }\n\n try {\n const result: T = await fn(span);\n\n _finalizePromptCapture(span, isPromptTemplateObj, isUserPromptTemplateObj);\n\n if (result !== undefined && result !== null) {\n const spanAttrs = (span as any).attributes ?? (span as any)._attributes;\n const hasOutput = spanAttrs && (\n 'output.value' in spanAttrs || 'neatlogs.output.value' in spanAttrs\n );\n if (!hasOutput) {\n span.setAttribute('output.value', safeJsonDumps(serializeObj(result)));\n }\n }\n\n return result;\n } catch (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n } finally {\n if (isPromptTemplateObj) {\n PromptContext.clear();\n }\n if (isUserPromptTemplateObj) {\n UserPromptContext.clear();\n }\n span.end();\n }\n };\n\n if (shouldCreateRootTrace) {\n logger.debug(`[trace] Creating NEW root trace '${name}' (sessionId=${sessionId})`);\n return tracer.startActiveSpan(name, {}, ROOT_CONTEXT, spanCallback);\n } else {\n logger.debug(`[trace] Creating child span '${name}'`);\n return tracer.startActiveSpan(name, {}, ctx, spanCallback);\n }\n}\n","/**\n * Core span decoration utilities.\n * Provides the low-level wrapping logic used by span() and Span().\n */\n\nimport { trace, SpanStatusCode, type Span as OtelSpan } from '@opentelemetry/api';\nimport { getLogger } from '../core/logger.js';\nimport { registerMask } from '../core/mask.js';\nimport type { SpanOptions, MaskFunction } from '../types.js';\n\nconst logger = getLogger();\nconst TRACER_NAME = 'neatlogs';\n\n/** Safely serialize any value to JSON string. */\nexport function safeJsonDumps(value: any): string {\n try {\n return JSON.stringify(value, (_key, val) => {\n if (typeof val === 'bigint') return val.toString();\n if (val instanceof Error) return { message: val.message, name: val.name, stack: val.stack };\n if (typeof val === 'function') return `[Function: ${val.name || 'anonymous'}]`;\n return val;\n });\n } catch {\n return String(value);\n }\n}\n\n/** Serialize an object for span attributes. Handles toJSON(), plain objects, primitives. */\nexport function serializeObj(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean') return obj;\n if (typeof obj.toJSON === 'function') return obj.toJSON();\n if (Array.isArray(obj)) return obj.map(serializeObj);\n if (typeof obj === 'object') {\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = serializeObj(value);\n }\n return result;\n }\n return String(obj);\n}\n\n/** Check if content capture is enabled via env var. */\nexport function shouldCaptureContent(): boolean {\n const envVal = process.env.NEATLOGS_TRACE_CONTENT;\n if (envVal === undefined || envVal === '') return true;\n return envVal.toLowerCase() !== 'false' && envVal !== '0';\n}\n\n/** Set common span attributes from options. */\nexport function setCommonSpanAttrs(span: OtelSpan, opts: SpanOptions): void {\n if (opts.kind) {\n span.setAttribute('openinference.span.kind', opts.kind);\n }\n if (opts.internal) {\n span.setAttribute('neatlogs.internal', true);\n }\n if (opts.description) {\n span.setAttribute('neatlogs.description', opts.description);\n }\n if (opts.mask) {\n const maskId = registerMask(opts.mask);\n span.setAttribute('neatlogs.mask_id', maskId);\n }\n}\n\nexport interface DecorateSpanOptions extends SpanOptions {\n /** Override the span name (defaults to function name). */\n spanName?: string;\n /** Post-process callback after the function returns. */\n postprocessResult?: (span: OtelSpan, result: any, boundInputs: Record<string, any>) => void;\n}\n\n/**\n * Core wrapper factory that creates an instrumented version of a function.\n * This is the low-level building block used by span() and Span().\n */\nexport function decorateSpan<TArgs extends any[], TReturn>(\n opts: DecorateSpanOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn extends Promise<any> ? TReturn : Promise<Awaited<TReturn>> {\n const tracer = trace.getTracer(TRACER_NAME);\n const spanName = opts.spanName ?? opts.name ?? (fn.name || 'anonymous');\n const captureInput = opts.captureInput !== false;\n const captureOutput = opts.captureOutput !== false;\n const doCapture = shouldCaptureContent();\n\n const wrapped = (...args: TArgs): any => {\n return tracer.startActiveSpan(spanName, (span: OtelSpan) => {\n try {\n // Set common attributes\n setCommonSpanAttrs(span, opts);\n\n // Capture input\n if (captureInput && doCapture && args.length > 0) {\n try {\n const inputValue = args.length === 1 ? serializeObj(args[0]) : args.map(serializeObj);\n span.setAttribute('input.value', safeJsonDumps(inputValue));\n } catch (err) {\n logger.debug(`Failed to capture input: ${err}`);\n }\n }\n\n // Execute the function\n const result = fn(...args);\n\n // Handle async results\n if (result instanceof Promise) {\n return result\n .then((resolved: any) => {\n // Capture output\n if (captureOutput && doCapture) {\n try {\n span.setAttribute('output.value', safeJsonDumps(serializeObj(resolved)));\n } catch (err) {\n logger.debug(`Failed to capture output: ${err}`);\n }\n }\n\n // Post-process\n if (opts.postprocessResult) {\n try {\n const boundInputs = _extractBoundInputs(fn, args);\n opts.postprocessResult(span, resolved, boundInputs);\n } catch (err) {\n logger.debug(`Postprocess failed: ${err}`);\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return resolved;\n })\n .catch((error: any) => {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error?.message ?? String(error),\n });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n });\n }\n\n // Sync result\n if (captureOutput && doCapture) {\n try {\n span.setAttribute('output.value', safeJsonDumps(serializeObj(result)));\n } catch (err) {\n logger.debug(`Failed to capture output: ${err}`);\n }\n }\n\n if (opts.postprocessResult) {\n try {\n const boundInputs = _extractBoundInputs(fn, args);\n opts.postprocessResult(span, result, boundInputs);\n } catch (err) {\n logger.debug(`Postprocess failed: ${err}`);\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n } catch (error: any) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error?.message ?? String(error),\n });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n }\n });\n };\n\n // Preserve function name for debugging\n Object.defineProperty(wrapped, 'name', { value: spanName, configurable: true });\n\n return wrapped as any;\n}\n\n/** Extract named arguments from function call (best-effort). */\nfunction _extractBoundInputs(fn: Function, args: any[]): Record<string, any> {\n const result: Record<string, any> = {};\n // Parse function parameter names from toString()\n const fnStr = fn.toString();\n const match = fnStr.match(/\\(([^)]*)\\)/);\n if (match) {\n const paramNames = match[1]\n .split(',')\n .map((p) => p.trim().replace(/\\s*[:=].*$/, '').replace(/^\\.\\.\\./, ''))\n .filter(Boolean);\n for (let i = 0; i < Math.min(paramNames.length, args.length); i++) {\n result[paramNames[i]] = args[i];\n }\n }\n return result;\n}\n","/**\n * Registry for CrewAI task template bindings.\n *\n * Call registerCrewaiTask(task, userTpl, vars) in your task setup after creating\n * each Task. The span processor reads and clears the entry when the corresponding\n * AGENT span ends, stamping the template onto that span.\n */\n\nimport { getLogger } from './logger.js';\n\nconst logger = getLogger();\n\n/** Registry: taskId -> [templateStr, varsJson] */\nconst _registry = new Map<string, [string, string | null]>();\n\n/**\n * Register a user prompt template for a CrewAI task.\n *\n * @param task - A CrewAI Task instance (must have an .id property)\n * @param userTpl - A neatlogs UserPromptTemplate describing the task prompt\n * @param vars - Variable values passed to userTpl at task-creation time\n */\nexport function registerCrewaiTask(\n task: { id: string | number },\n userTpl: { template: string | any },\n vars?: Record<string, any>,\n): void {\n const taskId = String(task.id);\n const tplStr = String(userTpl.template);\n const varsJson =\n vars && Object.keys(vars).length > 0\n ? JSON.stringify(vars, (_key, val) => (typeof val === 'undefined' ? null : val))\n : null;\n\n _registry.set(taskId, [tplStr, varsJson]);\n logger.debug(`Registered CrewAI task ${taskId}`);\n}\n\n/**\n * Remove and return the registry entry for taskId, or undefined if absent.\n */\nexport function popEntry(taskId: string): [string, string | null] | undefined {\n const entry = _registry.get(taskId);\n if (entry) {\n _registry.delete(taskId);\n }\n return entry;\n}\n\n/**\n * Clear all registered tasks. Used for testing.\n * @internal\n */\nexport function _clearTaskRegistry(): void {\n _registry.clear();\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"title\": \"Neatlogs Semantic Conventions - Attribute Mapping Configuration\",\n \"description\": \"Maps vendor-specific attributes (OpenInference, OpenLLMetry) to unified neatlogs.* namespace\",\n \"version\": \"1.0.0\",\n \"mappings\": {\n \"span_kind\": {\n \"description\": \"Span classification/type\",\n \"sources\": [\n \"openinference.span.kind\",\n \"traceloop.span.kind\"\n ],\n \"target\": \"neatlogs.span.kind\",\n \"values\": {\n \"LLM\": \"llm\",\n \"TOOL\": \"tool\",\n \"AGENT\": \"agent\",\n \"CHAIN\": \"chain\",\n \"WORKFLOW\": \"workflow\",\n \"TASK\": \"task\",\n \"RETRIEVER\": \"retriever\",\n \"EMBEDDING\": \"embedding\",\n \"VECTOR_STORE\": \"vector_store\",\n \"RERANKER\": \"reranker\",\n \"GUARDRAIL\": \"guardrail\",\n \"EVALUATOR\": \"evaluator\",\n \"MCP_TOOL\": \"mcp_tool\",\n \"HTTP\": \"http\"\n },\n \"priority\": \"openinference\"\n },\n \"llm\": {\n \"description\": \"LLM-specific attributes\",\n \"mappings\": {\n \"model_name\": {\n \"sources\": [\n \"llm.model_name\",\n \"gen_ai.response.model\",\n \"gen_ai.request.model\",\n \"traceloop.association.properties.ls_model_name\"\n ],\n \"target\": \"neatlogs.llm.model_name\"\n },\n \"provider\": {\n \"sources\": [\n \"llm.provider\",\n \"traceloop.association.properties.ls_provider\"\n ],\n \"target\": \"neatlogs.llm.provider\"\n },\n \"system\": {\n \"sources\": [\n \"llm.system\",\n \"gen_ai.system\"\n ],\n \"target\": \"neatlogs.llm.system\"\n },\n \"request_type\": {\n \"sources\": [\n \"llm.request.type\",\n \"neatlogs.llm.operation.name\",\n \"neatlogs.llm.operation.type\"\n ],\n \"target\": \"neatlogs.llm.request_type\"\n },\n \"choices\": {\n \"sources\": [\n \"gen_ai.client.generation.choices\",\n \"llm.request.n\"\n ],\n \"target\": \"neatlogs.llm.generation_choices\"\n },\n \"token_count\": {\n \"mappings\": {\n \"total\": {\n \"sources\": [\n \"llm.token_count.total\",\n \"llm.usage.total_tokens\",\n \"ai.usage.totalTokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.total\"\n },\n \"prompt\": {\n \"sources\": [\n \"llm.token_count.prompt\",\n \"gen_ai.usage.input_tokens\",\n \"ai.usage.promptTokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.prompt\"\n },\n \"completion\": {\n \"sources\": [\n \"llm.token_count.completion\",\n \"gen_ai.usage.output_tokens\",\n \"ai.usage.completionTokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.completion\"\n },\n \"reasoning\": {\n \"sources\": [\n \"llm.token_count.completion_details.reasoning\",\n \"llm.usage.reasoning_tokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.reasoning\"\n },\n \"cached\": {\n \"sources\": [\n \"neatlogs.llm.token_count.cached_read\",\n \"llm.token_count.prompt_details.cache_read\",\n \"llm.token_count.prompt.cache_read\",\n \"gen_ai.usage.cache_read_input_tokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.cache_read\"\n },\n \"cache_write\": {\n \"sources\": [\n \"neatlogs.llm.token_count.cached_write\",\n \"llm.token_count.prompt_details.cache_write\",\n \"gen_ai.usage.cache_creation_input_tokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.cache_write\"\n },\n \"prompt_audio\": {\n \"sources\": [\n \"llm.token_count.prompt_details.audio\"\n ],\n \"target\": \"neatlogs.llm.token_count.prompt_audio\"\n },\n \"completion_audio\": {\n \"sources\": [\n \"neatlogs.llm.token_count.audio\",\n \"llm.token_count.completion_details.audio\"\n ],\n \"target\": \"neatlogs.llm.token_count.completion_audio\"\n }\n }\n },\n \"tool_calls\": {\n \"description\": \"Tool/function calls extracted from provider responses\",\n \"sources\": {\n \"id\": [\n \"llm.tool_calls.{i}.id\"\n ],\n \"name\": [\n \"llm.tool_calls.{i}.name\"\n ],\n \"arguments\": [\n \"llm.tool_calls.{i}.arguments\"\n ]\n },\n \"target\": \"neatlogs.llm.tool_calls.{i}\",\n \"indexed\": true\n },\n \"invalid_tool_calls\": {\n \"description\": \"Invalid or malformed tool calls\",\n \"sources\": [\n \"llm.invalid_tool_calls\"\n ],\n \"target\": \"neatlogs.llm.invalid_tool_calls\"\n },\n \"tools\": {\n \"description\": \"Tool definitions passed to the model\",\n \"sources\": {\n \"name\": [\n \"llm.tools.{i}.name\"\n ],\n \"description\": [\n \"llm.tools.{i}.description\"\n ],\n \"input_schema\": [\n \"llm.tools.{i}.input_schema\"\n ]\n },\n \"target\": \"neatlogs.llm.tools.{i}\",\n \"indexed\": true\n },\n \"messages\": {\n \"mappings\": {\n \"input_role\": {\n \"sources\": [\n \"llm.input_messages.{i}.message.role\",\n \"gen_ai.prompt.{i}.role\"\n ],\n \"target\": \"neatlogs.llm.input_messages.{i}.role\",\n \"indexed\": true\n },\n \"input_content\": {\n \"sources\": [\n \"llm.input_messages.{i}.message.content\",\n \"gen_ai.prompt.{i}.content\"\n ],\n \"target\": \"neatlogs.llm.input_messages.{i}.content\",\n \"indexed\": true\n },\n \"input_tool_call_id\": {\n \"sources\": [\n \"llm.input_messages.{i}.tool_call_id\",\n \"llm.input_messages.{i}.message.tool_call_id\"\n ],\n \"target\": \"neatlogs.llm.input_messages.{i}.tool_call_id\",\n \"indexed\": true\n },\n \"input_name\": {\n \"sources\": [\n \"llm.input_messages.{i}.name\",\n \"llm.input_messages.{i}.message.name\"\n ],\n \"target\": \"neatlogs.llm.input_messages.{i}.name\",\n \"indexed\": true\n },\n \"output_role\": {\n \"sources\": [\n \"llm.output_messages.{i}.message.role\",\n \"gen_ai.completion.{i}.role\"\n ],\n \"target\": \"neatlogs.llm.output_messages.{i}.role\",\n \"indexed\": true\n },\n \"output_content\": {\n \"sources\": [\n \"llm.output_messages.{i}.message.content\",\n \"gen_ai.completion.{i}.content\"\n ],\n \"target\": \"neatlogs.llm.output_messages.{i}.content\",\n \"indexed\": true\n },\n \"system_prompt\": {\n \"sources\": [\n \"gen_ai.system_instructions\"\n ],\n \"target\": \"neatlogs.llm.system_prompt\"\n }\n },\n \"invocation_parameters\": {\n \"sources\": [\n \"llm.invocation_parameters\"\n ],\n \"target\": \"neatlogs.llm.invocation_parameters\"\n },\n \"temperature\": {\n \"sources\": [\n \"gen_ai.request.temperature\",\n \"traceloop.association.properties.ls_temperature\"\n ],\n \"target\": \"neatlogs.llm.temperature\"\n },\n \"intermediate_steps\": {\n \"description\": \"Derived ReAct-style steps extracted by the SDK (JSON array string).\",\n \"sources\": [\n \"llm.intermediate_steps\"\n ],\n \"target\": \"neatlogs.llm.intermediate_steps\"\n },\n \"top_p\": {\n \"sources\": [\n \"gen_ai.request.top_p\"\n ],\n \"target\": \"neatlogs.llm.top_p\"\n },\n \"top_k\": {\n \"sources\": [\n \"gen_ai.request.top_k\",\n \"llm.top_k\"\n ],\n \"target\": \"neatlogs.llm.top_k\"\n },\n \"max_tokens\": {\n \"sources\": [\n \"gen_ai.request.max_tokens\"\n ],\n \"target\": \"neatlogs.llm.max_tokens\"\n },\n \"frequency_penalty\": {\n \"sources\": [\n \"gen_ai.request.frequency_penalty\",\n \"llm.frequency_penalty\"\n ],\n \"target\": \"neatlogs.llm.frequency_penalty\"\n },\n \"presence_penalty\": {\n \"sources\": [\n \"gen_ai.request.presence_penalty\",\n \"llm.presence_penalty\"\n ],\n \"target\": \"neatlogs.llm.presence_penalty\"\n },\n \"stop_sequences\": {\n \"sources\": [\n \"gen_ai.request.stop_sequences\",\n \"llm.chat.stop_sequences\"\n ],\n \"target\": \"neatlogs.llm.stop_sequences\"\n },\n \"is_streaming\": {\n \"sources\": [\n \"llm.is_streaming\"\n ],\n \"target\": \"neatlogs.llm.is_streaming\"\n },\n \"headers\": {\n \"sources\": [\n \"llm.headers\"\n ],\n \"target\": \"neatlogs.llm.headers\"\n },\n \"finish_reason\": {\n \"sources\": [\n \"llm.response.finish_reason\",\n \"llm.finish_reason\",\n \"gen_ai.response.finish_reasons\",\n \"gen_ai.completion.0.finish_reason\"\n ],\n \"target\": \"neatlogs.llm.finish_reason\"\n },\n \"stop_reason\": {\n \"sources\": [\n \"llm.response.stop_reason\",\n \"gen_ai.response.stop_reason\"\n ],\n \"target\": \"neatlogs.llm.stop_reason\"\n },\n \"response_id\": {\n \"sources\": [\n \"gen_ai.response.id\"\n ],\n \"target\": \"neatlogs.llm.response_id\"\n },\n \"prompt_template\": {\n \"template\": {\n \"sources\": [\n \"neatlogs.prompt.template\",\n \"llm.prompt_template.template\",\n \"llm.prompt_template\",\n \"traceloop.prompt.template\"\n ],\n \"target\": \"neatlogs.llm.prompt_template\"\n },\n \"variables\": {\n \"sources\": [\n \"neatlogs.prompt.template_variables\",\n \"llm.prompt_template.variables\",\n \"llm.prompt_template_variables\",\n \"traceloop.prompt.template_variables\"\n ],\n \"target\": \"neatlogs.llm.prompt_template_variables\"\n },\n \"user_template\": {\n \"sources\": [\n \"llm.user_prompt_template\",\n \"neatlogs.user_prompt.template\"\n ],\n \"target\": \"neatlogs.llm.user_prompt_template\"\n },\n \"user_variables\": {\n \"sources\": [\n \"llm.user_prompt_template_variables\",\n \"neatlogs.user_prompt.template_variables\"\n ],\n \"target\": \"neatlogs.llm.user_prompt_template_variables\"\n },\n \"version\": {\n \"sources\": [\n \"neatlogs.prompt.version\",\n \"llm.prompt_template.version\",\n \"traceloop.prompt.version\"\n ],\n \"target\": \"neatlogs.llm.prompt_template.version\"\n },\n \"key\": {\n \"sources\": [\n \"traceloop.prompt.key\"\n ],\n \"target\": \"neatlogs.llm.prompt_key\"\n },\n \"vendor\": {\n \"sources\": [\n \"prompt.vendor\"\n ],\n \"target\": \"neatlogs.llm.prompt_vendor\"\n },\n \"id\": {\n \"sources\": [\n \"prompt.id\"\n ],\n \"target\": \"neatlogs.llm.prompt_id\"\n },\n \"url\": {\n \"sources\": [\n \"prompt.url\"\n ],\n \"target\": \"neatlogs.llm.prompt_url\"\n }\n }\n }\n },\n \"generic_io\": {\n \"description\": \"Generic input/output for any span type\",\n \"input\": {\n \"sources\": [\n \"input.value\",\n \"traceloop.entity.input\"\n ],\n \"target\": \"neatlogs.{span_kind}.input\"\n },\n \"output\": {\n \"sources\": [\n \"output.value\",\n \"traceloop.entity.output\"\n ],\n \"target\": \"neatlogs.{span_kind}.output\"\n },\n \"input_mime_type\": {\n \"sources\": [\n \"input.mime_type\"\n ],\n \"target\": \"neatlogs.{span_kind}.input_mime_type\"\n },\n \"output_mime_type\": {\n \"sources\": [\n \"output.mime_type\"\n ],\n \"target\": \"neatlogs.{span_kind}.output_mime_type\"\n }\n },\n \"span\": {\n \"description\": \"Span metadata\",\n \"name\": {\n \"sources\": [\n \"traceloop.entity.name\"\n ],\n \"target\": \"neatlogs.span.name\"\n },\n \"path\": {\n \"sources\": [\n \"traceloop.entity.path\"\n ],\n \"target\": \"neatlogs.span.path\"\n }\n },\n \"tool\": {\n \"name\": {\n \"sources\": [\n \"tool.name\"\n ],\n \"target\": \"neatlogs.tool.name\"\n },\n \"description\": {\n \"sources\": [\n \"tool.description\",\n \"gen_ai.tool.description\"\n ],\n \"target\": \"neatlogs.tool.description\"\n },\n \"parameters\": {\n \"sources\": [\n \"tool.parameters\"\n ],\n \"target\": \"neatlogs.tool.parameters\"\n },\n \"json_schema\": {\n \"sources\": [\n \"tool.json_schema\"\n ],\n \"target\": \"neatlogs.tool.json_schema\"\n },\n \"id\": {\n \"sources\": [\n \"tool.id\",\n \"gen_ai.tool.call.id\"\n ],\n \"target\": \"neatlogs.tool.id\"\n },\n \"call_id\": {\n \"sources\": [\n \"tool.call_id\",\n \"tool_call_id\"\n ],\n \"target\": \"neatlogs.tool_call.id\"\n }\n },\n \"agent\": {\n \"description\": \"Agent attributes\",\n \"name\": {\n \"sources\": [\n \"agent.name\"\n ],\n \"target\": \"neatlogs.agent.name\"\n },\n \"role\": {\n \"sources\": [\n \"agent_role\"\n ],\n \"target\": \"neatlogs.agent.role\"\n }\n },\n \"crewai\": {\n \"description\": \"CrewAI framework attributes (from OpenInference instrumentation)\",\n \"crew_id\": {\n \"sources\": [\"crew_id\"],\n \"target\": \"neatlogs.crewai.crew_id\"\n },\n \"crew_key\": {\n \"sources\": [\"crew_key\"],\n \"target\": \"neatlogs.crewai.crew_key\"\n },\n \"crew_number_of_agents\": {\n \"sources\": [\"crew_number_of_agents\"],\n \"target\": \"neatlogs.crewai.crew_number_of_agents\"\n },\n \"crew_number_of_tasks\": {\n \"sources\": [\"crew_number_of_tasks\"],\n \"target\": \"neatlogs.crewai.crew_number_of_tasks\"\n },\n \"version\": {\n \"sources\": [\"crewai_version\"],\n \"target\": \"neatlogs.crewai.version\"\n },\n \"task_id\": {\n \"sources\": [\"task_id\"],\n \"target\": \"neatlogs.task.id\"\n },\n \"task_key\": {\n \"sources\": [\"task_key\"],\n \"target\": \"neatlogs.task.key\"\n }\n },\n \"retriever\": {\n \"description\": \"Retrieval/Vector DB attributes\",\n \"documents\": {\n \"sources\": {\n \"id\": [\n \"retrieval.documents.{i}.document.id\",\n \"db.query.result.id\"\n ],\n \"content\": [\n \"retrieval.documents.{i}.document.content\",\n \"db.query.result.document\"\n ],\n \"score\": [\n \"retrieval.documents.{i}.document.score\",\n \"document.score\",\n \"db.query.result.score\",\n \"db.query.result.distance\"\n ],\n \"metadata\": [\n \"retrieval.documents.{i}.document.metadata\",\n \"db.query.result.metadata\"\n ]\n },\n \"target\": \"neatlogs.retriever.documents.{i}\",\n \"indexed\": true\n },\n \"query\": {\n \"sources\": [\n \"retrieval.query\",\n \"db.query.text\"\n ],\n \"target\": \"neatlogs.retriever.query\"\n },\n \"top_k\": {\n \"sources\": [\n \"retrieval.top_k\",\n \"db.vector.query.top_k\"\n ],\n \"target\": \"neatlogs.retriever.top_k\"\n }\n },\n \"db\": {\n \"description\": \"Database operations (vector DBs, etc.)\",\n \"system\": {\n \"sources\": [\n \"db.system\"\n ],\n \"target\": \"neatlogs.db.system\"\n },\n \"collection_name\": {\n \"sources\": [\n \"db.collection.name\"\n ],\n \"target\": \"neatlogs.db.collection_name\"\n },\n \"operation\": {\n \"sources\": [\n \"db.operation\"\n ],\n \"target\": \"neatlogs.db.operation\"\n },\n \"documents_count\": {\n \"sources\": [\n \"db.chroma.add.documents_count\",\n \"db.pinecone.add.documents_count\"\n ],\n \"target\": \"neatlogs.db.documents_count\"\n },\n \"ids_count\": {\n \"sources\": [\n \"db.chroma.add.ids_count\",\n \"db.pinecone.add.ids_count\"\n ],\n \"target\": \"neatlogs.db.ids_count\"\n },\n \"metadatas_count\": {\n \"sources\": [\n \"db.chroma.add.metadatas_count\",\n \"db.pinecone.add.metadatas_count\"\n ],\n \"target\": \"neatlogs.db.metadatas_count\"\n }\n },\n \"vectordb\": {\n \"description\": \"Vector Database specific attributes (Marqo, Qdrant, Milvus, etc.)\",\n \"index_name\": {\n \"sources\": [\n \"vector_db_index_name\",\n \"marqo.index_name\",\n \"qdrant.upsert.collection_name\",\n \"qdrant.search.collection_name\",\n \"db.milvus.create_collection.collection_name\",\n \"db.milvus.search.collection_name\",\n \"db.milvus.insert.collection_name\",\n \"db.chroma.collection.name\"\n ],\n \"target\": \"neatlogs.vectordb.index_name\"\n },\n \"embedding_model\": {\n \"sources\": [\n \"embedding_model\",\n \"marqo.model\",\n \"embedding.model_name\"\n ],\n \"target\": \"neatlogs.vectordb.embedding_model\"\n },\n \"retrieval_query\": {\n \"sources\": [\n \"retrieval_query\",\n \"db.marqo.search.query\"\n ],\n \"target\": \"neatlogs.vectordb.retrieval_query\"\n },\n \"retrieval_time_taken\": {\n \"sources\": [\n \"retrieval_time_taken\",\n \"db.marqo.search.processing_time\"\n ],\n \"target\": \"neatlogs.vectordb.retrieval_time_taken\"\n },\n \"vector_dimension\": {\n \"sources\": [\n \"vector_dimension\",\n \"db.milvus.create_collection.dimension\",\n \"db.milvus.search.query_vector_dimension\"\n ],\n \"target\": \"neatlogs.vectordb.vector_dimension\"\n },\n \"similarity_algorithm\": {\n \"sources\": [\n \"vector_similarity_algorithm\",\n \"db.milvus.create_collection.metric_type\"\n ],\n \"target\": \"neatlogs.vectordb.similarity_algorithm\"\n },\n \"document_attributes\": {\n \"sources\": [\n \"document_attributes\"\n ],\n \"target\": \"neatlogs.vectordb.document_attributes\",\n \"description\": \"Computed JSON field from SDK\"\n },\n \"retrieval_input_params\": {\n \"sources\": [\n \"retrieval_input_params\"\n ],\n \"target\": \"neatlogs.vectordb.retrieval_input_params\",\n \"description\": \"Computed JSON field from SDK (Marqo limit, hits_count, filter)\"\n },\n \"retrieval_documents\": {\n \"sources\": [\n \"retrieval_documents\"\n ],\n \"target\": \"neatlogs.vectordb.retrieval_documents\",\n \"description\": \"Computed JSON array from SDK events\"\n }\n },\n \"reranker\": {\n \"description\": \"Reranker model attributes\",\n \"applies_to\": [\"reranker\"],\n \"model_name\": {\n \"sources\": [\n \"reranker.model_name\",\n \"ai.model.id\"\n ],\n \"target\": \"neatlogs.reranker.model_name\"\n },\n \"provider\": {\n \"sources\": [\n \"ai.model.provider\"\n ],\n \"target\": \"neatlogs.reranker.provider\",\n \"description\": \"Vercel AI SDK reranker provider (e.g. gateway, cohere)\"\n },\n \"query\": {\n \"sources\": [\n \"reranker.query\",\n \"ai.rerank.query\"\n ],\n \"target\": \"neatlogs.reranker.query\"\n },\n \"documents\": {\n \"sources\": [\n \"ai.documents\"\n ],\n \"target\": \"neatlogs.reranker.input_documents\",\n \"description\": \"Vercel AI SDK rerank input documents array\"\n },\n \"ranking\": {\n \"sources\": [\n \"ai.ranking\"\n ],\n \"target\": \"neatlogs.reranker.output_documents\",\n \"description\": \"Vercel AI SDK rerank output ranking array\"\n },\n \"ranking_type\": {\n \"sources\": [\n \"ai.ranking.type\"\n ],\n \"target\": \"neatlogs.reranker.ranking_type\",\n \"description\": \"Vercel AI SDK rerank type (e.g. text)\"\n },\n \"top_k\": {\n \"sources\": [\n \"reranker.top_k\"\n ],\n \"target\": \"neatlogs.reranker.top_k\"\n },\n \"max_retries\": {\n \"sources\": [\n \"ai.settings.maxRetries\"\n ],\n \"target\": \"neatlogs.reranker.max_retries\",\n \"description\": \"Vercel AI SDK max retries setting\"\n },\n \"input_documents\": {\n \"sources\": {\n \"id\": [\n \"reranker.input_documents.{i}.document.id\"\n ],\n \"content\": [\n \"reranker.input_documents.{i}.document.content\"\n ],\n \"metadata\": [\n \"reranker.input_documents.{i}.document.metadata\"\n ]\n },\n \"target\": \"neatlogs.reranker.input_documents.{i}\",\n \"indexed\": true\n },\n \"output_documents\": {\n \"sources\": {\n \"id\": [\n \"reranker.output_documents.{i}.document.id\"\n ],\n \"content\": [\n \"reranker.output_documents.{i}.document.content\"\n ],\n \"score\": [\n \"reranker.output_documents.{i}.document.score\",\n \"reranker.output_documents.{i}.relevance_score\"\n ],\n \"metadata\": [\n \"reranker.output_documents.{i}.document.metadata\"\n ]\n },\n \"target\": \"neatlogs.reranker.output_documents.{i}\",\n \"indexed\": true\n }\n },\n \"embedding\": {\n \"description\": \"Embedding model attributes\",\n \"applies_to\": [\"embedding\"],\n \"input\": {\n \"sources\": [\n \"ai.value\",\n \"ai.values\"\n ],\n \"target\": \"neatlogs.embedding.input\",\n \"description\": \"Vercel AI SDK embed/embedMany input value(s)\"\n },\n \"model_name\": {\n \"sources\": [\n \"embedding.model_name\",\n \"ai.model.id\"\n ],\n \"target\": \"neatlogs.embedding.model_name\"\n },\n \"text\": {\n \"sources\": [\n \"embedding.text\"\n ],\n \"target\": \"neatlogs.embedding.text\"\n },\n \"vector\": {\n \"sources\": [\n \"embedding.vector\"\n ],\n \"target\": \"neatlogs.embedding.vector\"\n },\n \"token_count\": {\n \"sources\": [\n \"embedding.token_count\",\n \"ai.usage.tokens\"\n ],\n \"target\": \"neatlogs.embedding.token_count\"\n },\n \"invocation_parameters\": {\n \"sources\": [\n \"embedding.invocation_parameters\"\n ],\n \"target\": \"neatlogs.embedding.invocation_parameters\"\n },\n \"embeddings_data\": {\n \"sources\": [\n \"embeddings_data\"\n ],\n \"target\": \"neatlogs.embedding.embeddings_data\",\n \"description\": \"Computed JSON array from SDK (embedding.embeddings.*.embedding.text)\"\n }\n },\n \"session\": {\n \"description\": \"Session tracking\",\n \"id\": {\n \"sources\": [\n \"session.id\"\n ],\n \"target\": \"neatlogs.session.id\"\n }\n },\n \"user\": {\n \"description\": \"User tracking\",\n \"id\": {\n \"sources\": [\n \"user.id\"\n ],\n \"target\": \"neatlogs.user.id\"\n }\n },\n \"workflow\": {\n \"description\": \"Workflow/Chain metadata\",\n \"name\": {\n \"sources\": [\n \"traceloop.workflow.name\"\n ],\n \"target\": \"neatlogs.workflow.name\"\n }\n },\n \"entity\": {\n \"description\": \"LangChain entity metadata (from OpenLLMetry/Traceloop)\",\n \"name\": {\n \"sources\": [\n \"traceloop.entity.name\"\n ],\n \"target\": \"neatlogs.entity.name\"\n },\n \"path\": {\n \"sources\": [\n \"traceloop.entity.path\"\n ],\n \"target\": \"neatlogs.entity.path\"\n }\n },\n \"langgraph\": {\n \"description\": \"LangGraph execution metadata (from OpenLLMetry/Traceloop association properties)\",\n \"step\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_step\"\n ],\n \"target\": \"neatlogs.langgraph.step\"\n },\n \"node\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_node\"\n ],\n \"target\": \"neatlogs.langgraph.node\"\n },\n \"triggers\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_triggers\"\n ],\n \"target\": \"neatlogs.langgraph.triggers\"\n },\n \"path\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_path\"\n ],\n \"target\": \"neatlogs.langgraph.path\"\n },\n \"checkpoint_ns\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_checkpoint_ns\",\n \"traceloop.association.properties.checkpoint_ns\"\n ],\n \"target\": \"neatlogs.langgraph.checkpoint_ns\"\n },\n \"task_id\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_task_id\"\n ],\n \"target\": \"neatlogs.langgraph.task_id\"\n },\n \"thread_id\": {\n \"sources\": [\n \"traceloop.association.properties.thread_id\"\n ],\n \"target\": \"neatlogs.langgraph.thread_id\"\n }\n },\n \"mcp\": {\n \"description\": \"Model Context Protocol (MCP) attributes\",\n \"method\": {\n \"sources\": [\n \"mcp.method.name\",\n \"mcp.method\"\n ],\n \"target\": \"neatlogs.mcp.method\"\n },\n \"request_id\": {\n \"sources\": [\n \"mcp.request.id\"\n ],\n \"target\": \"neatlogs.mcp.request_id\"\n },\n \"request_argument\": {\n \"sources\": [\n \"mcp.request.argument\"\n ],\n \"target\": \"neatlogs.mcp.request_argument\"\n },\n \"response_value\": {\n \"sources\": [\n \"mcp.response.value\"\n ],\n \"target\": \"neatlogs.mcp.response_value\"\n },\n \"session_init_options\": {\n \"sources\": [\n \"mcp.session.init_options\"\n ],\n \"target\": \"neatlogs.mcp.session_init_options\"\n },\n \"protocol_version\": {\n \"sources\": [\n \"mcp.protocol_version\"\n ],\n \"target\": \"neatlogs.mcp.protocol_version\"\n },\n \"server\": {\n \"name\": {\n \"sources\": [\n \"mcp.server.name\"\n ],\n \"target\": \"neatlogs.mcp.server.name\"\n },\n \"version\": {\n \"sources\": [\n \"mcp.server.version\"\n ],\n \"target\": \"neatlogs.mcp.server.version\"\n },\n \"capabilities\": {\n \"sources\": [\n \"mcp.server.capabilities\"\n ],\n \"target\": \"neatlogs.mcp.server.capabilities\"\n }\n },\n \"tool\": {\n \"name\": {\n \"sources\": [\n \"mcp.tool.name\"\n ],\n \"target\": \"neatlogs.mcp.tool.name\"\n },\n \"arguments\": {\n \"sources\": [\n \"mcp.tool.arguments\"\n ],\n \"target\": \"neatlogs.mcp.tool.arguments\"\n }\n },\n \"tools\": {\n \"count\": {\n \"sources\": [\n \"mcp.tools.count\"\n ],\n \"target\": \"neatlogs.mcp.tools.count\"\n },\n \"names\": {\n \"sources\": [\n \"mcp.tools.names\"\n ],\n \"target\": \"neatlogs.mcp.tools.names\"\n }\n }\n },\n \"framework\": {\n \"description\": \"Framework-specific attributes\",\n \"langsmith\": {\n \"model_name\": {\n \"sources\": [\n \"traceloop.association.properties.ls_model_name\"\n ],\n \"target\": \"neatlogs.framework.langsmith.model_name\"\n },\n \"model_type\": {\n \"sources\": [\n \"traceloop.association.properties.ls_model_type\"\n ],\n \"target\": \"neatlogs.framework.langsmith.model_type\"\n },\n \"provider\": {\n \"sources\": [\n \"traceloop.association.properties.ls_provider\"\n ],\n \"target\": \"neatlogs.framework.langsmith.provider\"\n },\n \"temperature\": {\n \"sources\": [\n \"traceloop.association.properties.ls_temperature\"\n ],\n \"target\": \"neatlogs.framework.langsmith.temperature\"\n }\n }\n },\n \"graph\": {\n \"description\": \"Execution Graph / Chain attributes\",\n \"node\": {\n \"name\": {\n \"sources\": [\n \"graph.node.name\",\n \"traceloop.association.properties.langgraph_node\"\n ],\n \"target\": \"neatlogs.graph.node.name\"\n },\n \"id\": {\n \"sources\": [\n \"graph.node.id\"\n ],\n \"target\": \"neatlogs.graph.node.id\"\n },\n \"parent_id\": {\n \"sources\": [\n \"graph.node.parent_id\"\n ],\n \"target\": \"neatlogs.graph.node.parent_id\"\n }\n }\n },\n \"metadata\": {\n \"description\": \"Custom metadata\",\n \"sources\": [\n \"metadata\"\n ],\n \"target\": \"neatlogs.metadata\"\n },\n \"tags\": {\n \"description\": \"Tags array\",\n \"sources\": [\n \"tag.tags\"\n ],\n \"target\": \"neatlogs.tags\"\n },\n \"metrics\": {\n \"description\": \"Performance metrics from OpenLLMetry/OpenLit\",\n \"llm\": {\n \"time_to_first_token\": {\n \"sources\": [\n \"neatlogs.llm.metrics.time_to_first_token\",\n \"gen_ai.server.time_to_first_token\",\n \"llm.time_to_first_token\"\n ],\n \"target\": \"neatlogs.llm.metrics.time_to_first_token\"\n },\n \"streaming_time_to_generate\": {\n \"sources\": [\n \"neatlogs.llm.metrics.streaming_time_to_generate\",\n \"llm.chat_completions.streaming_time_to_generate\"\n ],\n \"target\": \"neatlogs.llm.metrics.streaming_time_to_generate\"\n },\n \"time_per_output_token\": {\n \"sources\": [\n \"neatlogs.llm.metrics.time_per_output_token\",\n \"gen_ai.server.time_per_output_token\"\n ],\n \"target\": \"neatlogs.llm.metrics.time_per_output_token\"\n }\n }\n }\n },\n \"keep_as_is\": {\n \"description\": \"OpenTelemetry standard attributes to keep unchanged\",\n \"attributes\": [\n \"neatlogs.internal\",\n \"http.method\",\n \"http.request.method\",\n \"http.url\",\n \"url.full\",\n \"url.path\",\n \"http.status_code\",\n \"http.response.status_code\",\n \"http.request.body.size\",\n \"http.response.body.size\",\n \"service.name\",\n \"service.version\",\n \"telemetry.sdk.name\",\n \"telemetry.sdk.version\",\n \"telemetry.sdk.language\"\n ]\n },\n \"ignore\": {\n \"description\": \"Attributes to ignore/drop during ingestion\",\n \"patterns\": [\n \"telemetry.distro.*\",\n \"code.*\",\n \"exception.*\"\n ]\n }\n }\n}\n","/**\n * Neatlogs Semantic Conventions - Attribute Mapper\n *\n * Maps vendor-specific attributes to the unified neatlogs.* namespace\n * using configuration from attribute-mapping.json.\n */\n\nimport { getLogger } from '../core/logger.js';\nimport attributeMappingConfig from './attribute-mapping.json';\n\nconst logger = getLogger();\n\ninterface MappingConfig {\n sources: string[] | Record<string, string[]>;\n target?: string;\n indexed?: boolean;\n target_content?: string;\n description?: string;\n priority?: string;\n values?: Record<string, string>;\n mappings?: Record<string, any>;\n [key: string]: any;\n}\n\n/** Flatten sources into a single array of source patterns, regardless of shape. */\nfunction flattenSources(sources: string[] | Record<string, string[]> | undefined): string[] {\n if (!sources) return [];\n if (Array.isArray(sources)) return sources;\n // Object form: { id: [...], name: [...], ... } — flatten all arrays\n const result: string[] = [];\n for (const arr of Object.values(sources)) {\n if (Array.isArray(arr)) {\n result.push(...arr);\n }\n }\n return result;\n}\n\nexport class AttributeMapper {\n private config: Record<string, any>;\n private mappings: Record<string, any>;\n private keepAsIs: Set<string>;\n private ignorePatterns: string[];\n private compiledIgnorePatterns: RegExp[];\n private _regexCache: Map<string, RegExp> = new Map();\n\n constructor(config?: Record<string, any>) {\n this.config = config ?? (attributeMappingConfig as Record<string, any>);\n\n this.mappings = this.config.mappings ?? {};\n // keep_as_is / ignore may live at top-level or inside mappings\n const keepAsIsAttrs =\n this.config.keep_as_is?.attributes ??\n this.mappings.keep_as_is?.attributes ??\n [];\n this.keepAsIs = new Set<string>(keepAsIsAttrs);\n this.ignorePatterns =\n this.config.ignore?.patterns ??\n this.mappings.ignore?.patterns ??\n [];\n // Pre-compile ignore patterns for performance (avoid per-call regex creation)\n this.compiledIgnorePatterns = this.ignorePatterns.map(\n (pattern) => new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$'),\n );\n }\n\n /** Check if an attribute should be ignored. */\n shouldIgnore(attrName: string): boolean {\n for (const regex of this.compiledIgnorePatterns) {\n if (regex.test(attrName)) {\n return true;\n }\n }\n return false;\n }\n\n /** Check if an attribute should be kept unchanged (OTel standard). */\n shouldKeepAsIs(attrName: string): boolean {\n return this.keepAsIs.has(attrName);\n }\n\n /** Extract and normalize span kind from multiple possible sources. */\n mapSpanKind(attributes: Record<string, any>): string {\n const spanKindConfig = this.mappings.span_kind ?? {};\n const sources: string[] = spanKindConfig.sources ?? [];\n const valuesMap: Record<string, string> = spanKindConfig.values ?? {};\n const priority: string = spanKindConfig.priority ?? 'openinference';\n\n let spanKindValue: string | undefined;\n\n if (priority === 'openinference') {\n if ('openinference.span.kind' in attributes) {\n spanKindValue = attributes['openinference.span.kind'];\n }\n } else {\n for (const source of sources) {\n if (source in attributes) {\n spanKindValue = attributes[source];\n break;\n }\n }\n }\n\n if (spanKindValue && spanKindValue in valuesMap) {\n return valuesMap[spanKindValue];\n }\n\n // Infer LLM span from attributes\n const isLlmSpan = [\n 'llm.model_name',\n 'gen_ai.request.model',\n 'llm.token_count.prompt',\n 'llm.token_count.completion',\n 'gen_ai.usage.prompt_tokens',\n 'gen_ai.usage.completion_tokens',\n ].some((key) => key in attributes);\n\n if (isLlmSpan) {\n return 'llm';\n }\n\n return 'unknown';\n }\n\n /** Map a simple attribute from multiple sources to target. */\n mapSimpleAttribute(\n mappingConfig: MappingConfig,\n attributes: Record<string, any>,\n ): any | undefined {\n const sources = flattenSources(mappingConfig.sources);\n for (const source of sources) {\n if (source in attributes) {\n return attributes[source];\n }\n }\n return undefined;\n }\n\n /** Get or create a cached RegExp for a source pattern. */\n private _getPatternRegex(sourcePattern: string): RegExp {\n let cached = this._regexCache.get(sourcePattern);\n if (!cached) {\n let regexPattern = sourcePattern.replace(/\\{i\\}/g, '(\\\\d+)');\n regexPattern = regexPattern.replace(/\\./g, '\\\\.');\n cached = new RegExp('^' + regexPattern + '$');\n this._regexCache.set(sourcePattern, cached);\n }\n return cached;\n }\n\n /** Map indexed attributes like messages (llm.input_messages.0.role). */\n mapIndexedAttributes(\n mappingConfig: MappingConfig,\n attributes: Record<string, any>,\n targetBase: string,\n ): Record<string, any> {\n const mapped: Record<string, any> = {};\n const rawSources = mappingConfig.sources;\n\n if (Array.isArray(rawSources)) {\n // Simple array of source patterns\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n for (const sourcePattern of rawSources) {\n const match = attrName.match(this._getPatternRegex(sourcePattern));\n\n if (match) {\n const index = match[1];\n const target = targetBase.replace(/\\{i\\}/g, index);\n mapped[target] = attrValue;\n }\n }\n }\n } else if (rawSources && typeof rawSources === 'object') {\n // Object form: { field: [sourcePatterns...] }\n // e.g. { id: [\"llm.tool_calls.{i}.id\"], name: [\"llm.tool_calls.{i}.name\"] }\n for (const [field, sourcePatterns] of Object.entries(rawSources)) {\n if (!Array.isArray(sourcePatterns)) continue;\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n for (const sourcePattern of sourcePatterns) {\n const match = attrName.match(this._getPatternRegex(sourcePattern));\n\n if (match) {\n const index = match[1];\n const target = targetBase.replace(/\\{i\\}/g, index) + '.' + field;\n mapped[target] = attrValue;\n }\n }\n }\n }\n }\n\n return mapped;\n }\n\n /** Recursively map nested configuration. */\n mapNestedConfig(\n config: Record<string, any>,\n attributes: Record<string, any>,\n spanKind?: string,\n ): Record<string, any> {\n const mapped: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(config)) {\n if (['description', 'sources', 'target', 'indexed', 'priority', 'values', 'applies_to'].includes(key)) {\n continue;\n }\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n if (Array.isArray(value.applies_to) && spanKind && !value.applies_to.includes(spanKind)) {\n continue;\n }\n if ('sources' in value) {\n if (value.indexed) {\n const target = value.target ?? '';\n const indexedMapped = this.mapIndexedAttributes(value, attributes, target);\n Object.assign(mapped, indexedMapped);\n\n if ('target_content' in value) {\n const contentTarget = value.target_content;\n const contentMapped = this.mapIndexedAttributes(value, attributes, contentTarget);\n Object.assign(mapped, contentMapped);\n }\n } else {\n let target = value.target ?? '';\n if (spanKind && target.includes('{span_kind}')) {\n target = target.replace(/\\{span_kind\\}/g, spanKind);\n }\n\n const result = this.mapSimpleAttribute(value, attributes);\n if (result !== undefined) {\n mapped[target] = result;\n }\n }\n } else {\n const nestedMapped = this.mapNestedConfig(value, attributes, spanKind);\n Object.assign(mapped, nestedMapped);\n }\n }\n }\n\n return mapped;\n }\n\n /** Map all attributes from vendor-specific to neatlogs namespace. */\n mapAttributes(\n attributes: Record<string, any>,\n spanKind?: string,\n ): Record<string, any> {\n const mapped: Record<string, any> = {};\n\n if (!spanKind) {\n spanKind = this.mapSpanKind(attributes);\n }\n mapped['neatlogs.span.kind'] = spanKind;\n\n for (const [sectionName, sectionConfig] of Object.entries(this.mappings)) {\n if (sectionName === 'span_kind' || sectionName === 'keep_as_is' || sectionName === 'ignore') continue;\n\n if (typeof sectionConfig === 'object' && sectionConfig !== null) {\n // Skip sections that don't apply to this span kind\n if (Array.isArray(sectionConfig.applies_to) && spanKind && !sectionConfig.applies_to.includes(spanKind)) {\n continue;\n }\n if ('mappings' in sectionConfig) {\n // Process the explicit 'mappings' sub-key\n const nestedMapped = this.mapNestedConfig(\n sectionConfig.mappings,\n attributes,\n spanKind,\n );\n Object.assign(mapped, nestedMapped);\n // Also process sibling sub-sections (e.g. generic_io, span, tool, etc.)\n for (const [subKey, subVal] of Object.entries(sectionConfig)) {\n if (subKey === 'mappings' || subKey === 'description' || subKey === 'applies_to') continue;\n if (typeof subVal === 'object' && subVal !== null && !Array.isArray(subVal)) {\n if (Array.isArray((subVal as any).applies_to) && spanKind && !(subVal as any).applies_to.includes(spanKind)) {\n continue;\n }\n if ('sources' in subVal) {\n if ((subVal as any).indexed) {\n const target = (subVal as any).target ?? '';\n const indexedMapped = this.mapIndexedAttributes(subVal as MappingConfig, attributes, target);\n Object.assign(mapped, indexedMapped);\n } else if (Array.isArray((subVal as any).sources)) {\n let target = (subVal as any).target ?? '';\n if (spanKind && target.includes('{span_kind}')) {\n target = target.replace(/\\{span_kind\\}/g, spanKind);\n }\n const result = this.mapSimpleAttribute(subVal as MappingConfig, attributes);\n if (result !== undefined) {\n mapped[target] = result;\n }\n }\n } else {\n const subMapped = this.mapNestedConfig(subVal as Record<string, any>, attributes, spanKind);\n Object.assign(mapped, subMapped);\n }\n }\n }\n } else if ('sources' in sectionConfig) {\n let target = sectionConfig.target ?? '';\n if (target.includes('{span_kind}')) {\n target = target.replace(/\\{span_kind\\}/g, spanKind);\n }\n const result = this.mapSimpleAttribute(sectionConfig, attributes);\n if (result !== undefined) {\n mapped[target] = result;\n }\n } else {\n const nestedMapped = this.mapNestedConfig(sectionConfig, attributes, spanKind);\n Object.assign(mapped, nestedMapped);\n }\n }\n }\n\n // Keep OTel standard attributes\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n if (this.shouldKeepAsIs(attrName) && !(attrName in mapped)) {\n mapped[attrName] = attrValue;\n }\n }\n\n // Collect all mapped sources\n const mappedSources = new Set<string>();\n for (const sectionConfig of Object.values(this.mappings)) {\n if (typeof sectionConfig === 'object' && sectionConfig !== null) {\n if ('sources' in sectionConfig) {\n for (const s of flattenSources((sectionConfig as any).sources)) {\n mappedSources.add(s);\n }\n }\n if ('mappings' in sectionConfig) {\n this._collectMappedSources((sectionConfig as any).mappings, mappedSources);\n }\n // Also collect from sibling sub-sections\n for (const [subKey, subVal] of Object.entries(sectionConfig)) {\n if (subKey === 'mappings' || subKey === 'description' || subKey === 'sources') continue;\n if (typeof subVal === 'object' && subVal !== null && !Array.isArray(subVal)) {\n this._collectMappedSources(subVal as Record<string, any>, mappedSources);\n }\n }\n }\n }\n\n // Pass through unmapped, non-ignored attributes\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n if (!mappedSources.has(attrName) && !(attrName in mapped) && !this.shouldIgnore(attrName)) {\n mapped[attrName] = attrValue;\n }\n }\n\n // Remove ignored attributes from final result\n const result: Record<string, any> = {};\n for (const [k, v] of Object.entries(mapped)) {\n if (!this.shouldIgnore(k)) {\n result[k] = v;\n }\n }\n\n return result;\n }\n\n /** Recursively collect all source attribute names from nested config. */\n private _collectMappedSources(config: Record<string, any>, collected: Set<string>): void {\n for (const value of Object.values(config)) {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n if ('sources' in value) {\n for (const s of flattenSources((value as any).sources)) {\n collected.add(s);\n }\n } else {\n this._collectMappedSources(value as Record<string, any>, collected);\n }\n }\n }\n }\n\n /** Get the span kind value mapping. */\n getSpanKindValueMapping(): Record<string, string> {\n return this.mappings.span_kind?.values ?? {};\n }\n\n /** Get the target neatlogs attribute name for a source attribute. */\n getTargetAttributeName(sourceAttr: string, spanKind?: string): string | undefined {\n const searchConfig = (config: Record<string, any>, targetSpanKind?: string): string | undefined => {\n for (const value of Object.values(config)) {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n if ('sources' in value) {\n const sources = flattenSources((value as any).sources);\n if (sources.includes(sourceAttr)) {\n let target = (value as any).target ?? '';\n if (targetSpanKind && target.includes('{span_kind}')) {\n target = target.replace(/\\{span_kind\\}/g, targetSpanKind);\n }\n return target;\n }\n }\n const result = searchConfig(value as Record<string, any>, targetSpanKind);\n if (result) return result;\n }\n }\n return undefined;\n };\n\n return searchConfig(this.mappings, spanKind);\n }\n}\n\n// Singleton instance\nlet _mapperInstance: AttributeMapper | null = null;\n\n/** Get the global AttributeMapper instance. */\nexport function getMapper(): AttributeMapper {\n if (!_mapperInstance) {\n _mapperInstance = new AttributeMapper();\n }\n return _mapperInstance;\n}\n\n/** Convenience function to map attributes using the global mapper. */\nexport function mapAttributes(\n attributes: Record<string, any>,\n spanKind?: string,\n): Record<string, any> {\n return getMapper().mapAttributes(attributes, spanKind);\n}\n","/**\n * A SpanExporter wrapper that filters out spans marked as dropped by the mask system.\n *\n * When NeatlogsSpanProcessor's onEnd() determines a mask returned null (meaning\n * \"drop this span\"), it sets `neatlogs.dropped = true` on the OTel span's attributes.\n * This exporter wrapper checks for that attribute and excludes those spans before\n * delegating to the real exporter.\n */\nimport type { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport type { ExportResult } from '@opentelemetry/core';\n\nexport class FilteringExporter implements SpanExporter {\n constructor(private readonly _delegate: SpanExporter) {}\n\n export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n const filtered = spans.filter(\n (s) => !s.attributes['neatlogs.dropped'] && s.instrumentationLibrary.name !== 'next.js',\n );\n if (filtered.length === 0) {\n // Nothing to export — report success immediately\n resultCallback({ code: 0 });\n return;\n }\n this._delegate.export(filtered, resultCallback);\n }\n\n async shutdown(): Promise<void> {\n return this._delegate.shutdown();\n }\n\n async forceFlush?(): Promise<void> {\n return this._delegate.forceFlush?.();\n }\n}\n","/**\n * NeatlogsExporter — batch HTTP exporter for log spans.\n *\n * Buffers span-like dicts and flushes them in batches to the\n * Neatlogs API at /api/data/v4/batch.\n */\n\nimport { getLogger } from './logger.js';\n\nconst logger = getLogger();\n\nexport interface NeatlogsExporterOptions {\n baseUrl: string;\n apiKey: string;\n batchSize?: number; // default 50\n flushIntervalMs?: number; // default 5000\n disableExport?: boolean;\n}\n\nexport class NeatlogsExporter {\n private baseUrl: string;\n private apiKey: string;\n private batchSize: number;\n private flushIntervalMs: number;\n private disableExport: boolean;\n private buffer: Record<string, any>[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private _shutdown = false;\n\n constructor(options: NeatlogsExporterOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, '');\n this.apiKey = options.apiKey;\n this.batchSize = options.batchSize ?? 50;\n this.flushIntervalMs = options.flushIntervalMs ?? 5000;\n this.disableExport = options.disableExport ?? false;\n\n if (!this.disableExport) {\n this.flushTimer = setInterval(() => this.flush(), this.flushIntervalMs);\n // Don't keep the process alive just for flushing\n if (this.flushTimer.unref) {\n this.flushTimer.unref();\n }\n }\n }\n\n /** Add a span-like dict to the buffer. */\n export(spanData: Record<string, any>): void {\n if (this._shutdown || this.disableExport) return;\n\n this.buffer.push(spanData);\n\n if (this.buffer.length >= this.batchSize) {\n this.flush().catch((err) => {\n logger.warn(`Failed to flush batch: ${err}`);\n });\n }\n }\n\n /** Flush all buffered spans to the API. */\n async flush(): Promise<void> {\n if (this.disableExport || this.buffer.length === 0) return;\n\n const batch = this.buffer.splice(0, this.buffer.length);\n\n try {\n const url = `${this.baseUrl}/api/data/v4/batch`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n },\n body: JSON.stringify({ spans: batch }),\n });\n\n if (!response.ok) {\n logger.warn(\n `Failed to export batch: ${response.status} ${response.statusText}`,\n );\n this._requeueBatch(batch);\n } else {\n logger.debug(`Exported ${batch.length} log spans`);\n }\n } catch (err) {\n logger.warn(`Failed to export batch: ${err}`);\n this._requeueBatch(batch);\n }\n }\n\n /** Re-insert a failed batch into the buffer for retry, up to a limit. */\n private _requeueBatch(batch: Record<string, any>[]): void {\n if (this.buffer.length < this.batchSize * 3) {\n this.buffer.unshift(...batch);\n }\n }\n\n /** Shutdown the exporter, flushing remaining items. */\n async shutdown(): Promise<void> {\n this._shutdown = true;\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.flush();\n }\n}\n","/**\n * NeatlogsLogExporter — bridges OTel LogRecord to NeatlogsExporter.\n *\n * Converts OTel log records into span-like dicts and forwards them\n * to the NeatlogsExporter for batch export.\n *\n * Also supports NEATLOGS_LOG_LOGS / NEATLOGS_LOG_LOGS_FILE env vars\n * for writing log records to a local file (mirrors Python SDK behavior).\n */\n\nimport * as crypto from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { ReadableLogRecord } from '@opentelemetry/sdk-logs';\nimport type { ExportResult } from '@opentelemetry/core';\nimport { ExportResultCode } from '@opentelemetry/core';\nimport type { LogRecordExporter } from '@opentelemetry/sdk-logs';\nimport { NeatlogsExporter } from './exporter.js';\nimport { getLogger } from './logger.js';\n\nconst logger = getLogger();\n\nexport class NeatlogsLogExporter implements LogRecordExporter {\n private exporter: NeatlogsExporter;\n private logFileHandle: number | null = null;\n private logEnabled: boolean;\n\n constructor(exporter: NeatlogsExporter) {\n this.exporter = exporter;\n\n this.logEnabled = ['1', 'true', 'yes'].includes(\n (process.env.NEATLOGS_LOG_LOGS ?? '').toLowerCase(),\n );\n const logFile = process.env.NEATLOGS_LOG_LOGS_FILE ?? '';\n\n if (this.logEnabled && logFile) {\n const filePath = path.resolve(process.cwd(), logFile);\n try {\n this.logFileHandle = fs.openSync(filePath, 'a');\n logger.info(`Log record logging enabled: ${filePath}`);\n } catch (err) {\n logger.warn(`Failed to open log file ${filePath}: ${err}`);\n }\n }\n }\n\n export(\n logRecords: ReadableLogRecord[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n try {\n for (const record of logRecords) {\n const spanDict = this._convertLogRecord(record);\n this.exporter.export(spanDict);\n this._writeToFile(record, spanDict);\n }\n resultCallback({ code: ExportResultCode.SUCCESS });\n } catch (err) {\n logger.warn(`Failed to export log records: ${err}`);\n resultCallback({ code: ExportResultCode.FAILED });\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.logFileHandle !== null) {\n fs.closeSync(this.logFileHandle);\n this.logFileHandle = null;\n }\n }\n\n async forceFlush(): Promise<void> {\n await this.exporter.flush();\n }\n\n private _writeToFile(record: ReadableLogRecord, spanDict: Record<string, any>): void {\n if (!this.logEnabled || this.logFileHandle === null) return;\n\n const entry: Record<string, any> = {\n trace_id: spanDict.trace_id || '',\n span_id: spanDict.span_id || '',\n body: spanDict.attributes?.['log.message'] ?? '',\n severity: record.severityText ?? '',\n template: spanDict.attributes?.['log.template'] ?? '',\n timestamp: spanDict.start_time,\n };\n\n fs.writeSync(this.logFileHandle, JSON.stringify(entry) + '\\n');\n }\n\n private _convertLogRecord(record: ReadableLogRecord): Record<string, any> {\n const attributes: Record<string, any> = { ...(record.attributes ?? {}) };\n\n if (record.body !== undefined && record.body !== null) {\n attributes['log.message'] = String(record.body);\n }\n\n attributes['openinference.span.kind'] = 'LOG';\n attributes['neatlogs.span.kind'] = 'log';\n\n return {\n name: attributes['log.template'] ?? 'log',\n kind: 'LOG',\n trace_id: record.spanContext?.traceId ?? '',\n span_id: crypto.randomBytes(8).toString('hex'),\n parent_span_id: record.spanContext?.spanId ?? '',\n start_time: record.hrTime ? this._hrTimeToIso(record.hrTime) : new Date().toISOString(),\n end_time: record.hrTime ? this._hrTimeToIso(record.hrTime) : new Date().toISOString(),\n status: 'OK',\n attributes,\n };\n }\n\n private _hrTimeToIso(hrTime: [number, number]): string {\n const ms = hrTime[0] * 1000 + hrTime[1] / 1_000_000;\n return new Date(ms).toISOString();\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context, createContextKey } from '@opentelemetry/api';\n\nconst SUPPRESS_TRACING_KEY = createContextKey(\n 'OpenTelemetry SDK Context Key SUPPRESS_TRACING'\n);\n\nexport function suppressTracing(context: Context): Context {\n return context.setValue(SUPPRESS_TRACING_KEY, true);\n}\n\nexport function unsuppressTracing(context: Context): Context {\n return context.deleteValue(SUPPRESS_TRACING_KEY);\n}\n\nexport function isTracingSuppressed(context: Context): boolean {\n return context.getValue(SUPPRESS_TRACING_KEY) === true;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport interface ExportResult {\n code: ExportResultCode;\n error?: Error;\n}\n\nexport enum ExportResultCode {\n SUCCESS,\n FAILED,\n}\n","/**\n * Structured logging for Neatlogs traces.\n *\n * The log() function captures timestamped steps within a trace,\n * emitting OTel LogRecords that are associated with the active span.\n */\n\nimport { context, trace } from '@opentelemetry/api';\nimport { getLogger } from './logger.js';\n\nconst logger = getLogger();\n\n// Module-level reference to the OTel Logger, set during init()\nlet _otelLogger: any = null;\nlet _debugMode = false;\n\n/**\n * Set the OTel logger instance. Called by init().\n * @internal\n */\nexport function _setOtelLogger(otelLogger: any, debug: boolean): void {\n _otelLogger = otelLogger;\n _debugMode = debug;\n}\n\n/**\n * Capture a timestamped log step within the current trace.\n *\n * @param msgTemplate - Message template with {key} placeholders\n * @param options - Optional key-value pairs for template rendering and attributes\n *\n * @example\n * ```typescript\n * log('Processing query: {query}', { query: 'What is TypeScript?', level: 'info' });\n * ```\n */\nexport function log(\n msgTemplate: string,\n options?: Record<string, any>,\n): void {\n const { level = 'info', ...variables } = options ?? {};\n\n // Render template\n let rendered = msgTemplate;\n for (const [key, value] of Object.entries(variables)) {\n rendered = rendered.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), String(value));\n }\n\n // Echo to console in debug mode\n if (_debugMode) {\n console.log(`[neatlogs:log] ${rendered}`);\n }\n\n // Emit OTel LogRecord if logger is available\n if (_otelLogger) {\n const activeSpan = trace.getSpan(context.active());\n const spanContext = activeSpan?.spanContext();\n\n const attributes: Record<string, any> = {\n 'log.template': msgTemplate,\n 'log.level': level,\n };\n\n // Add template variables as log.{key} attributes\n for (const [key, value] of Object.entries(variables)) {\n attributes[`log.${key}`] = String(value);\n }\n\n try {\n _otelLogger.emit({\n body: rendered,\n attributes,\n ...(spanContext ? { spanContext } : {}),\n });\n } catch (err) {\n logger.warn(`Failed to emit log record: ${err}`);\n }\n }\n}\n\n/**\n * Capture stdout (console.log) within a callback and route to OTel logger.\n *\n * @param fn - The function to execute while capturing stdout\n * @returns The return value of fn\n */\nexport async function captureStdout<T>(fn: () => T | Promise<T>): Promise<T> {\n if (!_otelLogger) {\n return fn();\n }\n\n const originalLog = console.log;\n const activeSpan = trace.getSpan(context.active());\n const spanContext = activeSpan?.spanContext();\n\n console.log = (...args: any[]) => {\n // Still output to console\n originalLog.apply(console, args);\n\n // Also emit as OTel log record\n const message = args.map((a) => (typeof a === 'string' ? a : JSON.stringify(a))).join(' ');\n try {\n _otelLogger.emit({\n body: message,\n attributes: {\n 'log.source': 'stdout',\n 'log.level': 'info',\n },\n ...(spanContext ? { spanContext } : {}),\n });\n } catch {\n // Ignore errors in log capture\n }\n };\n\n try {\n return await fn();\n } finally {\n console.log = originalLog;\n }\n}\n","/**\n * Registry of available instrumentations for the TypeScript SDK.\n *\n * Ported from Python: neatlogs/instrumentation/registry.py\n *\n * Each library entry specifies which instrumentation packages are available:\n * - openinference: @arizeai/openinference-instrumentation-* npm package (or null)\n * - openllmetry: OpenTelemetry contrib package (or null — not used in TS SDK)\n * - neatlogs: custom instrumentor module path relative to instrumentation dir (or null)\n * - default_span_kind: the default span kind for this library\n */\n\n/**\n * Information about a single library's instrumentation options.\n */\nexport interface LibraryInfo {\n openinference: string | null;\n openllmetry: string | null;\n neatlogs: string | null;\n default_span_kind: string;\n auto_load?: string[];\n /** npm package name for eager patching (used when OTel hooks don't fire) */\n npm_package?: string;\n}\n\n/**\n * Shape of the instrumentation registry.\n */\nexport interface InstrumentationRegistryShape {\n tags: Record<string, string[]>;\n libraries: Record<string, LibraryInfo>;\n}\n\nexport const INSTRUMENTATION_REGISTRY: InstrumentationRegistryShape = {\n tags: {\n llm: [\n 'azure_ai_inference',\n 'openai',\n 'anthropic',\n 'cohere',\n 'bedrock',\n 'groq',\n 'together',\n 'vertexai',\n 'google_generativeai',\n 'mistralai',\n 'ollama',\n 'watsonx',\n 'alephalpha',\n 'replicate',\n 'sagemaker',\n 'huggingface_hub',\n 'litellm',\n 'google_genai',\n 'portkey',\n 'ai_sdk',\n ],\n embedding: ['openai', 'cohere', 'huggingface', 'vertexai', 'mistralai', 'ollama'],\n retrieval: [\n 'chromadb',\n 'pinecone',\n 'weaviate',\n 'qdrant',\n 'milvus',\n 'opensearch',\n 'elasticsearch',\n 'redis',\n 'marqo',\n ],\n agent: [\n 'langchain',\n 'langgraph',\n 'llamaindex',\n 'crewai',\n 'mastra',\n 'autogen',\n 'haystack',\n 'dspy',\n 'agno',\n 'beeai',\n 'openai_agents',\n 'pydantic_ai',\n 'smolagents',\n 'strands',\n 'pipecat',\n 'ai_sdk',\n ],\n tool: ['langchain', 'llamaindex', 'haystack', 'mcp'],\n http: ['requests', 'httpx', 'urllib3', 'aiohttp'],\n framework: ['instructor', 'guardrails', 'promptflow', 'google_adk'],\n },\n libraries: {\n azure_ai_inference: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n ai_sdk: {\n openinference: null,\n openllmetry: null,\n // The wrapper is opt-in per call site; init({ instrumentations: ['ai_sdk'] })\n // is a no-op. This registry entry exists so scope detection and tagging stay\n // consistent with other LLM/agent libraries.\n neatlogs: '@neatlogs/instrumentation-ai-sdk',\n default_span_kind: 'LLM',\n },\n openai: {\n openinference: '@arizeai/openinference-instrumentation-openai',\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n npm_package: 'openai',\n },\n anthropic: {\n openinference: '@arizeai/openinference-instrumentation-anthropic',\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n npm_package: '@anthropic-ai/sdk',\n },\n cohere: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n bedrock: {\n openinference: '@arizeai/openinference-instrumentation-bedrock',\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n groq: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n together: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n vertexai: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n google_generativeai: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n mistralai: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n ollama: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n watsonx: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n alephalpha: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n replicate: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n sagemaker: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n huggingface_hub: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n litellm: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n langchain: {\n openinference: '@arizeai/openinference-instrumentation-langchain',\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'CHAIN',\n npm_package: '@langchain/core/callbacks/manager',\n },\n langgraph: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'WORKFLOW',\n },\n llamaindex: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'CHAIN',\n },\n crewai: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n auto_load: ['litellm'],\n },\n mastra: {\n openinference: null,\n openllmetry: null,\n neatlogs: '@neatlogs/instrumentation-mastra',\n default_span_kind: 'AGENT',\n },\n autogen: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n haystack: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'CHAIN',\n },\n dspy: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'CHAIN',\n },\n requests: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'TOOL',\n },\n httpx: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'TOOL',\n },\n urllib3: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'TOOL',\n },\n aiohttp: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'TOOL',\n },\n chromadb: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n pinecone: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n weaviate: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n qdrant: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n milvus: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n opensearch: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n elasticsearch: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n redis: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n marqo: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n instructor: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'CHAIN',\n },\n guardrails: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'GUARDRAIL',\n },\n google_genai: {\n openinference: null,\n openllmetry: null,\n neatlogs: '@neatlogs/instrumentation-google-genai',\n default_span_kind: 'LLM',\n npm_package: '@google/genai',\n },\n google_adk: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'CHAIN',\n },\n agno: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n beeai: {\n openinference: '@arizeai/openinference-instrumentation-beeai',\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n openai_agents: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n pydantic_ai: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n smolagents: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n strands: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n pipecat: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n portkey: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n promptflow: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'CHAIN',\n },\n mcp: {\n openinference: '@arizeai/openinference-instrumentation-mcp',\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'TOOL',\n },\n claude_agent_sdk: {\n openinference: '@arizeai/openinference-instrumentation-claude-agent-sdk',\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n },\n};\n\n/**\n * Get list of library names for a given semantic tag.\n *\n * @param tag - Semantic tag (e.g., \"llm\", \"agent\", \"http\")\n * @returns List of library names matching the tag\n */\nexport function getLibrariesByTag(tag: string): string[] {\n return INSTRUMENTATION_REGISTRY.tags[tag] ?? [];\n}\n\n/**\n * Get instrumentation info for a specific library.\n *\n * @param library - Library name (e.g., \"openai\", \"langchain\")\n * @returns Library info object or undefined if not found\n */\nexport function getLibraryInfo(library: string): LibraryInfo | undefined {\n return INSTRUMENTATION_REGISTRY.libraries[library];\n}\n","/**\n * InstrumentationManager — auto-discover and instrument libraries.\n *\n * Ported from Python: neatlogs/instrumentation/manager.py\n *\n * Priority order for each library:\n * 1. neatlogs custom instrumentor (if available)\n * 2. OpenInference (primary — rich semantic attributes)\n * 3. Skip — no instrumentor available\n */\n\nimport type { TracerProvider } from '@opentelemetry/api';\nimport { getLogger } from '../core/logger.js';\nimport { getLibraryInfo } from './registry.js';\n\nconst logger = getLogger();\n\nexport interface InstrumentationManagerOptions {\n provider: TracerProvider;\n debug?: boolean;\n}\n\nexport class InstrumentationManager {\n private provider: TracerProvider;\n private _instrumented: string[] = [];\n\n constructor(options: InstrumentationManagerOptions) {\n this.provider = options.provider;\n }\n\n /** Get list of successfully instrumented libraries. */\n get instrumented(): string[] {\n return [...this._instrumented];\n }\n\n /**\n * Instrument the specified libraries.\n * Priority: neatlogs custom > OpenInference > skip\n */\n async instrument(libraries: string[]): Promise<void> {\n for (const lib of libraries) {\n const info = getLibraryInfo(lib);\n if (!info) {\n logger.warn(\n `Unknown library '${lib}' — not in instrumentation registry. Skipping.`,\n );\n continue;\n }\n\n // Try neatlogs custom instrumentor first\n if (info.neatlogs) {\n try {\n const mod = await import(info.neatlogs);\n // When importing a CJS package from ESM, mod.default may be the\n // CJS namespace object (an object, not a function). Prefer a\n // function export explicitly to avoid picking the wrong value.\n const InstrumentorClass =\n (typeof mod.default === 'function' ? mod.default : undefined) ??\n Object.values(mod).find(\n (v: unknown) =>\n typeof v === 'function' &&\n (v as { prototype?: { instrument?: unknown } }).prototype\n ?.instrument,\n ) ??\n (typeof mod[Object.keys(mod)[0]] === 'function' ? mod[Object.keys(mod)[0]] : undefined);\n if (InstrumentorClass && typeof InstrumentorClass === 'function') {\n const instrumentor = new (InstrumentorClass as new () => any)();\n if (typeof instrumentor.instrument === 'function') {\n instrumentor.instrument({ tracerProvider: this.provider });\n this._instrumented.push(lib);\n logger.debug(\n `Instrumented '${lib}' via neatlogs custom instrumentor`,\n );\n continue;\n }\n if (typeof instrumentor.setTracerProvider === 'function' && typeof instrumentor.enable === 'function') {\n instrumentor.setTracerProvider(this.provider);\n instrumentor.enable();\n // Eagerly patch target module for ESM environments where\n // OTel module hooks don't fire (e.g. tsx, dynamic imports)\n if (typeof instrumentor.patchEager === 'function' && info.npm_package) {\n try {\n const targetMod = await import(info.npm_package);\n instrumentor.patchEager(targetMod);\n } catch (e) {\n logger.debug(\n `Eager patch for '${lib}' skipped — ${info.npm_package} not available: ${e}`,\n );\n }\n }\n this._instrumented.push(lib);\n logger.debug(\n `Instrumented '${lib}' via neatlogs OTel instrumentor`,\n );\n continue;\n }\n }\n logger.debug(\n `neatlogs instrumentor for '${lib}' loaded but has no instrument() method — trying OpenInference`,\n );\n } catch (err) {\n logger.debug(\n `neatlogs instrumentor for '${lib}' failed to load: ${err} — trying OpenInference`,\n );\n }\n }\n\n // Try OpenInference instrumentor\n if (info.openinference) {\n try {\n const mod = await import(info.openinference);\n // OpenInference instrumentors export a class like LangChainInstrumentation, OpenAIInstrumentation\n const InstrumentorClass =\n mod.default ??\n Object.values(mod).find(\n (v: unknown) =>\n typeof v === 'function' &&\n (v as { prototype?: Record<string, unknown> }).prototype &&\n ('instrument' in (v as { prototype: Record<string, unknown> }).prototype ||\n 'manuallyInstrument' in (v as { prototype: Record<string, unknown> }).prototype),\n );\n if (InstrumentorClass && typeof InstrumentorClass === 'function') {\n const instrumentor = new (InstrumentorClass as new () => any)();\n // Pattern 1: instrument({ tracerProvider })\n if (typeof instrumentor.instrument === 'function') {\n instrumentor.instrument({ tracerProvider: this.provider });\n this._instrumented.push(lib);\n logger.debug(`Instrumented '${lib}' via OpenInference`);\n continue;\n }\n // Pattern 2: setTracerProvider + manuallyInstrument (OpenInference ESM pattern)\n if (typeof instrumentor.setTracerProvider === 'function' &&\n typeof instrumentor.manuallyInstrument === 'function') {\n instrumentor.setTracerProvider(this.provider);\n if (info.npm_package) {\n try {\n const targetMod = await import(info.npm_package);\n instrumentor.manuallyInstrument(targetMod);\n this._instrumented.push(lib);\n logger.debug(`Instrumented '${lib}' via OpenInference (manual patch)`);\n continue;\n } catch (importErr) {\n logger.debug(\n `Could not import '${info.npm_package}' for manual instrumentation of '${lib}': ${importErr}`,\n );\n }\n }\n // No npm_package or import failed — still mark as instrumented\n // since setTracerProvider was called (Node module hooks may still fire for CJS)\n this._instrumented.push(lib);\n logger.debug(`Instrumented '${lib}' via OpenInference (tracer set, awaiting module hook)`);\n continue;\n }\n }\n // Some OpenInference packages export an instrumentor function directly\n if (\n typeof (mod as { instrument?: unknown }).instrument === 'function'\n ) {\n (mod as { instrument: (opts: { tracerProvider: TracerProvider }) => void }).instrument({\n tracerProvider: this.provider,\n });\n this._instrumented.push(lib);\n logger.debug(`Instrumented '${lib}' via OpenInference`);\n continue;\n }\n logger.warn(\n `OpenInference package for '${lib}' loaded but could not find instrumentor class`,\n );\n } catch (err) {\n logger.debug(\n `OpenInference instrumentor for '${lib}' not available: ${err}`,\n );\n }\n }\n\n // No instrumentor available\n if (!info.openinference && !info.neatlogs) {\n logger.debug(\n `'${lib}' instrumentation not yet available for TypeScript — skipping`,\n );\n }\n }\n\n if (this._instrumented.length > 0) {\n logger.info(`Instrumented: ${this._instrumented.join(', ')}`);\n }\n }\n}\n","import { context } from '@opentelemetry/api';\nimport { suppressTracing } from '@opentelemetry/core';\nimport type { CachedPrompt, PromptMessage } from '../types.js';\n\n// ---------------------------------------------------------------------------\n// Error classes\n// ---------------------------------------------------------------------------\n\n/** Base exception for prompt client failures. */\nexport class PromptClientError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'PromptClientError';\n }\n}\n\n/** Raised when the backend returns an API error. */\nexport class PromptApiError extends PromptClientError {\n constructor(message: string) {\n super(message);\n this.name = 'PromptApiError';\n }\n}\n\n/** Raised when a prompt/label/version is not found. */\nexport class PromptNotFoundError extends PromptClientError {\n constructor(message: string) {\n super(message);\n this.name = 'PromptNotFoundError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Template rendering helper\n// ---------------------------------------------------------------------------\n\nconst PLACEHOLDER_PATTERN = /\\{\\{\\s*([A-Za-z0-9_.-]+)\\s*\\}\\}/g;\n\n/**\n * Replace `{{key}}` placeholders in a template string with the corresponding\n * values from the provided variables map. Unknown placeholders are left as-is.\n */\nexport function renderTemplate(template: string, variables: Record<string, any>): string {\n return template.replace(PLACEHOLDER_PATTERN, (full, key: string) => {\n return key in variables ? String(variables[key]) : full;\n });\n}\n\n// ---------------------------------------------------------------------------\n// Normalize raw API response → CachedPrompt\n// ---------------------------------------------------------------------------\n\n/** Normalize a raw API response object into a well-typed {@link CachedPrompt}. */\nexport function normalizePromptObject(raw: Record<string, any>): CachedPrompt {\n // Messages\n let messages: PromptMessage[] | null = null;\n const rawMessages = raw['messages'];\n if (Array.isArray(rawMessages)) {\n const messageList: PromptMessage[] = [];\n for (const item of rawMessages) {\n if (item && typeof item === 'object') {\n messageList.push({\n role: String(item['role'] ?? 'system'),\n content: String(item['content'] ?? ''),\n });\n }\n }\n if (messageList.length > 0) {\n messages = messageList;\n }\n }\n\n // Labels\n let labels: string[] = [];\n const rawLabels = raw['labels'];\n if (Array.isArray(rawLabels)) {\n labels = rawLabels.filter((l) => String(l).trim()).map(String);\n }\n\n // Config\n let config: Record<string, any> = {};\n if (raw['config'] && typeof raw['config'] === 'object' && !Array.isArray(raw['config'])) {\n config = { ...raw['config'] };\n }\n\n // Scalar fields\n const content: string | null = typeof raw['content'] === 'string' ? raw['content'] : null;\n const id: string = typeof raw['id'] === 'string' ? raw['id'] : '';\n const name: string = typeof raw['name'] === 'string' ? raw['name'] : '';\n\n let version = 0;\n try {\n if (raw['version'] != null) {\n version = Number(raw['version']) || 0;\n }\n } catch {\n version = 0;\n }\n\n let updatedAt: string = '';\n if (typeof raw['updatedAt'] === 'string') {\n updatedAt = raw['updatedAt'];\n } else if (typeof raw['updated_at'] === 'string') {\n updatedAt = raw['updated_at'];\n }\n\n let type: 'text' | 'chat' = 'text';\n if (raw['type'] === 'chat') {\n type = 'chat';\n }\n\n return { id, name, version, content, messages, config, labels, updatedAt, type };\n}\n\n// ---------------------------------------------------------------------------\n// PromptHandle\n// ---------------------------------------------------------------------------\n\n/**\n * Compiled prompt handle returned by {@link PromptClient.getPrompt}.\n */\nexport class PromptHandle {\n private readonly _prompt: CachedPrompt;\n\n constructor(prompt: CachedPrompt) {\n this._prompt = prompt;\n }\n\n get id(): string {\n return this._prompt.id;\n }\n get name(): string {\n return this._prompt.name;\n }\n get version(): number {\n return this._prompt.version;\n }\n get content(): string | null {\n return this._prompt.content;\n }\n get messages(): PromptMessage[] | null {\n return this._prompt.messages ? [...this._prompt.messages] : null;\n }\n get config(): Record<string, any> {\n return { ...this._prompt.config };\n }\n get labels(): string[] {\n return [...this._prompt.labels];\n }\n get updatedAt(): string {\n return this._prompt.updatedAt;\n }\n get type(): string {\n return this._prompt.type;\n }\n\n /**\n * Compile string content with `{{variable}}` replacement.\n *\n * If the prompt has `content`, renders it directly.\n * If it only has `messages`, renders and joins all message contents.\n */\n compile(variables?: Record<string, any>): string {\n const vars = variables ?? {};\n\n if (this._prompt.content) {\n return renderTemplate(this._prompt.content, vars);\n }\n\n if (this._prompt.messages) {\n const rendered = this._prompt.messages\n .map((msg) => renderTemplate(msg.content ?? '', vars))\n .filter(Boolean);\n return rendered.join('\\n\\n');\n }\n\n return '';\n }\n\n /**\n * Compile message list with `{{variable}}` replacement.\n *\n * If no messages exist, returns a single synthetic system message from content.\n */\n compileMessages(variables?: Record<string, any>): PromptMessage[] {\n const vars = variables ?? {};\n\n if (this._prompt.messages) {\n return this._prompt.messages.map((msg) => ({\n role: String(msg.role ?? 'system'),\n content: renderTemplate(String(msg.content ?? ''), vars),\n }));\n }\n\n return [\n {\n role: 'system',\n content: renderTemplate(this._prompt.content ?? '', vars),\n },\n ];\n }\n}\n\n// ---------------------------------------------------------------------------\n// PromptClient\n// ---------------------------------------------------------------------------\n\nexport interface PromptClientOptions {\n baseUrl: string;\n apiKey: string;\n}\n\n/**\n * Prompt client for Neatlogs managed prompts.\n *\n * Fetches prompts on-demand from the backend.\n * Uses an in-memory cache to avoid redundant HTTP calls.\n */\nexport class PromptClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly _cache: Map<string, CachedPrompt> = new Map();\n\n constructor(options: PromptClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.apiKey = options.apiKey;\n }\n\n // ---- public API ----------------------------------------------------------\n\n /**\n * Get a prompt by name, optionally pinned to a version or label.\n * Results are cached in memory by cache key.\n */\n async getPrompt(\n name: string,\n options?: { version?: number; label?: string },\n ): Promise<PromptHandle> {\n const version = options?.version;\n const label = options?.label;\n\n if (label != null && version != null) {\n throw new PromptClientError('Cannot specify both label and version.');\n }\n\n const cacheKey = `${name}:${label ?? ''}:${version ?? ''}`;\n const cached = this._cache.get(cacheKey);\n if (cached) {\n return new PromptHandle(cached);\n }\n\n const handle = await this.fetchPrompt(name, options);\n this._cache.set(cacheKey, {\n id: handle.id,\n name: handle.name,\n version: handle.version,\n content: handle.content,\n messages: handle.messages,\n config: handle.config,\n labels: handle.labels,\n updatedAt: handle.updatedAt,\n type: handle.type as 'text' | 'chat',\n });\n return handle;\n }\n\n /**\n * Always fetch from the API (bypasses cache).\n */\n async fetchPrompt(\n name: string,\n options?: { version?: number; label?: string },\n ): Promise<PromptHandle> {\n const version = options?.version;\n const label = options?.label;\n\n if (label != null) {\n const path = `/api/v1/prompts/${encodeURIComponent(name)}/fetch`;\n const url = `${path}?label=${encodeURIComponent(label)}`;\n const payload = await this._request(url);\n return new PromptHandle(normalizePromptObject(payload));\n }\n\n // List all versions, find the right one\n const listing = await this._request(\n `/api/managed-prompts?name=${encodeURIComponent(name)}&limit=100&offset=0`,\n );\n const items: Record<string, any>[] = listing['items'] ?? [];\n\n if (items.length === 0) {\n throw new PromptNotFoundError(`No versions found for prompt '${name}'`);\n }\n\n if (version != null) {\n const match = items.find((item) => item['version'] === version);\n if (!match) {\n throw new PromptNotFoundError(`Prompt '${name}' version ${version} not found`);\n }\n return new PromptHandle(normalizePromptObject(match));\n }\n\n // Default: most recently created version\n const latest = items.reduce((a, b) => {\n const aDate = a['createdAt'] ?? a['created_at'] ?? '';\n const bDate = b['createdAt'] ?? b['created_at'] ?? '';\n return String(aDate) >= String(bDate) ? a : b;\n });\n return new PromptHandle(normalizePromptObject(latest));\n }\n\n /**\n * List all prompts.\n */\n async listPrompts(): Promise<PromptHandle[]> {\n const payload = await this._request('/api/managed-prompts?limit=100&offset=0');\n const items: Record<string, any>[] = payload['items'] ?? [];\n return items.map((item) => new PromptHandle(normalizePromptObject(item)));\n }\n\n /**\n * Create a new prompt.\n */\n async createPrompt(data: {\n name: string;\n content?: string;\n messages?: PromptMessage[];\n config?: Record<string, any>;\n labels?: string[];\n }): Promise<PromptHandle> {\n const body: Record<string, any> = { name: data.name };\n if (data.content !== undefined) body['content'] = data.content;\n if (data.messages !== undefined) {\n body['messages'] = data.messages;\n body['type'] = 'chat';\n } else {\n body['type'] = 'text';\n }\n if (data.config !== undefined) body['config'] = data.config;\n if (data.labels !== undefined) body['labels'] = data.labels;\n\n const payload = await this._request('/api/managed-prompts', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n const promptData = payload['prompt'] ?? payload;\n return new PromptHandle(normalizePromptObject(promptData));\n }\n\n /**\n * Update an existing prompt.\n */\n async updatePrompt(\n name: string,\n data: {\n content?: string;\n messages?: PromptMessage[];\n config?: Record<string, any>;\n labels?: string[];\n },\n ): Promise<PromptHandle> {\n const body: Record<string, any> = { name };\n if (data.content !== undefined) body['content'] = data.content;\n if (data.messages !== undefined) body['messages'] = data.messages;\n if (data.config !== undefined) body['config'] = data.config;\n if (data.labels !== undefined) body['labels'] = data.labels;\n\n const payload = await this._request(`/api/managed-prompts`, {\n method: 'PUT',\n body: JSON.stringify(body),\n });\n\n const promptData = payload['prompt'] ?? payload;\n return new PromptHandle(normalizePromptObject(promptData));\n }\n\n /**\n * Delete a prompt by name.\n */\n async deletePrompt(name: string): Promise<void> {\n await this._request(`/api/managed-prompts/${encodeURIComponent(name)}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Remove a tag from a prompt.\n */\n async removeTag(name: string, tag: string): Promise<void> {\n await this._request(`/api/managed-prompts/${encodeURIComponent(name)}/tags`, {\n method: 'DELETE',\n body: JSON.stringify({ tag }),\n });\n }\n\n /**\n * Save the current prompt content as a new version, optionally with a label.\n */\n async saveAsVersion(\n name: string,\n options?: { label?: string },\n ): Promise<PromptHandle> {\n const body: Record<string, any> = { promptName: name };\n if (options?.label) body['labels'] = [options.label];\n\n const payload = await this._request('/api/prompt-playground/save-as-version', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n const promptData = payload['prompt'] ?? payload;\n return new PromptHandle(normalizePromptObject(promptData));\n }\n\n // ---- internal ------------------------------------------------------------\n\n /**\n * Internal fetch wrapper with auth headers and OTel suppression.\n */\n async _request(path: string, options?: RequestInit): Promise<any> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n 'x-api-key': this.apiKey,\n ...(options?.headers as Record<string, string> | undefined),\n };\n\n const fetchOptions: RequestInit = {\n method: options?.method ?? 'GET',\n headers,\n body: options?.body,\n };\n\n // Suppress OTel instrumentation on our own HTTP calls so they don't\n // create noisy child spans under the user's traces.\n let response: Response;\n try {\n const suppressedContext = suppressTracing(context.active());\n response = await context.with(suppressedContext, () => fetch(url, fetchOptions));\n } catch {\n // If OTel is not available, fall through to plain fetch\n response = await fetch(url, fetchOptions);\n }\n\n if (!response.ok) {\n const body = await response.text().catch(() => '<unavailable>');\n throw new PromptApiError(\n `${fetchOptions.method} ${path} failed (${response.status}): ${body.slice(0, 400)}`,\n );\n }\n\n try {\n return await response.json();\n } catch {\n throw new PromptApiError(`${fetchOptions.method} ${path} returned non-JSON response`);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level shared client (set by init())\n// ---------------------------------------------------------------------------\n\nlet _sharedClient: PromptClient | null = null;\n\n/** Set the module-level shared prompt client (called by init()). */\nexport function setSharedClient(client: PromptClient): void {\n _sharedClient = client;\n}\n\n/** Get the module-level shared prompt client. Throws if not initialized. */\nexport function getSharedClient(): PromptClient {\n if (!_sharedClient) {\n throw new PromptClientError(\n 'No prompt client available. Call neatlogs.init(apiKey: ...) or setSharedClient() first.',\n );\n }\n return _sharedClient;\n}\n\n// ---------------------------------------------------------------------------\n// Module-level convenience functions that delegate to shared client\n// ---------------------------------------------------------------------------\n\nexport async function getPrompt(\n name: string,\n options?: { version?: number; label?: string },\n): Promise<PromptHandle> {\n return getSharedClient().getPrompt(name, options);\n}\n\nexport async function fetchPrompt(\n name: string,\n options?: { version?: number; label?: string },\n): Promise<PromptHandle> {\n return getSharedClient().fetchPrompt(name, options);\n}\n\nexport async function listPrompts(): Promise<PromptHandle[]> {\n return getSharedClient().listPrompts();\n}\n\nexport async function createPrompt(data: {\n name: string;\n content?: string;\n messages?: PromptMessage[];\n config?: Record<string, any>;\n labels?: string[];\n}): Promise<PromptHandle> {\n return getSharedClient().createPrompt(data);\n}\n\nexport async function updatePrompt(\n name: string,\n data: {\n content?: string;\n messages?: PromptMessage[];\n config?: Record<string, any>;\n labels?: string[];\n },\n): Promise<PromptHandle> {\n return getSharedClient().updatePrompt(name, data);\n}\n\nexport async function saveAsVersion(\n name: string,\n options?: { label?: string },\n): Promise<PromptHandle> {\n return getSharedClient().saveAsVersion(name, options);\n}\n\nexport async function deletePrompt(name: string): Promise<void> {\n return getSharedClient().deletePrompt(name);\n}\n\nexport async function removeTag(name: string, tag: string): Promise<void> {\n return getSharedClient().removeTag(name, tag);\n}\n","/**\n * SDK version. Updated during release process.\n */\nexport const __version__ = '1.0.0';\n","/**\n * High-level span() function wrapper and Span() class-method decorator.\n *\n * Primary public API for instrumenting user code.\n */\n\nimport { type Span as OtelSpan } from '@opentelemetry/api';\nimport { VALID_SPAN_KINDS } from '../span-kinds/mapping.js';\nimport { decorateSpan, safeJsonDumps, serializeObj, type DecorateSpanOptions } from './base.js';\nimport { getLogger } from '../core/logger.js';\nimport type { SpanOptions, SpanKind } from '../types.js';\n\nconst logger = getLogger();\n\n/**\n * Wrap a function with OpenTelemetry span instrumentation.\n *\n * @example\n * ```typescript\n * const myWorkflow = span({ kind: 'WORKFLOW' }, async (query: string) => {\n * return await process(query);\n * });\n * await myWorkflow('What is TypeScript?');\n * ```\n */\nexport function span<TArgs extends any[], TReturn>(\n options: SpanOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn extends Promise<any> ? TReturn : Promise<Awaited<TReturn>> {\n // Validate kind\n if (!VALID_SPAN_KINDS.has(options.kind)) {\n throw new Error(\n `Invalid span kind: '${options.kind}'. Must be one of: ${[...VALID_SPAN_KINDS].join(', ')}`,\n );\n }\n\n const decorateOpts: DecorateSpanOptions = { ...options };\n\n // Kind-specific attribute setup\n switch (options.kind) {\n case 'AGENT':\n decorateOpts.postprocessResult = _agentPostprocessor(options);\n break;\n case 'TOOL':\n decorateOpts.postprocessResult = _toolPostprocessor(options);\n break;\n case 'EMBEDDING':\n decorateOpts.postprocessResult = _embeddingPostprocessor(options);\n break;\n case 'RETRIEVER':\n decorateOpts.postprocessResult = retrieverPostprocessor;\n break;\n case 'MCP_TOOL':\n return _createMcpToolWrapper(options, fn);\n default:\n break;\n }\n\n return decorateSpan(decorateOpts, fn);\n}\n\n/** Agent-specific: set role and goal attributes. */\nfunction _agentPostprocessor(options: SpanOptions) {\n return (span: OtelSpan, _result: any, _boundInputs: Record<string, any>) => {\n if (options.role) {\n span.setAttribute('neatlogs.agent.role', options.role);\n }\n if (options.goal) {\n span.setAttribute('neatlogs.agent.goal', options.goal);\n }\n };\n}\n\n/** Tool-specific: set tool_name and parameters attributes. */\nfunction _toolPostprocessor(options: SpanOptions) {\n return (span: OtelSpan, _result: any, _boundInputs: Record<string, any>) => {\n if (options.toolName) {\n span.setAttribute('tool.name', options.toolName);\n }\n if (options.parameters) {\n span.setAttribute('tool.parameters', safeJsonDumps(options.parameters));\n }\n };\n}\n\n/** Embedding-specific: set model and dimension attributes. */\nfunction _embeddingPostprocessor(options: SpanOptions) {\n return (span: OtelSpan, _result: any, _boundInputs: Record<string, any>) => {\n if (options.model) {\n span.setAttribute('embedding.model_name', options.model);\n }\n if (options.dimension) {\n span.setAttribute('embedding.dimension', options.dimension);\n }\n };\n}\n\n/**\n * RETRIEVER postprocessor: extract documents from result.\n * Looks for query in 'query', 'question', 'text' keys.\n * Extracts documents from list results or dict with 'documents'/'docs'/'results' keys.\n * Sets retrieval.documents.N.document.* attributes (up to 20 docs).\n */\nexport function retrieverPostprocessor(\n span: OtelSpan,\n result: any,\n boundInputs: Record<string, any>,\n): void {\n // Extract query\n for (const key of ['query', 'question', 'text']) {\n if (key in boundInputs && typeof boundInputs[key] === 'string') {\n span.setAttribute('retrieval.query', boundInputs[key]);\n break;\n }\n }\n\n // Extract documents\n let docs: any[] | null = null;\n\n if (Array.isArray(result)) {\n docs = result;\n } else if (result && typeof result === 'object') {\n for (const key of ['documents', 'docs', 'results']) {\n if (Array.isArray(result[key])) {\n docs = result[key];\n break;\n }\n }\n }\n\n if (!docs) return;\n\n // Set document attributes (up to 20)\n const maxDocs = Math.min(docs.length, 20);\n for (let i = 0; i < maxDocs; i++) {\n const doc = docs[i];\n const prefix = `retrieval.documents.${i}.document`;\n\n if (typeof doc === 'string') {\n span.setAttribute(`${prefix}.content`, doc);\n } else if (doc && typeof doc === 'object') {\n if (doc.content || doc.page_content || doc.text) {\n span.setAttribute(`${prefix}.content`, doc.content ?? doc.page_content ?? doc.text);\n }\n if (doc.id) {\n span.setAttribute(`${prefix}.id`, String(doc.id));\n }\n if (doc.score !== undefined) {\n span.setAttribute(`${prefix}.score`, doc.score);\n }\n if (doc.metadata) {\n span.setAttribute(`${prefix}.metadata`, safeJsonDumps(doc.metadata));\n }\n }\n }\n}\n\n/**\n * MCP_TOOL special handling.\n * Checks first arg for .toJSON() / plain object.\n * Wraps string results as { result: \"...\" }.\n * Sets both mcp.* and standard attributes.\n */\nfunction _createMcpToolWrapper<TArgs extends any[], TReturn>(\n options: SpanOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => any {\n const decorateOpts: DecorateSpanOptions = {\n ...options,\n postprocessResult: (span: OtelSpan, result: any, boundInputs: Record<string, any>) => {\n // Set MCP-specific attributes\n if (options.toolName) {\n span.setAttribute('mcp.tool.name', options.toolName);\n span.setAttribute('tool.name', options.toolName);\n }\n if (options.parameters) {\n span.setAttribute('mcp.tool.parameters', safeJsonDumps(options.parameters));\n span.setAttribute('tool.parameters', safeJsonDumps(options.parameters));\n }\n if (options.toolJsonSchema) {\n span.setAttribute('tool.json_schema', safeJsonDumps(options.toolJsonSchema));\n }\n\n // Wrap string results\n if (typeof result === 'string') {\n span.setAttribute('output.value', safeJsonDumps({ result }));\n }\n\n // Extract input from first arg if it has toJSON or is a plain object\n if (boundInputs && Object.keys(boundInputs).length > 0) {\n const firstArg = Object.values(boundInputs)[0];\n if (firstArg && typeof firstArg === 'object') {\n const serialized = typeof firstArg.toJSON === 'function'\n ? firstArg.toJSON()\n : serializeObj(firstArg);\n span.setAttribute('mcp.tool.input', safeJsonDumps(serialized));\n }\n }\n },\n };\n\n return decorateSpan(decorateOpts, fn);\n}\n\n/**\n * TC39 Stage 3 class-method decorator variant.\n *\n * @example\n * ```typescript\n * class MyAgent {\n * @Span({ kind: 'AGENT', role: 'researcher' })\n * async run(query: string) { ... }\n * }\n * ```\n */\nexport function Span(options: SpanOptions) {\n return function <T extends (...args: any[]) => any>(\n target: T,\n context: ClassMethodDecoratorContext,\n ): T {\n // Validate eagerly at decoration-time (same behaviour as before this fix)\n // by building a temporary wrapper with a no-op target. span() will throw\n // here for invalid kinds before the class is instantiated.\n span(options, target);\n\n // TC39 stage-3 decorators replace the method on the prototype, so `this`\n // is the instance when the method is called normally (e.g. agent.run()).\n // `decorateSpan`'s closure calls `fn(...args)` without a receiver, which\n // loses `this` for instance methods that call other instance methods.\n // Wrap at the call site: bind `target` to the live `this` on every call\n // so that `fn(…args)` inside `decorateSpan` retains the correct receiver.\n function decoratorWrapper(this: unknown, ...args: Parameters<T>): ReturnType<T> {\n const boundTarget = target.bind(this) as T;\n const wrapped = span(options, boundTarget);\n return wrapped(...args) as ReturnType<T>;\n }\n Object.defineProperty(decoratorWrapper, 'name', { value: context.name, configurable: true });\n return decoratorWrapper as unknown as T;\n };\n}\n","import { getTracerProvider } from './init.js';\n\nlet _cached: any = null;\n\nexport async function getMastraObservability(): Promise<any> {\n if (_cached) return _cached;\n\n const tracerProvider = getTracerProvider();\n\n let createFn: any;\n try {\n const mod = await import('@neatlogs/instrumentation-mastra');\n createFn = mod.createNeatlogsMastraObservability;\n } catch {\n throw new Error(\n '@neatlogs/instrumentation-mastra is required for getMastraObservability(). ' +\n 'Install it with: npm install @neatlogs/instrumentation-mastra',\n );\n }\n\n const { observability } = await createFn(tracerProvider);\n _cached = observability;\n return _cached;\n}\n","/**\n * Vercel AI SDK wrapper — inline implementation.\n *\n * Wraps `generateText`, `streamText`, `generateObject`, `streamObject` from\n * the `ai` package with OTel parent spans + forced telemetry. Static export,\n * no dynamic imports — bundler-friendly (works with Turbopack, webpack, esbuild).\n *\n * Usage:\n * import { wrapAISDK } from 'neatlogs';\n * import * as ai from 'ai';\n * const { streamText, generateText } = wrapAISDK(ai);\n */\n\nimport { trace, context as otelContext, ROOT_CONTEXT, SpanStatusCode, type Span, type Tracer } from '@opentelemetry/api';\n\nconst TRACER_NAME = 'neatlogs.ai-sdk';\n\n// -- Telemetry config --------------------------------------------------------\n\nexport interface CreateAITelemetryOptions {\n metadata?: Record<string, unknown>;\n}\n\nexport interface AITelemetryConfig {\n isEnabled: true;\n recordInputs: true;\n recordOutputs: true;\n tracer: Tracer;\n metadata: Record<string, unknown>;\n}\n\nexport function createAITelemetry(\n opts: CreateAITelemetryOptions = {},\n): AITelemetryConfig {\n const userMeta = opts.metadata ?? {};\n return {\n isEnabled: true,\n recordInputs: true,\n recordOutputs: true,\n tracer: trace.getTracer(TRACER_NAME),\n metadata: { ...userMeta, neatlogsWrapped: true },\n };\n}\n\n// -- Span attributes ---------------------------------------------------------\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return '';\n }\n}\n\nfunction setInputValue(span: Span, opts: Record<string, unknown>): void {\n // For generateText/streamText — only capture prompt or messages, not full model config\n if (opts && ('prompt' in opts || 'messages' in opts)) {\n const input = opts.messages ?? opts.prompt;\n const stringified = safeStringify(input);\n if (stringified) {\n span.setAttribute('input.value', stringified);\n }\n return;\n }\n const stringified = safeStringify(opts);\n if (stringified) {\n span.setAttribute('input.value', stringified);\n }\n}\n\nfunction setOutputValue(span: Span, result: unknown): void {\n if (result && typeof result === 'object') {\n const r = result as Record<string, unknown>;\n // GenerateTextResult / StreamTextResult — extract meaningful fields\n if ('text' in r && 'finishReason' in r) {\n const text = String(r.text ?? '');\n if (text) {\n span.setAttribute('output.value', text);\n }\n if (r.finishReason) {\n span.setAttribute('gen_ai.finish_reason', String(r.finishReason));\n }\n return;\n }\n }\n const stringified = safeStringify(result);\n if (stringified) {\n span.setAttribute('output.value', stringified);\n }\n}\n\n// -- Wrapping ----------------------------------------------------------------\n\ntype WrappedFunctionName = 'generateText' | 'streamText' | 'generateObject' | 'streamObject' | 'embed' | 'embedMany' | 'rerank';\n\nconst WRAPPED_FUNCTIONS: readonly WrappedFunctionName[] = [\n 'generateText',\n 'streamText',\n 'generateObject',\n 'streamObject',\n 'embed',\n 'embedMany',\n 'rerank',\n] as const;\n\n/**\n * Wrap the `ai` module namespace so that every `generateText` / `streamText` /\n * `generateObject` / `streamObject` call:\n *\n * 1. Opens a parent OTel span on the active TracerProvider.\n * 2. Forces `experimental_telemetry: { isEnabled: true }`, merging user metadata.\n * 3. Records input/output on the parent span and propagates errors.\n *\n * Other exports (types, helpers) pass through unchanged.\n */\nexport function wrapAISDK<T extends Record<string, unknown>>(aiModule: T): T {\n const wrapped: Record<string, unknown> = { ...aiModule };\n\n for (const name of WRAPPED_FUNCTIONS) {\n const original = aiModule[name];\n if (typeof original !== 'function') continue;\n\n if (name === 'streamText' || name === 'streamObject') {\n wrapped[name] = createSyncWrapper(name, original as (opts: any) => unknown);\n } else {\n wrapped[name] = createAsyncWrapper(name, original as (opts: any) => Promise<unknown>);\n }\n }\n\n return wrapped as T;\n}\n\nfunction rootSpanKind(name: WrappedFunctionName): string {\n if (name === 'embed' || name === 'embedMany' || name === 'rerank') return 'CHAIN';\n return 'WORKFLOW';\n}\n\n\nfunction getParentContext() {\n const activeSpan = trace.getActiveSpan();\n if (activeSpan) {\n const instrScope = (activeSpan as any).instrumentationLibrary?.name ?? '';\n if (instrScope === 'next.js') {\n return ROOT_CONTEXT;\n }\n }\n return otelContext.active();\n}\n\nfunction createAsyncWrapper(\n name: WrappedFunctionName,\n original: (opts: any) => Promise<unknown>,\n): (opts: any) => Promise<unknown> {\n return async function wrappedAsyncFn(opts: any): Promise<unknown> {\n const tracer = trace.getTracer(TRACER_NAME);\n return tracer.startActiveSpan(\n `ai.${name}`,\n { attributes: { 'openinference.span.kind': rootSpanKind(name) } },\n getParentContext(),\n async (span) => {\n try {\n const isEmbedOrRerank = name === 'embed' || name === 'embedMany' || name === 'rerank';\n if (!isEmbedOrRerank) {\n setInputValue(span, opts);\n }\n if (name === 'rerank' && opts?.query) {\n span.setAttribute('ai.rerank.query', String(opts.query));\n }\n const merged = mergeTelemetry(opts);\n const result = await original(merged);\n if (!isEmbedOrRerank) {\n setOutputValue(span, result);\n }\n return result;\n } catch (err) {\n recordSpanError(span, err);\n throw err;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\nfunction createSyncWrapper(\n name: WrappedFunctionName,\n original: (opts: any) => unknown,\n): (opts: any) => unknown {\n return function wrappedSyncFn(opts: any): unknown {\n const tracer = trace.getTracer(TRACER_NAME);\n return tracer.startActiveSpan(`ai.${name}`, { attributes: { 'openinference.span.kind': rootSpanKind(name) } }, getParentContext(), (span) => {\n try {\n setInputValue(span, opts);\n const merged = mergeTelemetry(opts);\n const result = original(merged);\n return result;\n } catch (err) {\n recordSpanError(span, err);\n throw err;\n } finally {\n span.end();\n }\n });\n };\n}\n\nfunction mergeTelemetry(opts: any): any {\n const baseTelemetry: AITelemetryConfig = createAITelemetry({\n metadata: opts?.experimental_telemetry?.metadata,\n });\n return {\n ...opts,\n experimental_telemetry: {\n ...opts?.experimental_telemetry,\n ...baseTelemetry,\n },\n };\n}\n\n\nfunction recordSpanError(span: Span, err: unknown): void {\n if (err instanceof Error) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: err.message });\n span.recordException(err);\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) });\n }\n}\n","/**\n * LLM template binding for frameworks that manage LLM calls internally (e.g. CrewAI).\n *\n * Usage:\n * const boundLlm = bindTemplates(llm, systemTpl, userTpl, { content: '...' });\n * const agent = new Agent({ llm: boundLlm, ... });\n *\n * When the LLM's invoke/call method runs, this wrapper fires first:\n * 1. Sets prompt template + user prompt template in OTel context\n * 2. Calls the instrumented class-level invoke (creates the LLM span)\n * 3. span_processor reads context -> templates land on the LLM span\n */\n\nimport { context as otelContext, type Context } from '@opentelemetry/api';\nimport { getLogger } from './logger.js';\nimport { PromptContext, UserPromptContext } from '../prompt/template.js';\n\nconst logger = getLogger();\n\n/**\n * Return a copy of `llm` whose invoke()/call() injects prompt template context\n * before the instrumented LLM span is created.\n *\n * @param llm - Any LangChain-compatible chat model or crewai.LLM\n * @param systemTpl - PromptTemplate for the agent backstory / system role\n * @param userTpl - Optional UserPromptTemplate for the task description\n * @param compiledVars - Variable values to pass to userTpl.compile()\n * @returns A new LLM instance with template context pre-wired\n */\nexport function bindTemplates(\n llm: any,\n systemTpl: any,\n userTpl?: any,\n compiledVars?: Record<string, any>,\n): any {\n const systemStr = String(systemTpl.template);\n const userStr = userTpl ? String(userTpl.template) : null;\n\n // Clone the LLM so different agents can each have their own binding.\n // Prefer Object.create (preserves prototype chain and methods) over\n // structuredClone (which strips functions).\n let llmCopy: any;\n try {\n // Shallow copy that preserves prototype chain (like Python's copy.copy)\n llmCopy = Object.create(Object.getPrototypeOf(llm), Object.getOwnPropertyDescriptors(llm));\n } catch {\n try {\n // Try structured clone for plain data objects\n llmCopy = structuredClone(llm);\n } catch {\n // Fall back to binding in place\n llmCopy = llm;\n logger.debug(\n `LLM type ${llm?.constructor?.name ?? 'unknown'} is not copyable — binding in place.`,\n );\n }\n }\n\n // Find the method to wrap: prefer invoke(), fall back to call()\n let methodName: string;\n if (typeof llmCopy.invoke === 'function') {\n methodName = 'invoke';\n } else if (typeof llmCopy.call === 'function') {\n methodName = 'call';\n } else {\n logger.warn(\n `LLM type ${llm?.constructor?.name ?? 'unknown'} has neither invoke() nor call() — ` +\n 'prompt templates will not be captured on spans.',\n );\n return llmCopy;\n }\n\n const originalMethod = llmCopy[methodName].bind(llmCopy);\n\n llmCopy[methodName] = function wrappedWithTemplates(...args: any[]) {\n // Compile system template (stores in PromptContext)\n systemTpl.compile();\n\n // Compile user template if provided\n if (userTpl && compiledVars) {\n userTpl.compile(compiledVars);\n }\n\n // Call the original (instrumented) method\n try {\n return originalMethod(...args);\n } finally {\n PromptContext.clear();\n if (userTpl && compiledVars) {\n UserPromptContext.clear();\n }\n }\n };\n\n logger.debug(\n `Wrapped ${llm?.constructor?.name ?? 'unknown'}.${methodName}() with template injection.`,\n );\n\n return llmCopy;\n}\n"],"mappings":"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","names":["trace","path","import_api","import_api","logger","logger","import_api","logger","span","logger","span","trace","otelTrace","otelContext","logger","logger","result","logger","resolve","span","otelContext","spanId","otelTrace","logger","fs","path","import_api","context","ExportResultCode","logger","import_api","logger","logger","import_api","path","logger","_debugMode","logger","span","context","import_api","TRACER_NAME","safeStringify","span","stringified","otelContext","logger"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/init.ts","../src/core/span-processor.ts","../src/core/logger.ts","../src/core/instrumentation-scope-parser.ts","../src/span-kinds/constants.ts","../src/span-kinds/mapping.ts","../src/config/model_defaults.json","../src/config/defaults-enricher.ts","../src/core/attribute-processor.ts","../src/core/mask.ts","../src/prompt/template.ts","../src/core/context.ts","../src/decorators/base.ts","../src/core/crewai-task-registry.ts","../src/config/attribute-mapping.json","../src/config/attribute-mapper.ts","../src/core/filtering-exporter.ts","../src/core/exporter.ts","../src/core/log-exporter.ts","../node_modules/@opentelemetry/core/src/trace/suppress-tracing.ts","../node_modules/@opentelemetry/core/src/ExportResult.ts","../src/core/log.ts","../src/instrumentation/registry.ts","../src/instrumentation/manager.ts","../src/prompt/client.ts","../src/version.ts","../src/decorators/orchestration.ts","../src/mastra.ts","../src/ai-sdk.ts","../src/openai.ts","../src/anthropic.ts","../src/langchain.ts","../src/strands.ts","../src/openai-agents.ts","../src/mastra-wrap.ts","../src/core/llm-binder.ts"],"sourcesContent":["/**\n * Neatlogs TypeScript SDK\n *\n * OpenTelemetry-native observability for LLM applications.\n *\n * @example\n * ```typescript\n * import { init, span, shutdown } from 'neatlogs';\n *\n * async function main() {\n * await init({ apiKey: process.env.NEATLOGS_API_KEY, instrumentations: ['openai'] });\n *\n * const myWorkflow = span({ kind: 'WORKFLOW' }, async (query: string) => {\n * // your LLM code here\n * });\n *\n * await myWorkflow('Hello!');\n * await shutdown();\n * }\n * main().catch(console.error);\n * ```\n */\n\n// Lifecycle\nexport { init, flush, shutdown, isDebugEnabled, getSessionConfig } from './init.js';\n\n// Instrumentation\nexport { span, Span } from './decorators/index.js';\nexport { trace } from './core/context.js';\nexport { log } from './core/log.js';\n\n// Prompt management\nexport { PromptTemplate, UserPromptTemplate } from './prompt/template.js';\nexport {\n PromptClient,\n PromptHandle,\n PromptClientError,\n PromptApiError,\n PromptNotFoundError,\n getPrompt,\n fetchPrompt,\n listPrompts,\n createPrompt,\n updatePrompt,\n saveAsVersion,\n deletePrompt,\n removeTag,\n} from './prompt/client.js';\n\n// Mastra integration\nexport { getMastraObservability } from './mastra.js';\n\n// Vercel AI SDK integration\nexport { wrapAISDK, createAITelemetry } from './ai-sdk.js';\n\n// Provider wrappers\nexport { wrapOpenAI, traceTool as traceToolOpenAI } from './openai.js';\nexport { wrapAnthropic, traceTool as traceToolAnthropic } from './anthropic.js';\n\n// Agent framework integrations\nexport { langchainHandler } from './langchain.js';\nexport { strandsHooks } from './strands.js';\nexport { openaiAgentsProcessor } from './openai-agents.js';\nexport { wrapMastra } from './mastra-wrap.js';\n\n// Utilities\nexport { bindTemplates } from './core/llm-binder.js';\nexport { registerCrewaiTask } from './core/crewai-task-registry.js';\n\n// Types\nexport type {\n InitOptions,\n SpanOptions,\n TraceOptions,\n SpanKind,\n MaskFunction,\n CachedPrompt,\n PromptMessage,\n} from './types.js';\n\n// Version\nexport { __version__ } from './version.js';\n","/**\n * Neatlogs SDK initialisation, flush, and shutdown.\n *\n * Port of Python neatlogs/init.py to TypeScript.\n *\n * `init()` sets up the OTel TracerProvider, MeterProvider, LoggerProvider,\n * span processors, exporters, and instrumentation.\n * `flush()` and `shutdown()` handle graceful cleanup.\n */\n\nimport { randomBytes } from 'node:crypto';\nimport * as path from 'node:path';\n\nimport { trace, metrics } from '@opentelemetry/api';\nimport { logs } from '@opentelemetry/api-logs';\nimport { Resource } from '@opentelemetry/resources';\nimport { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';\nimport { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport { MeterProvider } from '@opentelemetry/sdk-metrics';\nimport { LoggerProvider, SimpleLogRecordProcessor, BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-proto';\n\nimport { NeatlogsSpanProcessor } from './core/span-processor.js';\nimport { FilteringExporter } from './core/filtering-exporter.js';\nimport { NeatlogsExporter } from './core/exporter.js';\nimport { NeatlogsLogExporter } from './core/log-exporter.js';\nimport { _setOtelLogger } from './core/log.js';\nimport { _setSessionConfig } from './core/context.js';\nimport { getLogger, enableDebugLogging } from './core/logger.js';\nimport { InstrumentationManager } from './instrumentation/manager.js';\nimport { PromptClient, setSharedClient } from './prompt/client.js';\nimport { __version__ } from './version.js';\nimport type { InitOptions } from './types.js';\n\nconst logger = getLogger();\n\n// ---------------------------------------------------------------------------\n// Module-level state\n// ---------------------------------------------------------------------------\n\nlet _initialized = false;\nlet _tracerProvider: NodeTracerProvider | null = null;\nlet _meterProvider: MeterProvider | null = null;\nlet _logProvider: LoggerProvider | null = null;\nlet _logSpanExporter: NeatlogsExporter | null = null;\nlet _spanProcessor: NeatlogsSpanProcessor | null = null;\nlet _debugMode = false;\n\n// Track signal handlers so we can remove them in shutdown()\nlet _sigHandlersRegistered = false;\nconst _shutdownOnSignal = () => {\n shutdown().catch(() => {});\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a non-empty workflow name; derive from process.argv when omitted.\n */\nfunction _resolveWorkflowName(workflowName?: string): string {\n const provided = (workflowName ?? '').trim();\n if (provided) return provided;\n\n const argv1 = process.argv[1] ?? '';\n const base = path.basename(argv1, path.extname(argv1));\n const slug = base\n .replace(/[^a-zA-Z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .toLowerCase();\n\n if (slug && !['node', 'ts-node', 'tsx', 'npx', '-e'].includes(slug)) {\n return slug;\n }\n\n return 'neatlogs-app';\n}\n\n/**\n * Generate a short random hex string.\n */\nfunction _randomHex(bytes: number): string {\n return randomBytes(bytes).toString('hex');\n}\n\n// ---------------------------------------------------------------------------\n// init()\n// ---------------------------------------------------------------------------\n\n/**\n * Initialise the Neatlogs SDK.\n *\n * Sets up OTel TracerProvider, MeterProvider, LoggerProvider, span processors,\n * exporters and auto-instrumentation. Returns a Promise because library\n * instrumentation uses dynamic `import()`.\n */\nexport async function init(options: InitOptions = {}): Promise<void> {\n // 1. Guard double-init\n if (_initialized) {\n logger.warn('Neatlogs already initialized, skipping re-initialization');\n return;\n }\n\n // 2. Resolve API key\n let resolvedKey: string;\n if (options.apiKey && options.apiKey.trim()) {\n resolvedKey = options.apiKey.trim();\n } else {\n resolvedKey = (process.env.NEATLOGS_API_KEY ?? '').trim();\n }\n\n // 3. Resolve disableExport\n let disableExportResolved =\n !!options.disableExport ||\n ['true', '1', 'yes'].includes(\n (process.env.NEATLOGS_DISABLE_EXPORT ?? '').toLowerCase(),\n );\n\n if (!resolvedKey) {\n disableExportResolved = true;\n resolvedKey = 'disabled';\n if (options.debug) {\n logger.warn(\n 'No NEATLOGS_API_KEY set; HTTP export disabled. ' +\n 'Set NEATLOGS_API_KEY (or pass apiKey) to send spans to the backend.',\n );\n }\n }\n\n // 4. Debug mode\n if (options.debug) {\n enableDebugLogging();\n }\n _debugMode = options.debug ?? false;\n\n // 5. Resolve workflow name\n const resolvedWorkflowName = _resolveWorkflowName(options.workflowName);\n\n // 6. Resolve session ID\n let sessionId: string | undefined = options.sessionId;\n if (!sessionId && options.autoSession) {\n sessionId = `session_${Date.now()}_${_randomHex(4)}`;\n if (options.debug) {\n logger.debug(`Auto-generated session_id: ${sessionId}`);\n }\n }\n\n // 7. Parse base URL from endpoint\n const endpoint =\n options.endpoint ??\n 'https://staging-cloud.neatlogs.com';\n const baseUrl = new URL(endpoint).origin;\n\n // 8. Set session config\n _setSessionConfig({\n sessionId,\n userId: options.userId,\n workflowName: resolvedWorkflowName,\n _apiKey: resolvedKey,\n _baseUrl: baseUrl,\n });\n\n // 8b. Initialize shared PromptClient so module-level helpers work after init()\n if (resolvedKey && resolvedKey !== 'disabled') {\n setSharedClient(new PromptClient({ baseUrl, apiKey: resolvedKey }));\n }\n\n // 9. Build OTel Resource\n const resourceAttrs: Record<string, string | number | boolean> = {\n [ATTR_SERVICE_NAME]: options.workflowName || 'neatlogs-app',\n 'service.version': __version__,\n 'neatlogs.workflow_name': resolvedWorkflowName,\n };\n if (sessionId) resourceAttrs['session.id'] = sessionId;\n if (options.userId) resourceAttrs['user.id'] = options.userId;\n\n const tags = options.tags;\n if (tags !== undefined) {\n if (!Array.isArray(tags) || !tags.every((t) => typeof t === 'string')) {\n throw new Error('tags must be a list of strings');\n }\n resourceAttrs['neatlogs.tags'] = tags.join(',');\n }\n\n if (options.pii !== undefined) {\n resourceAttrs['neatlogs.pii.enabled'] =\n options.pii === false ? 'false' : 'true';\n }\n\n if (options.piiSpanTypes !== undefined) {\n resourceAttrs['neatlogs.pii.span_types'] = options.piiSpanTypes.join(',');\n }\n\n const resource = new Resource(resourceAttrs);\n\n // 10. Create TracerProvider\n const provider = new NodeTracerProvider({\n resource,\n spanLimits: { attributeCountLimit: 10_000 },\n });\n\n // 11. Add NeatlogsSpanProcessor\n _spanProcessor = new NeatlogsSpanProcessor({\n sampleRate: options.sampleRate ?? 1.0,\n debug: options.debug ?? false,\n mask: options.mask,\n });\n provider.addSpanProcessor(_spanProcessor);\n\n // 12. Add BatchSpanProcessor + OTLPSpanExporter (if export enabled)\n if (!disableExportResolved) {\n const tracesEndpoint = endpoint.endsWith('/v1/traces')\n ? endpoint\n : `${baseUrl}/v1/traces`;\n\n const otlpExporter = new FilteringExporter(\n new OTLPTraceExporter({\n url: tracesEndpoint,\n headers: { 'x-api-key': resolvedKey },\n }),\n );\n\n const batchProcessor = new BatchSpanProcessor(otlpExporter, {\n maxExportBatchSize: options.batchSize ?? 100,\n scheduledDelayMillis: (options.flushInterval ?? 5) * 1000,\n });\n provider.addSpanProcessor(batchProcessor);\n\n if (options.debug) {\n logger.debug(`OTLP trace exporter configured: ${tracesEndpoint}`);\n }\n } else if (options.debug) {\n logger.debug('Export disabled — spans will not be sent to backend');\n }\n\n // 13. Register provider globally\n provider.register();\n _tracerProvider = provider;\n\n if (options.debug) {\n logger.debug('Neatlogs tracer provider initialized');\n }\n\n // 14. Set up MeterProvider\n try {\n _meterProvider = new MeterProvider({ resource });\n metrics.setGlobalMeterProvider(_meterProvider);\n if (options.debug) {\n logger.debug('Neatlogs meter provider initialized');\n }\n } catch {\n // MeterProvider is optional — skip gracefully\n if (options.debug) {\n logger.debug('MeterProvider not available — skipping');\n }\n }\n\n // 15. Set up LoggerProvider (if captureLogs)\n const captureLogs = options.captureLogs ?? false;\n if (captureLogs) {\n _logSpanExporter = new NeatlogsExporter({\n baseUrl,\n apiKey: resolvedKey,\n batchSize: options.batchSize ?? 100,\n flushIntervalMs: (options.flushInterval ?? 5) * 1000,\n disableExport: disableExportResolved,\n });\n\n _logProvider = new LoggerProvider({ resource });\n\n // File-based log exporter (for NEATLOGS_LOG_LOGS env var)\n _logProvider.addLogRecordProcessor(\n new SimpleLogRecordProcessor(new NeatlogsLogExporter(_logSpanExporter)),\n );\n\n // OTLP log export to /v1/logs (same pattern as Python SDK)\n if (!disableExportResolved) {\n const logsEndpoint = endpoint.endsWith('/v1/logs')\n ? endpoint\n : `${baseUrl}/v1/logs`;\n const otlpLogExporter = new OTLPLogExporter({\n url: logsEndpoint,\n headers: resolvedKey ? { 'x-api-key': resolvedKey } : undefined,\n });\n _logProvider.addLogRecordProcessor(\n new BatchLogRecordProcessor(otlpLogExporter),\n );\n if (options.debug) {\n logger.debug(`OTLP log exporter configured: ${logsEndpoint}`);\n }\n }\n\n logs.setGlobalLoggerProvider(_logProvider);\n\n // Wire the OTel logger for neatlogs.log() function\n const otelLogger = _logProvider.getLogger('neatlogs');\n _setOtelLogger(otelLogger, options.debug ?? false);\n\n if (options.debug) {\n logger.debug(`Neatlogs log capture enabled (endpoint: ${baseUrl}/v1/logs)`);\n }\n } else if (options.debug) {\n logger.debug('Log capture disabled (pass captureLogs: true to enable)');\n }\n\n // 16. Instrument libraries\n const manager = new InstrumentationManager({\n provider,\n debug: options.debug,\n });\n\n if (options.instrumentations?.length) {\n await manager.instrument(options.instrumentations);\n if (options.debug) {\n logger.debug(`Instrumented libraries: ${manager.instrumented.join(', ')}`);\n }\n }\n\n // 17. Register shutdown handlers\n if (!_sigHandlersRegistered) {\n process.on('beforeExit', _shutdownOnSignal);\n process.on('SIGTERM', _shutdownOnSignal);\n process.on('SIGINT', _shutdownOnSignal);\n _sigHandlersRegistered = true;\n }\n\n // 18. Mark as initialised\n _initialized = true;\n\n if (options.debug) {\n logger.info('Neatlogs SDK initialized successfully');\n logger.info(`Endpoint: ${endpoint}`);\n logger.info(`Workflow: ${resolvedWorkflowName}`);\n logger.info(`Session: ${sessionId ?? '(none)'}`);\n logger.info(`User: ${options.userId ?? '(none)'}`);\n logger.info(`Tags: ${tags ?? []}`);\n logger.info(`Instrumentations: ${manager.instrumented.join(', ') || '(none)'}`);\n logger.info(`Sample Rate: ${options.sampleRate ?? 1.0}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// flush()\n// ---------------------------------------------------------------------------\n\n/**\n * Flush all pending spans, metrics, and log records.\n *\n * @returns true if all providers flushed successfully\n */\nexport async function flush(): Promise<boolean> {\n let success = true;\n\n if (_tracerProvider) {\n try {\n logger.debug('Flushing tracer provider...');\n await _tracerProvider.forceFlush();\n logger.debug('Tracer provider flushed successfully');\n } catch (e) {\n logger.error(`Error flushing spans: ${e}`);\n success = false;\n }\n }\n\n if (_meterProvider) {\n try {\n logger.debug('Flushing meter provider...');\n await _meterProvider.forceFlush();\n logger.debug('Meter provider flushed successfully');\n } catch (e) {\n logger.error(`Error flushing metrics: ${e}`);\n success = false;\n }\n }\n\n if (_logSpanExporter) {\n try {\n logger.debug('Flushing log span exporter...');\n await _logSpanExporter.flush();\n logger.debug('Log span exporter flushed successfully');\n } catch (e) {\n logger.error(`Error flushing logs: ${e}`);\n success = false;\n }\n }\n\n return success;\n}\n\n// ---------------------------------------------------------------------------\n// shutdown()\n// ---------------------------------------------------------------------------\n\n/**\n * Shutdown the SDK and flush all pending spans, metrics, and log records.\n *\n * Resets all module-level state so `init()` can be called again.\n *\n * @returns true if all providers shut down successfully\n */\nexport async function shutdown(): Promise<boolean> {\n // Remove signal handlers\n if (_sigHandlersRegistered) {\n process.removeListener('beforeExit', _shutdownOnSignal);\n process.removeListener('SIGTERM', _shutdownOnSignal);\n process.removeListener('SIGINT', _shutdownOnSignal);\n _sigHandlersRegistered = false;\n }\n\n let success = true;\n\n if (_tracerProvider) {\n try {\n logger.debug('Shutting down tracer provider...');\n await _tracerProvider.shutdown();\n logger.debug('Tracer provider shut down successfully');\n } catch (e) {\n logger.error(`Error shutting down tracer provider: ${e}`);\n success = false;\n }\n }\n\n if (_meterProvider) {\n try {\n logger.debug('Shutting down meter provider...');\n await _meterProvider.shutdown();\n logger.debug('Meter provider shut down successfully');\n } catch (e) {\n logger.error(`Error shutting down meter provider: ${e}`);\n success = false;\n }\n }\n\n if (_logProvider) {\n try {\n logger.debug('Shutting down log provider...');\n await _logProvider.shutdown();\n logger.debug('Log provider shut down successfully');\n } catch (e) {\n logger.error(`Error shutting down log provider: ${e}`);\n success = false;\n }\n }\n\n if (_logSpanExporter) {\n try {\n logger.debug('Shutting down log span exporter...');\n await _logSpanExporter.shutdown();\n logger.debug('Log span exporter shut down successfully');\n } catch (e) {\n logger.error(`Error shutting down log span exporter: ${e}`);\n success = false;\n }\n }\n\n // Reset all module-level state\n _initialized = false;\n _tracerProvider = null;\n _meterProvider = null;\n _logProvider = null;\n _logSpanExporter = null;\n _spanProcessor = null;\n _debugMode = false;\n\n // Reset session config\n _setSessionConfig({});\n\n logger.info('Neatlogs SDK shutdown complete');\n return success;\n}\n\n// ---------------------------------------------------------------------------\n// getTracerProvider()\n// ---------------------------------------------------------------------------\n\n/**\n * Return the active TracerProvider. Throws if init() has not been called.\n */\nexport function getTracerProvider(): NodeTracerProvider {\n if (!_tracerProvider) {\n throw new Error(\n 'Neatlogs is not initialized. Call init() before accessing the TracerProvider.',\n );\n }\n return _tracerProvider;\n}\n\n// ---------------------------------------------------------------------------\n// isDebugEnabled()\n// ---------------------------------------------------------------------------\n\n/**\n * Return true if neatlogs was initialised with `debug: true`.\n */\nexport function isDebugEnabled(): boolean {\n return _debugMode;\n}\n\n// ---------------------------------------------------------------------------\n// Re-export getSessionConfig from context\n// ---------------------------------------------------------------------------\n\nexport { getSessionConfig } from './core/context.js';\n","/**\n * NeatlogsSpanProcessor — attribute normalization and file logging.\n *\n * Port of Python neatlogs/core/span_processor.py\n *\n * Sits between span creation and export, normalizing attributes and handling\n * file logging. The downstream BatchSpanProcessor + OTLPSpanExporter handles\n * actual transport.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { performance } from 'node:perf_hooks';\n\nimport {\n context as otelContext,\n trace as otelTrace,\n TraceFlags,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { Context, HrTime, SpanContext } from '@opentelemetry/api';\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport type { Span as SdkSpan, SpanProcessor } from '@opentelemetry/sdk-trace-base';\n\nimport { UnifiedAttributeProcessor } from './attribute-processor.js';\nimport type { SpanDict } from './attribute-processor.js';\nimport { applyMask } from './mask.js';\nimport { getLogger } from './logger.js';\nimport { PromptContext, UserPromptContext } from '../prompt/template.js';\nimport {\n PROMPT_VARIABLES_KEY,\n PROMPT_TEMPLATE_KEY,\n PROMPT_VERSION_KEY,\n USER_PROMPT_TEMPLATE_KEY,\n USER_PROMPT_VARIABLES_KEY,\n} from './context.js';\nimport { popEntry } from './crewai-task-registry.js';\nimport type { MaskFunction } from '../types.js';\nimport { AttributeMapper } from '../config/attribute-mapper.js';\n\nconst logger = getLogger();\n\nfunction resolveLogFilePath(configuredPath: string): string {\n return path.isAbsolute(configuredPath)\n ? configuredPath\n : path.join(process.cwd(), configuredPath);\n}\n\nfunction createLogStream(configuredPath: string): fs.WriteStream | null {\n const logPath = resolveLogFilePath(configuredPath);\n let fd: number | null = null;\n\n try {\n fs.mkdirSync(path.dirname(logPath), { recursive: true });\n fd = fs.openSync(logPath, 'a');\n const stream = fs.createWriteStream(logPath, { fd, autoClose: true });\n fd = null;\n stream.on('error', (error) => {\n logger.warn(`Failed to write span log file ${logPath}: ${error}`);\n stream.destroy();\n });\n return stream;\n } catch (error) {\n if (fd !== null) {\n try {\n fs.closeSync(fd);\n } catch {\n // ignore cleanup failure; the open error below is the actionable one.\n }\n }\n logger.warn(`Failed to open span log file ${logPath}: ${error}`);\n return null;\n }\n}\n\nconst CLOSE_STREAM_TIMEOUT_MS = 5_000;\n\nasync function closeLogStream(\n stream: fs.WriteStream | null,\n description: string,\n): Promise<void> {\n if (!stream || stream.destroyed || stream.writableEnded) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n let settled = false;\n const settle = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n stream.off('close', closeHandler);\n stream.off('error', errorHandler);\n resolve();\n };\n\n const closeHandler = settle;\n const errorHandler = (error: Error) => {\n logger.warn(`Failed to close ${description} log file handle: ${error}`);\n settle();\n };\n const timer = setTimeout(() => {\n logger.warn(\n `Timed out waiting for ${description} log stream to close; destroying`,\n );\n stream.destroy();\n settle();\n }, CLOSE_STREAM_TIMEOUT_MS);\n\n stream.once('close', closeHandler);\n stream.once('error', errorHandler);\n\n try {\n stream.end();\n } catch (error) {\n logger.warn(`Failed to close ${description} log file handle: ${error}`);\n settle();\n }\n });\n}\n\n// ────────────────────────────────────────────────────────\n// LLM span detection patterns\n// ────────────────────────────────────────────────────────\n\nconst LLM_NAME_PATTERNS = /chat|completion|generate|embedding/i;\n\n// ────────────────────────────────────────────────────────\n// Performance stats\n// ────────────────────────────────────────────────────────\n\ninterface PerfStats {\n onStartTime: number;\n onEndTime: number;\n spansProcessed: number;\n spansExported: number;\n}\n\n// ────────────────────────────────────────────────────────\n// Helper: convert HrTime ([seconds, nanoseconds]) to ns\n// ────────────────────────────────────────────────────────\n\nfunction hrTimeToNanos(hr: HrTime): number {\n return hr[0] * 1_000_000_000 + hr[1];\n}\n\n// ────────────────────────────────────────────────────────\n// Helper: convert ReadableSpan to JSON-serializable dict\n//\n// When includeScope=true, includes instrumentation_scope\n// and uses `status.message` (for the UnifiedAttributeProcessor).\n// When false (default), uses `status.description` for\n// backward-compatible raw logging.\n// ────────────────────────────────────────────────────────\n\nexport function spanToDict(\n span: ReadableSpan,\n options?: { includeScope?: boolean },\n): Record<string, any> {\n const ctx = span.spanContext();\n const includeScope = options?.includeScope ?? false;\n\n const dict: Record<string, any> = {\n trace_id: ctx.traceId,\n span_id: ctx.spanId,\n parent_span_id: span.parentSpanId ?? null,\n name: span.name,\n kind: span.kind,\n start_time: hrTimeToNanos(span.startTime),\n end_time: hrTimeToNanos(span.endTime),\n attributes: { ...span.attributes },\n resource: span.resource?.attributes ? { ...span.resource.attributes } : {},\n status: includeScope\n ? { code: span.status.code, message: span.status.message ?? undefined }\n : { code: span.status.code, description: span.status.message ?? null },\n events: span.events\n ? span.events.map((e) => ({\n name: e.name,\n timestamp: hrTimeToNanos(e.time),\n attributes: e.attributes ? { ...e.attributes } : {},\n }))\n : [],\n };\n\n if (includeScope) {\n dict.instrumentation_scope = span.instrumentationLibrary\n ? {\n name: span.instrumentationLibrary.name,\n version: span.instrumentationLibrary.version,\n }\n : null;\n }\n\n return dict;\n}\n\n// ────────────────────────────────────────────────────────\n// Constructor options\n// ────────────────────────────────────────────────────────\n\nexport interface NeatlogsSpanProcessorOptions {\n sampleRate?: number;\n debug?: boolean;\n mask?: MaskFunction;\n /** Pre-built AttributeMapper. If not supplied, a default mapper is created. */\n mapper?: AttributeMapper;\n}\n\n// ────────────────────────────────────────────────────────\n// NeatlogsSpanProcessor\n// ────────────────────────────────────────────────────────\n\nexport class NeatlogsSpanProcessor implements SpanProcessor {\n private readonly sampleRate: number;\n private readonly debug: boolean;\n private readonly mask: MaskFunction | undefined;\n private readonly unifiedProcessor: UnifiedAttributeProcessor;\n\n private perfStats: PerfStats;\n private _retrieversToSuppress: Set<string>;\n\n // File logging\n private _logRawSpansEnabled: boolean;\n private _logProcessedSpansEnabled: boolean;\n private _rawLogStream: fs.WriteStream | null;\n private _processedLogStream: fs.WriteStream | null;\n\n constructor(opts: NeatlogsSpanProcessorOptions = {}) {\n this.sampleRate = opts.sampleRate ?? 1.0;\n this.debug = opts.debug ?? false;\n this.mask = opts.mask;\n\n this.unifiedProcessor = new UnifiedAttributeProcessor(\n opts.mapper ?? new AttributeMapper(),\n this.debug,\n );\n\n this._logRawSpansEnabled = false;\n this._logProcessedSpansEnabled = false;\n this._rawLogStream = null;\n this._processedLogStream = null;\n\n this._initFileLogging();\n\n this.perfStats = {\n onStartTime: 0,\n onEndTime: 0,\n spansProcessed: 0,\n spansExported: 0,\n };\n\n this._retrieversToSuppress = new Set<string>();\n }\n\n // ── File logging init ─────────────────────────────────\n\n private _initFileLogging(): void {\n // Raw OTel span JSON (before attribute normalization)\n this._logRawSpansEnabled =\n this.debug ||\n ['true', '1', 'yes'].includes(\n (process.env.NEATLOGS_LOG_RAW_SPANS ?? '').toLowerCase(),\n );\n\n if (this._logRawSpansEnabled) {\n const rawPath =\n process.env.NEATLOGS_LOG_RAW_SPANS_FILE ?? 'spans_raw_optimized.log';\n this._rawLogStream = createLogStream(rawPath);\n if (this._rawLogStream) {\n logger.info(\n `Raw span logging enabled: ${resolveLogFilePath(rawPath)}`,\n );\n }\n }\n\n // Processed span dict (after normalization)\n this._logProcessedSpansEnabled = ['true', '1', 'yes'].includes(\n (process.env.NEATLOGS_LOG_SPANS ?? '').toLowerCase(),\n );\n\n if (this._logProcessedSpansEnabled) {\n const processedPath =\n process.env.NEATLOGS_LOG_SPANS_FILE ?? 'spans_optimized.log';\n this._processedLogStream = createLogStream(processedPath);\n if (this._processedLogStream) {\n logger.info(\n `Processed span logging enabled: ${resolveLogFilePath(processedPath)}`,\n );\n }\n }\n }\n\n // ── SpanProcessor.onStart ─────────────────────────────\n\n onStart(span: SdkSpan, parentContext: Context): void {\n const startTime = performance.now();\n try {\n const attrs = (span as any).attributes ?? {};\n const spanKind = attrs['openinference.span.kind'] as string | undefined;\n const spanName: string =\n typeof (span as any).name === 'string' ? (span as any).name : '';\n\n const isLlmSpan =\n spanKind === 'LLM' || LLM_NAME_PATTERNS.test(spanName);\n\n if (!isLlmSpan) return;\n\n // Read context values\n const ctx = otelContext.active();\n let variablesJson = ctx.getValue(PROMPT_VARIABLES_KEY) as\n | string\n | undefined;\n let template = ctx.getValue(PROMPT_TEMPLATE_KEY) as string | undefined;\n const versionVal = ctx.getValue(PROMPT_VERSION_KEY) as\n | string\n | undefined;\n let userTemplate = ctx.getValue(USER_PROMPT_TEMPLATE_KEY) as\n | string\n | undefined;\n let userVariablesJson = ctx.getValue(USER_PROMPT_VARIABLES_KEY) as\n | string\n | undefined;\n\n // Fall back to PromptContext / UserPromptContext\n if (!variablesJson) {\n const captured = PromptContext.getVariables();\n if (captured) {\n variablesJson = JSON.stringify(captured);\n }\n }\n\n if (!template) {\n const captured = PromptContext.getTemplate();\n if (captured) {\n template = captured;\n }\n }\n\n if (!userTemplate) {\n const captured = UserPromptContext.getTemplate();\n if (captured) {\n userTemplate = captured;\n }\n }\n\n if (!userVariablesJson) {\n const captured = UserPromptContext.getVariables();\n if (captured) {\n userVariablesJson = JSON.stringify(captured);\n }\n }\n\n if (this.debug) {\n logger.debug(\n `[SpanProcessor.onStart] LLM span '${spanName}' starting`,\n );\n logger.debug(` variables_json from context: ${variablesJson}`);\n logger.debug(` template from context: ${template}`);\n logger.debug(` version from context: ${versionVal}`);\n logger.debug(` user_template from context: ${userTemplate}`);\n logger.debug(\n ` user_variables_json from context: ${userVariablesJson}`,\n );\n }\n\n if (variablesJson) {\n span.setAttribute('llm.prompt_template_variables', variablesJson);\n }\n if (template) {\n span.setAttribute('llm.prompt_template', template);\n }\n if (versionVal) {\n span.setAttribute('llm.prompt_template.version', versionVal);\n }\n if (userTemplate) {\n span.setAttribute('llm.user_prompt_template', userTemplate);\n }\n if (userVariablesJson) {\n span.setAttribute(\n 'llm.user_prompt_template_variables',\n userVariablesJson,\n );\n }\n } finally {\n this.perfStats.onStartTime += performance.now() - startTime;\n }\n }\n\n // ── SpanProcessor.onEnd ───────────────────────────────\n\n onEnd(span: ReadableSpan): void {\n // Skip internal completion markers — they only need to be exported as-is\n if (span.name === 'neatlogs.trace.complete') {\n return;\n }\n\n\n const startTime = performance.now();\n this.perfStats.spansProcessed += 1;\n\n try {\n if (this.debug) {\n logger.debug(`[SpanProcessor.onEnd] Span ending: ${span.name}`);\n }\n\n // 1. Log raw OTel span (before any processing)\n if (this._rawLogStream && !this._rawLogStream.destroyed) {\n try {\n this._rawLogStream.write(\n JSON.stringify(spanToDict(span)) + '\\n',\n );\n } catch (e) {\n logger.warn(`Failed to write span to raw log file: ${e}`);\n }\n }\n\n // Sample rate check\n if (this.sampleRate < 1.0 && Math.random() > this.sampleRate) {\n return;\n }\n\n // 2. Process and normalize attributes\n const spanDict = spanToDict(span, { includeScope: true }) as SpanDict;\n const unifiedAttrs = this.unifiedProcessor.normalize(spanDict);\n\n // 3. Filter large tokenized arrays for EMBEDDING/VECTOR_STORE spans\n let nlKind = unifiedAttrs['neatlogs.span.kind'] as string | undefined;\n if (nlKind === 'embedding' || nlKind === 'vector_store') {\n const skipOutput =\n unifiedAttrs['neatlogs._skip_output_value'] === true;\n const keysToRemove: string[] = [];\n\n for (const key of Object.keys(unifiedAttrs)) {\n if (\n key.includes('input_messages') ||\n key.includes('output_messages') ||\n key.includes('gen_ai.prompt') ||\n key.includes('gen_ai.completion') ||\n key.includes('.content')\n ) {\n keysToRemove.push(key);\n } else if (\n key === 'neatlogs.embedding.output' ||\n (skipOutput && key === 'neatlogs.embedding.input')\n ) {\n keysToRemove.push(key);\n }\n }\n\n for (const key of keysToRemove) {\n delete unifiedAttrs[key];\n }\n\n if (this.debug && keysToRemove.length > 0) {\n logger.debug(\n `[EMBEDDING Filter] Removed ${keysToRemove.length} large attribute keys ` +\n `from ${nlKind} span (skip_output=${skipOutput})`,\n );\n }\n }\n\n // 4. Filter prompt template keys for non-LLM spans\n nlKind = unifiedAttrs['neatlogs.span.kind'] as string | undefined;\n if (\n nlKind !== 'llm' &&\n nlKind !== 'embedding' &&\n nlKind !== 'crewai_task' &&\n span.name !== 'PromptTemplate'\n ) {\n delete unifiedAttrs['neatlogs.llm.prompt_template'];\n delete unifiedAttrs['neatlogs.llm.prompt_template_variables'];\n delete unifiedAttrs['neatlogs.llm.prompt_template.version'];\n }\n\n // PromptTemplate spans → internal\n if (span.name === 'PromptTemplate') {\n if (unifiedAttrs['neatlogs.internal'] === undefined) {\n unifiedAttrs['neatlogs.internal'] = true;\n }\n unifiedAttrs['neatlogs.span.kind'] = 'Neatlogs.INTERNAL';\n }\n\n // 4b. Retriever span dedup\n if (nlKind === 'retriever') {\n const isInternal = unifiedAttrs['neatlogs.internal'] === true;\n if (isInternal && span.parentSpanId) {\n this._retrieversToSuppress.add(span.parentSpanId);\n }\n const spanId = span.spanContext().spanId;\n if (this._retrieversToSuppress.has(spanId)) {\n this._retrieversToSuppress.delete(spanId);\n unifiedAttrs['neatlogs.internal'] = true;\n if (this.debug) {\n logger.debug(\n `[Retriever Merge] Marked OI retriever '${span.name}' as internal ` +\n `(had neatlogs retriever child)`,\n );\n }\n }\n }\n\n // 5. Build resource attributes\n const resourceAttrs: Record<string, any> = {};\n if (span.resource?.attributes) {\n for (const [key, value] of Object.entries(span.resource.attributes)) {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n resourceAttrs[key] = value;\n } else if (Array.isArray(value)) {\n resourceAttrs[key] = [...value];\n } else {\n resourceAttrs[key] = String(value);\n }\n }\n\n if (this.debug && 'neatlogs.tags' in resourceAttrs) {\n logger.debug(\n `[Tags] Span ${span.name}: resource.neatlogs.tags = ${resourceAttrs['neatlogs.tags']}`,\n );\n }\n }\n\n // Format IDs — JS OTel SDK already provides hex strings\n const traceId = span.spanContext().traceId;\n const spanId = span.spanContext().spanId;\n let parentSpanId: string | null = span.parentSpanId ?? null;\n\n // Detect self-parenting\n if (parentSpanId === spanId) {\n if (this.debug) {\n logger.warn(\n `[SpanProcessor] Detected self-parenting span. ` +\n `trace_id=${traceId} span_id=${spanId} name=${span.name}. ` +\n `Setting parent_span_id=None.`,\n );\n }\n parentSpanId = null;\n }\n\n // 6. Build span_data dict\n const kindValue = (unifiedAttrs['neatlogs.span.kind'] as string) ?? 'UNKNOWN';\n const startTimeNs = hrTimeToNanos(span.startTime);\n const endTimeNs = hrTimeToNanos(span.endTime);\n\n let spanData: Record<string, any> = {\n trace_id: traceId,\n span_id: spanId,\n parent_span_id: parentSpanId,\n name: span.name,\n kind: kindValue || 'UNKNOWN',\n start_time: startTimeNs,\n end_time: endTimeNs,\n duration_ns: endTimeNs > 0 ? endTimeNs - startTimeNs : null,\n attributes: unifiedAttrs,\n resource: { attributes: resourceAttrs },\n status: {\n code: SpanStatusCode[span.status.code] ?? String(span.status.code),\n description: span.status.message ?? null,\n },\n events: span.events\n ? span.events.map((e) => ({\n name: e.name,\n timestamp: hrTimeToNanos(e.time),\n attributes: e.attributes ? { ...e.attributes } : {},\n }))\n : [],\n };\n\n // 7. Post-processing: framework span name normalization, CrewAI tasks, model resolution\n let results = this._normalizeFrameworkSpanNames([spanData]);\n spanData = results[0] ?? spanData;\n results = this._injectCrewaiTaskTemplates([spanData]);\n spanData = results[0] ?? spanData;\n this._resolveActualModelName(spanData);\n\n // 7b. Apply mask — if mask returns null, drop the span entirely\n const maskedSpanData = applyMask(spanData, this.mask ?? null);\n if (maskedSpanData === null) {\n // Mark the OTel span so the FilteringExporter can skip it\n try {\n const spanAttrs = (span as any).attributes ?? (span as any)._attributes;\n if (spanAttrs != null) {\n spanAttrs['neatlogs.dropped'] = true;\n }\n } catch {\n // Best-effort — if write-back fails, span may still export\n }\n return;\n }\n spanData = maskedSpanData;\n\n // 7c. Write normalized neatlogs.* attributes back to the OTel span\n const finalAttrs = (spanData.attributes ?? {}) as Record<string, any>;\n try {\n const spanAttrs = (span as any).attributes ?? (span as any)._attributes;\n if (spanAttrs != null) {\n for (const [k, v] of Object.entries(finalAttrs)) {\n if (\n typeof v === 'string' ||\n typeof v === 'number' ||\n typeof v === 'boolean'\n ) {\n spanAttrs[k] = v;\n } else if (\n Array.isArray(v) &&\n v.every(\n (i: any) =>\n typeof i === 'string' ||\n typeof i === 'number' ||\n typeof i === 'boolean',\n )\n ) {\n spanAttrs[k] = [...v];\n }\n }\n }\n } catch (wbExc) {\n if (this.debug) {\n logger.debug(\n `[SpanProcessor] Attr write-back failed: ${wbExc}`,\n );\n }\n }\n\n // 8. Log processed span dict (mask already applied in step 7b)\n if (this._processedLogStream && !this._processedLogStream.destroyed) {\n try {\n this._processedLogStream.write(\n JSON.stringify(spanData) + '\\n',\n );\n } catch (e) {\n logger.warn(`Failed to write span to processed log file: ${e}`);\n }\n }\n\n this.perfStats.spansExported += 1;\n\n // Emit completion marker when a root span ends\n if (!span.parentSpanId) {\n this._emitCompletionMarker(span, traceId, resourceAttrs);\n }\n } finally {\n this.perfStats.onEndTime += performance.now() - startTime;\n }\n }\n\n // ── Completion marker ─────────────────────────────────\n\n private _emitCompletionMarker(\n rootSpan: ReadableSpan,\n traceId: string,\n resourceAttrs: Record<string, any>,\n ): void {\n try {\n const spanCtx: SpanContext = {\n traceId: rootSpan.spanContext().traceId,\n spanId: rootSpan.spanContext().spanId,\n isRemote: false,\n traceFlags: TraceFlags.SAMPLED,\n };\n\n // Use wrapSpanContext to create a non-recording span from context\n const wrappedSpan = otelTrace.wrapSpanContext(spanCtx);\n const ctx = otelTrace.setSpan(otelContext.active(), wrappedSpan);\n\n const tracer = otelTrace.getTracer('neatlogs.internal');\n const marker = tracer.startSpan('neatlogs.trace.complete', undefined, ctx);\n marker.setAttribute('neatlogs.trace.complete', true);\n marker.setAttribute('neatlogs.internal', true);\n marker.setAttribute('neatlogs.span.kind', 'Neatlogs.INTERNAL');\n\n // Copy resource tags\n if (resourceAttrs['neatlogs.tags']) {\n marker.setAttribute('neatlogs.tags', resourceAttrs['neatlogs.tags']);\n }\n\n marker.end();\n\n if (this.debug) {\n logger.debug(\n `[SpanProcessor] Emitted completion marker for trace ${traceId}`,\n );\n }\n } catch (e) {\n logger.warn(`[SpanProcessor] Failed to emit completion marker: ${e}`);\n }\n }\n\n // ── Framework span name normalization ─────────────────\n\n private _normalizeFrameworkSpanNames(\n spans: Record<string, any>[],\n ): Record<string, any>[] {\n for (const s of spans) {\n const name: string = s.name ?? '';\n const kind: string =\n s.kind ?? s.attributes?.['neatlogs.span.kind'] ?? '';\n\n if (kind !== 'task' || !name.endsWith('.task')) {\n continue;\n }\n\n const attrs: Record<string, any> = s.attributes ?? {};\n if (!Object.keys(attrs).some((k) => k.startsWith('neatlogs.crewai.'))) {\n continue;\n }\n\n let desc = name.slice(0, -'.task'.length).trimEnd();\n while (desc.endsWith('.')) {\n desc = desc.slice(0, -1).trimEnd();\n }\n\n if (desc) {\n if (attrs['neatlogs.task.description'] === undefined) {\n attrs['neatlogs.task.description'] = desc;\n }\n }\n\n s.name = 'crewai.task';\n s.attributes = attrs;\n }\n\n return spans;\n }\n\n // ── CrewAI task template injection ────────────────────\n\n private _injectCrewaiTaskTemplates(\n spans: Record<string, any>[],\n ): Record<string, any>[] {\n for (const s of spans) {\n const attrs: Record<string, any> = s.attributes ?? {};\n const taskId = attrs['neatlogs.task.id'];\n if (!taskId) continue;\n\n const entry = popEntry(String(taskId));\n if (!entry) continue;\n\n const [tplStr, varsJson] = entry;\n attrs['neatlogs.task.user_prompt_template'] = tplStr;\n if (varsJson) {\n attrs['neatlogs.task.user_prompt_template_variables'] = varsJson;\n }\n attrs['neatlogs.span.kind'] = 'crewai_task';\n s.attributes = attrs;\n }\n\n return spans;\n }\n\n // ── Resolve actual model name from LLM output ────────\n // LangChain/Azure spans report deployment names (e.g., \"gpt-3.5-turbo\") as\n // the model name. The actual resolved model (e.g., \"gpt-5-nano-2025-08-07\")\n // is buried in the LLM output JSON at response_metadata.model_name.\n\n private _resolveActualModelName(spanData: Record<string, any>): void {\n const attrs: Record<string, any> = spanData.attributes ?? {};\n const kind = attrs['neatlogs.span.kind'];\n if (kind !== 'llm') return;\n\n const currentModel = attrs['neatlogs.llm.model_name'] as string | undefined;\n if (!currentModel) return;\n\n const llmOutput = attrs['neatlogs.llm.output'] as string | undefined;\n if (!llmOutput) return;\n\n try {\n const output = JSON.parse(llmOutput);\n\n // LangChain format: generations[0][0].message.kwargs.response_metadata.model_name\n const generations = output?.generations;\n if (Array.isArray(generations) && generations[0]?.[0]) {\n const respMeta = generations[0][0]?.message?.kwargs?.response_metadata;\n if (respMeta?.model_name && respMeta.model_name !== currentModel) {\n attrs['neatlogs.llm.model_name'] = respMeta.model_name;\n if (this.debug) {\n logger.debug(\n `[ModelResolve] LangChain span: ${currentModel} → ${respMeta.model_name}`,\n );\n }\n return;\n }\n }\n\n // Vercel AI SDK / direct OpenAI format: model field at top level of response\n if (output?.model && output.model !== currentModel) {\n attrs['neatlogs.llm.model_name'] = output.model;\n if (this.debug) {\n logger.debug(\n `[ModelResolve] Direct response: ${currentModel} → ${output.model}`,\n );\n }\n }\n } catch (e: unknown) {\n logger.warn(`[ModelResolve] Failed to parse LLM output for model extraction: ${e}`);\n }\n }\n\n // ── forceFlush / shutdown ─────────────────────────────\n\n async forceFlush(): Promise<void> {\n // Flushing is handled by BatchSpanProcessor downstream.\n }\n\n async shutdown(): Promise<void> {\n this._logPerformanceStats();\n\n await closeLogStream(this._rawLogStream, 'raw');\n this._rawLogStream = null;\n\n await closeLogStream(this._processedLogStream, 'processed');\n this._processedLogStream = null;\n }\n\n // ── Performance stats ─────────────────────────────────\n\n private _logPerformanceStats(): void {\n if (!this.debug) return;\n\n const stats = this.perfStats;\n if (stats.spansProcessed === 0) return;\n\n const totalTime = stats.onStartTime + stats.onEndTime;\n const avgMs = totalTime / stats.spansProcessed;\n\n try {\n logger.info(\n `Neatlogs overhead: ${totalTime.toFixed(2)}ms total, ${avgMs.toFixed(3)}ms/span ` +\n `(${stats.spansProcessed} spans processed, ` +\n `${stats.spansExported} spans logged)`,\n );\n } catch {\n // ignore\n }\n }\n\n // ── Accessors for testing ─────────────────────────────\n\n /** @internal — exposed for testing */\n get _perfStats(): PerfStats {\n return this.perfStats;\n }\n\n /** @internal — exposed for testing */\n get _suppressedRetrievers(): Set<string> {\n return this._retrieversToSuppress;\n }\n}\n","/**\n * Centralized logging configuration for Neatlogs SDK.\n * Provides structured logging with configurable levels.\n */\n\ntype LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'NONE';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n DEBUG: 0,\n INFO: 1,\n WARN: 2,\n ERROR: 3,\n NONE: 4,\n};\n\nlet _logLevel: LogLevel = 'INFO';\nlet _disabled = false;\n\nfunction _getConfiguredLevel(): LogLevel {\n const envLevel = process.env.NEATLOGS_LOG_LEVEL?.toUpperCase();\n if (envLevel && envLevel in LOG_LEVELS) {\n return envLevel as LogLevel;\n }\n return 'INFO';\n}\n\n// Initialize from env on first import\n_logLevel = _getConfiguredLevel();\n\nexport function getLogger() {\n return {\n debug(message: string, ...args: any[]) {\n if (!_disabled && LOG_LEVELS[_logLevel] <= LOG_LEVELS.DEBUG) {\n console.debug(`[neatlogs] ${message}`, ...args);\n }\n },\n info(message: string, ...args: any[]) {\n if (!_disabled && LOG_LEVELS[_logLevel] <= LOG_LEVELS.INFO) {\n console.info(`[neatlogs] ${message}`, ...args);\n }\n },\n warn(message: string, ...args: any[]) {\n if (!_disabled && LOG_LEVELS[_logLevel] <= LOG_LEVELS.WARN) {\n console.warn(`[neatlogs] ${message}`, ...args);\n }\n },\n error(message: string, ...args: any[]) {\n if (!_disabled && LOG_LEVELS[_logLevel] <= LOG_LEVELS.ERROR) {\n console.error(`[neatlogs] ${message}`, ...args);\n }\n },\n };\n}\n\nexport function setLogLevel(level: LogLevel): void {\n _logLevel = level;\n}\n\nexport function enableDebugLogging(): void {\n _logLevel = 'DEBUG';\n}\n\nexport function disableLogging(): void {\n _disabled = true;\n}\n\nexport function enableLogging(): void {\n _disabled = false;\n}\n","/**\n * Framework and platform detection from instrumentation scope.\n *\n * Parses OpenTelemetry instrumentation_scope.name to extract:\n * - Provider: LLM provider (openai, anthropic, google, etc.)\n * - Framework: Orchestration framework (langchain, llamaindex, crewai, etc.)\n * - Platform: Cloud platform (bedrock, vertex_ai, azure_openai, etc.)\n *\n * Port of Python neatlogs/core/instrumentation_scope_parser.py\n */\n\n// ────────────────────────────────────────────────────────\n// Types\n// ────────────────────────────────────────────────────────\n\nexport interface ScopeInfo {\n provider?: string;\n framework?: string;\n platform?: string;\n}\n\n// ────────────────────────────────────────────────────────\n// Scope-name → provider / framework / platform tables\n// ────────────────────────────────────────────────────────\n\nconst SCOPE_PATTERNS: Record<string, ScopeInfo> = {\n // Neatlogs custom instrumentations\n '@neatlogs/instrumentation-google-genai': { provider: 'google', framework: 'google_genai' },\n '@neatlogs/instrumentation-mastra': { framework: 'mastra' },\n '@neatlogs/instrumentation-ai-sdk': { framework: 'ai_sdk' },\n\n // Vercel AI SDK native scope (the `ai` package emits this directly)\n ai: { framework: 'ai_sdk' },\n\n // OpenInference instrumentations (npm @arizeai scope names)\n '@arizeai/openinference-instrumentation-openai': { provider: 'openai', framework: 'openai' },\n '@arizeai/openinference-instrumentation-anthropic': { provider: 'anthropic', framework: 'anthropic' },\n '@arizeai/openinference-instrumentation-langchain': { framework: 'langchain' },\n '@arizeai/openinference-instrumentation-bedrock': { provider: 'bedrock', platform: 'bedrock', framework: 'bedrock' },\n '@arizeai/openinference-instrumentation-vertexai': { provider: 'vertex_ai', platform: 'vertex_ai', framework: 'vertex_ai' },\n '@arizeai/openinference-instrumentation-mistralai': { provider: 'mistral', framework: 'mistral' },\n '@arizeai/openinference-instrumentation-cohere': { provider: 'cohere', framework: 'cohere' },\n '@arizeai/openinference-instrumentation-groq': { provider: 'groq', framework: 'groq' },\n '@arizeai/openinference-instrumentation-llama-index': { framework: 'llamaindex' },\n '@arizeai/openinference-instrumentation-llamaindex': { framework: 'llamaindex' },\n '@arizeai/openinference-instrumentation-crewai': { framework: 'crewai' },\n '@arizeai/openinference-instrumentation-haystack': { framework: 'haystack' },\n '@arizeai/openinference-instrumentation-dspy': { framework: 'dspy' },\n '@arizeai/openinference-instrumentation-beeai': { framework: 'beeai' },\n '@arizeai/openinference-instrumentation-mcp': { framework: 'mcp' },\n '@arizeai/openinference-instrumentation-claude-agent-sdk': { framework: 'claude_agent_sdk' },\n\n // OpenInference instrumentations (Python-style scope names)\n 'openinference.instrumentation.openai': { provider: 'openai', framework: 'openai' },\n 'openinference.instrumentation.anthropic': { provider: 'anthropic', framework: 'anthropic' },\n 'openinference.instrumentation.google_genai': { provider: 'google', framework: 'google_genai' },\n 'openinference.instrumentation.bedrock': { provider: 'bedrock', platform: 'bedrock', framework: 'bedrock' },\n 'openinference.instrumentation.vertexai': { provider: 'vertex_ai', platform: 'vertex_ai', framework: 'vertex_ai' },\n 'openinference.instrumentation.mistralai': { provider: 'mistral', framework: 'mistral' },\n 'openinference.instrumentation.cohere': { provider: 'cohere', framework: 'cohere' },\n 'openinference.instrumentation.groq': { provider: 'groq', framework: 'groq' },\n\n // OpenInference frameworks (Python-style scope names)\n 'openinference.instrumentation.mastra': { framework: 'mastra' },\n 'openinference.instrumentation.langchain': { framework: 'langchain' },\n 'openinference.instrumentation.llama_index': { framework: 'llamaindex' },\n 'openinference.instrumentation.llamaindex': { framework: 'llamaindex' },\n 'openinference.instrumentation.crewai': { framework: 'crewai' },\n 'openinference.instrumentation.haystack': { framework: 'haystack' },\n 'openinference.instrumentation.dspy': { framework: 'dspy' },\n\n // OpenLLMetry (Traceloop) instrumentations\n 'opentelemetry.instrumentation.openai': { provider: 'openai', framework: 'openai' },\n 'opentelemetry.instrumentation.anthropic': { provider: 'anthropic', framework: 'anthropic' },\n 'opentelemetry.instrumentation.google_generativeai': { provider: 'google', framework: 'google_genai' },\n 'opentelemetry.instrumentation.bedrock': { provider: 'bedrock', platform: 'bedrock', framework: 'bedrock' },\n 'opentelemetry.instrumentation.vertexai': { provider: 'vertex_ai', platform: 'vertex_ai', framework: 'vertex_ai' },\n 'opentelemetry.instrumentation.cohere': { provider: 'cohere', framework: 'cohere' },\n 'opentelemetry.instrumentation.mistralai': { provider: 'mistral', framework: 'mistral' },\n\n // OpenLLMetry frameworks\n 'opentelemetry.instrumentation.langchain': { framework: 'langchain' },\n 'opentelemetry.instrumentation.llamaindex': { framework: 'llamaindex' },\n 'opentelemetry.instrumentation.crewai': { framework: 'crewai' },\n 'opentelemetry.instrumentation.haystack': { framework: 'haystack' },\n\n // Native framework telemetry\n 'haystack.telemetry': { framework: 'haystack' },\n crewai: { framework: 'crewai' },\n langchain: { framework: 'langchain' },\n llama_index: { framework: 'llamaindex' },\n};\n\n// gen_ai.system → neatlogs.provider mapping\nconst GEN_AI_SYSTEM_TO_PROVIDER: Record<string, string> = {\n openai: 'openai',\n anthropic: 'anthropic',\n google: 'google',\n vertex_ai: 'vertex_ai',\n bedrock: 'bedrock',\n azure_openai: 'openai', // Azure OpenAI uses OpenAI provider\n cohere: 'cohere',\n mistral: 'mistral',\n groq: 'groq',\n};\n\n// ────────────────────────────────────────────────────────\n// Public API\n// ────────────────────────────────────────────────────────\n\n/**\n * Parse instrumentation scope name to extract provider/framework/platform.\n *\n * @param scopeName - The instrumentation_scope.name from the span\n * @returns Dictionary with detected: provider, framework, platform (if found)\n *\n * @example\n * parseInstrumentationScope('openinference.instrumentation.openai')\n * // → { provider: 'openai' }\n *\n * parseInstrumentationScope('openinference.instrumentation.langchain')\n * // → { framework: 'langchain' }\n *\n * parseInstrumentationScope('opentelemetry.instrumentation.bedrock')\n * // → { provider: 'bedrock', platform: 'bedrock' }\n */\nexport function parseInstrumentationScope(scopeName: string | null | undefined): ScopeInfo {\n if (!scopeName) return {};\n\n const scopeLower = scopeName.toLowerCase();\n\n // Direct exact match\n if (scopeLower in SCOPE_PATTERNS) {\n return { ...SCOPE_PATTERNS[scopeLower] };\n }\n\n // Prefix match (handles versioned scopes like \"openinference.instrumentation.openai.v1\")\n for (const [pattern, info] of Object.entries(SCOPE_PATTERNS)) {\n if (scopeLower.startsWith(pattern)) {\n return { ...info };\n }\n }\n\n // Fuzzy extraction as fallback\n const result: ScopeInfo = {};\n\n // Check for framework indicators\n if (scopeLower.includes('langchain')) {\n result.framework = 'langchain';\n } else if (scopeLower.includes('llama') || scopeLower.includes('llamaindex')) {\n result.framework = 'llamaindex';\n } else if (scopeLower.includes('crewai') || scopeLower.includes('crew')) {\n result.framework = 'crewai';\n } else if (scopeLower.includes('haystack')) {\n result.framework = 'haystack';\n } else if (scopeLower.includes('dspy')) {\n result.framework = 'dspy';\n } else if (scopeLower.includes('vercel-ai') || scopeLower.includes('ai-sdk')) {\n result.framework = 'ai_sdk';\n }\n\n // Check for provider indicators\n if (scopeLower.includes('openai')) {\n result.provider = 'openai';\n if (scopeLower.includes('azure')) {\n result.platform = 'azure_openai';\n }\n } else if (scopeLower.includes('anthropic') || scopeLower.includes('claude')) {\n result.provider = 'anthropic';\n } else if (\n scopeLower.includes('google') ||\n scopeLower.includes('gemini') ||\n scopeLower.includes('genai')\n ) {\n result.provider = 'google';\n } else if (scopeLower.includes('bedrock')) {\n result.provider = 'bedrock';\n result.platform = 'bedrock';\n } else if (scopeLower.includes('vertex')) {\n result.platform = 'vertex_ai';\n // Vertex can host multiple providers, default to google\n if (!result.provider) {\n result.provider = 'vertex_ai';\n }\n } else if (scopeLower.includes('mistral')) {\n result.provider = 'mistral';\n } else if (scopeLower.includes('cohere')) {\n result.provider = 'cohere';\n } else if (scopeLower.includes('groq')) {\n result.provider = 'groq';\n }\n\n return result;\n}\n\n/**\n * Enrich attributes with framework/platform/provider detected from instrumentation scope.\n *\n * Modifies attrs **in-place** by adding:\n * - neatlogs.instrumentation.name\n * - neatlogs.provider\n * - neatlogs.framework\n * - neatlogs.platform\n *\n * Logic:\n * 1. Parse current span's scope → gives provider/platform\n * 2. Parse parent span's scope (if provided) → gives orchestrating framework\n * 3. Only set attributes if not already present (explicit attrs take precedence)\n * 4. Cross-reference with gen_ai.system / model name patterns\n */\nexport function enrichWithScopeDetection(\n attrs: Record<string, any>,\n scopeName: string | null | undefined,\n parentScopeName: string | null | undefined = null,\n): void {\n // Store original instrumentation scope info\n if (scopeName) {\n if (!('neatlogs.instrumentation.name' in attrs)) {\n attrs['neatlogs.instrumentation.name'] = scopeName;\n }\n }\n\n // Parse current span's scope\n const currentInfo = parseInstrumentationScope(scopeName);\n\n // Set provider (from current span's scope)\n if (currentInfo.provider && !('neatlogs.provider' in attrs)) {\n attrs['neatlogs.provider'] = currentInfo.provider;\n }\n\n // Set platform (from current span's scope)\n if (currentInfo.platform && !('neatlogs.platform' in attrs)) {\n attrs['neatlogs.platform'] = currentInfo.platform;\n }\n\n // Set framework — prioritize parent scope, fallback to current scope\n if (parentScopeName) {\n const parentInfo = parseInstrumentationScope(parentScopeName);\n if (parentInfo.framework && !('neatlogs.framework' in attrs)) {\n attrs['neatlogs.framework'] = parentInfo.framework;\n }\n }\n\n // If no framework from parent, check current scope\n if (!('neatlogs.framework' in attrs) && currentInfo.framework) {\n attrs['neatlogs.framework'] = currentInfo.framework;\n }\n\n // Cross-reference with gen_ai.system if available\n const genAiSystem = (attrs['gen_ai.system'] ?? '').toLowerCase();\n if (genAiSystem && !('neatlogs.provider' in attrs)) {\n const mapped = GEN_AI_SYSTEM_TO_PROVIDER[genAiSystem];\n if (mapped) {\n attrs['neatlogs.provider'] = mapped;\n }\n }\n\n // Detect platform from model name patterns (e.g., \"anthropic.claude-3-5-sonnet-v1:0\" → Bedrock)\n const llmModel: string = attrs['llm.model_name'] ?? '';\n if (llmModel && !('neatlogs.platform' in attrs)) {\n if (\n llmModel.startsWith('anthropic.') ||\n llmModel.startsWith('meta.') ||\n llmModel.startsWith('amazon.')\n ) {\n attrs['neatlogs.platform'] = 'bedrock';\n } else if (llmModel.toLowerCase().includes('azure')) {\n attrs['neatlogs.platform'] = 'azure_openai';\n }\n }\n}\n\n/**\n * Get the effective provider to use for pricing lookups.\n *\n * Logic:\n * 1. Use neatlogs.platform if it's set (bedrock/vertex_ai/azure_openai)\n * 2. Otherwise use neatlogs.provider\n * 3. Fallback to gen_ai.system or llm.system\n */\nexport function getEffectiveProviderForPricing(attrs: Record<string, any>): string {\n // Platform takes precedence for pricing (different pricing on cloud platforms)\n const platform = (attrs['neatlogs.platform'] ?? '').toLowerCase();\n if (platform) {\n const platformPricingMap: Record<string, string> = {\n bedrock: 'bedrock',\n vertex_ai: 'vertex_ai',\n azure_openai: 'azure_openai',\n };\n if (platform in platformPricingMap) {\n return platformPricingMap[platform];\n }\n }\n\n // Use detected provider\n const provider = (attrs['neatlogs.provider'] ?? '').toLowerCase();\n if (provider) {\n return provider;\n }\n\n // Fallback to gen_ai.system or llm.system\n return (attrs['gen_ai.system'] ?? attrs['llm.system'] ?? '').toLowerCase();\n}\n\n/**\n * Get the effective provider to use for defaults lookups.\n *\n * Currently uses the same logic as pricing. Exported as a separate\n * name so callers express intent (defaults vs pricing) even though\n * the implementation is shared.\n */\nexport const getEffectiveProviderForDefaults = getEffectiveProviderForPricing;\n","/**\n * Shared constants for vector DB systems and retrieval operations.\n *\n * Used by both attribute-processor.ts and mapping.ts to avoid\n * divergent keyword lists.\n */\n\n/** Known vector database system identifiers. */\nexport const VECTOR_DB_SYSTEMS = new Set([\n 'chroma',\n 'chromadb',\n 'pinecone',\n 'qdrant',\n 'milvus',\n 'marqo',\n 'weaviate',\n 'lancedb',\n 'pgvector',\n 'elasticsearch',\n]);\n\n/** Operations that indicate a retrieval / read from a vector DB. */\nexport const RETRIEVAL_OPS = [\n 'query',\n 'search',\n 'get',\n 'fetch',\n 'find',\n 'retrieve',\n 'scroll',\n 'peek',\n 'discover',\n 'recommend',\n 'aggregate',\n 'hybrid_search',\n 'select',\n];\n\n/** Operations that indicate a write to a vector DB. */\nexport const WRITE_OPS = [\n 'upsert',\n 'insert',\n 'add',\n 'update',\n 'delete',\n 'create',\n 'drop',\n 'put',\n 'set',\n 'upload',\n 'index',\n];\n\n/** Vector DB names used for span-name-based inference. */\nexport const VECTOR_DB_NAMES = [\n 'chroma',\n 'pinecone',\n 'weaviate',\n 'qdrant',\n 'milvus',\n 'lancedb',\n 'marqo',\n];\n","/**\n * Span kind constants and inference from span names.\n * Mirrors Python span_kinds/mapping.py.\n */\n\nimport type { SpanKind } from '../types.js';\nimport { VECTOR_DB_NAMES, RETRIEVAL_OPS } from './constants.js';\n\n/** All valid span kinds for the span() decorator. */\nexport const VALID_SPAN_KINDS = new Set<SpanKind>([\n 'WORKFLOW',\n 'AGENT',\n 'CHAIN',\n 'TOOL',\n 'RETRIEVER',\n 'EMBEDDING',\n 'MCP_TOOL',\n 'GUARDRAIL',\n]);\n\n/** Extended span kinds that can appear in processed spans (from OpenInference). */\nexport const ALL_SPAN_KINDS = new Set<string>([\n ...VALID_SPAN_KINDS,\n 'LLM',\n 'RERANKER',\n 'EVALUATOR',\n 'VECTOR_STORE',\n]);\n\n/**\n * Infer OpenInference span kind from span name.\n * Distinguishes RETRIEVER (read ops) vs VECTOR_STORE (write ops) for vector DBs.\n */\nexport function inferSpanKindFromName(spanName: string): string {\n const nameLower = spanName.toLowerCase();\n\n // LLM operations\n if (\n ['openai', 'anthropic', 'cohere', 'bedrock', 'chat', 'completion', 'llm', 'gemini', 'google_genai'].some(\n (kw) => nameLower.includes(kw),\n )\n ) {\n return 'LLM';\n }\n\n // Embedding operations\n if (nameLower.includes('embed')) {\n return 'EMBEDDING';\n }\n\n // Vector DB: Distinguish RETRIEVER (read) vs VECTOR_STORE (write)\n if (VECTOR_DB_NAMES.some((db) => nameLower.includes(db))) {\n if (RETRIEVAL_OPS.some((kw) => nameLower.includes(kw))) {\n return 'RETRIEVER';\n }\n return 'VECTOR_STORE';\n }\n\n // Generic retrieval\n if (['retriev', 'search', 'query'].some((kw) => nameLower.includes(kw))) {\n return 'RETRIEVER';\n }\n\n // Reranker\n if (nameLower.includes('rerank')) {\n return 'RERANKER';\n }\n\n // Agent\n if (nameLower.includes('agent')) {\n return 'AGENT';\n }\n\n // Tool/function\n if (['tool', 'function'].some((kw) => nameLower.includes(kw))) {\n return 'TOOL';\n }\n\n // Guardrail\n if (['guardrail', 'validate', 'moderate', 'safety'].some((kw) => nameLower.includes(kw))) {\n return 'GUARDRAIL';\n }\n\n // Evaluator\n if (['evaluat', 'score', 'metric'].some((kw) => nameLower.includes(kw))) {\n return 'EVALUATOR';\n }\n\n // Default\n return 'CHAIN';\n}\n","{\n \"openai\": {\n \"chat.completions\": {\n \"gpt-5.2\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-5.1\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-5\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-5-mini\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0\n },\n \"gpt-5-nano\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0\n },\n \"gpt-4.1\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-4.1-mini\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0\n },\n \"gpt-4o\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-4o-mini\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0\n },\n \"o4-mini\": {\n \"max_completion_tokens\": null\n },\n \"o3\": {\n \"max_completion_tokens\": null\n },\n \"o3-mini\": {\n \"max_completion_tokens\": null\n },\n \"o1\": {\n \"max_completion_tokens\": null\n },\n \"o1-mini\": {\n \"max_completion_tokens\": null\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"stream\": false\n }\n },\n \"embeddings\": {\n \"_default\": {\n \"encoding_format\": \"float\",\n \"dimensions\": null\n }\n }\n },\n \"anthropic\": {\n \"messages\": {\n \"claude-opus-4-6\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-opus-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-opus-4-1\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"claude-opus-4\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"claude-sonnet-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-sonnet-4\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-haiku-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-3-5-sonnet\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false,\n \"stop_sequences\": null\n },\n \"claude-3-5-haiku\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"claude-3-opus\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"claude-3-haiku\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"stream\": false\n }\n }\n },\n \"cohere\": {\n \"chat\": {\n \"_default\": {\n \"temperature\": 0.3,\n \"p\": 0.75,\n \"k\": 0,\n \"max_tokens\": null,\n \"safety_mode\": \"CONTEXTUAL\"\n }\n },\n \"generate\": {\n \"_default\": {\n \"temperature\": 0.9,\n \"p\": null,\n \"k\": 0,\n \"max_tokens\": null,\n \"safety_mode\": \"CONTEXTUAL\"\n }\n }\n },\n \"google\": {\n \"generateContent\": {\n \"gemini-2.5-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.5-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.0-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.0-flash-lite\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.0-flash-thinking\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 64,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.5-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.94,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"stop_sequences\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.5-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.0-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n }\n }\n },\n \"vertex_ai\": {\n \"generateContent\": {\n \"gemini-2.5-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.5-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.0-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.5-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.94,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.5-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n }\n }\n },\n \"bedrock\": {\n \"_note\": \"Claude Sonnet 4.5 and Haiku 4.5 on Bedrock: Use EITHER temperature OR top_p, not both\",\n \"messages\": {\n \"anthropic.claude-sonnet-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-haiku-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-3-5-sonnet-20241022\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-3-5-sonnet-20240620\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null,\n \"stop_sequences\": null\n },\n \"anthropic.claude-3-5-haiku-20241022\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-3-opus\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-3-haiku\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"meta.llama3\": {\n \"temperature\": 0.5,\n \"top_p\": 0.9,\n \"max_gen_len\": null\n },\n \"mistral.mistral-7b-instruct\": {\n \"temperature\": 0.5,\n \"top_p\": 0.9,\n \"top_k\": 50,\n \"max_tokens\": null\n },\n \"amazon.titan-text\": {\n \"temperature\": 0.7,\n \"topP\": 0.9,\n \"maxTokenCount\": null\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0\n }\n }\n },\n \"groq\": {\n \"chat.completions\": {\n \"llama-3.3-70b-versatile\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 1024,\n \"stream\": false\n },\n \"llama-3.1-70b-versatile\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 1024,\n \"stream\": false\n },\n \"mixtral-8x7b-32768\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 1024,\n \"stream\": false\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 1024,\n \"stream\": false\n }\n }\n },\n \"deepseek\": {\n \"chat.completions\": {\n \"deepseek-chat\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 4096,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"stream\": false\n },\n \"deepseek-reasoner\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"stream\": false\n }\n }\n },\n \"mistral\": {\n \"chat\": {\n \"mistral-large-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null,\n \"safe_prompt\": false\n },\n \"mistral-small-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"pixtral-large-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"pixtral-12b-2409\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"codestral-latest\": {\n \"temperature\": 0.0,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"ministral-8b-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"ministral-3b-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0\n }\n }\n },\n \"ollama\": {\n \"generate\": {\n \"_default\": {\n \"temperature\": 0.8,\n \"top_k\": 40,\n \"top_p\": 0.9,\n \"num_predict\": -1,\n \"repeat_penalty\": 1.1,\n \"stream\": false\n }\n },\n \"chat\": {\n \"_default\": {\n \"temperature\": 0.8,\n \"top_k\": 40,\n \"top_p\": 0.9,\n \"num_predict\": -1,\n \"stream\": false\n }\n }\n },\n \"together\": {\n \"chat.completions\": {\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 0.7,\n \"top_k\": 50,\n \"max_tokens\": 512,\n \"stream\": false\n }\n },\n \"completions\": {\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 0.7,\n \"top_k\": 50,\n \"max_tokens\": 128\n }\n }\n },\n \"replicate\": {\n \"predictions\": {\n \"meta/llama-2\": {\n \"temperature\": 0.75,\n \"top_p\": 0.9,\n \"max_new_tokens\": 500\n },\n \"meta/llama-3\": {\n \"temperature\": 0.75,\n \"top_p\": 0.9,\n \"max_new_tokens\": 500\n },\n \"_default\": {\n \"temperature\": 0.75,\n \"top_p\": 0.9\n }\n }\n },\n \"huggingface\": {\n \"text_generation\": {\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_new_tokens\": null,\n \"do_sample\": true\n }\n },\n \"conversational\": {\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_length\": null\n }\n }\n },\n \"azure_openai\": {\n \"chat.completions\": {\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false\n }\n }\n },\n \"aleph_alpha\": {\n \"completion\": {\n \"_default\": {\n \"temperature\": 0.0,\n \"top_p\": 0.0,\n \"top_k\": 0,\n \"maximum_tokens\": 64\n }\n }\n },\n \"watsonx\": {\n \"generate\": {\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"top_k\": 50,\n \"max_new_tokens\": 200\n }\n }\n },\n \"writer\": {\n \"completion\": {\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": 1024\n }\n }\n }\n}\n","/**\n * Model defaults enricher for invocation parameters.\n *\n * Loads defaults from config/model_defaults.json and intelligently merges\n * them with explicitly set parameters.\n */\n\nimport { getLogger } from '../core/logger.js';\nimport modelDefaultsConfig from './model_defaults.json';\n\nconst logger = getLogger();\n\n/**\n * Get default parameters for a specific provider/operation/model.\n */\nexport function getDefaults(\n provider: string,\n operation: string,\n model: string,\n): Record<string, any> {\n const defaultsData = modelDefaultsConfig as Record<string, any>;\n\n const providerData = defaultsData[provider.toLowerCase()] ?? {};\n const operationData = providerData[operation] ?? {};\n\n if (Object.keys(operationData).length === 0) {\n return {};\n }\n\n // Exact match\n if (model in operationData) {\n return { ...operationData[model] };\n }\n\n // Prefix match\n for (const [modelKey, defaults] of Object.entries(operationData)) {\n if (modelKey !== '_default' && model.startsWith(modelKey)) {\n logger.debug(`Matched model '${model}' to defaults for '${modelKey}'`);\n return { ...(defaults as Record<string, any>) };\n }\n }\n\n // Default fallback\n if ('_default' in operationData) {\n logger.debug(`Using _default for ${provider}/${operation}/${model}`);\n return { ...operationData._default };\n }\n\n return {};\n}\n\n/**\n * Enrich invocation parameters with model defaults.\n *\n * Merges default parameters from model_defaults.json with explicitly captured\n * parameters. Explicit parameters always take precedence.\n *\n * Modifies mergedAttrs in-place.\n */\nexport function enrichInvocationParameters(\n mergedAttrs: Record<string, any>,\n enableEnrichment = true,\n): void {\n if (!enableEnrichment) return;\n\n const spanKind = mergedAttrs['openinference.span.kind'];\n if (spanKind !== 'LLM' && spanKind !== 'EMBEDDING') return;\n\n const provider = (mergedAttrs['llm.system'] ?? '').toLowerCase();\n const model =\n spanKind === 'EMBEDDING'\n ? mergedAttrs['embedding.model_name'] ?? ''\n : mergedAttrs['llm.model_name'] ?? '';\n\n if (!provider || !model) return;\n\n let operation: string | undefined;\n if (spanKind === 'LLM') {\n operation = provider === 'openai' ? 'chat.completions' : 'messages';\n } else if (spanKind === 'EMBEDDING') {\n operation = 'embeddings';\n }\n\n if (!operation) return;\n\n const defaults = getDefaults(provider, operation, model);\n if (Object.keys(defaults).length === 0) {\n logger.debug(`No defaults found for ${provider}/${operation}/${model}`);\n return;\n }\n\n const existingParamsStr = mergedAttrs['llm.invocation_parameters'] ?? '{}';\n let existingParams: Record<string, any>;\n try {\n existingParams =\n typeof existingParamsStr === 'string'\n ? JSON.parse(existingParamsStr)\n : existingParamsStr;\n } catch {\n existingParams = {};\n }\n\n const enrichedParams = { ...defaults, ...existingParams };\n mergedAttrs['llm.invocation_parameters'] = JSON.stringify(enrichedParams);\n\n logger.debug(\n `Enriched params for ${provider}/${model}: added ${Object.keys(defaults).length} defaults`,\n );\n}\n","/**\n * Unified Attribute Processor — the core normalization pipeline.\n *\n * Port of Python neatlogs/core/attribute_processor.py\n *\n * Receives a span dict (already serialized from an OTel ReadableSpan) and\n * produces a normalized dict with neatlogs.* attributes.\n *\n * The processor handles three conventions:\n * - OpenInference (llm.*, embedding.*, openinference.*)\n * - OpenLLMetry (gen_ai.*, traceloop.*)\n * - Raw OTel (http.*, db.*, etc.)\n */\n\nimport { getLogger } from './logger.js';\nimport { enrichWithScopeDetection } from './instrumentation-scope-parser.js';\nimport { inferSpanKindFromName } from '../span-kinds/mapping.js';\nimport { enrichInvocationParameters } from '../config/defaults-enricher.js';\nimport { VECTOR_DB_SYSTEMS, RETRIEVAL_OPS, WRITE_OPS } from '../span-kinds/constants.js';\nimport type { AttributeMapper } from '../config/attribute-mapper.js';\n\nconst logger = getLogger();\n\n// ────────────────────────────────────────────────────────\n// Regular expressions\n// ────────────────────────────────────────────────────────\n\n/** Matches Python object repr strings like `<function BaseTool.<lambda> at 0x110107be0>` */\nconst PYTHON_REPR_RE = /^<[A-Za-z_].*?\\bat\\s+0x[0-9a-fA-F]+>$/;\n\n// Tool-call extraction from OpenInference output messages\nconst OI_TOOL_RE =\n /^llm\\.output_messages\\.(\\d+)\\.message\\.tool_calls\\.(\\d+)\\.tool_call\\.function\\.(name|arguments)$/;\nconst OI_TOOL_ID_RE =\n /^llm\\.output_messages\\.(\\d+)\\.message\\.tool_calls\\.(\\d+)\\.tool_call\\.id$/;\n\n// Tool definitions\nconst OI_SCHEMA_RE = /^llm\\.tools\\.(\\d+)\\.tool\\.json_schema$/;\nconst OL_FN_RE = /^llm\\.request\\.functions\\.(\\d+)\\.(name|description|input_schema)$/;\n\n// Input message tool fields\nconst INPUT_MSG_TOOL_RE = /^llm\\.input_messages\\.(\\d+)\\.message\\.(tool_call_id|name)$/;\n\n// Maps neatlogs.provider → neatlogs.llm.system\nconst PROVIDER_TO_SYSTEM: Record<string, string> = {\n openai: 'openai',\n azure: 'openai',\n azure_openai: 'openai',\n anthropic: 'anthropic',\n cohere: 'cohere',\n mistral: 'mistralai',\n mistralai: 'mistralai',\n google: 'google',\n vertex_ai: 'vertexai',\n groq: 'groq',\n xai: 'xai',\n deepseek: 'deepseek',\n};\n\n// ────────────────────────────────────────────────────────\n// Helpers\n// ────────────────────────────────────────────────────────\n\nfunction isPythonRepr(s: string): boolean {\n return PYTHON_REPR_RE.test(s.trim());\n}\n\n/** Recursively remove Python object repr strings from a parsed JSON structure. */\nfunction cleanPythonReprs(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n\n if (Array.isArray(obj)) {\n return obj\n .filter((item) => !(typeof item === 'string' && isPythonRepr(item)))\n .map((item) => cleanPythonReprs(item));\n }\n\n if (typeof obj === 'object') {\n const cleaned: Record<string, any> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (typeof v === 'string' && isPythonRepr(v)) continue;\n cleaned[k] = cleanPythonReprs(v);\n }\n return cleaned;\n }\n\n return obj;\n}\n\nfunction safeParse(val: string): any {\n try {\n return JSON.parse(val);\n } catch {\n return undefined;\n }\n}\n\nfunction safeStringify(val: any): string {\n try {\n return JSON.stringify(val);\n } catch {\n return String(val);\n }\n}\n\n// ────────────────────────────────────────────────────────\n// Span dict shape\n// ────────────────────────────────────────────────────────\n\nexport interface SpanDict {\n name: string;\n kind: number | string;\n trace_id: string;\n span_id: string;\n parent_span_id?: string | null;\n start_time: number | string;\n end_time: number | string;\n status?: { code?: number | string; message?: string };\n attributes: Record<string, any>;\n resource?: Record<string, any>;\n instrumentation_scope?: { name?: string; version?: string } | null;\n events?: Array<{\n name: string;\n timestamp: number | string;\n attributes: Record<string, any>;\n }>;\n}\n\n// ────────────────────────────────────────────────────────\n// UnifiedAttributeProcessor\n// ────────────────────────────────────────────────────────\n\nexport class UnifiedAttributeProcessor {\n private mapper: AttributeMapper;\n private debug: boolean;\n\n constructor(mapper: AttributeMapper, debug = false) {\n this.mapper = mapper;\n this.debug = debug;\n }\n\n // ── Public entry point ──────────────────────────────\n\n /**\n * Normalize a raw span dict into the neatlogs.* namespace.\n *\n * Steps:\n * 1. Merge resource + span attributes\n * 2. Detect framework/provider/platform from instrumentation scope\n * 3. Normalize vendor conventions (tool calls, tool defs, MCP, vector DB, etc.)\n * 4. Extract operational metrics (duration, TTFT)\n * 5. Upcycle events (retriever docs, embedding dimensions)\n * 6. Enrich invocation parameters with model defaults\n * 7. Apply namespace mapping via AttributeMapper\n * 8. Fill provider / system gaps\n * 9. Add intermediate ReAct steps\n * 10. Filter embedding vectors if applicable\n */\n normalize(spanDict: SpanDict): Record<string, any> {\n // 1. Merge resource + span attributes\n const resAttrs = spanDict.resource ?? {};\n const attrs: Record<string, any> = { ...resAttrs, ...spanDict.attributes };\n\n // Add span name for downstream processing\n attrs['_span_name'] = spanDict.name;\n\n // 2. Detect framework/provider/platform from instrumentation scope\n const scopeName = spanDict.instrumentation_scope?.name ?? null;\n enrichWithScopeDetection(attrs, scopeName, null);\n\n if (this.debug) {\n logger.debug(\n `[ScopeDetection] trace_id=${spanDict.trace_id} span_id=${spanDict.span_id} ` +\n `span_name=${spanDict.name} scope=${scopeName} ` +\n `framework=${attrs['neatlogs.framework'] ?? ''} ` +\n `provider=${attrs['neatlogs.provider'] ?? ''} ` +\n `platform=${attrs['neatlogs.platform'] ?? ''}`,\n );\n }\n\n // 3. Normalize vendor conventions\n this.normalizeConventions(spanDict, attrs);\n\n // 4. Extract operational metrics\n const computedMetrics = this.extractOperationalMetrics(spanDict, attrs);\n Object.assign(attrs, computedMetrics);\n\n // 5. Upcycle events\n const eventAttrs = this.upcycleEvents(spanDict);\n Object.assign(attrs, eventAttrs);\n\n // 6. Enrich invocation parameters\n try {\n enrichInvocationParameters(attrs, true);\n } catch (e: any) {\n logger.warn(`Failed to enrich invocation parameters: ${e?.message ?? e}`);\n }\n\n // 7. Apply namespace mapping\n const unified = this.applyNamespaceMapping(attrs);\n\n // 8. Add intermediate ReAct steps\n this.addIntermediateSteps(unified);\n\n // 9. Filter embedding vectors\n const spanKind = (unified['neatlogs.span.kind'] ?? '').toLowerCase();\n if (spanKind === 'embedding' || spanKind === 'vector_store') {\n return this.filterEmbeddingVectors(unified);\n }\n\n return unified;\n }\n\n // ── Convention normalization ────────────────────────\n\n private normalizeConventions(spanDict: SpanDict, attrs: Record<string, any>): void {\n // Detect HTTP spans\n if (this.isHttpLikeSpanKind(spanDict.kind) && this.looksLikeHttp(attrs)) {\n attrs['openinference.span.kind'] = 'HTTP';\n }\n\n // CrewAI fallback: if no span kind and has crewai.crew.* attrs → CHAIN\n if (\n !('openinference.span.kind' in attrs) &&\n Object.keys(attrs).some((k) => k.startsWith('crewai.crew.'))\n ) {\n attrs['openinference.span.kind'] = 'CHAIN';\n }\n\n // CrewAI token usage fallback\n this.addCrewaiTokenUsageFallback(attrs);\n\n // Reasoning tokens from output.value\n this.addReasoningTokensFromOutputValue(attrs);\n\n // CrewAI kickoff telemetry\n this.addCrewaiKickoffTelemetry(attrs);\n\n // Vercel AI SDK ai.* normalization MUST run before extractToolCalls so\n // the exploded llm.output_messages.0.message.tool_calls.* keys get\n // collapsed into the canonical llm.tool_calls.{i}.* shape that\n // attribute-mapping.json understands.\n this.extractVercelAiSdkAttrs(attrs);\n\n // Extract tool calls from output messages (OpenInference format)\n this.extractToolCalls(attrs);\n\n // Extract tool_call_id and name from input messages (tool response messages)\n for (const [k, v] of Object.entries(attrs)) {\n const m = INPUT_MSG_TOOL_RE.exec(k);\n if (m) {\n const [, msgIdx, field] = m;\n attrs[`llm.input_messages.${msgIdx}.${field}`] = v;\n }\n }\n\n // Extract invalid_tool_calls from output\n this.extractInvalidToolCalls(attrs);\n\n // Extract tool_call_id from tool output (for TOOL kind spans)\n this.extractToolCallIdFromOutput(attrs);\n\n // Extract tool definitions\n this.extractToolDefinitions(attrs);\n\n // Detect vector DB span kind from db.system\n this.detectVectorDbSpanKind(attrs);\n\n // Parse traceloop.entity.input for MCP signals\n this.parseMcpFromTraceloop(attrs);\n\n // Process MCP-specific signals\n this.processMcpSignals(attrs);\n\n // Handle EMBEDDING spans\n this.handleEmbeddingSpans(attrs);\n\n // Handle vector DB doc attributes\n this.handleVectorDbDocAttributes(attrs);\n\n // Extract LangChain metadata (ls_*) into standard positions\n this.extractLangchainMetadata(attrs);\n }\n\n private extractToolCalls(attrs: Record<string, any>): void {\n const toolCalls: Record<number, Record<string, any>> = {};\n const keysToRemove: string[] = [];\n\n for (const [k, v] of Object.entries(attrs)) {\n let m = OI_TOOL_RE.exec(k);\n if (m) {\n const [, , callIdxStr, field] = m;\n const idx = parseInt(callIdxStr, 10);\n if (!toolCalls[idx]) toolCalls[idx] = {};\n toolCalls[idx][field] = v;\n keysToRemove.push(k);\n continue;\n }\n\n m = OI_TOOL_ID_RE.exec(k);\n if (m) {\n const [, , callIdxStr] = m;\n const idx = parseInt(callIdxStr, 10);\n if (!toolCalls[idx]) toolCalls[idx] = {};\n toolCalls[idx]['id'] = v;\n keysToRemove.push(k);\n continue;\n }\n }\n\n for (const idx of Object.keys(toolCalls).map(Number).sort((a, b) => a - b)) {\n const tc = toolCalls[idx];\n if (tc.id !== undefined) attrs[`llm.tool_calls.${idx}.id`] = tc.id;\n if (tc.name !== undefined) attrs[`llm.tool_calls.${idx}.name`] = tc.name;\n if (tc.arguments !== undefined) attrs[`llm.tool_calls.${idx}.arguments`] = tc.arguments;\n }\n\n for (const k of keysToRemove) {\n delete attrs[k];\n }\n }\n\n private extractInvalidToolCalls(attrs: Record<string, any>): void {\n const llmOutput = attrs['llm.output'] ?? attrs['output.value'];\n if (!llmOutput || typeof llmOutput !== 'string') return;\n\n try {\n const outputData = JSON.parse(llmOutput);\n if (typeof outputData === 'object' && outputData !== null && !Array.isArray(outputData)) {\n const generations = outputData.generations;\n if (\n Array.isArray(generations) &&\n generations.length > 0 &&\n Array.isArray(generations[0]) &&\n generations[0].length > 0\n ) {\n const message = generations[0][0]?.message;\n const invalidCalls = message?.invalid_tool_calls;\n if (Array.isArray(invalidCalls) && invalidCalls.length > 0) {\n attrs['llm.invalid_tool_calls'] = JSON.stringify(invalidCalls);\n }\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n private extractToolCallIdFromOutput(attrs: Record<string, any>): void {\n const toolOutput = attrs['tool.output'] ?? attrs['output.value'];\n if (!toolOutput || typeof toolOutput !== 'string') return;\n\n try {\n const outputData = JSON.parse(toolOutput);\n if (typeof outputData === 'object' && outputData !== null && !Array.isArray(outputData)) {\n const toolCallId = outputData.tool_call_id ?? outputData.toolCallId;\n if (toolCallId) {\n attrs['tool_call_id'] = toolCallId;\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n private extractToolDefinitions(attrs: Record<string, any>): void {\n const toolDefs: Record<number, Record<string, any>> = {};\n const keysToRemove: string[] = [];\n\n for (const [k, v] of Object.entries(attrs)) {\n let m = OL_FN_RE.exec(k);\n if (m) {\n const [, idxStr, field] = m;\n const idx = parseInt(idxStr, 10);\n if (!toolDefs[idx]) toolDefs[idx] = {};\n toolDefs[idx][field] = v;\n keysToRemove.push(k);\n continue;\n }\n\n m = OI_SCHEMA_RE.exec(k);\n if (m) {\n const idx = parseInt(m[1], 10);\n let schema = v;\n if (typeof schema === 'string') {\n schema = safeParse(schema) ?? null;\n }\n if (typeof schema === 'object' && schema !== null) {\n if (!toolDefs[idx]) toolDefs[idx] = {};\n const td = toolDefs[idx];\n if (!td.name) td.name = schema.name;\n if (!td.description) td.description = schema.description;\n if (!td.input_schema) td.input_schema = schema.input_schema ?? schema.parameters;\n }\n keysToRemove.push(k);\n }\n }\n\n for (const idx of Object.keys(toolDefs).map(Number).sort((a, b) => a - b)) {\n const td = toolDefs[idx];\n if (td.name !== undefined && td.name !== null) {\n if (!('llm.tools.' + idx + '.name' in attrs)) {\n attrs[`llm.tools.${idx}.name`] = td.name;\n }\n }\n if (td.description !== undefined && td.description !== null) {\n if (!('llm.tools.' + idx + '.description' in attrs)) {\n attrs[`llm.tools.${idx}.description`] = td.description;\n }\n }\n if (td.input_schema !== undefined && td.input_schema !== null) {\n let val = td.input_schema;\n if (typeof val !== 'string') {\n val = safeStringify(val);\n }\n if (!('llm.tools.' + idx + '.input_schema' in attrs)) {\n attrs[`llm.tools.${idx}.input_schema`] = val;\n }\n }\n }\n\n for (const k of keysToRemove) {\n delete attrs[k];\n }\n }\n\n private detectVectorDbSpanKind(attrs: Record<string, any>): void {\n if ('openinference.span.kind' in attrs) return;\n\n const dbSystem = attrs['db.system'];\n if (typeof dbSystem !== 'string') return;\n\n if (!VECTOR_DB_SYSTEMS.has(dbSystem.toLowerCase())) return;\n\n const dbOperation = (attrs['db.operation'] ?? '').toLowerCase();\n const spanName = (attrs['_span_name'] ?? '').toLowerCase();\n\n let isRetrieval = false;\n if (dbOperation) {\n isRetrieval = RETRIEVAL_OPS.some((op) => dbOperation.includes(op));\n } else {\n isRetrieval = RETRIEVAL_OPS.some((op) => spanName.includes(op));\n }\n\n attrs['openinference.span.kind'] = isRetrieval ? 'RETRIEVER' : 'VECTOR_STORE';\n }\n\n private parseMcpFromTraceloop(attrs: Record<string, any>): void {\n const rawInput = attrs['traceloop.entity.input'];\n if (rawInput === undefined || rawInput === null) return;\n\n try {\n const entityInput = typeof rawInput === 'string' ? JSON.parse(rawInput) : rawInput;\n if (typeof entityInput !== 'object' || entityInput === null || Array.isArray(entityInput))\n return;\n\n if ('method' in entityInput) {\n attrs['mcp.method.name'] = entityInput.method;\n }\n if ('params' in entityInput) {\n attrs['mcp.request.argument'] = JSON.stringify(entityInput.params);\n }\n if ('tool_name' in entityInput) {\n attrs['mcp.tool.name'] = entityInput.tool_name;\n if (\n 'arguments' in entityInput &&\n typeof entityInput.arguments === 'object' &&\n entityInput.arguments !== null\n ) {\n attrs['mcp.tool.arguments'] = JSON.stringify(entityInput.arguments);\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n private processMcpSignals(attrs: Record<string, any>): void {\n const hasMcpSignal =\n (typeof attrs['mcp.method.name'] === 'string' && !!attrs['mcp.method.name']) ||\n (typeof attrs['mcp.tool.name'] === 'string' && !!attrs['mcp.tool.name']) ||\n 'mcp.request.argument' in attrs ||\n 'mcp.tool.arguments' in attrs;\n\n if (hasMcpSignal && 'traceloop.entity.output' in attrs && !('mcp.response.value' in attrs)) {\n attrs['mcp.response.value'] = attrs['traceloop.entity.output'];\n }\n\n // MCP initialize response\n if (attrs['mcp.method.name'] === 'initialize' && 'traceloop.entity.output' in attrs) {\n try {\n const output =\n typeof attrs['traceloop.entity.output'] === 'string'\n ? JSON.parse(attrs['traceloop.entity.output'])\n : attrs['traceloop.entity.output'];\n\n if (output && typeof output === 'object') {\n if ('protocolVersion' in output) {\n attrs['mcp.protocol_version'] = output.protocolVersion;\n }\n if ('serverInfo' in output && typeof output.serverInfo === 'object') {\n const info = output.serverInfo;\n attrs['mcp.server.name'] = info.name ?? '';\n attrs['mcp.server.version'] = info.version ?? '';\n }\n if ('capabilities' in output) {\n attrs['mcp.server.capabilities'] = JSON.stringify(output.capabilities).slice(0, 2000);\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n // MCP tools/list response\n if (attrs['mcp.method.name'] === 'tools/list' && 'traceloop.entity.output' in attrs) {\n try {\n const output =\n typeof attrs['traceloop.entity.output'] === 'string'\n ? JSON.parse(attrs['traceloop.entity.output'])\n : attrs['traceloop.entity.output'];\n\n if (output && typeof output === 'object' && Array.isArray(output.tools)) {\n const tools: any[] = output.tools;\n attrs['mcp.tools.count'] = tools.length;\n const toolNames = tools.filter((t) => 'name' in t).map((t) => t.name);\n attrs['mcp.tools.names'] = JSON.stringify(toolNames);\n }\n } catch {\n // ignore parse errors\n }\n }\n }\n\n private handleEmbeddingSpans(attrs: Record<string, any>): void {\n const spanKind = (attrs['openinference.span.kind'] ?? '').toUpperCase();\n if (spanKind !== 'EMBEDDING') return;\n\n const embeddings: Array<{ index: number; text: any }> = [];\n for (const [key, value] of Object.entries(attrs)) {\n if (key.startsWith('embedding.embeddings.') && key.endsWith('.embedding.text')) {\n const parts = key.split('.');\n if (parts.length >= 3) {\n const index = parseInt(parts[2], 10);\n if (!isNaN(index)) {\n embeddings.push({ index, text: value });\n }\n }\n }\n }\n\n if (embeddings.length > 0) {\n embeddings.sort((a, b) => a.index - b.index);\n attrs['embeddings_data'] = JSON.stringify(embeddings);\n }\n\n // Only skip output if it's a REAL embedding operation from OpenLLMetry\n const hasEmbeddingAttrs = Object.keys(attrs).some(\n (k) => k.startsWith('embedding.') || k.startsWith('gen_ai.embedding'),\n );\n if (hasEmbeddingAttrs) {\n attrs['neatlogs._skip_output_value'] = true;\n }\n }\n\n /**\n * Extract vendor-specific keys from attrs into a plain object,\n * mapping each source key to a short target name.\n */\n private _extractKeys(\n attrs: Record<string, any>,\n keyMap: Record<string, string>,\n ): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [srcKey, tgtName] of Object.entries(keyMap)) {\n if (srcKey in attrs) {\n result[tgtName] = attrs[srcKey];\n }\n }\n return result;\n }\n\n private handleVectorDbDocAttributes(attrs: Record<string, any>): void {\n const dbSystem = (attrs['db.system'] ?? '').toLowerCase();\n\n if (dbSystem === 'chroma') {\n const docKeyMap: Record<string, string> = {\n 'db.chroma.add.ids_count': 'ids_count',\n 'db.chroma.add.embeddings_count': 'embeddings_count',\n 'db.chroma.add.metadatas_count': 'metadatas_count',\n 'db.chroma.add.documents_count': 'documents_count',\n 'db.chroma.upsert.ids_count': 'ids_count',\n 'db.chroma.upsert.embeddings_count': 'embeddings_count',\n 'db.chroma.upsert.metadatas_count': 'metadatas_count',\n 'db.chroma.upsert.documents_count': 'documents_count',\n 'db.chroma.query.n_results': 'requested_top_k',\n 'db.chroma.query.include': 'include',\n };\n const docAttrs = this._extractKeys(attrs, docKeyMap);\n if (Object.keys(docAttrs).length > 0) {\n attrs['document_attributes'] = JSON.stringify(docAttrs);\n }\n } else if (dbSystem === 'marqo') {\n const inputKeyMap: Record<string, string> = {\n 'marqo.limit': 'limit',\n 'marqo.hits_count': 'hits_count',\n 'marqo.filter': 'filter',\n };\n const inputParams = this._extractKeys(attrs, inputKeyMap);\n if (Object.keys(inputParams).length > 0) {\n attrs['retrieval_input_params'] = JSON.stringify(inputParams);\n }\n const docKeyMap: Record<string, string> = {\n 'marqo.document_count': 'document_count',\n 'marqo.items_processed': 'items_processed',\n };\n const docAttrs = this._extractKeys(attrs, docKeyMap);\n if (Object.keys(docAttrs).length > 0) {\n attrs['document_attributes'] = JSON.stringify(docAttrs);\n }\n } else if (dbSystem === 'qdrant') {\n const docKeyMap: Record<string, string> = {\n 'qdrant.upsert.points_count': 'points_count',\n };\n const docAttrs = this._extractKeys(attrs, docKeyMap);\n if (Object.keys(docAttrs).length > 0) {\n attrs['document_attributes'] = JSON.stringify(docAttrs);\n }\n } else if (dbSystem === 'milvus') {\n const docKeyMap: Record<string, string> = {\n 'db.milvus.insert.data_count': 'insert.data_count',\n 'db.milvus.search.data_count': 'search.data_count',\n 'db.milvus.search.limit': 'search.limit',\n 'db.milvus.search.output_fields_count': 'search.output_fields_count',\n 'db.milvus.search.result_count': 'search.result_count',\n 'db.milvus.search.filter': 'search.filter',\n };\n const docAttrs = this._extractKeys(attrs, docKeyMap);\n if (Object.keys(docAttrs).length > 0) {\n attrs['document_attributes'] = JSON.stringify(docAttrs);\n }\n }\n }\n\n // ── LangChain metadata extraction ───────────────────\n\n /**\n * LangChain instrumentation puts model info in `metadata` as a JSON string\n * with `ls_provider`, `ls_model_name`, `ls_temperature`, `ls_max_tokens`.\n * Extract these into standard positions when the standard attributes are missing.\n */\n private extractLangchainMetadata(attrs: Record<string, any>): void {\n const raw = attrs['metadata'];\n if (!raw || typeof raw !== 'string') return;\n\n let meta: Record<string, any>;\n try {\n meta = JSON.parse(raw);\n } catch {\n return;\n }\n if (typeof meta !== 'object' || meta === null) return;\n\n // ls_model_name → llm.model_name\n if (meta.ls_model_name && !attrs['llm.model_name']) {\n attrs['llm.model_name'] = meta.ls_model_name;\n }\n\n // ls_provider → llm.system (used by defaults enricher and provider detection)\n if (meta.ls_provider && !attrs['llm.system']) {\n const providerMap: Record<string, string> = {\n google_genai: 'google',\n openai: 'openai',\n anthropic: 'anthropic',\n };\n attrs['llm.system'] = providerMap[meta.ls_provider] ?? meta.ls_provider;\n }\n\n // ls_temperature / ls_max_tokens → merge into invocation_parameters\n const hasTemp = meta.ls_temperature !== undefined;\n const hasMaxTokens = meta.ls_max_tokens !== undefined;\n if (hasTemp || hasMaxTokens) {\n let existing: Record<string, any> = {};\n try {\n existing = JSON.parse(attrs['llm.invocation_parameters'] ?? '{}');\n } catch {\n existing = {};\n }\n if (hasTemp && !('temperature' in existing)) {\n existing['temperature'] = meta.ls_temperature;\n }\n if (hasMaxTokens && !('max_tokens' in existing)) {\n existing['max_tokens'] = meta.ls_max_tokens;\n }\n // Also inject model if missing\n if (meta.ls_model_name && !('model' in existing)) {\n existing['model'] = meta.ls_model_name;\n }\n attrs['llm.invocation_parameters'] = JSON.stringify(existing);\n }\n }\n\n // ── Vercel AI SDK extraction ───────────────────────\n\n /**\n * The Vercel AI SDK emits its own `ai.*` namespace alongside `gen_ai.*`. Map\n * the AI-SDK-specific keys onto the canonical `llm.*` / `gen_ai.*` / `tool.*`\n * keys that the existing pipeline already understands. Span-kind inference\n * runs first so downstream `applyNamespaceMapping` resolves it correctly.\n */\n private extractVercelAiSdkAttrs(attrs: Record<string, any>): void {\n const spanName: string = attrs['_span_name'] ?? '';\n const isAiSdkSpan =\n spanName.startsWith('ai.') ||\n 'ai.model.id' in attrs ||\n 'ai.toolCall.name' in attrs;\n\n if (!isAiSdkSpan) return;\n\n // Span-kind inference (only when not already set)\n if (!('openinference.span.kind' in attrs)) {\n if (spanName === 'ai.toolCall') {\n attrs['openinference.span.kind'] = 'TOOL';\n } else if (spanName.startsWith('ai.embed')) {\n attrs['openinference.span.kind'] = 'EMBEDDING';\n } else if (spanName.startsWith('ai.rerank')) {\n attrs['openinference.span.kind'] = 'RERANKER';\n } else if (spanName.endsWith('.doStream') || spanName.endsWith('.doGenerate') || spanName.endsWith('.doRerank') || spanName.endsWith('.doEmbed')) {\n // Actual provider API calls (ai.streamText.doStream, ai.generateText.doGenerate, etc.)\n if (spanName.includes('embed')) {\n attrs['openinference.span.kind'] = 'EMBEDDING';\n } else if (spanName.includes('rerank')) {\n attrs['openinference.span.kind'] = 'RERANKER';\n } else {\n attrs['openinference.span.kind'] = 'LLM';\n }\n } else if (spanName === 'ai.generateText' || spanName === 'ai.streamText' || spanName === 'ai.generateObject' || spanName === 'ai.streamObject') {\n // Top-level AI SDK orchestration spans (multi-step loops)\n attrs['openinference.span.kind'] = 'CHAIN';\n }\n }\n\n // Model id / provider\n if ('ai.model.id' in attrs && !('llm.model_name' in attrs)) {\n attrs['llm.model_name'] = attrs['ai.model.id'];\n }\n if ('ai.model.provider' in attrs && !('llm.provider' in attrs)) {\n // ai.model.provider is e.g. \"openai.chat\" — take the leading segment\n const raw = String(attrs['ai.model.provider']);\n attrs['llm.provider'] = raw.split('.')[0];\n }\n\n // Token usage\n if ('ai.usage.promptTokens' in attrs && !('llm.token_count.prompt' in attrs)) {\n attrs['llm.token_count.prompt'] = attrs['ai.usage.promptTokens'];\n }\n if ('ai.usage.completionTokens' in attrs && !('llm.token_count.completion' in attrs)) {\n attrs['llm.token_count.completion'] = attrs['ai.usage.completionTokens'];\n }\n if ('ai.usage.totalTokens' in attrs && !('llm.token_count.total' in attrs)) {\n attrs['llm.token_count.total'] = attrs['ai.usage.totalTokens'];\n }\n\n // Settings → gen_ai.request.*\n const settingMap: Record<string, string> = {\n 'ai.settings.temperature': 'gen_ai.request.temperature',\n 'ai.settings.maxTokens': 'gen_ai.request.max_tokens',\n 'ai.settings.topP': 'gen_ai.request.top_p',\n 'ai.settings.topK': 'gen_ai.request.top_k',\n 'ai.settings.frequencyPenalty': 'gen_ai.request.frequency_penalty',\n 'ai.settings.presencePenalty': 'gen_ai.request.presence_penalty',\n 'ai.settings.stopSequences': 'gen_ai.request.stop_sequences',\n };\n for (const [src, tgt] of Object.entries(settingMap)) {\n if (src in attrs && !(tgt in attrs)) {\n attrs[tgt] = attrs[src];\n }\n }\n\n // Build llm.invocation_parameters from gen_ai.request.* if not already set\n if (!('llm.invocation_parameters' in attrs)) {\n const params: Record<string, any> = {};\n if ('gen_ai.request.temperature' in attrs) params.temperature = attrs['gen_ai.request.temperature'];\n if ('gen_ai.request.max_tokens' in attrs) params.max_tokens = attrs['gen_ai.request.max_tokens'];\n if ('gen_ai.request.top_p' in attrs) params.top_p = attrs['gen_ai.request.top_p'];\n if ('gen_ai.request.top_k' in attrs) params.top_k = attrs['gen_ai.request.top_k'];\n if ('gen_ai.request.frequency_penalty' in attrs) params.frequency_penalty = attrs['gen_ai.request.frequency_penalty'];\n if ('gen_ai.request.presence_penalty' in attrs) params.presence_penalty = attrs['gen_ai.request.presence_penalty'];\n if ('gen_ai.request.stop_sequences' in attrs) params.stop_sequences = attrs['gen_ai.request.stop_sequences'];\n if (Object.keys(params).length > 0) {\n attrs['llm.invocation_parameters'] = JSON.stringify(params);\n }\n }\n\n // Operation id → gen_ai.operation.name (helps RERANKER detection)\n if ('ai.operationId' in attrs && !('gen_ai.operation.name' in attrs)) {\n attrs['gen_ai.operation.name'] = attrs['ai.operationId'];\n }\n\n // Response text → output message 0\n if (\n 'ai.response.text' in attrs &&\n !('llm.output_messages.0.message.content' in attrs)\n ) {\n attrs['llm.output_messages.0.message.role'] = 'assistant';\n attrs['llm.output_messages.0.message.content'] = attrs['ai.response.text'];\n }\n\n // Response finish reason / id\n if ('ai.response.finishReason' in attrs && !('llm.response.finish_reason' in attrs)) {\n attrs['llm.response.finish_reason'] = attrs['ai.response.finishReason'];\n }\n if ('ai.response.id' in attrs && !('gen_ai.response.id' in attrs)) {\n attrs['gen_ai.response.id'] = attrs['ai.response.id'];\n }\n\n // Prompt messages → exploded indexed keys\n const rawMessages = attrs['ai.prompt.messages'];\n if (typeof rawMessages === 'string') {\n try {\n const parsed = JSON.parse(rawMessages);\n if (Array.isArray(parsed)) {\n parsed.forEach((msg, i) => {\n if (msg && typeof msg === 'object') {\n if (typeof msg.role === 'string') {\n attrs[`llm.input_messages.${i}.message.role`] = msg.role;\n }\n if (typeof msg.content === 'string') {\n attrs[`llm.input_messages.${i}.message.content`] = msg.content;\n } else if (msg.content !== undefined) {\n attrs[`llm.input_messages.${i}.message.content`] = JSON.stringify(msg.content);\n }\n }\n });\n }\n } catch {\n // Leave the raw string in place if parse fails\n }\n }\n\n // Response toolCalls → exploded under output message 0\n const rawToolCalls = attrs['ai.response.toolCalls'];\n if (typeof rawToolCalls === 'string') {\n try {\n const parsed = JSON.parse(rawToolCalls);\n if (Array.isArray(parsed)) {\n parsed.forEach((tc, i) => {\n if (tc && typeof tc === 'object') {\n if (tc.toolName !== undefined) {\n attrs[`llm.output_messages.0.message.tool_calls.${i}.tool_call.function.name`] = tc.toolName;\n }\n if (tc.args !== undefined) {\n const argStr =\n typeof tc.args === 'string' ? tc.args : JSON.stringify(tc.args);\n attrs[`llm.output_messages.0.message.tool_calls.${i}.tool_call.function.arguments`] = argStr;\n }\n if (tc.toolCallId !== undefined) {\n attrs[`llm.output_messages.0.message.tool_calls.${i}.tool_call.id`] = tc.toolCallId;\n }\n }\n });\n }\n } catch {\n // Ignore parse failure\n }\n }\n\n // Embedding input: Vercel AI SDK JSON.stringify()s each value for OTel transport — unwrap\n if ('ai.value' in attrs && typeof attrs['ai.value'] === 'string') {\n try { attrs['ai.value'] = JSON.parse(attrs['ai.value']); } catch {}\n }\n if ('ai.values' in attrs && Array.isArray(attrs['ai.values'])) {\n attrs['ai.values'] = JSON.stringify(attrs['ai.values'].map((v: unknown) => {\n if (typeof v === 'string') { try { return JSON.parse(v); } catch {} }\n return v;\n }));\n }\n\n // Tool span attributes\n if (spanName === 'ai.toolCall') {\n if ('ai.toolCall.name' in attrs && !('tool.name' in attrs)) {\n attrs['tool.name'] = attrs['ai.toolCall.name'];\n }\n // Normalize args/result to JSON strings so downstream parsers\n // (e.g. extractToolCallIdFromOutput) can JSON.parse them safely.\n if ('ai.toolCall.args' in attrs && !('input.value' in attrs)) {\n const raw = attrs['ai.toolCall.args'];\n attrs['input.value'] = typeof raw === 'string' ? raw : JSON.stringify(raw);\n }\n if ('ai.toolCall.result' in attrs && !('output.value' in attrs)) {\n const raw = attrs['ai.toolCall.result'];\n attrs['output.value'] = typeof raw === 'string' ? raw : JSON.stringify(raw);\n }\n }\n }\n\n // ── CrewAI-specific ─────────────────────────────────\n\n private addCrewaiTokenUsageFallback(attrs: Record<string, any>): void {\n const usage = attrs['neatlogs.crew.token_usage'];\n if (typeof usage !== 'string' || !usage) return;\n\n if (\n 'llm.token_count.prompt' in attrs ||\n 'llm.token_count.completion' in attrs ||\n 'llm.token_count.total' in attrs\n ) {\n return;\n }\n\n const parsed: Record<string, number> = {};\n const re = /([a-zA-Z_]+)=(\\d+)/g;\n let match: RegExpExecArray | null;\n while ((match = re.exec(usage)) !== null) {\n parsed[match[1]] = parseInt(match[2], 10);\n }\n\n if ('prompt_tokens' in parsed) {\n attrs['llm.token_count.prompt'] = parsed['prompt_tokens'];\n }\n if ('completion_tokens' in parsed) {\n attrs['llm.token_count.completion'] = parsed['completion_tokens'];\n }\n if ('total_tokens' in parsed) {\n attrs['llm.token_count.total'] = parsed['total_tokens'];\n }\n if ('cached_prompt_tokens' in parsed) {\n attrs['llm.token_count.prompt_details.cache_read'] = parsed['cached_prompt_tokens'];\n }\n }\n\n private addReasoningTokensFromOutputValue(attrs: Record<string, any>): void {\n if ('llm.token_count.completion_details.reasoning' in attrs) return;\n if ('llm.usage.reasoning_tokens' in attrs) return;\n\n const outputValue = attrs['output.value'];\n if (typeof outputValue !== 'string') return;\n\n try {\n const parsed = JSON.parse(outputValue);\n const usage = parsed?.usage ?? {};\n const details = usage.completion_tokens_details ?? {};\n const reasoning = details.reasoning_tokens;\n if (reasoning && reasoning > 0) {\n attrs['llm.token_count.completion_details.reasoning'] = reasoning;\n }\n } catch {\n // ignore\n }\n }\n\n private addCrewaiKickoffTelemetry(attrs: Record<string, any>): void {\n const spanName = String(attrs['_span_name'] ?? '');\n if (!(spanName.startsWith('Crew_') && spanName.endsWith('.kickoff'))) return;\n\n if (!('crew_number_of_tasks' in attrs)) {\n const count = this.coerceCollectionCount(attrs['crew_tasks']);\n if (count !== null) {\n attrs['crew_number_of_tasks'] = count;\n }\n }\n\n if (!('crew_number_of_agents' in attrs)) {\n const count = this.coerceCollectionCount(attrs['crew_agents']);\n if (count !== null) {\n attrs['crew_number_of_agents'] = count;\n }\n }\n }\n\n private coerceCollectionCount(value: any): number | null {\n if (value === null || value === undefined) return null;\n\n if (typeof value === 'boolean') return value ? 1 : 0;\n if (typeof value === 'number') {\n return Number.isFinite(value) ? Math.floor(value) : null;\n }\n if (Array.isArray(value)) return value.length;\n if (typeof value === 'object' && value !== null) return Object.keys(value).length;\n\n if (typeof value === 'string') {\n const s = value.trim();\n if (!s) return null;\n\n // Direct integer string\n if (/^\\d+$/.test(s)) {\n return parseInt(s, 10);\n }\n\n // Try JSON parse\n try {\n const parsed = JSON.parse(s);\n if (Array.isArray(parsed)) return parsed.length;\n if (typeof parsed === 'object' && parsed !== null) return Object.keys(parsed).length;\n } catch {\n // ignore\n }\n }\n\n return null;\n }\n\n // ── Operational metrics ─────────────────────────────\n\n private extractOperationalMetrics(\n spanDict: SpanDict,\n attrs: Record<string, any>,\n ): Record<string, any> {\n const computed: Record<string, any> = {};\n\n const startTime =\n typeof spanDict.start_time === 'number' ? spanDict.start_time : Number(spanDict.start_time);\n const endTime =\n typeof spanDict.end_time === 'number' ? spanDict.end_time : Number(spanDict.end_time);\n\n const durationNs = endTime - startTime;\n computed['neatlogs.metrics.duration_ms'] = durationNs / 1_000_000;\n\n // Skip event-based TTFT computation if already set live by streaming patch\n if (attrs['neatlogs.llm.metrics.ttft_ms'] !== undefined) {\n return computed;\n }\n\n // Google GenAI emits \"gen_ai.content.chunk\" on every text chunk — use for TTFT\n const chunkTimestamps: number[] = [];\n if (spanDict.events) {\n for (const event of spanDict.events) {\n if (event.name === 'gen_ai.content.chunk') {\n const ts =\n typeof event.timestamp === 'number' ? event.timestamp : Number(event.timestamp);\n chunkTimestamps.push(ts);\n }\n }\n }\n\n if (chunkTimestamps.length > 0) {\n const firstNs = chunkTimestamps[0];\n const ttftMs = Math.round(((firstNs - startTime) / 1_000_000) * 1000) / 1000;\n computed['neatlogs.llm.metrics.ttft_ms'] = ttftMs;\n\n if (chunkTimestamps.length >= 2) {\n const lastNs = chunkTimestamps[chunkTimestamps.length - 1];\n const stgMs = Math.round(((lastNs - firstNs) / 1_000_000) * 1000) / 1000;\n computed['neatlogs.llm.metrics.streaming_time_to_generate_ms'] = stgMs;\n }\n }\n\n return computed;\n }\n\n // ── Event upcycling ─────────────────────────────────\n\n private upcycleEvents(spanDict: SpanDict): Record<string, any> {\n const upcycled: Record<string, any> = {};\n const retrieverDocs: Array<Record<string, any>> = [];\n\n if (!spanDict.events) return upcycled;\n\n for (const event of spanDict.events) {\n const eAttrs = event.attributes ?? {};\n\n if (event.name === 'db.query.result') {\n const doc: Record<string, any> = {\n timestamp: String(event.timestamp),\n };\n if ('db.query.result.id' in eAttrs) doc['id'] = eAttrs['db.query.result.id'];\n if ('db.query.result.distance' in eAttrs)\n doc['distance'] = eAttrs['db.query.result.distance'];\n if ('db.query.result.document' in eAttrs)\n doc['document'] = eAttrs['db.query.result.document'];\n if ('db.query.result.metadata' in eAttrs) {\n const metadata = eAttrs['db.query.result.metadata'];\n if (typeof metadata === 'string') {\n doc['metadata'] = safeParse(metadata) ?? String(metadata);\n } else {\n doc['metadata'] = metadata;\n }\n }\n for (const field of ['_id', 'title', 'text', 'category', '_score']) {\n if (field in eAttrs) doc[field] = eAttrs[field];\n }\n retrieverDocs.push(doc);\n } else if (event.name === 'db.search.result') {\n const doc: Record<string, any> = {\n timestamp: String(event.timestamp),\n };\n if ('db.search.query.id' in eAttrs) doc['query_id'] = eAttrs['db.search.query.id'];\n if ('db.search.result.id' in eAttrs) doc['result_id'] = eAttrs['db.search.result.id'];\n if ('db.search.result.distance' in eAttrs)\n doc['distance'] = eAttrs['db.search.result.distance'];\n if ('db.search.result.entity' in eAttrs)\n doc['entity'] = eAttrs['db.search.result.entity'];\n retrieverDocs.push(doc);\n } else if (event.name === 'db.query.embeddings') {\n const vector =\n eAttrs['db.query.embeddings.vector'] ?? eAttrs['vector'];\n if (vector && (Array.isArray(vector) || ArrayBuffer.isView(vector))) {\n upcycled['neatlogs.db.query.embeddings.dimension'] = (vector as any).length;\n if (this.debug) {\n logger.debug(`Calculated embedding dimension: ${(vector as any).length}`);\n }\n }\n }\n }\n\n if (retrieverDocs.length > 0) {\n upcycled['retrieval_documents'] = JSON.stringify(retrieverDocs);\n }\n\n return upcycled;\n }\n\n // ── Namespace mapping ───────────────────────────────\n\n private applyNamespaceMapping(attrs: Record<string, any>): Record<string, any> {\n // Use the AttributeMapper for the heavy lifting\n const unified = this.mapper.mapAttributes(attrs);\n\n // Ensure neatlogs.span.kind is meaningful (not 'unknown')\n const currentKind = unified['neatlogs.span.kind'];\n if (!currentKind || currentKind === 'unknown') {\n const oiKind = attrs['openinference.span.kind'];\n if (oiKind) {\n unified['neatlogs.span.kind'] = String(oiKind).toLowerCase();\n } else {\n // Fallback: infer from span name — skip for framework-internal spans (e.g. next.js routes)\n const scopeName = attrs['neatlogs.instrumentation.name'] ?? '';\n const spanName = attrs['_span_name'] ?? '';\n if (spanName && scopeName !== 'next.js') {\n const inferred = inferSpanKindFromName(spanName).toLowerCase();\n unified['neatlogs.span.kind'] = inferred;\n }\n }\n }\n\n // Detect RERANKER operations (only infer if kind wasn't explicitly set)\n const llmRequestType = (attrs['llm.request.type'] ?? '').toLowerCase();\n const genAiOperation = (attrs['gen_ai.operation.name'] ?? '').toLowerCase();\n const spanNameLower = (attrs['_span_name'] ?? '').toLowerCase();\n const hasExplicitKind = 'openinference.span.kind' in attrs || 'traceloop.span.kind' in attrs;\n\n if (\n !hasExplicitKind && (\n llmRequestType === 'rerank' ||\n genAiOperation === 'rerank' ||\n spanNameLower.includes('rerank')\n )\n ) {\n unified['neatlogs.span.kind'] = 'reranker';\n }\n\n // Remove vectordb.embedding_model for non-vector span kinds\n const spanKind = (\n attrs['neatlogs.span.kind'] ?? attrs['openinference.span.kind'] ?? ''\n ).toLowerCase();\n if (!['embedding', 'retriever', 'vector_store'].includes(spanKind)) {\n delete unified['neatlogs.vectordb.embedding_model'];\n }\n\n if (this.debug) {\n logger.debug(\n `[ScopeDetectionFinal] span_name=${attrs['_span_name']} ` +\n `scope=${attrs['neatlogs.instrumentation.name']} ` +\n `framework=${unified['neatlogs.framework']}`,\n );\n }\n\n // Fill provider/system gaps\n this.fillProviderGaps(attrs, unified);\n\n return unified;\n }\n\n // ── Provider/system gap filling ─────────────────────\n\n private fillProviderGaps(attrs: Record<string, any>, unified: Record<string, any>): void {\n // --- neatlogs.llm.provider ---\n if (!unified['neatlogs.llm.provider']) {\n const scopeProvider = unified['neatlogs.provider'] ?? attrs['neatlogs.provider'] ?? '';\n if (scopeProvider) {\n unified['neatlogs.llm.provider'] = scopeProvider;\n } else {\n const model = String(\n attrs['llm.model_name'] ??\n attrs['gen_ai.request.model'] ??\n attrs['llm.model'] ??\n '',\n );\n const inferred = this.inferProviderFromModel(model);\n if (inferred) {\n unified['neatlogs.llm.provider'] = inferred;\n }\n }\n }\n\n // --- neatlogs.llm.system ---\n if (!unified['neatlogs.llm.system']) {\n const provider = (\n unified['neatlogs.llm.provider'] ??\n unified['neatlogs.provider'] ??\n ''\n ).toLowerCase();\n const system = PROVIDER_TO_SYSTEM[provider] ?? '';\n if (system) {\n unified['neatlogs.llm.system'] = system;\n }\n }\n }\n\n private inferProviderFromModel(model: string): string {\n if (!model) return '';\n const m = model.toLowerCase();\n\n // OpenAI model families\n if (/^(gpt-|o1-|o3-|o4-|text-embedding-|text-davinci-)/.test(m)) return 'openai';\n // Anthropic\n if (m.startsWith('claude-')) return 'anthropic';\n // Google\n if (m.startsWith('gemini-') || m.startsWith('gemma-')) return 'google';\n // Mistral\n if (m.startsWith('mistral-') || m.startsWith('mixtral-')) return 'mistralai';\n // Cohere\n if (m.startsWith('command-') || m.startsWith('embed-english') || m.startsWith('embed-multilingual'))\n return 'cohere';\n // Bedrock model IDs\n if (\n m.startsWith('anthropic.') ||\n m.startsWith('meta.') ||\n m.startsWith('amazon.') ||\n m.startsWith('nova-') ||\n m.startsWith('titan-')\n )\n return 'aws';\n // xAI\n if (m.startsWith('grok-')) return 'xai';\n // DeepSeek\n if (m.startsWith('deepseek-')) return 'deepseek';\n\n return '';\n }\n\n // ── Intermediate ReAct steps ────────────────────────\n\n private addIntermediateSteps(unified: Record<string, any>): void {\n if ('neatlogs.llm.intermediate_steps' in unified) return;\n if (String(unified['neatlogs.span.kind'] ?? '').toLowerCase() !== 'llm') return;\n\n const steps = this.extractReactStepsFromMessages(unified);\n if (steps.length === 0) return;\n\n unified['neatlogs.llm.intermediate_steps'] = JSON.stringify(steps);\n }\n\n private extractReactStepsFromMessages(unified: Record<string, any>): Array<Record<string, string>> {\n // Try output messages first\n const outputTexts = this.collectRoleTexts(\n unified,\n 'neatlogs.llm.output_messages',\n 'assistant',\n );\n const steps = this.parseReactSteps(outputTexts);\n if (steps.length > 0) return steps;\n\n // Fallback to input messages\n const inputTexts = this.collectRoleTexts(\n unified,\n 'neatlogs.llm.input_messages',\n 'assistant',\n );\n return this.parseReactSteps(inputTexts);\n }\n\n private collectRoleTexts(\n unified: Record<string, any>,\n prefix: string,\n role: string,\n ): string[] {\n const idxRe = new RegExp(`^${escapeRegExp(prefix)}\\\\.(\\\\d+)\\\\.content$`);\n const idxs = new Set<number>();\n for (const k of Object.keys(unified)) {\n const m = idxRe.exec(k);\n if (m) {\n idxs.add(parseInt(m[1], 10));\n }\n }\n\n const texts: string[] = [];\n for (const i of [...idxs].sort((a, b) => a - b)) {\n const r = unified[`${prefix}.${i}.role`];\n if (typeof r !== 'string' || r.toLowerCase() !== role) continue;\n const c = unified[`${prefix}.${i}.content`];\n if (typeof c === 'string' && c.toLowerCase().includes('thought:')) {\n texts.push(c.slice(0, 20000));\n }\n }\n return texts;\n }\n\n private parseReactSteps(texts: string[]): Array<Record<string, string>> {\n if (texts.length === 0) return [];\n\n const markerRe = /(?:^|\\n)\\s*(Thought|Context|Action|Action Input|Observation|Final Answer)\\s*:\\s*/gim;\n\n const allSteps: Array<Record<string, string>> = [];\n\n for (const text of texts) {\n const matches: Array<{ label: string; start: number; matchStart: number }> = [];\n let m: RegExpExecArray | null;\n // Reset lastIndex for global regex\n markerRe.lastIndex = 0;\n while ((m = markerRe.exec(text)) !== null) {\n matches.push({\n label: m[1].trim().toLowerCase(),\n start: m.index + m[0].length,\n matchStart: m.index,\n });\n }\n\n if (matches.length === 0) continue;\n\n let cur: Record<string, string> = {};\n\n const commit = () => {\n if (Object.keys(cur).length === 0) return;\n if (!Object.values(cur).some((v) => v)) {\n cur = {};\n return;\n }\n if (allSteps.length > 0) {\n const last = allSteps[allSteps.length - 1];\n if (JSON.stringify(last) === JSON.stringify(cur)) {\n cur = {};\n return;\n }\n }\n allSteps.push(cur);\n cur = {};\n };\n\n for (let idx = 0; idx < matches.length; idx++) {\n const { label, start: contentStart } = matches[idx];\n const contentEnd = idx + 1 < matches.length ? matches[idx + 1].matchStart : text.length;\n const value = text.slice(contentStart, contentEnd).trim();\n\n if (label === 'thought' && Object.keys(cur).length > 0) {\n commit();\n }\n\n if (label === 'thought') {\n cur['thought'] = truncate(value, 600);\n } else if (label === 'context') {\n cur['context'] = truncate(value, 500);\n } else if (label === 'action') {\n cur['action'] = truncate(value, 200);\n } else if (label === 'action input') {\n cur['action_input'] = truncate(value, 1000);\n } else if (label === 'observation') {\n cur['observation'] = truncate(value, 500);\n } else if (label === 'final answer') {\n cur['final_answer'] = truncate(value, 1200);\n }\n }\n\n commit();\n }\n\n return allSteps;\n }\n\n // ── I/O sanitization ────────────────────────────────\n\n /**\n * Remove Python object reprs from input.value / output.value JSON strings.\n * Also drops the top-level \"self\" key that CrewAI injects.\n */\n sanitizeIoValue(val: any): any {\n if (typeof val !== 'string') return val;\n\n try {\n const parsed = JSON.parse(val);\n const cleaned = cleanPythonReprs(parsed);\n if (typeof cleaned === 'object' && cleaned !== null && !Array.isArray(cleaned)) {\n delete cleaned['self'];\n }\n if (JSON.stringify(cleaned) !== JSON.stringify(parsed)) {\n return JSON.stringify(cleaned);\n }\n } catch {\n // not JSON, return as-is\n }\n return val;\n }\n\n // ── Embedding vector filter ─────────────────────────\n\n private filterEmbeddingVectors(attrs: Record<string, any>): Record<string, any> {\n const filtered: Record<string, any> = {};\n for (const [key, value] of Object.entries(attrs)) {\n // Skip embedding vector keys\n if (key.includes('.embedding.vector') || key.includes('.embeddings.') || key === 'ai.embeddings' || key === 'ai.embedding') {\n if (this.debug) {\n logger.debug(`[FILTER] Dropped embedding vector key: ${key}`);\n }\n continue;\n }\n\n // Skip large arrays (likely embedding vectors)\n if ((Array.isArray(value) || ArrayBuffer.isView(value)) && (value as any).length > 1000) {\n if (this.debug) {\n logger.debug(`[FILTER] Dropped large array (${(value as any).length} elements): ${key}`);\n }\n continue;\n }\n\n filtered[key] = value;\n }\n return filtered;\n }\n\n // ── Helpers ─────────────────────────────────────────\n\n private looksLikeHttp(attrs: Record<string, any>): boolean {\n for (const k of ['http.method', 'http.url', 'http.status_code', 'http.route']) {\n if (k in attrs) return true;\n }\n return Object.keys(attrs).some((key) => key.startsWith('http.'));\n }\n\n /**\n * Check if the raw span kind indicates CLIENT (OTel SpanKind.CLIENT = 3).\n */\n private isHttpLikeSpanKind(kind: number | string): boolean {\n if (typeof kind === 'number') return kind === 3; // SpanKind.CLIENT = 3\n return String(kind).toUpperCase() === 'CLIENT';\n }\n}\n\n// ────────────────────────────────────────────────────────\n// Utility functions\n// ────────────────────────────────────────────────────────\n\nfunction truncate(val: string, maxLen: number): string {\n val = (val ?? '').trim();\n if (val.length <= maxLen) return val;\n return val.slice(0, maxLen) + `...(truncated,len=${val.length})`;\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","/**\n * PII masking support for Neatlogs spans.\n *\n * Users supply a callable that receives the full span dict and returns\n * the (possibly modified) span dict. Return null to drop the span entirely.\n */\n\nimport type { MaskFunction } from '../types.js';\nimport { getLogger } from './logger.js';\n\nconst logger = getLogger();\n\n/** Module-level registry: key -> mask function */\nconst _MASK_REGISTRY = new Map<string, MaskFunction>();\n\nlet _nextId = 0;\n\n/**\n * Register a mask function and return its lookup key.\n */\nexport function registerMask(fn: MaskFunction): string {\n const key = String(++_nextId);\n _MASK_REGISTRY.set(key, fn);\n return key;\n}\n\n/**\n * Apply the effective mask function to span data.\n *\n * Per-span mask (stored in attributes[\"neatlogs.mask_id\"]) takes\n * precedence over the global mask. Returns the (possibly modified) dict.\n */\nexport function applyMask(\n spanData: Record<string, any>,\n globalMask: MaskFunction | null | undefined,\n): Record<string, any> | null {\n const maskId = spanData?.attributes?.['neatlogs.mask_id'];\n let maskFn: MaskFunction | undefined | null = null;\n\n if (maskId) {\n maskFn = _MASK_REGISTRY.get(String(maskId)) ?? null;\n }\n\n if (!maskFn) {\n maskFn = globalMask ?? null;\n }\n\n if (!maskFn) {\n return spanData;\n }\n\n try {\n const result = maskFn(spanData);\n // null means \"drop this span entirely\"; undefined means \"keep original\"\n if (result === null) return null;\n return result !== undefined ? result : spanData;\n } catch (exc) {\n logger.warn(\n `mask callable raised an exception for span '${spanData?.name}': ${exc} — original span data will be exported unchanged.`,\n );\n return spanData;\n }\n}\n\n/**\n * Clear all registered masks. Used for testing.\n * @internal\n */\nexport function _clearMaskRegistry(): void {\n _MASK_REGISTRY.clear();\n _nextId = 0;\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport type { PromptMessage } from '../types.js';\n\n// ---------------------------------------------------------------------------\n// Async-local context for system prompts\n// ---------------------------------------------------------------------------\n\ninterface PromptContextData {\n template: string;\n variables: Record<string, any>;\n}\n\nconst _promptStorage = new AsyncLocalStorage<PromptContextData>();\n\n/**\n * Manages system prompt metadata in async-local context for automatic tracing.\n */\nexport class PromptContext {\n /**\n * Store system prompt template and variables in context.\n */\n static set(template: string, variables: Record<string, any>): void {\n // enterWith mutates the current async context in-place\n _promptStorage.enterWith({ template, variables });\n }\n\n /**\n * Retrieve system prompt template from context.\n */\n static getTemplate(): string | undefined {\n return _promptStorage.getStore()?.template;\n }\n\n /**\n * Retrieve system prompt variables from context.\n */\n static getVariables(): Record<string, any> | undefined {\n return _promptStorage.getStore()?.variables;\n }\n\n /**\n * Clear system prompt context.\n */\n static clear(): void {\n _promptStorage.enterWith(undefined as unknown as PromptContextData);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Async-local context for user prompts\n// ---------------------------------------------------------------------------\n\nconst _userPromptStorage = new AsyncLocalStorage<PromptContextData>();\n\n/**\n * Manages user/human prompt metadata in async-local context for automatic tracing.\n */\nexport class UserPromptContext {\n /**\n * Store user prompt template and variables in context.\n */\n static set(template: string, variables: Record<string, any>): void {\n _userPromptStorage.enterWith({ template, variables });\n }\n\n /**\n * Retrieve user prompt template from context.\n */\n static getTemplate(): string | undefined {\n return _userPromptStorage.getStore()?.template;\n }\n\n /**\n * Retrieve user prompt variables from context.\n */\n static getVariables(): Record<string, any> | undefined {\n return _userPromptStorage.getStore()?.variables;\n }\n\n /**\n * Clear user prompt context.\n */\n static clear(): void {\n _userPromptStorage.enterWith(undefined as unknown as PromptContextData);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shared context setter type for the base template class\n// ---------------------------------------------------------------------------\n\ninterface ContextSetter {\n set(template: string, variables: Record<string, any>): void;\n}\n\n// ---------------------------------------------------------------------------\n// BasePromptTemplate — shared logic for system and user prompts\n// ---------------------------------------------------------------------------\n\nconst VARIABLE_PATTERN = /\\{\\{(\\w+)\\}\\}/g;\n\n/**\n * Base class for prompt templates with `{{variable}}` placeholders.\n *\n * Extracts variables, compiles templates, and renders strings.\n * Subclasses only need to specify the context class and display name.\n */\nabstract class BasePromptTemplate {\n protected readonly _template: string | PromptMessage[];\n protected readonly _variables: string[];\n\n /**\n * @param template - Either a string with `{{variable}}` placeholders or\n * an array of `PromptMessage` objects whose `content` fields contain placeholders.\n */\n constructor(template: string | PromptMessage[]) {\n this._template = template;\n this._variables = this._extractVariables();\n }\n\n /** List of unique variable names found in this template. */\n get variables(): string[] {\n return this._variables;\n }\n\n /** The raw template (string or message array). */\n get template(): string | PromptMessage[] {\n return this._template;\n }\n\n /** The context class to store template/variables for automatic tracing. */\n protected abstract get _contextSetter(): ContextSetter;\n\n /** Display name for toString(). */\n protected abstract get _displayName(): string;\n\n /**\n * Compile the prompt template with the given variables.\n *\n * @param variables - Key/value pairs to substitute for `{{key}}` placeholders.\n * @returns The rendered string or rendered message array.\n * @throws {Error} If any required variables are missing.\n */\n compile(variables?: Record<string, any>): string | PromptMessage[] {\n const vars = variables ?? {};\n\n const missing = this._variables.filter((v) => !(v in vars));\n if (missing.length > 0) {\n throw new Error(\n `Missing required variables: ${missing.join(', ')}. Template requires: ${this._variables.join(', ')}`,\n );\n }\n\n this._contextSetter.set(\n typeof this._template === 'string'\n ? this._template\n : this._template.map((msg) => `${msg.role}: ${msg.content}`).join('\\n'),\n vars,\n );\n\n if (typeof this._template === 'string') {\n return this._renderString(this._template, vars);\n }\n\n return this._template.map((msg) => ({\n role: msg.role,\n content: this._renderString(msg.content, vars),\n }));\n }\n\n /**\n * Replace `{{key}}` placeholders in a string with the corresponding values.\n */\n _renderString(text: string, variables: Record<string, any>): string {\n let result = text;\n for (const [key, value] of Object.entries(variables)) {\n result = result.replaceAll(`{{${key}}}`, String(value));\n }\n return result;\n }\n\n toString(): string {\n if (typeof this._template === 'string') {\n return this._template.length > 50\n ? `${this._displayName}('${this._template.slice(0, 50)}...')`\n : `${this._displayName}('${this._template}')`;\n }\n return `${this._displayName}(${this._template.length} messages, variables=${JSON.stringify(this._variables)})`;\n }\n\n // ---- private ----\n\n private _extractVariables(): string[] {\n if (typeof this._template === 'string') {\n return [...new Set(Array.from(this._template.matchAll(VARIABLE_PATTERN), (m) => m[1]))];\n }\n\n const found: string[] = [];\n for (const msg of this._template) {\n if (msg.content) {\n for (const match of msg.content.matchAll(VARIABLE_PATTERN)) {\n found.push(match[1]);\n }\n }\n }\n return [...new Set(found)];\n }\n}\n\n// ---------------------------------------------------------------------------\n// PromptTemplate — system/AI instruction prompt\n// ---------------------------------------------------------------------------\n\n/**\n * Template for the system/AI instruction prompt with `{{variable}}` placeholders.\n */\nexport class PromptTemplate extends BasePromptTemplate {\n protected get _contextSetter(): ContextSetter {\n return PromptContext;\n }\n\n protected get _displayName(): string {\n return 'PromptTemplate';\n }\n}\n\n// ---------------------------------------------------------------------------\n// UserPromptTemplate — user/human turn prompt\n// ---------------------------------------------------------------------------\n\n/**\n * Template for the user/human turn prompt with `{{variable}}` placeholders.\n *\n * Identical to {@link PromptTemplate} but stores context in {@link UserPromptContext}.\n */\nexport class UserPromptTemplate extends BasePromptTemplate {\n protected get _contextSetter(): ContextSetter {\n return UserPromptContext;\n }\n\n protected get _displayName(): string {\n return 'UserPromptTemplate';\n }\n}\n","/**\n * Context wrapper for manual span creation.\n *\n * Provides the `trace()` function — the TypeScript equivalent of the Python\n * `trace()` context manager. Creates an OTel span, sets prompt template/variable\n * context, and executes the user callback within the span.\n *\n * @example\n * ```typescript\n * await trace({ name: 'my-trace' }, async (span) => {\n * // user code runs here with the span active\n * });\n * ```\n */\n\nimport {\n trace as otelTrace,\n context as otelContext,\n createContextKey,\n ROOT_CONTEXT,\n SpanStatusCode,\n type Span,\n} from '@opentelemetry/api';\nimport { PromptContext, UserPromptContext, PromptTemplate, UserPromptTemplate } from '../prompt/template.js';\nimport { registerMask } from './mask.js';\n\nimport { getLogger } from './logger.js';\nimport { safeJsonDumps, serializeObj } from '../decorators/base.js';\nimport type { TraceOptions, MaskFunction } from '../types.js';\n\nconst logger = getLogger();\n\n// ---------------------------------------------------------------------------\n// Module-level session config (set by init.ts via _setSessionConfig)\n// ---------------------------------------------------------------------------\n\nlet _sessionConfig: Record<string, any> = {};\n\n/**\n * Set the session configuration. Called by init() during SDK setup.\n * @internal\n */\nexport function _setSessionConfig(config: Record<string, any>): void {\n _sessionConfig = config;\n}\n\n/**\n * Get a copy of the current session configuration.\n */\nexport function getSessionConfig(): Record<string, any> {\n return { ..._sessionConfig };\n}\n\n// ---------------------------------------------------------------------------\n// OTel context keys for prompt data propagation\n// ---------------------------------------------------------------------------\n\nexport const PROMPT_VARIABLES_KEY = createContextKey('neatlogs.prompt_variables');\nexport const PROMPT_TEMPLATE_KEY = createContextKey('neatlogs.prompt_template');\nexport const PROMPT_VERSION_KEY = createContextKey('neatlogs.prompt_version');\nexport const USER_PROMPT_TEMPLATE_KEY = createContextKey('neatlogs.user_prompt_template');\nexport const USER_PROMPT_VARIABLES_KEY = createContextKey('neatlogs.user_prompt_variables');\n\n// ---------------------------------------------------------------------------\n// Known TraceOptions keys (not forwarded as extra span attributes)\n// ---------------------------------------------------------------------------\n\nconst KNOWN_OPTION_KEYS = new Set([\n 'name',\n 'kind',\n 'input',\n 'promptTemplate',\n 'promptVariables',\n 'userPromptTemplate',\n 'userPromptVariables',\n 'version',\n 'mask',\n 'attributes',\n]);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Set standard and extra attributes on a span.\n * @internal\n */\nexport function _setSpanAttributes(\n span: Span,\n kind: string | undefined,\n attributes: Record<string, any>,\n): void {\n span.setAttribute('neatlogs.internal', true);\n span.setAttribute('openinference.span.kind', kind ?? 'CHAIN');\n\n for (const [key, value] of Object.entries(attributes)) {\n span.setAttribute(key, value);\n }\n}\n\n/**\n * After the user callback completes, capture prompt variables that were\n * set by PromptTemplate.compile() / UserPromptTemplate.compile() and\n * record them as span attributes.\n * @internal\n */\nexport function _finalizePromptCapture(\n span: Span,\n isPromptTemplateObj: boolean,\n isUserPromptTemplateObj: boolean,\n): void {\n if (isPromptTemplateObj) {\n const capturedVars = PromptContext.getVariables();\n if (capturedVars) {\n span.setAttribute(\n 'llm.prompt_template_variables',\n JSON.stringify(capturedVars),\n );\n logger.debug(\n `[trace] Auto-captured variables from PromptContext: ${Object.keys(capturedVars).join(', ')}`,\n );\n }\n }\n\n if (isUserPromptTemplateObj) {\n const capturedUserVars = UserPromptContext.getVariables();\n if (capturedUserVars) {\n span.setAttribute(\n 'llm.user_prompt_template_variables',\n JSON.stringify(capturedUserVars),\n );\n logger.debug(\n `[trace] Auto-captured variables from UserPromptContext: ${Object.keys(capturedUserVars).join(', ')}`,\n );\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main trace() function\n// ---------------------------------------------------------------------------\n\n/**\n * Async callback wrapper for manual span creation with prompt tracking.\n *\n * Creates an OTel span, optionally sets prompt template/variable context,\n * and executes the provided callback within the span.\n *\n * **Session-Aware Trace Creation:**\n * - If `session_id` is set in init() AND no active parent span exists,\n * this creates a NEW root trace (for multi-turn conversations).\n * - Otherwise, creates a normal child span within the existing trace.\n *\n * @param options - Trace configuration options\n * @param fn - Callback that receives the active span\n * @returns The return value of the callback\n *\n * @example\n * ```typescript\n * // Basic usage\n * await trace({ name: 'my-pipeline' }, async (span) => {\n * await step1();\n * await step2();\n * });\n *\n * // With prompt template\n * const template = new PromptTemplate('Hello {{name}}');\n * await trace({ name: 'prompt', promptTemplate: template }, async (span) => {\n * const rendered = template.compile({ name: 'world' });\n * // ...\n * });\n * ```\n */\nexport async function trace<T>(\n options: TraceOptions,\n fn: (span: Span) => T | Promise<T>,\n): Promise<T> {\n const {\n name,\n kind,\n input,\n promptTemplate,\n promptVariables,\n userPromptTemplate,\n userPromptVariables,\n version,\n mask,\n attributes: explicitAttributes,\n ...extraOptions\n } = options;\n\n const sessionConfig = getSessionConfig();\n const sessionId = sessionConfig.sessionId;\n\n // Determine whether we are inside an existing active trace\n const currentSpan = otelTrace.getSpan(otelContext.active());\n const isInActiveTrace = currentSpan !== undefined && currentSpan.isRecording();\n const shouldCreateRootTrace = !!sessionId && !isInActiveTrace;\n\n // ---------------------------------------------------------------------------\n // Process prompt templates\n // ---------------------------------------------------------------------------\n\n let templateString: string | undefined;\n let isPromptTemplateObj = false;\n\n if (promptTemplate !== undefined) {\n if (promptTemplate instanceof PromptTemplate) {\n isPromptTemplateObj = true;\n const t = promptTemplate.template;\n templateString = typeof t === 'string' ? t : JSON.stringify(t);\n logger.debug(\n `[trace] Using PromptTemplate object with variables: ${promptTemplate.variables.join(', ')}`,\n );\n } else if (typeof promptTemplate === 'string') {\n templateString = promptTemplate;\n } else {\n const t = promptTemplate.template;\n templateString = typeof t === 'string' ? t : JSON.stringify(t);\n }\n }\n\n let userTemplateString: string | undefined;\n let isUserPromptTemplateObj = false;\n\n if (userPromptTemplate !== undefined) {\n if (userPromptTemplate instanceof UserPromptTemplate) {\n isUserPromptTemplateObj = true;\n const t = userPromptTemplate.template;\n userTemplateString = typeof t === 'string' ? t : JSON.stringify(t);\n logger.debug(\n `[trace] Using UserPromptTemplate object with variables: ${userPromptTemplate.variables.join(', ')}`,\n );\n } else if (typeof userPromptTemplate === 'string') {\n userTemplateString = userPromptTemplate;\n } else {\n const t = userPromptTemplate.template;\n userTemplateString = typeof t === 'string' ? t : JSON.stringify(t);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Build OTel context with prompt values\n // ---------------------------------------------------------------------------\n\n let ctx = otelContext.active();\n\n const variablesJson = promptVariables ? JSON.stringify(promptVariables) : undefined;\n const userVariablesJson = userPromptVariables ? JSON.stringify(userPromptVariables) : undefined;\n\n if (variablesJson) {\n ctx = ctx.setValue(PROMPT_VARIABLES_KEY, variablesJson);\n logger.debug(`[trace] Set neatlogs.prompt_variables in context: ${variablesJson}`);\n }\n if (templateString) {\n ctx = ctx.setValue(PROMPT_TEMPLATE_KEY, templateString);\n logger.debug(`[trace] Set neatlogs.prompt_template in context: ${templateString}`);\n }\n if (userVariablesJson) {\n ctx = ctx.setValue(USER_PROMPT_VARIABLES_KEY, userVariablesJson);\n logger.debug(`[trace] Set neatlogs.user_prompt_variables in context: ${userVariablesJson}`);\n }\n if (userTemplateString) {\n ctx = ctx.setValue(USER_PROMPT_TEMPLATE_KEY, userTemplateString);\n logger.debug(`[trace] Set neatlogs.user_prompt_template in context: ${userTemplateString}`);\n }\n if (version) {\n ctx = ctx.setValue(PROMPT_VERSION_KEY, version);\n logger.debug(`[trace] Set neatlogs.prompt_version in context: ${version}`);\n }\n\n // ---------------------------------------------------------------------------\n // Collect extra attributes (non-standard option keys)\n // ---------------------------------------------------------------------------\n\n const extraAttributes: Record<string, any> = { ...(explicitAttributes ?? {}) };\n for (const [key, value] of Object.entries(extraOptions)) {\n if (!KNOWN_OPTION_KEYS.has(key)) {\n extraAttributes[key] = value;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Create span and execute callback\n // ---------------------------------------------------------------------------\n\n const tracer = otelTrace.getTracer('neatlogs.trace');\n\n const spanCallback = async (span: Span): Promise<T> => {\n _setSpanAttributes(span, kind, extraAttributes);\n\n if (input !== undefined && input !== null) {\n span.setAttribute('input.value', safeJsonDumps(serializeObj(input)));\n }\n\n if (mask) {\n const maskId = registerMask(mask);\n span.setAttribute('neatlogs.mask_id', maskId);\n }\n\n try {\n const result: T = await fn(span);\n\n _finalizePromptCapture(span, isPromptTemplateObj, isUserPromptTemplateObj);\n\n if (result !== undefined && result !== null) {\n const spanAttrs = (span as any).attributes ?? (span as any)._attributes;\n const hasOutput = spanAttrs && (\n 'output.value' in spanAttrs || 'neatlogs.output.value' in spanAttrs\n );\n if (!hasOutput) {\n span.setAttribute('output.value', safeJsonDumps(serializeObj(result)));\n }\n }\n\n return result;\n } catch (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n } finally {\n if (isPromptTemplateObj) {\n PromptContext.clear();\n }\n if (isUserPromptTemplateObj) {\n UserPromptContext.clear();\n }\n span.end();\n }\n };\n\n if (shouldCreateRootTrace) {\n logger.debug(`[trace] Creating NEW root trace '${name}' (sessionId=${sessionId})`);\n return tracer.startActiveSpan(name, {}, ROOT_CONTEXT, spanCallback);\n } else {\n logger.debug(`[trace] Creating child span '${name}'`);\n return tracer.startActiveSpan(name, {}, ctx, spanCallback);\n }\n}\n","/**\n * Core span decoration utilities.\n * Provides the low-level wrapping logic used by span() and Span().\n */\n\nimport { trace, SpanStatusCode, type Span as OtelSpan } from '@opentelemetry/api';\nimport { getLogger } from '../core/logger.js';\nimport { registerMask } from '../core/mask.js';\nimport type { SpanOptions, MaskFunction } from '../types.js';\n\nconst logger = getLogger();\nconst TRACER_NAME = 'neatlogs';\n\n/** Safely serialize any value to JSON string. */\nexport function safeJsonDumps(value: any): string {\n try {\n return JSON.stringify(value, (_key, val) => {\n if (typeof val === 'bigint') return val.toString();\n if (val instanceof Error) return { message: val.message, name: val.name, stack: val.stack };\n if (typeof val === 'function') return `[Function: ${val.name || 'anonymous'}]`;\n return val;\n });\n } catch {\n return String(value);\n }\n}\n\n/** Serialize an object for span attributes. Handles toJSON(), plain objects, primitives. */\nexport function serializeObj(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean') return obj;\n if (typeof obj.toJSON === 'function') return obj.toJSON();\n if (Array.isArray(obj)) return obj.map(serializeObj);\n if (typeof obj === 'object') {\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = serializeObj(value);\n }\n return result;\n }\n return String(obj);\n}\n\n/** Check if content capture is enabled via env var. */\nexport function shouldCaptureContent(): boolean {\n const envVal = process.env.NEATLOGS_TRACE_CONTENT;\n if (envVal === undefined || envVal === '') return true;\n return envVal.toLowerCase() !== 'false' && envVal !== '0';\n}\n\n/** Set common span attributes from options. */\nexport function setCommonSpanAttrs(span: OtelSpan, opts: SpanOptions): void {\n if (opts.kind) {\n span.setAttribute('openinference.span.kind', opts.kind);\n }\n if (opts.internal) {\n span.setAttribute('neatlogs.internal', true);\n }\n if (opts.description) {\n span.setAttribute('neatlogs.description', opts.description);\n }\n if (opts.mask) {\n const maskId = registerMask(opts.mask);\n span.setAttribute('neatlogs.mask_id', maskId);\n }\n}\n\nexport interface DecorateSpanOptions extends SpanOptions {\n /** Override the span name (defaults to function name). */\n spanName?: string;\n /** Post-process callback after the function returns. */\n postprocessResult?: (span: OtelSpan, result: any, boundInputs: Record<string, any>) => void;\n}\n\n/**\n * Core wrapper factory that creates an instrumented version of a function.\n * This is the low-level building block used by span() and Span().\n */\nexport function decorateSpan<TArgs extends any[], TReturn>(\n opts: DecorateSpanOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn extends Promise<any> ? TReturn : Promise<Awaited<TReturn>> {\n const tracer = trace.getTracer(TRACER_NAME);\n const spanName = opts.spanName ?? opts.name ?? (fn.name || 'anonymous');\n const captureInput = opts.captureInput !== false;\n const captureOutput = opts.captureOutput !== false;\n const doCapture = shouldCaptureContent();\n\n const wrapped = (...args: TArgs): any => {\n return tracer.startActiveSpan(spanName, (span: OtelSpan) => {\n try {\n // Set common attributes\n setCommonSpanAttrs(span, opts);\n\n // Capture input\n if (captureInput && doCapture && args.length > 0) {\n try {\n const inputValue = args.length === 1 ? serializeObj(args[0]) : args.map(serializeObj);\n span.setAttribute('input.value', safeJsonDumps(inputValue));\n } catch (err) {\n logger.debug(`Failed to capture input: ${err}`);\n }\n }\n\n // Execute the function\n const result = fn(...args);\n\n // Handle async results\n if (result instanceof Promise) {\n return result\n .then((resolved: any) => {\n // Capture output\n if (captureOutput && doCapture) {\n try {\n span.setAttribute('output.value', safeJsonDumps(serializeObj(resolved)));\n } catch (err) {\n logger.debug(`Failed to capture output: ${err}`);\n }\n }\n\n // Post-process\n if (opts.postprocessResult) {\n try {\n const boundInputs = _extractBoundInputs(fn, args);\n opts.postprocessResult(span, resolved, boundInputs);\n } catch (err) {\n logger.debug(`Postprocess failed: ${err}`);\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return resolved;\n })\n .catch((error: any) => {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error?.message ?? String(error),\n });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n });\n }\n\n // Sync result\n if (captureOutput && doCapture) {\n try {\n span.setAttribute('output.value', safeJsonDumps(serializeObj(result)));\n } catch (err) {\n logger.debug(`Failed to capture output: ${err}`);\n }\n }\n\n if (opts.postprocessResult) {\n try {\n const boundInputs = _extractBoundInputs(fn, args);\n opts.postprocessResult(span, result, boundInputs);\n } catch (err) {\n logger.debug(`Postprocess failed: ${err}`);\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n } catch (error: any) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error?.message ?? String(error),\n });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n }\n });\n };\n\n // Preserve function name for debugging\n Object.defineProperty(wrapped, 'name', { value: spanName, configurable: true });\n\n return wrapped as any;\n}\n\n/** Extract named arguments from function call (best-effort). */\nfunction _extractBoundInputs(fn: Function, args: any[]): Record<string, any> {\n const result: Record<string, any> = {};\n // Parse function parameter names from toString()\n const fnStr = fn.toString();\n const match = fnStr.match(/\\(([^)]*)\\)/);\n if (match) {\n const paramNames = match[1]\n .split(',')\n .map((p) => p.trim().replace(/\\s*[:=].*$/, '').replace(/^\\.\\.\\./, ''))\n .filter(Boolean);\n for (let i = 0; i < Math.min(paramNames.length, args.length); i++) {\n result[paramNames[i]] = args[i];\n }\n }\n return result;\n}\n","/**\n * Registry for CrewAI task template bindings.\n *\n * Call registerCrewaiTask(task, userTpl, vars) in your task setup after creating\n * each Task. The span processor reads and clears the entry when the corresponding\n * AGENT span ends, stamping the template onto that span.\n */\n\nimport { getLogger } from './logger.js';\n\nconst logger = getLogger();\n\n/** Registry: taskId -> [templateStr, varsJson] */\nconst _registry = new Map<string, [string, string | null]>();\n\n/**\n * Register a user prompt template for a CrewAI task.\n *\n * @param task - A CrewAI Task instance (must have an .id property)\n * @param userTpl - A neatlogs UserPromptTemplate describing the task prompt\n * @param vars - Variable values passed to userTpl at task-creation time\n */\nexport function registerCrewaiTask(\n task: { id: string | number },\n userTpl: { template: string | any },\n vars?: Record<string, any>,\n): void {\n const taskId = String(task.id);\n const tplStr = String(userTpl.template);\n const varsJson =\n vars && Object.keys(vars).length > 0\n ? JSON.stringify(vars, (_key, val) => (typeof val === 'undefined' ? null : val))\n : null;\n\n _registry.set(taskId, [tplStr, varsJson]);\n logger.debug(`Registered CrewAI task ${taskId}`);\n}\n\n/**\n * Remove and return the registry entry for taskId, or undefined if absent.\n */\nexport function popEntry(taskId: string): [string, string | null] | undefined {\n const entry = _registry.get(taskId);\n if (entry) {\n _registry.delete(taskId);\n }\n return entry;\n}\n\n/**\n * Clear all registered tasks. Used for testing.\n * @internal\n */\nexport function _clearTaskRegistry(): void {\n _registry.clear();\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"title\": \"Neatlogs Semantic Conventions - Attribute Mapping Configuration\",\n \"description\": \"Maps vendor-specific attributes (OpenInference, OpenLLMetry) to unified neatlogs.* namespace\",\n \"version\": \"1.0.0\",\n \"mappings\": {\n \"span_kind\": {\n \"description\": \"Span classification/type\",\n \"sources\": [\n \"openinference.span.kind\",\n \"traceloop.span.kind\"\n ],\n \"target\": \"neatlogs.span.kind\",\n \"values\": {\n \"LLM\": \"llm\",\n \"TOOL\": \"tool\",\n \"AGENT\": \"agent\",\n \"CHAIN\": \"chain\",\n \"WORKFLOW\": \"workflow\",\n \"TASK\": \"task\",\n \"RETRIEVER\": \"retriever\",\n \"EMBEDDING\": \"embedding\",\n \"VECTOR_STORE\": \"vector_store\",\n \"RERANKER\": \"reranker\",\n \"GUARDRAIL\": \"guardrail\",\n \"EVALUATOR\": \"evaluator\",\n \"MCP_TOOL\": \"mcp_tool\",\n \"HTTP\": \"http\"\n },\n \"priority\": \"openinference\"\n },\n \"llm\": {\n \"description\": \"LLM-specific attributes\",\n \"mappings\": {\n \"model_name\": {\n \"sources\": [\n \"llm.model_name\",\n \"gen_ai.response.model\",\n \"gen_ai.request.model\",\n \"traceloop.association.properties.ls_model_name\"\n ],\n \"target\": \"neatlogs.llm.model_name\"\n },\n \"provider\": {\n \"sources\": [\n \"llm.provider\",\n \"traceloop.association.properties.ls_provider\"\n ],\n \"target\": \"neatlogs.llm.provider\"\n },\n \"system\": {\n \"sources\": [\n \"llm.system\",\n \"gen_ai.system\"\n ],\n \"target\": \"neatlogs.llm.system\"\n },\n \"request_type\": {\n \"sources\": [\n \"llm.request.type\",\n \"neatlogs.llm.operation.name\",\n \"neatlogs.llm.operation.type\"\n ],\n \"target\": \"neatlogs.llm.request_type\"\n },\n \"choices\": {\n \"sources\": [\n \"gen_ai.client.generation.choices\",\n \"llm.request.n\"\n ],\n \"target\": \"neatlogs.llm.generation_choices\"\n },\n \"token_count\": {\n \"mappings\": {\n \"total\": {\n \"sources\": [\n \"llm.token_count.total\",\n \"llm.usage.total_tokens\",\n \"ai.usage.totalTokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.total\"\n },\n \"prompt\": {\n \"sources\": [\n \"llm.token_count.prompt\",\n \"gen_ai.usage.input_tokens\",\n \"ai.usage.promptTokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.prompt\"\n },\n \"completion\": {\n \"sources\": [\n \"llm.token_count.completion\",\n \"gen_ai.usage.output_tokens\",\n \"ai.usage.completionTokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.completion\"\n },\n \"reasoning\": {\n \"sources\": [\n \"llm.token_count.completion_details.reasoning\",\n \"llm.usage.reasoning_tokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.reasoning\"\n },\n \"cached\": {\n \"sources\": [\n \"neatlogs.llm.token_count.cached_read\",\n \"llm.token_count.prompt_details.cache_read\",\n \"llm.token_count.prompt.cache_read\",\n \"gen_ai.usage.cache_read_input_tokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.cache_read\"\n },\n \"cache_write\": {\n \"sources\": [\n \"neatlogs.llm.token_count.cached_write\",\n \"llm.token_count.prompt_details.cache_write\",\n \"gen_ai.usage.cache_creation_input_tokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.cache_write\"\n },\n \"prompt_audio\": {\n \"sources\": [\n \"llm.token_count.prompt_details.audio\"\n ],\n \"target\": \"neatlogs.llm.token_count.prompt_audio\"\n },\n \"completion_audio\": {\n \"sources\": [\n \"neatlogs.llm.token_count.audio\",\n \"llm.token_count.completion_details.audio\"\n ],\n \"target\": \"neatlogs.llm.token_count.completion_audio\"\n }\n }\n },\n \"tool_calls\": {\n \"description\": \"Tool/function calls extracted from provider responses\",\n \"sources\": {\n \"id\": [\n \"llm.tool_calls.{i}.id\"\n ],\n \"name\": [\n \"llm.tool_calls.{i}.name\"\n ],\n \"arguments\": [\n \"llm.tool_calls.{i}.arguments\"\n ]\n },\n \"target\": \"neatlogs.llm.tool_calls.{i}\",\n \"indexed\": true\n },\n \"invalid_tool_calls\": {\n \"description\": \"Invalid or malformed tool calls\",\n \"sources\": [\n \"llm.invalid_tool_calls\"\n ],\n \"target\": \"neatlogs.llm.invalid_tool_calls\"\n },\n \"tools\": {\n \"description\": \"Tool definitions passed to the model\",\n \"sources\": {\n \"name\": [\n \"llm.tools.{i}.name\"\n ],\n \"description\": [\n \"llm.tools.{i}.description\"\n ],\n \"input_schema\": [\n \"llm.tools.{i}.input_schema\"\n ]\n },\n \"target\": \"neatlogs.llm.tools.{i}\",\n \"indexed\": true\n },\n \"messages\": {\n \"mappings\": {\n \"input_role\": {\n \"sources\": [\n \"llm.input_messages.{i}.message.role\",\n \"gen_ai.prompt.{i}.role\"\n ],\n \"target\": \"neatlogs.llm.input_messages.{i}.role\",\n \"indexed\": true\n },\n \"input_content\": {\n \"sources\": [\n \"llm.input_messages.{i}.message.content\",\n \"gen_ai.prompt.{i}.content\"\n ],\n \"target\": \"neatlogs.llm.input_messages.{i}.content\",\n \"indexed\": true\n },\n \"input_tool_call_id\": {\n \"sources\": [\n \"llm.input_messages.{i}.tool_call_id\",\n \"llm.input_messages.{i}.message.tool_call_id\"\n ],\n \"target\": \"neatlogs.llm.input_messages.{i}.tool_call_id\",\n \"indexed\": true\n },\n \"input_name\": {\n \"sources\": [\n \"llm.input_messages.{i}.name\",\n \"llm.input_messages.{i}.message.name\"\n ],\n \"target\": \"neatlogs.llm.input_messages.{i}.name\",\n \"indexed\": true\n },\n \"output_role\": {\n \"sources\": [\n \"llm.output_messages.{i}.message.role\",\n \"gen_ai.completion.{i}.role\"\n ],\n \"target\": \"neatlogs.llm.output_messages.{i}.role\",\n \"indexed\": true\n },\n \"output_content\": {\n \"sources\": [\n \"llm.output_messages.{i}.message.content\",\n \"gen_ai.completion.{i}.content\"\n ],\n \"target\": \"neatlogs.llm.output_messages.{i}.content\",\n \"indexed\": true\n },\n \"system_prompt\": {\n \"sources\": [\n \"gen_ai.system_instructions\"\n ],\n \"target\": \"neatlogs.llm.system_prompt\"\n }\n },\n \"invocation_parameters\": {\n \"sources\": [\n \"llm.invocation_parameters\"\n ],\n \"target\": \"neatlogs.llm.invocation_parameters\"\n },\n \"temperature\": {\n \"sources\": [\n \"gen_ai.request.temperature\",\n \"traceloop.association.properties.ls_temperature\"\n ],\n \"target\": \"neatlogs.llm.temperature\"\n },\n \"intermediate_steps\": {\n \"description\": \"Derived ReAct-style steps extracted by the SDK (JSON array string).\",\n \"sources\": [\n \"llm.intermediate_steps\"\n ],\n \"target\": \"neatlogs.llm.intermediate_steps\"\n },\n \"top_p\": {\n \"sources\": [\n \"gen_ai.request.top_p\"\n ],\n \"target\": \"neatlogs.llm.top_p\"\n },\n \"top_k\": {\n \"sources\": [\n \"gen_ai.request.top_k\",\n \"llm.top_k\"\n ],\n \"target\": \"neatlogs.llm.top_k\"\n },\n \"max_tokens\": {\n \"sources\": [\n \"gen_ai.request.max_tokens\"\n ],\n \"target\": \"neatlogs.llm.max_tokens\"\n },\n \"frequency_penalty\": {\n \"sources\": [\n \"gen_ai.request.frequency_penalty\",\n \"llm.frequency_penalty\"\n ],\n \"target\": \"neatlogs.llm.frequency_penalty\"\n },\n \"presence_penalty\": {\n \"sources\": [\n \"gen_ai.request.presence_penalty\",\n \"llm.presence_penalty\"\n ],\n \"target\": \"neatlogs.llm.presence_penalty\"\n },\n \"stop_sequences\": {\n \"sources\": [\n \"gen_ai.request.stop_sequences\",\n \"llm.chat.stop_sequences\"\n ],\n \"target\": \"neatlogs.llm.stop_sequences\"\n },\n \"is_streaming\": {\n \"sources\": [\n \"llm.is_streaming\"\n ],\n \"target\": \"neatlogs.llm.is_streaming\"\n },\n \"headers\": {\n \"sources\": [\n \"llm.headers\"\n ],\n \"target\": \"neatlogs.llm.headers\"\n },\n \"finish_reason\": {\n \"sources\": [\n \"llm.response.finish_reason\",\n \"llm.finish_reason\",\n \"gen_ai.response.finish_reasons\",\n \"gen_ai.completion.0.finish_reason\"\n ],\n \"target\": \"neatlogs.llm.finish_reason\"\n },\n \"stop_reason\": {\n \"sources\": [\n \"llm.response.stop_reason\",\n \"gen_ai.response.stop_reason\"\n ],\n \"target\": \"neatlogs.llm.stop_reason\"\n },\n \"response_id\": {\n \"sources\": [\n \"gen_ai.response.id\"\n ],\n \"target\": \"neatlogs.llm.response_id\"\n },\n \"prompt_template\": {\n \"template\": {\n \"sources\": [\n \"neatlogs.prompt.template\",\n \"llm.prompt_template.template\",\n \"llm.prompt_template\",\n \"traceloop.prompt.template\"\n ],\n \"target\": \"neatlogs.llm.prompt_template\"\n },\n \"variables\": {\n \"sources\": [\n \"neatlogs.prompt.template_variables\",\n \"llm.prompt_template.variables\",\n \"llm.prompt_template_variables\",\n \"traceloop.prompt.template_variables\"\n ],\n \"target\": \"neatlogs.llm.prompt_template_variables\"\n },\n \"user_template\": {\n \"sources\": [\n \"llm.user_prompt_template\",\n \"neatlogs.user_prompt.template\"\n ],\n \"target\": \"neatlogs.llm.user_prompt_template\"\n },\n \"user_variables\": {\n \"sources\": [\n \"llm.user_prompt_template_variables\",\n \"neatlogs.user_prompt.template_variables\"\n ],\n \"target\": \"neatlogs.llm.user_prompt_template_variables\"\n },\n \"version\": {\n \"sources\": [\n \"neatlogs.prompt.version\",\n \"llm.prompt_template.version\",\n \"traceloop.prompt.version\"\n ],\n \"target\": \"neatlogs.llm.prompt_template.version\"\n },\n \"key\": {\n \"sources\": [\n \"traceloop.prompt.key\"\n ],\n \"target\": \"neatlogs.llm.prompt_key\"\n },\n \"vendor\": {\n \"sources\": [\n \"prompt.vendor\"\n ],\n \"target\": \"neatlogs.llm.prompt_vendor\"\n },\n \"id\": {\n \"sources\": [\n \"prompt.id\"\n ],\n \"target\": \"neatlogs.llm.prompt_id\"\n },\n \"url\": {\n \"sources\": [\n \"prompt.url\"\n ],\n \"target\": \"neatlogs.llm.prompt_url\"\n }\n }\n }\n },\n \"generic_io\": {\n \"description\": \"Generic input/output for any span type\",\n \"input\": {\n \"sources\": [\n \"input.value\",\n \"traceloop.entity.input\"\n ],\n \"target\": \"neatlogs.{span_kind}.input\"\n },\n \"output\": {\n \"sources\": [\n \"output.value\",\n \"traceloop.entity.output\"\n ],\n \"target\": \"neatlogs.{span_kind}.output\"\n },\n \"input_mime_type\": {\n \"sources\": [\n \"input.mime_type\"\n ],\n \"target\": \"neatlogs.{span_kind}.input_mime_type\"\n },\n \"output_mime_type\": {\n \"sources\": [\n \"output.mime_type\"\n ],\n \"target\": \"neatlogs.{span_kind}.output_mime_type\"\n }\n },\n \"span\": {\n \"description\": \"Span metadata\",\n \"name\": {\n \"sources\": [\n \"traceloop.entity.name\"\n ],\n \"target\": \"neatlogs.span.name\"\n },\n \"path\": {\n \"sources\": [\n \"traceloop.entity.path\"\n ],\n \"target\": \"neatlogs.span.path\"\n }\n },\n \"tool\": {\n \"name\": {\n \"sources\": [\n \"tool.name\",\n \"gen_ai.tool.name\"\n ],\n \"target\": \"neatlogs.tool.name\"\n },\n \"description\": {\n \"sources\": [\n \"tool.description\",\n \"gen_ai.tool.description\"\n ],\n \"target\": \"neatlogs.tool.description\"\n },\n \"parameters\": {\n \"sources\": [\n \"tool.parameters\"\n ],\n \"target\": \"neatlogs.tool.parameters\"\n },\n \"json_schema\": {\n \"sources\": [\n \"tool.json_schema\"\n ],\n \"target\": \"neatlogs.tool.json_schema\"\n },\n \"id\": {\n \"sources\": [\n \"tool.id\",\n \"gen_ai.tool.call.id\"\n ],\n \"target\": \"neatlogs.tool.id\"\n },\n \"call_id\": {\n \"sources\": [\n \"tool.call_id\",\n \"tool_call_id\"\n ],\n \"target\": \"neatlogs.tool_call.id\"\n }\n },\n \"agent\": {\n \"description\": \"Agent attributes\",\n \"name\": {\n \"sources\": [\n \"agent.name\"\n ],\n \"target\": \"neatlogs.agent.name\"\n },\n \"role\": {\n \"sources\": [\n \"agent_role\"\n ],\n \"target\": \"neatlogs.agent.role\"\n }\n },\n \"crewai\": {\n \"description\": \"CrewAI framework attributes (from OpenInference instrumentation)\",\n \"crew_id\": {\n \"sources\": [\"crew_id\"],\n \"target\": \"neatlogs.crewai.crew_id\"\n },\n \"crew_key\": {\n \"sources\": [\"crew_key\"],\n \"target\": \"neatlogs.crewai.crew_key\"\n },\n \"crew_number_of_agents\": {\n \"sources\": [\"crew_number_of_agents\"],\n \"target\": \"neatlogs.crewai.crew_number_of_agents\"\n },\n \"crew_number_of_tasks\": {\n \"sources\": [\"crew_number_of_tasks\"],\n \"target\": \"neatlogs.crewai.crew_number_of_tasks\"\n },\n \"version\": {\n \"sources\": [\"crewai_version\"],\n \"target\": \"neatlogs.crewai.version\"\n },\n \"task_id\": {\n \"sources\": [\"task_id\"],\n \"target\": \"neatlogs.task.id\"\n },\n \"task_key\": {\n \"sources\": [\"task_key\"],\n \"target\": \"neatlogs.task.key\"\n }\n },\n \"retriever\": {\n \"description\": \"Retrieval/Vector DB attributes\",\n \"documents\": {\n \"sources\": {\n \"id\": [\n \"retrieval.documents.{i}.document.id\",\n \"db.query.result.id\"\n ],\n \"content\": [\n \"retrieval.documents.{i}.document.content\",\n \"db.query.result.document\"\n ],\n \"score\": [\n \"retrieval.documents.{i}.document.score\",\n \"document.score\",\n \"db.query.result.score\",\n \"db.query.result.distance\"\n ],\n \"metadata\": [\n \"retrieval.documents.{i}.document.metadata\",\n \"db.query.result.metadata\"\n ]\n },\n \"target\": \"neatlogs.retriever.documents.{i}\",\n \"indexed\": true\n },\n \"query\": {\n \"sources\": [\n \"retrieval.query\",\n \"db.query.text\"\n ],\n \"target\": \"neatlogs.retriever.query\"\n },\n \"top_k\": {\n \"sources\": [\n \"retrieval.top_k\",\n \"db.vector.query.top_k\"\n ],\n \"target\": \"neatlogs.retriever.top_k\"\n }\n },\n \"db\": {\n \"description\": \"Database operations (vector DBs, etc.)\",\n \"system\": {\n \"sources\": [\n \"db.system\"\n ],\n \"target\": \"neatlogs.db.system\"\n },\n \"collection_name\": {\n \"sources\": [\n \"db.collection.name\"\n ],\n \"target\": \"neatlogs.db.collection_name\"\n },\n \"operation\": {\n \"sources\": [\n \"db.operation\"\n ],\n \"target\": \"neatlogs.db.operation\"\n },\n \"documents_count\": {\n \"sources\": [\n \"db.chroma.add.documents_count\",\n \"db.pinecone.add.documents_count\"\n ],\n \"target\": \"neatlogs.db.documents_count\"\n },\n \"ids_count\": {\n \"sources\": [\n \"db.chroma.add.ids_count\",\n \"db.pinecone.add.ids_count\"\n ],\n \"target\": \"neatlogs.db.ids_count\"\n },\n \"metadatas_count\": {\n \"sources\": [\n \"db.chroma.add.metadatas_count\",\n \"db.pinecone.add.metadatas_count\"\n ],\n \"target\": \"neatlogs.db.metadatas_count\"\n }\n },\n \"vectordb\": {\n \"description\": \"Vector Database specific attributes (Marqo, Qdrant, Milvus, etc.)\",\n \"index_name\": {\n \"sources\": [\n \"vector_db_index_name\",\n \"marqo.index_name\",\n \"qdrant.upsert.collection_name\",\n \"qdrant.search.collection_name\",\n \"db.milvus.create_collection.collection_name\",\n \"db.milvus.search.collection_name\",\n \"db.milvus.insert.collection_name\",\n \"db.chroma.collection.name\"\n ],\n \"target\": \"neatlogs.vectordb.index_name\"\n },\n \"embedding_model\": {\n \"sources\": [\n \"embedding_model\",\n \"marqo.model\",\n \"embedding.model_name\"\n ],\n \"target\": \"neatlogs.vectordb.embedding_model\"\n },\n \"retrieval_query\": {\n \"sources\": [\n \"retrieval_query\",\n \"db.marqo.search.query\"\n ],\n \"target\": \"neatlogs.vectordb.retrieval_query\"\n },\n \"retrieval_time_taken\": {\n \"sources\": [\n \"retrieval_time_taken\",\n \"db.marqo.search.processing_time\"\n ],\n \"target\": \"neatlogs.vectordb.retrieval_time_taken\"\n },\n \"vector_dimension\": {\n \"sources\": [\n \"vector_dimension\",\n \"db.milvus.create_collection.dimension\",\n \"db.milvus.search.query_vector_dimension\"\n ],\n \"target\": \"neatlogs.vectordb.vector_dimension\"\n },\n \"similarity_algorithm\": {\n \"sources\": [\n \"vector_similarity_algorithm\",\n \"db.milvus.create_collection.metric_type\"\n ],\n \"target\": \"neatlogs.vectordb.similarity_algorithm\"\n },\n \"document_attributes\": {\n \"sources\": [\n \"document_attributes\"\n ],\n \"target\": \"neatlogs.vectordb.document_attributes\",\n \"description\": \"Computed JSON field from SDK\"\n },\n \"retrieval_input_params\": {\n \"sources\": [\n \"retrieval_input_params\"\n ],\n \"target\": \"neatlogs.vectordb.retrieval_input_params\",\n \"description\": \"Computed JSON field from SDK (Marqo limit, hits_count, filter)\"\n },\n \"retrieval_documents\": {\n \"sources\": [\n \"retrieval_documents\"\n ],\n \"target\": \"neatlogs.vectordb.retrieval_documents\",\n \"description\": \"Computed JSON array from SDK events\"\n }\n },\n \"reranker\": {\n \"description\": \"Reranker model attributes\",\n \"applies_to\": [\"reranker\"],\n \"model_name\": {\n \"sources\": [\n \"reranker.model_name\",\n \"ai.model.id\"\n ],\n \"target\": \"neatlogs.reranker.model_name\"\n },\n \"provider\": {\n \"sources\": [\n \"ai.model.provider\"\n ],\n \"target\": \"neatlogs.reranker.provider\",\n \"description\": \"Vercel AI SDK reranker provider (e.g. gateway, cohere)\"\n },\n \"query\": {\n \"sources\": [\n \"reranker.query\",\n \"ai.rerank.query\"\n ],\n \"target\": \"neatlogs.reranker.query\"\n },\n \"documents\": {\n \"sources\": [\n \"ai.documents\"\n ],\n \"target\": \"neatlogs.reranker.input_documents\",\n \"description\": \"Vercel AI SDK rerank input documents array\"\n },\n \"ranking\": {\n \"sources\": [\n \"ai.ranking\"\n ],\n \"target\": \"neatlogs.reranker.output_documents\",\n \"description\": \"Vercel AI SDK rerank output ranking array\"\n },\n \"ranking_type\": {\n \"sources\": [\n \"ai.ranking.type\"\n ],\n \"target\": \"neatlogs.reranker.ranking_type\",\n \"description\": \"Vercel AI SDK rerank type (e.g. text)\"\n },\n \"top_k\": {\n \"sources\": [\n \"reranker.top_k\"\n ],\n \"target\": \"neatlogs.reranker.top_k\"\n },\n \"max_retries\": {\n \"sources\": [\n \"ai.settings.maxRetries\"\n ],\n \"target\": \"neatlogs.reranker.max_retries\",\n \"description\": \"Vercel AI SDK max retries setting\"\n },\n \"input_documents\": {\n \"sources\": {\n \"id\": [\n \"reranker.input_documents.{i}.document.id\"\n ],\n \"content\": [\n \"reranker.input_documents.{i}.document.content\"\n ],\n \"metadata\": [\n \"reranker.input_documents.{i}.document.metadata\"\n ]\n },\n \"target\": \"neatlogs.reranker.input_documents.{i}\",\n \"indexed\": true\n },\n \"output_documents\": {\n \"sources\": {\n \"id\": [\n \"reranker.output_documents.{i}.document.id\"\n ],\n \"content\": [\n \"reranker.output_documents.{i}.document.content\"\n ],\n \"score\": [\n \"reranker.output_documents.{i}.document.score\",\n \"reranker.output_documents.{i}.relevance_score\"\n ],\n \"metadata\": [\n \"reranker.output_documents.{i}.document.metadata\"\n ]\n },\n \"target\": \"neatlogs.reranker.output_documents.{i}\",\n \"indexed\": true\n }\n },\n \"embedding\": {\n \"description\": \"Embedding model attributes\",\n \"applies_to\": [\"embedding\"],\n \"input\": {\n \"sources\": [\n \"ai.value\",\n \"ai.values\"\n ],\n \"target\": \"neatlogs.embedding.input\",\n \"description\": \"Vercel AI SDK embed/embedMany input value(s)\"\n },\n \"model_name\": {\n \"sources\": [\n \"embedding.model_name\",\n \"ai.model.id\"\n ],\n \"target\": \"neatlogs.embedding.model_name\"\n },\n \"text\": {\n \"sources\": [\n \"embedding.text\"\n ],\n \"target\": \"neatlogs.embedding.text\"\n },\n \"vector\": {\n \"sources\": [\n \"embedding.vector\"\n ],\n \"target\": \"neatlogs.embedding.vector\"\n },\n \"token_count\": {\n \"sources\": [\n \"embedding.token_count\",\n \"ai.usage.tokens\"\n ],\n \"target\": \"neatlogs.embedding.token_count\"\n },\n \"invocation_parameters\": {\n \"sources\": [\n \"embedding.invocation_parameters\"\n ],\n \"target\": \"neatlogs.embedding.invocation_parameters\"\n },\n \"embeddings_data\": {\n \"sources\": [\n \"embeddings_data\"\n ],\n \"target\": \"neatlogs.embedding.embeddings_data\",\n \"description\": \"Computed JSON array from SDK (embedding.embeddings.*.embedding.text)\"\n }\n },\n \"session\": {\n \"description\": \"Session tracking\",\n \"id\": {\n \"sources\": [\n \"session.id\"\n ],\n \"target\": \"neatlogs.session.id\"\n }\n },\n \"user\": {\n \"description\": \"User tracking\",\n \"id\": {\n \"sources\": [\n \"user.id\"\n ],\n \"target\": \"neatlogs.user.id\"\n }\n },\n \"workflow\": {\n \"description\": \"Workflow/Chain metadata\",\n \"name\": {\n \"sources\": [\n \"traceloop.workflow.name\"\n ],\n \"target\": \"neatlogs.workflow.name\"\n }\n },\n \"entity\": {\n \"description\": \"LangChain entity metadata (from OpenLLMetry/Traceloop)\",\n \"name\": {\n \"sources\": [\n \"traceloop.entity.name\"\n ],\n \"target\": \"neatlogs.entity.name\"\n },\n \"path\": {\n \"sources\": [\n \"traceloop.entity.path\"\n ],\n \"target\": \"neatlogs.entity.path\"\n }\n },\n \"langgraph\": {\n \"description\": \"LangGraph execution metadata (from OpenLLMetry/Traceloop association properties)\",\n \"step\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_step\"\n ],\n \"target\": \"neatlogs.langgraph.step\"\n },\n \"node\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_node\"\n ],\n \"target\": \"neatlogs.langgraph.node\"\n },\n \"triggers\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_triggers\"\n ],\n \"target\": \"neatlogs.langgraph.triggers\"\n },\n \"path\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_path\"\n ],\n \"target\": \"neatlogs.langgraph.path\"\n },\n \"checkpoint_ns\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_checkpoint_ns\",\n \"traceloop.association.properties.checkpoint_ns\"\n ],\n \"target\": \"neatlogs.langgraph.checkpoint_ns\"\n },\n \"task_id\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_task_id\"\n ],\n \"target\": \"neatlogs.langgraph.task_id\"\n },\n \"thread_id\": {\n \"sources\": [\n \"traceloop.association.properties.thread_id\"\n ],\n \"target\": \"neatlogs.langgraph.thread_id\"\n }\n },\n \"mcp\": {\n \"description\": \"Model Context Protocol (MCP) attributes\",\n \"method\": {\n \"sources\": [\n \"mcp.method.name\",\n \"mcp.method\"\n ],\n \"target\": \"neatlogs.mcp.method\"\n },\n \"request_id\": {\n \"sources\": [\n \"mcp.request.id\"\n ],\n \"target\": \"neatlogs.mcp.request_id\"\n },\n \"request_argument\": {\n \"sources\": [\n \"mcp.request.argument\"\n ],\n \"target\": \"neatlogs.mcp.request_argument\"\n },\n \"response_value\": {\n \"sources\": [\n \"mcp.response.value\"\n ],\n \"target\": \"neatlogs.mcp.response_value\"\n },\n \"session_init_options\": {\n \"sources\": [\n \"mcp.session.init_options\"\n ],\n \"target\": \"neatlogs.mcp.session_init_options\"\n },\n \"protocol_version\": {\n \"sources\": [\n \"mcp.protocol_version\"\n ],\n \"target\": \"neatlogs.mcp.protocol_version\"\n },\n \"server\": {\n \"name\": {\n \"sources\": [\n \"mcp.server.name\"\n ],\n \"target\": \"neatlogs.mcp.server.name\"\n },\n \"version\": {\n \"sources\": [\n \"mcp.server.version\"\n ],\n \"target\": \"neatlogs.mcp.server.version\"\n },\n \"capabilities\": {\n \"sources\": [\n \"mcp.server.capabilities\"\n ],\n \"target\": \"neatlogs.mcp.server.capabilities\"\n }\n },\n \"tool\": {\n \"name\": {\n \"sources\": [\n \"mcp.tool.name\"\n ],\n \"target\": \"neatlogs.mcp.tool.name\"\n },\n \"arguments\": {\n \"sources\": [\n \"mcp.tool.arguments\"\n ],\n \"target\": \"neatlogs.mcp.tool.arguments\"\n }\n },\n \"tools\": {\n \"count\": {\n \"sources\": [\n \"mcp.tools.count\"\n ],\n \"target\": \"neatlogs.mcp.tools.count\"\n },\n \"names\": {\n \"sources\": [\n \"mcp.tools.names\"\n ],\n \"target\": \"neatlogs.mcp.tools.names\"\n }\n }\n },\n \"framework\": {\n \"description\": \"Framework-specific attributes\",\n \"langsmith\": {\n \"model_name\": {\n \"sources\": [\n \"traceloop.association.properties.ls_model_name\"\n ],\n \"target\": \"neatlogs.framework.langsmith.model_name\"\n },\n \"model_type\": {\n \"sources\": [\n \"traceloop.association.properties.ls_model_type\"\n ],\n \"target\": \"neatlogs.framework.langsmith.model_type\"\n },\n \"provider\": {\n \"sources\": [\n \"traceloop.association.properties.ls_provider\"\n ],\n \"target\": \"neatlogs.framework.langsmith.provider\"\n },\n \"temperature\": {\n \"sources\": [\n \"traceloop.association.properties.ls_temperature\"\n ],\n \"target\": \"neatlogs.framework.langsmith.temperature\"\n }\n }\n },\n \"graph\": {\n \"description\": \"Execution Graph / Chain attributes\",\n \"node\": {\n \"name\": {\n \"sources\": [\n \"graph.node.name\",\n \"traceloop.association.properties.langgraph_node\"\n ],\n \"target\": \"neatlogs.graph.node.name\"\n },\n \"id\": {\n \"sources\": [\n \"graph.node.id\"\n ],\n \"target\": \"neatlogs.graph.node.id\"\n },\n \"parent_id\": {\n \"sources\": [\n \"graph.node.parent_id\"\n ],\n \"target\": \"neatlogs.graph.node.parent_id\"\n }\n }\n },\n \"metadata\": {\n \"description\": \"Custom metadata\",\n \"sources\": [\n \"metadata\"\n ],\n \"target\": \"neatlogs.metadata\"\n },\n \"tags\": {\n \"description\": \"Tags array\",\n \"sources\": [\n \"tag.tags\"\n ],\n \"target\": \"neatlogs.tags\"\n },\n \"metrics\": {\n \"description\": \"Performance metrics from OpenLLMetry/OpenLit\",\n \"llm\": {\n \"time_to_first_token\": {\n \"sources\": [\n \"neatlogs.llm.metrics.time_to_first_token\",\n \"gen_ai.server.time_to_first_token\",\n \"llm.time_to_first_token\"\n ],\n \"target\": \"neatlogs.llm.metrics.time_to_first_token\"\n },\n \"streaming_time_to_generate\": {\n \"sources\": [\n \"neatlogs.llm.metrics.streaming_time_to_generate\",\n \"llm.chat_completions.streaming_time_to_generate\"\n ],\n \"target\": \"neatlogs.llm.metrics.streaming_time_to_generate\"\n },\n \"time_per_output_token\": {\n \"sources\": [\n \"neatlogs.llm.metrics.time_per_output_token\",\n \"gen_ai.server.time_per_output_token\"\n ],\n \"target\": \"neatlogs.llm.metrics.time_per_output_token\"\n }\n }\n }\n },\n \"keep_as_is\": {\n \"description\": \"OpenTelemetry standard attributes to keep unchanged\",\n \"attributes\": [\n \"neatlogs.internal\",\n \"http.method\",\n \"http.request.method\",\n \"http.url\",\n \"url.full\",\n \"url.path\",\n \"http.status_code\",\n \"http.response.status_code\",\n \"http.request.body.size\",\n \"http.response.body.size\",\n \"service.name\",\n \"service.version\",\n \"telemetry.sdk.name\",\n \"telemetry.sdk.version\",\n \"telemetry.sdk.language\"\n ]\n },\n \"ignore\": {\n \"description\": \"Attributes to ignore/drop during ingestion\",\n \"patterns\": [\n \"telemetry.distro.*\",\n \"code.*\",\n \"exception.*\"\n ]\n }\n }\n}\n","/**\n * Neatlogs Semantic Conventions - Attribute Mapper\n *\n * Maps vendor-specific attributes to the unified neatlogs.* namespace\n * using configuration from attribute-mapping.json.\n */\n\nimport { getLogger } from '../core/logger.js';\nimport attributeMappingConfig from './attribute-mapping.json';\n\nconst logger = getLogger();\n\ninterface MappingConfig {\n sources: string[] | Record<string, string[]>;\n target?: string;\n indexed?: boolean;\n target_content?: string;\n description?: string;\n priority?: string;\n values?: Record<string, string>;\n mappings?: Record<string, any>;\n [key: string]: any;\n}\n\n/** Flatten sources into a single array of source patterns, regardless of shape. */\nfunction flattenSources(sources: string[] | Record<string, string[]> | undefined): string[] {\n if (!sources) return [];\n if (Array.isArray(sources)) return sources;\n // Object form: { id: [...], name: [...], ... } — flatten all arrays\n const result: string[] = [];\n for (const arr of Object.values(sources)) {\n if (Array.isArray(arr)) {\n result.push(...arr);\n }\n }\n return result;\n}\n\nexport class AttributeMapper {\n private config: Record<string, any>;\n private mappings: Record<string, any>;\n private keepAsIs: Set<string>;\n private ignorePatterns: string[];\n private compiledIgnorePatterns: RegExp[];\n private _regexCache: Map<string, RegExp> = new Map();\n\n constructor(config?: Record<string, any>) {\n this.config = config ?? (attributeMappingConfig as Record<string, any>);\n\n this.mappings = this.config.mappings ?? {};\n // keep_as_is / ignore may live at top-level or inside mappings\n const keepAsIsAttrs =\n this.config.keep_as_is?.attributes ??\n this.mappings.keep_as_is?.attributes ??\n [];\n this.keepAsIs = new Set<string>(keepAsIsAttrs);\n this.ignorePatterns =\n this.config.ignore?.patterns ??\n this.mappings.ignore?.patterns ??\n [];\n // Pre-compile ignore patterns for performance (avoid per-call regex creation)\n this.compiledIgnorePatterns = this.ignorePatterns.map(\n (pattern) => new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$'),\n );\n }\n\n /** Check if an attribute should be ignored. */\n shouldIgnore(attrName: string): boolean {\n for (const regex of this.compiledIgnorePatterns) {\n if (regex.test(attrName)) {\n return true;\n }\n }\n return false;\n }\n\n /** Check if an attribute should be kept unchanged (OTel standard). */\n shouldKeepAsIs(attrName: string): boolean {\n return this.keepAsIs.has(attrName);\n }\n\n /** Extract and normalize span kind from multiple possible sources. */\n mapSpanKind(attributes: Record<string, any>): string {\n const spanKindConfig = this.mappings.span_kind ?? {};\n const sources: string[] = spanKindConfig.sources ?? [];\n const valuesMap: Record<string, string> = spanKindConfig.values ?? {};\n const priority: string = spanKindConfig.priority ?? 'openinference';\n\n let spanKindValue: string | undefined;\n\n if (priority === 'openinference') {\n if ('openinference.span.kind' in attributes) {\n spanKindValue = attributes['openinference.span.kind'];\n }\n } else {\n for (const source of sources) {\n if (source in attributes) {\n spanKindValue = attributes[source];\n break;\n }\n }\n }\n\n // Honor a kind already set directly on the neatlogs namespace by a wrapper\n // (e.g. wrapMastra/strands/openai set `neatlogs.span.kind` = 'AGENT'/'TOOL'/'LLM').\n // Without this the value below gets clobbered to 'unknown' and re-inferred from\n // the span name, which mis-classifies (e.g. 'mastra.agent.*' → vector_store).\n if (!spanKindValue && 'neatlogs.span.kind' in attributes) {\n spanKindValue = attributes['neatlogs.span.kind'];\n }\n\n if (spanKindValue && spanKindValue in valuesMap) {\n return valuesMap[spanKindValue];\n }\n // A pre-set neatlogs kind may already be the normalized lowercase form.\n if (spanKindValue && Object.values(valuesMap).includes(spanKindValue)) {\n return spanKindValue;\n }\n\n // Infer LLM span from attributes\n const isLlmSpan = [\n 'llm.model_name',\n 'gen_ai.request.model',\n 'llm.token_count.prompt',\n 'llm.token_count.completion',\n 'gen_ai.usage.prompt_tokens',\n 'gen_ai.usage.completion_tokens',\n 'neatlogs.llm.model_name',\n 'neatlogs.llm.token_count.prompt',\n 'neatlogs.llm.token_count.completion',\n ].some((key) => key in attributes);\n\n if (isLlmSpan) {\n return 'llm';\n }\n\n return 'unknown';\n }\n\n /** Map a simple attribute from multiple sources to target. */\n mapSimpleAttribute(\n mappingConfig: MappingConfig,\n attributes: Record<string, any>,\n ): any | undefined {\n const sources = flattenSources(mappingConfig.sources);\n for (const source of sources) {\n if (source in attributes) {\n return attributes[source];\n }\n }\n return undefined;\n }\n\n /** Get or create a cached RegExp for a source pattern. */\n private _getPatternRegex(sourcePattern: string): RegExp {\n let cached = this._regexCache.get(sourcePattern);\n if (!cached) {\n let regexPattern = sourcePattern.replace(/\\{i\\}/g, '(\\\\d+)');\n regexPattern = regexPattern.replace(/\\./g, '\\\\.');\n cached = new RegExp('^' + regexPattern + '$');\n this._regexCache.set(sourcePattern, cached);\n }\n return cached;\n }\n\n /** Map indexed attributes like messages (llm.input_messages.0.role). */\n mapIndexedAttributes(\n mappingConfig: MappingConfig,\n attributes: Record<string, any>,\n targetBase: string,\n ): Record<string, any> {\n const mapped: Record<string, any> = {};\n const rawSources = mappingConfig.sources;\n\n if (Array.isArray(rawSources)) {\n // Simple array of source patterns\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n for (const sourcePattern of rawSources) {\n const match = attrName.match(this._getPatternRegex(sourcePattern));\n\n if (match) {\n const index = match[1];\n const target = targetBase.replace(/\\{i\\}/g, index);\n mapped[target] = attrValue;\n }\n }\n }\n } else if (rawSources && typeof rawSources === 'object') {\n // Object form: { field: [sourcePatterns...] }\n // e.g. { id: [\"llm.tool_calls.{i}.id\"], name: [\"llm.tool_calls.{i}.name\"] }\n for (const [field, sourcePatterns] of Object.entries(rawSources)) {\n if (!Array.isArray(sourcePatterns)) continue;\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n for (const sourcePattern of sourcePatterns) {\n const match = attrName.match(this._getPatternRegex(sourcePattern));\n\n if (match) {\n const index = match[1];\n const target = targetBase.replace(/\\{i\\}/g, index) + '.' + field;\n mapped[target] = attrValue;\n }\n }\n }\n }\n }\n\n return mapped;\n }\n\n /** Recursively map nested configuration. */\n mapNestedConfig(\n config: Record<string, any>,\n attributes: Record<string, any>,\n spanKind?: string,\n ): Record<string, any> {\n const mapped: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(config)) {\n if (['description', 'sources', 'target', 'indexed', 'priority', 'values', 'applies_to'].includes(key)) {\n continue;\n }\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n if (Array.isArray(value.applies_to) && spanKind && !value.applies_to.includes(spanKind)) {\n continue;\n }\n if ('sources' in value) {\n if (value.indexed) {\n const target = value.target ?? '';\n const indexedMapped = this.mapIndexedAttributes(value, attributes, target);\n Object.assign(mapped, indexedMapped);\n\n if ('target_content' in value) {\n const contentTarget = value.target_content;\n const contentMapped = this.mapIndexedAttributes(value, attributes, contentTarget);\n Object.assign(mapped, contentMapped);\n }\n } else {\n let target = value.target ?? '';\n if (spanKind && target.includes('{span_kind}')) {\n target = target.replace(/\\{span_kind\\}/g, spanKind);\n }\n\n const result = this.mapSimpleAttribute(value, attributes);\n if (result !== undefined) {\n mapped[target] = result;\n }\n }\n } else {\n const nestedMapped = this.mapNestedConfig(value, attributes, spanKind);\n Object.assign(mapped, nestedMapped);\n }\n }\n }\n\n return mapped;\n }\n\n /** Map all attributes from vendor-specific to neatlogs namespace. */\n mapAttributes(\n attributes: Record<string, any>,\n spanKind?: string,\n ): Record<string, any> {\n const mapped: Record<string, any> = {};\n\n if (!spanKind) {\n spanKind = this.mapSpanKind(attributes);\n }\n mapped['neatlogs.span.kind'] = spanKind;\n\n for (const [sectionName, sectionConfig] of Object.entries(this.mappings)) {\n if (sectionName === 'span_kind' || sectionName === 'keep_as_is' || sectionName === 'ignore') continue;\n\n if (typeof sectionConfig === 'object' && sectionConfig !== null) {\n // Skip sections that don't apply to this span kind\n if (Array.isArray(sectionConfig.applies_to) && spanKind && !sectionConfig.applies_to.includes(spanKind)) {\n continue;\n }\n if ('mappings' in sectionConfig) {\n // Process the explicit 'mappings' sub-key\n const nestedMapped = this.mapNestedConfig(\n sectionConfig.mappings,\n attributes,\n spanKind,\n );\n Object.assign(mapped, nestedMapped);\n // Also process sibling sub-sections (e.g. generic_io, span, tool, etc.)\n for (const [subKey, subVal] of Object.entries(sectionConfig)) {\n if (subKey === 'mappings' || subKey === 'description' || subKey === 'applies_to') continue;\n if (typeof subVal === 'object' && subVal !== null && !Array.isArray(subVal)) {\n if (Array.isArray((subVal as any).applies_to) && spanKind && !(subVal as any).applies_to.includes(spanKind)) {\n continue;\n }\n if ('sources' in subVal) {\n if ((subVal as any).indexed) {\n const target = (subVal as any).target ?? '';\n const indexedMapped = this.mapIndexedAttributes(subVal as MappingConfig, attributes, target);\n Object.assign(mapped, indexedMapped);\n } else if (Array.isArray((subVal as any).sources)) {\n let target = (subVal as any).target ?? '';\n if (spanKind && target.includes('{span_kind}')) {\n target = target.replace(/\\{span_kind\\}/g, spanKind);\n }\n const result = this.mapSimpleAttribute(subVal as MappingConfig, attributes);\n if (result !== undefined) {\n mapped[target] = result;\n }\n }\n } else {\n const subMapped = this.mapNestedConfig(subVal as Record<string, any>, attributes, spanKind);\n Object.assign(mapped, subMapped);\n }\n }\n }\n } else if ('sources' in sectionConfig) {\n let target = sectionConfig.target ?? '';\n if (target.includes('{span_kind}')) {\n target = target.replace(/\\{span_kind\\}/g, spanKind);\n }\n const result = this.mapSimpleAttribute(sectionConfig, attributes);\n if (result !== undefined) {\n mapped[target] = result;\n }\n } else {\n const nestedMapped = this.mapNestedConfig(sectionConfig, attributes, spanKind);\n Object.assign(mapped, nestedMapped);\n }\n }\n }\n\n // Keep OTel standard attributes\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n if (this.shouldKeepAsIs(attrName) && !(attrName in mapped)) {\n mapped[attrName] = attrValue;\n }\n }\n\n // Collect all mapped sources\n const mappedSources = new Set<string>();\n for (const sectionConfig of Object.values(this.mappings)) {\n if (typeof sectionConfig === 'object' && sectionConfig !== null) {\n if ('sources' in sectionConfig) {\n for (const s of flattenSources((sectionConfig as any).sources)) {\n mappedSources.add(s);\n }\n }\n if ('mappings' in sectionConfig) {\n this._collectMappedSources((sectionConfig as any).mappings, mappedSources);\n }\n // Also collect from sibling sub-sections\n for (const [subKey, subVal] of Object.entries(sectionConfig)) {\n if (subKey === 'mappings' || subKey === 'description' || subKey === 'sources') continue;\n if (typeof subVal === 'object' && subVal !== null && !Array.isArray(subVal)) {\n this._collectMappedSources(subVal as Record<string, any>, mappedSources);\n }\n }\n }\n }\n\n // Pass through unmapped, non-ignored attributes\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n if (!mappedSources.has(attrName) && !(attrName in mapped) && !this.shouldIgnore(attrName)) {\n mapped[attrName] = attrValue;\n }\n }\n\n // Remove ignored attributes from final result\n const result: Record<string, any> = {};\n for (const [k, v] of Object.entries(mapped)) {\n if (!this.shouldIgnore(k)) {\n result[k] = v;\n }\n }\n\n return result;\n }\n\n /** Recursively collect all source attribute names from nested config. */\n private _collectMappedSources(config: Record<string, any>, collected: Set<string>): void {\n for (const value of Object.values(config)) {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n if ('sources' in value) {\n for (const s of flattenSources((value as any).sources)) {\n collected.add(s);\n }\n } else {\n this._collectMappedSources(value as Record<string, any>, collected);\n }\n }\n }\n }\n\n /** Get the span kind value mapping. */\n getSpanKindValueMapping(): Record<string, string> {\n return this.mappings.span_kind?.values ?? {};\n }\n\n /** Get the target neatlogs attribute name for a source attribute. */\n getTargetAttributeName(sourceAttr: string, spanKind?: string): string | undefined {\n const searchConfig = (config: Record<string, any>, targetSpanKind?: string): string | undefined => {\n for (const value of Object.values(config)) {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n if ('sources' in value) {\n const sources = flattenSources((value as any).sources);\n if (sources.includes(sourceAttr)) {\n let target = (value as any).target ?? '';\n if (targetSpanKind && target.includes('{span_kind}')) {\n target = target.replace(/\\{span_kind\\}/g, targetSpanKind);\n }\n return target;\n }\n }\n const result = searchConfig(value as Record<string, any>, targetSpanKind);\n if (result) return result;\n }\n }\n return undefined;\n };\n\n return searchConfig(this.mappings, spanKind);\n }\n}\n\n// Singleton instance\nlet _mapperInstance: AttributeMapper | null = null;\n\n/** Get the global AttributeMapper instance. */\nexport function getMapper(): AttributeMapper {\n if (!_mapperInstance) {\n _mapperInstance = new AttributeMapper();\n }\n return _mapperInstance;\n}\n\n/** Convenience function to map attributes using the global mapper. */\nexport function mapAttributes(\n attributes: Record<string, any>,\n spanKind?: string,\n): Record<string, any> {\n return getMapper().mapAttributes(attributes, spanKind);\n}\n","/**\n * A SpanExporter wrapper that filters out spans marked as dropped by the mask system.\n *\n * When NeatlogsSpanProcessor's onEnd() determines a mask returned null (meaning\n * \"drop this span\"), it sets `neatlogs.dropped = true` on the OTel span's attributes.\n * This exporter wrapper checks for that attribute and excludes those spans before\n * delegating to the real exporter.\n */\nimport type { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport type { ExportResult } from '@opentelemetry/core';\n\nexport class FilteringExporter implements SpanExporter {\n constructor(private readonly _delegate: SpanExporter) {}\n\n export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n const filtered = spans.filter(\n (s) => !s.attributes['neatlogs.dropped'] && s.instrumentationLibrary.name !== 'next.js',\n );\n if (filtered.length === 0) {\n // Nothing to export — report success immediately\n resultCallback({ code: 0 });\n return;\n }\n this._delegate.export(filtered, resultCallback);\n }\n\n async shutdown(): Promise<void> {\n return this._delegate.shutdown();\n }\n\n async forceFlush?(): Promise<void> {\n return this._delegate.forceFlush?.();\n }\n}\n","/**\n * NeatlogsExporter — batch HTTP exporter for log spans.\n *\n * Buffers span-like dicts and flushes them in batches to the\n * Neatlogs API at /api/data/v4/batch.\n */\n\nimport { getLogger } from './logger.js';\n\nconst logger = getLogger();\n\nexport interface NeatlogsExporterOptions {\n baseUrl: string;\n apiKey: string;\n batchSize?: number; // default 50\n flushIntervalMs?: number; // default 5000\n disableExport?: boolean;\n}\n\nexport class NeatlogsExporter {\n private baseUrl: string;\n private apiKey: string;\n private batchSize: number;\n private flushIntervalMs: number;\n private disableExport: boolean;\n private buffer: Record<string, any>[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private _shutdown = false;\n\n constructor(options: NeatlogsExporterOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, '');\n this.apiKey = options.apiKey;\n this.batchSize = options.batchSize ?? 50;\n this.flushIntervalMs = options.flushIntervalMs ?? 5000;\n this.disableExport = options.disableExport ?? false;\n\n if (!this.disableExport) {\n this.flushTimer = setInterval(() => this.flush(), this.flushIntervalMs);\n // Don't keep the process alive just for flushing\n if (this.flushTimer.unref) {\n this.flushTimer.unref();\n }\n }\n }\n\n /** Add a span-like dict to the buffer. */\n export(spanData: Record<string, any>): void {\n if (this._shutdown || this.disableExport) return;\n\n this.buffer.push(spanData);\n\n if (this.buffer.length >= this.batchSize) {\n this.flush().catch((err) => {\n logger.warn(`Failed to flush batch: ${err}`);\n });\n }\n }\n\n /** Flush all buffered spans to the API. */\n async flush(): Promise<void> {\n if (this.disableExport || this.buffer.length === 0) return;\n\n const batch = this.buffer.splice(0, this.buffer.length);\n\n try {\n const url = `${this.baseUrl}/api/data/v4/batch`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n },\n body: JSON.stringify({ spans: batch }),\n });\n\n if (!response.ok) {\n logger.warn(\n `Failed to export batch: ${response.status} ${response.statusText}`,\n );\n this._requeueBatch(batch);\n } else {\n logger.debug(`Exported ${batch.length} log spans`);\n }\n } catch (err) {\n logger.warn(`Failed to export batch: ${err}`);\n this._requeueBatch(batch);\n }\n }\n\n /** Re-insert a failed batch into the buffer for retry, up to a limit. */\n private _requeueBatch(batch: Record<string, any>[]): void {\n if (this.buffer.length < this.batchSize * 3) {\n this.buffer.unshift(...batch);\n }\n }\n\n /** Shutdown the exporter, flushing remaining items. */\n async shutdown(): Promise<void> {\n this._shutdown = true;\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.flush();\n }\n}\n","/**\n * NeatlogsLogExporter — bridges OTel LogRecord to NeatlogsExporter.\n *\n * Converts OTel log records into span-like dicts and forwards them\n * to the NeatlogsExporter for batch export.\n *\n * Also supports NEATLOGS_LOG_LOGS / NEATLOGS_LOG_LOGS_FILE env vars\n * for writing log records to a local file (mirrors Python SDK behavior).\n */\n\nimport * as crypto from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { ReadableLogRecord } from '@opentelemetry/sdk-logs';\nimport type { ExportResult } from '@opentelemetry/core';\nimport { ExportResultCode } from '@opentelemetry/core';\nimport type { LogRecordExporter } from '@opentelemetry/sdk-logs';\nimport { NeatlogsExporter } from './exporter.js';\nimport { getLogger } from './logger.js';\n\nconst logger = getLogger();\n\nexport class NeatlogsLogExporter implements LogRecordExporter {\n private exporter: NeatlogsExporter;\n private logFileHandle: number | null = null;\n private logEnabled: boolean;\n\n constructor(exporter: NeatlogsExporter) {\n this.exporter = exporter;\n\n this.logEnabled = ['1', 'true', 'yes'].includes(\n (process.env.NEATLOGS_LOG_LOGS ?? '').toLowerCase(),\n );\n const logFile = process.env.NEATLOGS_LOG_LOGS_FILE ?? '';\n\n if (this.logEnabled && logFile) {\n const filePath = path.resolve(process.cwd(), logFile);\n try {\n this.logFileHandle = fs.openSync(filePath, 'a');\n logger.info(`Log record logging enabled: ${filePath}`);\n } catch (err) {\n logger.warn(`Failed to open log file ${filePath}: ${err}`);\n }\n }\n }\n\n export(\n logRecords: ReadableLogRecord[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n try {\n for (const record of logRecords) {\n const spanDict = this._convertLogRecord(record);\n this.exporter.export(spanDict);\n this._writeToFile(record, spanDict);\n }\n resultCallback({ code: ExportResultCode.SUCCESS });\n } catch (err) {\n logger.warn(`Failed to export log records: ${err}`);\n resultCallback({ code: ExportResultCode.FAILED });\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.logFileHandle !== null) {\n fs.closeSync(this.logFileHandle);\n this.logFileHandle = null;\n }\n }\n\n async forceFlush(): Promise<void> {\n await this.exporter.flush();\n }\n\n private _writeToFile(record: ReadableLogRecord, spanDict: Record<string, any>): void {\n if (!this.logEnabled || this.logFileHandle === null) return;\n\n const entry: Record<string, any> = {\n trace_id: spanDict.trace_id || '',\n span_id: spanDict.span_id || '',\n body: spanDict.attributes?.['log.message'] ?? '',\n severity: record.severityText ?? '',\n template: spanDict.attributes?.['log.template'] ?? '',\n timestamp: spanDict.start_time,\n };\n\n fs.writeSync(this.logFileHandle, JSON.stringify(entry) + '\\n');\n }\n\n private _convertLogRecord(record: ReadableLogRecord): Record<string, any> {\n const attributes: Record<string, any> = { ...(record.attributes ?? {}) };\n\n if (record.body !== undefined && record.body !== null) {\n attributes['log.message'] = String(record.body);\n }\n\n attributes['openinference.span.kind'] = 'LOG';\n attributes['neatlogs.span.kind'] = 'log';\n\n return {\n name: attributes['log.template'] ?? 'log',\n kind: 'LOG',\n trace_id: record.spanContext?.traceId ?? '',\n span_id: crypto.randomBytes(8).toString('hex'),\n parent_span_id: record.spanContext?.spanId ?? '',\n start_time: record.hrTime ? this._hrTimeToIso(record.hrTime) : new Date().toISOString(),\n end_time: record.hrTime ? this._hrTimeToIso(record.hrTime) : new Date().toISOString(),\n status: 'OK',\n attributes,\n };\n }\n\n private _hrTimeToIso(hrTime: [number, number]): string {\n const ms = hrTime[0] * 1000 + hrTime[1] / 1_000_000;\n return new Date(ms).toISOString();\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context, createContextKey } from '@opentelemetry/api';\n\nconst SUPPRESS_TRACING_KEY = createContextKey(\n 'OpenTelemetry SDK Context Key SUPPRESS_TRACING'\n);\n\nexport function suppressTracing(context: Context): Context {\n return context.setValue(SUPPRESS_TRACING_KEY, true);\n}\n\nexport function unsuppressTracing(context: Context): Context {\n return context.deleteValue(SUPPRESS_TRACING_KEY);\n}\n\nexport function isTracingSuppressed(context: Context): boolean {\n return context.getValue(SUPPRESS_TRACING_KEY) === true;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport interface ExportResult {\n code: ExportResultCode;\n error?: Error;\n}\n\nexport enum ExportResultCode {\n SUCCESS,\n FAILED,\n}\n","/**\n * Structured logging for Neatlogs traces.\n *\n * The log() function captures timestamped steps within a trace,\n * emitting OTel LogRecords that are associated with the active span.\n */\n\nimport { context, trace } from '@opentelemetry/api';\nimport { getLogger } from './logger.js';\n\nconst logger = getLogger();\n\n// Module-level reference to the OTel Logger, set during init()\nlet _otelLogger: any = null;\nlet _debugMode = false;\n\n/**\n * Set the OTel logger instance. Called by init().\n * @internal\n */\nexport function _setOtelLogger(otelLogger: any, debug: boolean): void {\n _otelLogger = otelLogger;\n _debugMode = debug;\n}\n\n/**\n * Capture a timestamped log step within the current trace.\n *\n * @param msgTemplate - Message template with {key} placeholders\n * @param options - Optional key-value pairs for template rendering and attributes\n *\n * @example\n * ```typescript\n * log('Processing query: {query}', { query: 'What is TypeScript?', level: 'info' });\n * ```\n */\nexport function log(\n msgTemplate: string,\n options?: Record<string, any>,\n): void {\n const { level = 'info', ...variables } = options ?? {};\n\n // Render template\n let rendered = msgTemplate;\n for (const [key, value] of Object.entries(variables)) {\n rendered = rendered.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), String(value));\n }\n\n // Echo to console in debug mode\n if (_debugMode) {\n console.log(`[neatlogs:log] ${rendered}`);\n }\n\n // Emit OTel LogRecord if logger is available\n if (_otelLogger) {\n const activeSpan = trace.getSpan(context.active());\n const spanContext = activeSpan?.spanContext();\n\n const attributes: Record<string, any> = {\n 'log.template': msgTemplate,\n 'log.level': level,\n };\n\n // Add template variables as log.{key} attributes\n for (const [key, value] of Object.entries(variables)) {\n attributes[`log.${key}`] = String(value);\n }\n\n try {\n _otelLogger.emit({\n body: rendered,\n attributes,\n ...(spanContext ? { spanContext } : {}),\n });\n } catch (err) {\n logger.warn(`Failed to emit log record: ${err}`);\n }\n }\n}\n\n/**\n * Capture stdout (console.log) within a callback and route to OTel logger.\n *\n * @param fn - The function to execute while capturing stdout\n * @returns The return value of fn\n */\nexport async function captureStdout<T>(fn: () => T | Promise<T>): Promise<T> {\n if (!_otelLogger) {\n return fn();\n }\n\n const originalLog = console.log;\n const activeSpan = trace.getSpan(context.active());\n const spanContext = activeSpan?.spanContext();\n\n console.log = (...args: any[]) => {\n // Still output to console\n originalLog.apply(console, args);\n\n // Also emit as OTel log record\n const message = args.map((a) => (typeof a === 'string' ? a : JSON.stringify(a))).join(' ');\n try {\n _otelLogger.emit({\n body: message,\n attributes: {\n 'log.source': 'stdout',\n 'log.level': 'info',\n },\n ...(spanContext ? { spanContext } : {}),\n });\n } catch {\n // Ignore errors in log capture\n }\n };\n\n try {\n return await fn();\n } finally {\n console.log = originalLog;\n }\n}\n","/**\n * Registry of available instrumentations for the TypeScript SDK.\n *\n * Ported from Python: neatlogs/instrumentation/registry.py\n *\n * Each library entry specifies which instrumentation packages are available:\n * - openinference: @arizeai/openinference-instrumentation-* npm package (or null)\n * - openllmetry: OpenTelemetry contrib package (or null — not used in TS SDK)\n * - neatlogs: custom instrumentor module path relative to instrumentation dir (or null)\n * - default_span_kind: the default span kind for this library\n */\n\n/**\n * Information about a single library's instrumentation options.\n */\nexport interface LibraryInfo {\n openinference: string | null;\n openllmetry: string | null;\n neatlogs: string | null;\n default_span_kind: string;\n auto_load?: string[];\n /** npm package name for eager patching (used when OTel hooks don't fire) */\n npm_package?: string;\n}\n\n/**\n * Shape of the instrumentation registry.\n */\nexport interface InstrumentationRegistryShape {\n tags: Record<string, string[]>;\n libraries: Record<string, LibraryInfo>;\n}\n\nexport const INSTRUMENTATION_REGISTRY: InstrumentationRegistryShape = {\n tags: {\n llm: [\n 'azure_ai_inference',\n 'openai',\n 'anthropic',\n 'cohere',\n 'bedrock',\n 'groq',\n 'together',\n 'vertexai',\n 'google_generativeai',\n 'mistralai',\n 'ollama',\n 'watsonx',\n 'alephalpha',\n 'replicate',\n 'sagemaker',\n 'huggingface_hub',\n 'litellm',\n 'google_genai',\n 'portkey',\n 'ai_sdk',\n ],\n embedding: ['openai', 'cohere', 'huggingface', 'vertexai', 'mistralai', 'ollama'],\n retrieval: [\n 'chromadb',\n 'pinecone',\n 'weaviate',\n 'qdrant',\n 'milvus',\n 'opensearch',\n 'elasticsearch',\n 'redis',\n 'marqo',\n ],\n agent: [\n 'langchain',\n 'langgraph',\n 'llamaindex',\n 'crewai',\n 'mastra',\n 'autogen',\n 'haystack',\n 'dspy',\n 'agno',\n 'beeai',\n 'openai_agents',\n 'pydantic_ai',\n 'smolagents',\n 'strands',\n 'pipecat',\n 'ai_sdk',\n ],\n tool: ['langchain', 'llamaindex', 'haystack', 'mcp'],\n http: ['requests', 'httpx', 'urllib3', 'aiohttp'],\n framework: ['instructor', 'guardrails', 'promptflow', 'google_adk'],\n },\n libraries: {\n azure_ai_inference: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n ai_sdk: {\n openinference: null,\n openllmetry: null,\n // The wrapper is opt-in per call site; init({ instrumentations: ['ai_sdk'] })\n // is a no-op. This registry entry exists so scope detection and tagging stay\n // consistent with other LLM/agent libraries.\n neatlogs: '@neatlogs/instrumentation-ai-sdk',\n default_span_kind: 'LLM',\n },\n openai: {\n openinference: '@arizeai/openinference-instrumentation-openai',\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n npm_package: 'openai',\n },\n anthropic: {\n openinference: '@arizeai/openinference-instrumentation-anthropic',\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n npm_package: '@anthropic-ai/sdk',\n },\n cohere: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n bedrock: {\n openinference: '@arizeai/openinference-instrumentation-bedrock',\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n groq: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n together: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n vertexai: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n google_generativeai: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n mistralai: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n ollama: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n watsonx: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n alephalpha: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n replicate: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n sagemaker: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n huggingface_hub: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n litellm: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n langchain: {\n openinference: '@arizeai/openinference-instrumentation-langchain',\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'CHAIN',\n npm_package: '@langchain/core/callbacks/manager',\n },\n langgraph: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'WORKFLOW',\n },\n llamaindex: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'CHAIN',\n },\n crewai: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n auto_load: ['litellm'],\n },\n mastra: {\n openinference: null,\n openllmetry: null,\n neatlogs: '@neatlogs/instrumentation-mastra',\n default_span_kind: 'AGENT',\n },\n autogen: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n haystack: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'CHAIN',\n },\n dspy: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'CHAIN',\n },\n requests: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'TOOL',\n },\n httpx: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'TOOL',\n },\n urllib3: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'TOOL',\n },\n aiohttp: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'TOOL',\n },\n chromadb: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n pinecone: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n weaviate: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n qdrant: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n milvus: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n opensearch: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n elasticsearch: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n redis: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n marqo: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'RETRIEVER',\n },\n instructor: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'CHAIN',\n },\n guardrails: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'GUARDRAIL',\n },\n google_genai: {\n openinference: null,\n openllmetry: null,\n neatlogs: '@neatlogs/instrumentation-google-genai',\n default_span_kind: 'LLM',\n npm_package: '@google/genai',\n },\n google_adk: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'CHAIN',\n },\n agno: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n beeai: {\n openinference: '@arizeai/openinference-instrumentation-beeai',\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n openai_agents: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n pydantic_ai: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n smolagents: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n strands: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n pipecat: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n portkey: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'LLM',\n },\n promptflow: {\n openinference: null,\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'CHAIN',\n },\n mcp: {\n openinference: '@arizeai/openinference-instrumentation-mcp',\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'TOOL',\n },\n claude_agent_sdk: {\n openinference: '@arizeai/openinference-instrumentation-claude-agent-sdk',\n openllmetry: null,\n neatlogs: null,\n default_span_kind: 'AGENT',\n },\n },\n};\n\n/**\n * Get list of library names for a given semantic tag.\n *\n * @param tag - Semantic tag (e.g., \"llm\", \"agent\", \"http\")\n * @returns List of library names matching the tag\n */\nexport function getLibrariesByTag(tag: string): string[] {\n return INSTRUMENTATION_REGISTRY.tags[tag] ?? [];\n}\n\n/**\n * Get instrumentation info for a specific library.\n *\n * @param library - Library name (e.g., \"openai\", \"langchain\")\n * @returns Library info object or undefined if not found\n */\nexport function getLibraryInfo(library: string): LibraryInfo | undefined {\n return INSTRUMENTATION_REGISTRY.libraries[library];\n}\n","/**\n * InstrumentationManager — auto-discover and instrument libraries.\n *\n * Ported from Python: neatlogs/instrumentation/manager.py\n *\n * Priority order for each library:\n * 1. neatlogs custom instrumentor (if available)\n * 2. OpenInference (primary — rich semantic attributes)\n * 3. Skip — no instrumentor available\n */\n\nimport type { TracerProvider } from '@opentelemetry/api';\nimport { getLogger } from '../core/logger.js';\nimport { getLibraryInfo } from './registry.js';\n\nconst logger = getLogger();\n\nexport interface InstrumentationManagerOptions {\n provider: TracerProvider;\n debug?: boolean;\n}\n\nexport class InstrumentationManager {\n private provider: TracerProvider;\n private _instrumented: string[] = [];\n\n constructor(options: InstrumentationManagerOptions) {\n this.provider = options.provider;\n }\n\n /** Get list of successfully instrumented libraries. */\n get instrumented(): string[] {\n return [...this._instrumented];\n }\n\n /**\n * Instrument the specified libraries.\n * Priority: neatlogs custom > OpenInference > skip\n */\n async instrument(libraries: string[]): Promise<void> {\n for (const lib of libraries) {\n const info = getLibraryInfo(lib);\n if (!info) {\n logger.warn(\n `Unknown library '${lib}' — not in instrumentation registry. Skipping.`,\n );\n continue;\n }\n\n // Try neatlogs custom instrumentor first\n if (info.neatlogs) {\n try {\n const mod = await import(info.neatlogs);\n // When importing a CJS package from ESM, mod.default may be the\n // CJS namespace object (an object, not a function). Prefer a\n // function export explicitly to avoid picking the wrong value.\n const InstrumentorClass =\n (typeof mod.default === 'function' ? mod.default : undefined) ??\n Object.values(mod).find(\n (v: unknown) =>\n typeof v === 'function' &&\n (v as { prototype?: { instrument?: unknown } }).prototype\n ?.instrument,\n ) ??\n (typeof mod[Object.keys(mod)[0]] === 'function' ? mod[Object.keys(mod)[0]] : undefined);\n if (InstrumentorClass && typeof InstrumentorClass === 'function') {\n const instrumentor = new (InstrumentorClass as new () => any)();\n if (typeof instrumentor.instrument === 'function') {\n instrumentor.instrument({ tracerProvider: this.provider });\n this._instrumented.push(lib);\n logger.debug(\n `Instrumented '${lib}' via neatlogs custom instrumentor`,\n );\n continue;\n }\n if (typeof instrumentor.setTracerProvider === 'function' && typeof instrumentor.enable === 'function') {\n instrumentor.setTracerProvider(this.provider);\n instrumentor.enable();\n // Eagerly patch target module for ESM environments where\n // OTel module hooks don't fire (e.g. tsx, dynamic imports)\n if (typeof instrumentor.patchEager === 'function' && info.npm_package) {\n try {\n const targetMod = await import(info.npm_package);\n instrumentor.patchEager(targetMod);\n } catch (e) {\n logger.debug(\n `Eager patch for '${lib}' skipped — ${info.npm_package} not available: ${e}`,\n );\n }\n }\n this._instrumented.push(lib);\n logger.debug(\n `Instrumented '${lib}' via neatlogs OTel instrumentor`,\n );\n continue;\n }\n }\n logger.debug(\n `neatlogs instrumentor for '${lib}' loaded but has no instrument() method — trying OpenInference`,\n );\n } catch (err) {\n logger.debug(\n `neatlogs instrumentor for '${lib}' failed to load: ${err} — trying OpenInference`,\n );\n }\n }\n\n // Try OpenInference instrumentor\n if (info.openinference) {\n try {\n const mod = await import(info.openinference);\n // OpenInference instrumentors export a class like LangChainInstrumentation, OpenAIInstrumentation\n const InstrumentorClass =\n mod.default ??\n Object.values(mod).find(\n (v: unknown) =>\n typeof v === 'function' &&\n (v as { prototype?: Record<string, unknown> }).prototype &&\n ('instrument' in (v as { prototype: Record<string, unknown> }).prototype ||\n 'manuallyInstrument' in (v as { prototype: Record<string, unknown> }).prototype),\n );\n if (InstrumentorClass && typeof InstrumentorClass === 'function') {\n const instrumentor = new (InstrumentorClass as new () => any)();\n // Pattern 1: instrument({ tracerProvider })\n if (typeof instrumentor.instrument === 'function') {\n instrumentor.instrument({ tracerProvider: this.provider });\n this._instrumented.push(lib);\n logger.debug(`Instrumented '${lib}' via OpenInference`);\n continue;\n }\n // Pattern 2: setTracerProvider + manuallyInstrument (OpenInference ESM pattern)\n if (typeof instrumentor.setTracerProvider === 'function' &&\n typeof instrumentor.manuallyInstrument === 'function') {\n instrumentor.setTracerProvider(this.provider);\n if (info.npm_package) {\n try {\n const targetMod = await import(info.npm_package);\n instrumentor.manuallyInstrument(targetMod);\n this._instrumented.push(lib);\n logger.debug(`Instrumented '${lib}' via OpenInference (manual patch)`);\n continue;\n } catch (importErr) {\n logger.debug(\n `Could not import '${info.npm_package}' for manual instrumentation of '${lib}': ${importErr}`,\n );\n }\n }\n // No npm_package or import failed — still mark as instrumented\n // since setTracerProvider was called (Node module hooks may still fire for CJS)\n this._instrumented.push(lib);\n logger.debug(`Instrumented '${lib}' via OpenInference (tracer set, awaiting module hook)`);\n continue;\n }\n }\n // Some OpenInference packages export an instrumentor function directly\n if (\n typeof (mod as { instrument?: unknown }).instrument === 'function'\n ) {\n (mod as { instrument: (opts: { tracerProvider: TracerProvider }) => void }).instrument({\n tracerProvider: this.provider,\n });\n this._instrumented.push(lib);\n logger.debug(`Instrumented '${lib}' via OpenInference`);\n continue;\n }\n logger.warn(\n `OpenInference package for '${lib}' loaded but could not find instrumentor class`,\n );\n } catch (err) {\n logger.debug(\n `OpenInference instrumentor for '${lib}' not available: ${err}`,\n );\n }\n }\n\n // No instrumentor available\n if (!info.openinference && !info.neatlogs) {\n logger.debug(\n `'${lib}' instrumentation not yet available for TypeScript — skipping`,\n );\n }\n }\n\n if (this._instrumented.length > 0) {\n logger.info(`Instrumented: ${this._instrumented.join(', ')}`);\n }\n }\n}\n","import { context } from '@opentelemetry/api';\nimport { suppressTracing } from '@opentelemetry/core';\nimport type { CachedPrompt, PromptMessage } from '../types.js';\n\n// ---------------------------------------------------------------------------\n// Error classes\n// ---------------------------------------------------------------------------\n\n/** Base exception for prompt client failures. */\nexport class PromptClientError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'PromptClientError';\n }\n}\n\n/** Raised when the backend returns an API error. */\nexport class PromptApiError extends PromptClientError {\n constructor(message: string) {\n super(message);\n this.name = 'PromptApiError';\n }\n}\n\n/** Raised when a prompt/label/version is not found. */\nexport class PromptNotFoundError extends PromptClientError {\n constructor(message: string) {\n super(message);\n this.name = 'PromptNotFoundError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Template rendering helper\n// ---------------------------------------------------------------------------\n\nconst PLACEHOLDER_PATTERN = /\\{\\{\\s*([A-Za-z0-9_.-]+)\\s*\\}\\}/g;\n\n/**\n * Replace `{{key}}` placeholders in a template string with the corresponding\n * values from the provided variables map. Unknown placeholders are left as-is.\n */\nexport function renderTemplate(template: string, variables: Record<string, any>): string {\n return template.replace(PLACEHOLDER_PATTERN, (full, key: string) => {\n return key in variables ? String(variables[key]) : full;\n });\n}\n\n// ---------------------------------------------------------------------------\n// Normalize raw API response → CachedPrompt\n// ---------------------------------------------------------------------------\n\n/** Normalize a raw API response object into a well-typed {@link CachedPrompt}. */\nexport function normalizePromptObject(raw: Record<string, any>): CachedPrompt {\n // Messages\n let messages: PromptMessage[] | null = null;\n const rawMessages = raw['messages'];\n if (Array.isArray(rawMessages)) {\n const messageList: PromptMessage[] = [];\n for (const item of rawMessages) {\n if (item && typeof item === 'object') {\n messageList.push({\n role: String(item['role'] ?? 'system'),\n content: String(item['content'] ?? ''),\n });\n }\n }\n if (messageList.length > 0) {\n messages = messageList;\n }\n }\n\n // Labels\n let labels: string[] = [];\n const rawLabels = raw['labels'];\n if (Array.isArray(rawLabels)) {\n labels = rawLabels.filter((l) => String(l).trim()).map(String);\n }\n\n // Config\n let config: Record<string, any> = {};\n if (raw['config'] && typeof raw['config'] === 'object' && !Array.isArray(raw['config'])) {\n config = { ...raw['config'] };\n }\n\n // Scalar fields\n const content: string | null = typeof raw['content'] === 'string' ? raw['content'] : null;\n const id: string = typeof raw['id'] === 'string' ? raw['id'] : '';\n const name: string = typeof raw['name'] === 'string' ? raw['name'] : '';\n\n let version = 0;\n try {\n if (raw['version'] != null) {\n version = Number(raw['version']) || 0;\n }\n } catch {\n version = 0;\n }\n\n let updatedAt: string = '';\n if (typeof raw['updatedAt'] === 'string') {\n updatedAt = raw['updatedAt'];\n } else if (typeof raw['updated_at'] === 'string') {\n updatedAt = raw['updated_at'];\n }\n\n let type: 'text' | 'chat' = 'text';\n if (raw['type'] === 'chat') {\n type = 'chat';\n }\n\n return { id, name, version, content, messages, config, labels, updatedAt, type };\n}\n\n// ---------------------------------------------------------------------------\n// PromptHandle\n// ---------------------------------------------------------------------------\n\n/**\n * Compiled prompt handle returned by {@link PromptClient.getPrompt}.\n */\nexport class PromptHandle {\n private readonly _prompt: CachedPrompt;\n\n constructor(prompt: CachedPrompt) {\n this._prompt = prompt;\n }\n\n get id(): string {\n return this._prompt.id;\n }\n get name(): string {\n return this._prompt.name;\n }\n get version(): number {\n return this._prompt.version;\n }\n get content(): string | null {\n return this._prompt.content;\n }\n get messages(): PromptMessage[] | null {\n return this._prompt.messages ? [...this._prompt.messages] : null;\n }\n get config(): Record<string, any> {\n return { ...this._prompt.config };\n }\n get labels(): string[] {\n return [...this._prompt.labels];\n }\n get updatedAt(): string {\n return this._prompt.updatedAt;\n }\n get type(): string {\n return this._prompt.type;\n }\n\n /**\n * Compile string content with `{{variable}}` replacement.\n *\n * If the prompt has `content`, renders it directly.\n * If it only has `messages`, renders and joins all message contents.\n */\n compile(variables?: Record<string, any>): string {\n const vars = variables ?? {};\n\n if (this._prompt.content) {\n return renderTemplate(this._prompt.content, vars);\n }\n\n if (this._prompt.messages) {\n const rendered = this._prompt.messages\n .map((msg) => renderTemplate(msg.content ?? '', vars))\n .filter(Boolean);\n return rendered.join('\\n\\n');\n }\n\n return '';\n }\n\n /**\n * Compile message list with `{{variable}}` replacement.\n *\n * If no messages exist, returns a single synthetic system message from content.\n */\n compileMessages(variables?: Record<string, any>): PromptMessage[] {\n const vars = variables ?? {};\n\n if (this._prompt.messages) {\n return this._prompt.messages.map((msg) => ({\n role: String(msg.role ?? 'system'),\n content: renderTemplate(String(msg.content ?? ''), vars),\n }));\n }\n\n return [\n {\n role: 'system',\n content: renderTemplate(this._prompt.content ?? '', vars),\n },\n ];\n }\n}\n\n// ---------------------------------------------------------------------------\n// PromptClient\n// ---------------------------------------------------------------------------\n\nexport interface PromptClientOptions {\n baseUrl: string;\n apiKey: string;\n}\n\n/**\n * Prompt client for Neatlogs managed prompts.\n *\n * Fetches prompts on-demand from the backend.\n * Uses an in-memory cache to avoid redundant HTTP calls.\n */\nexport class PromptClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly _cache: Map<string, CachedPrompt> = new Map();\n\n constructor(options: PromptClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.apiKey = options.apiKey;\n }\n\n // ---- public API ----------------------------------------------------------\n\n /**\n * Get a prompt by name, optionally pinned to a version or label.\n * Results are cached in memory by cache key.\n */\n async getPrompt(\n name: string,\n options?: { version?: number; label?: string },\n ): Promise<PromptHandle> {\n const version = options?.version;\n const label = options?.label;\n\n if (label != null && version != null) {\n throw new PromptClientError('Cannot specify both label and version.');\n }\n\n const cacheKey = `${name}:${label ?? ''}:${version ?? ''}`;\n const cached = this._cache.get(cacheKey);\n if (cached) {\n return new PromptHandle(cached);\n }\n\n const handle = await this.fetchPrompt(name, options);\n this._cache.set(cacheKey, {\n id: handle.id,\n name: handle.name,\n version: handle.version,\n content: handle.content,\n messages: handle.messages,\n config: handle.config,\n labels: handle.labels,\n updatedAt: handle.updatedAt,\n type: handle.type as 'text' | 'chat',\n });\n return handle;\n }\n\n /**\n * Always fetch from the API (bypasses cache).\n */\n async fetchPrompt(\n name: string,\n options?: { version?: number; label?: string },\n ): Promise<PromptHandle> {\n const version = options?.version;\n const label = options?.label;\n\n if (label != null) {\n const path = `/api/v1/prompts/${encodeURIComponent(name)}/fetch`;\n const url = `${path}?label=${encodeURIComponent(label)}`;\n const payload = await this._request(url);\n return new PromptHandle(normalizePromptObject(payload));\n }\n\n // List all versions, find the right one\n const listing = await this._request(\n `/api/managed-prompts?name=${encodeURIComponent(name)}&limit=100&offset=0`,\n );\n const items: Record<string, any>[] = listing['items'] ?? [];\n\n if (items.length === 0) {\n throw new PromptNotFoundError(`No versions found for prompt '${name}'`);\n }\n\n if (version != null) {\n const match = items.find((item) => item['version'] === version);\n if (!match) {\n throw new PromptNotFoundError(`Prompt '${name}' version ${version} not found`);\n }\n return new PromptHandle(normalizePromptObject(match));\n }\n\n // Default: most recently created version\n const latest = items.reduce((a, b) => {\n const aDate = a['createdAt'] ?? a['created_at'] ?? '';\n const bDate = b['createdAt'] ?? b['created_at'] ?? '';\n return String(aDate) >= String(bDate) ? a : b;\n });\n return new PromptHandle(normalizePromptObject(latest));\n }\n\n /**\n * List all prompts.\n */\n async listPrompts(): Promise<PromptHandle[]> {\n const payload = await this._request('/api/managed-prompts?limit=100&offset=0');\n const items: Record<string, any>[] = payload['items'] ?? [];\n return items.map((item) => new PromptHandle(normalizePromptObject(item)));\n }\n\n /**\n * Create a new prompt.\n */\n async createPrompt(data: {\n name: string;\n content?: string;\n messages?: PromptMessage[];\n config?: Record<string, any>;\n labels?: string[];\n }): Promise<PromptHandle> {\n const body: Record<string, any> = { name: data.name };\n if (data.content !== undefined) body['content'] = data.content;\n if (data.messages !== undefined) {\n body['messages'] = data.messages;\n body['type'] = 'chat';\n } else {\n body['type'] = 'text';\n }\n if (data.config !== undefined) body['config'] = data.config;\n if (data.labels !== undefined) body['labels'] = data.labels;\n\n const payload = await this._request('/api/managed-prompts', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n const promptData = payload['prompt'] ?? payload;\n return new PromptHandle(normalizePromptObject(promptData));\n }\n\n /**\n * Update an existing prompt.\n */\n async updatePrompt(\n name: string,\n data: {\n content?: string;\n messages?: PromptMessage[];\n config?: Record<string, any>;\n labels?: string[];\n },\n ): Promise<PromptHandle> {\n const body: Record<string, any> = { name };\n if (data.content !== undefined) body['content'] = data.content;\n if (data.messages !== undefined) body['messages'] = data.messages;\n if (data.config !== undefined) body['config'] = data.config;\n if (data.labels !== undefined) body['labels'] = data.labels;\n\n const payload = await this._request(`/api/managed-prompts`, {\n method: 'PUT',\n body: JSON.stringify(body),\n });\n\n const promptData = payload['prompt'] ?? payload;\n return new PromptHandle(normalizePromptObject(promptData));\n }\n\n /**\n * Delete a prompt by name.\n */\n async deletePrompt(name: string): Promise<void> {\n await this._request(`/api/managed-prompts/${encodeURIComponent(name)}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Remove a tag from a prompt.\n */\n async removeTag(name: string, tag: string): Promise<void> {\n await this._request(`/api/managed-prompts/${encodeURIComponent(name)}/tags`, {\n method: 'DELETE',\n body: JSON.stringify({ tag }),\n });\n }\n\n /**\n * Save the current prompt content as a new version, optionally with a label.\n */\n async saveAsVersion(\n name: string,\n options?: { label?: string },\n ): Promise<PromptHandle> {\n const body: Record<string, any> = { promptName: name };\n if (options?.label) body['labels'] = [options.label];\n\n const payload = await this._request('/api/prompt-playground/save-as-version', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n const promptData = payload['prompt'] ?? payload;\n return new PromptHandle(normalizePromptObject(promptData));\n }\n\n // ---- internal ------------------------------------------------------------\n\n /**\n * Internal fetch wrapper with auth headers and OTel suppression.\n */\n async _request(path: string, options?: RequestInit): Promise<any> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n 'x-api-key': this.apiKey,\n ...(options?.headers as Record<string, string> | undefined),\n };\n\n const fetchOptions: RequestInit = {\n method: options?.method ?? 'GET',\n headers,\n body: options?.body,\n };\n\n // Suppress OTel instrumentation on our own HTTP calls so they don't\n // create noisy child spans under the user's traces.\n let response: Response;\n try {\n const suppressedContext = suppressTracing(context.active());\n response = await context.with(suppressedContext, () => fetch(url, fetchOptions));\n } catch {\n // If OTel is not available, fall through to plain fetch\n response = await fetch(url, fetchOptions);\n }\n\n if (!response.ok) {\n const body = await response.text().catch(() => '<unavailable>');\n throw new PromptApiError(\n `${fetchOptions.method} ${path} failed (${response.status}): ${body.slice(0, 400)}`,\n );\n }\n\n try {\n return await response.json();\n } catch {\n throw new PromptApiError(`${fetchOptions.method} ${path} returned non-JSON response`);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level shared client (set by init())\n// ---------------------------------------------------------------------------\n\nlet _sharedClient: PromptClient | null = null;\n\n/** Set the module-level shared prompt client (called by init()). */\nexport function setSharedClient(client: PromptClient): void {\n _sharedClient = client;\n}\n\n/** Get the module-level shared prompt client. Throws if not initialized. */\nexport function getSharedClient(): PromptClient {\n if (!_sharedClient) {\n throw new PromptClientError(\n 'No prompt client available. Call neatlogs.init(apiKey: ...) or setSharedClient() first.',\n );\n }\n return _sharedClient;\n}\n\n// ---------------------------------------------------------------------------\n// Module-level convenience functions that delegate to shared client\n// ---------------------------------------------------------------------------\n\nexport async function getPrompt(\n name: string,\n options?: { version?: number; label?: string },\n): Promise<PromptHandle> {\n return getSharedClient().getPrompt(name, options);\n}\n\nexport async function fetchPrompt(\n name: string,\n options?: { version?: number; label?: string },\n): Promise<PromptHandle> {\n return getSharedClient().fetchPrompt(name, options);\n}\n\nexport async function listPrompts(): Promise<PromptHandle[]> {\n return getSharedClient().listPrompts();\n}\n\nexport async function createPrompt(data: {\n name: string;\n content?: string;\n messages?: PromptMessage[];\n config?: Record<string, any>;\n labels?: string[];\n}): Promise<PromptHandle> {\n return getSharedClient().createPrompt(data);\n}\n\nexport async function updatePrompt(\n name: string,\n data: {\n content?: string;\n messages?: PromptMessage[];\n config?: Record<string, any>;\n labels?: string[];\n },\n): Promise<PromptHandle> {\n return getSharedClient().updatePrompt(name, data);\n}\n\nexport async function saveAsVersion(\n name: string,\n options?: { label?: string },\n): Promise<PromptHandle> {\n return getSharedClient().saveAsVersion(name, options);\n}\n\nexport async function deletePrompt(name: string): Promise<void> {\n return getSharedClient().deletePrompt(name);\n}\n\nexport async function removeTag(name: string, tag: string): Promise<void> {\n return getSharedClient().removeTag(name, tag);\n}\n","/**\n * SDK version. Updated during release process.\n */\nexport const __version__ = '1.0.0';\n","/**\n * High-level span() function wrapper and Span() class-method decorator.\n *\n * Primary public API for instrumenting user code.\n */\n\nimport { type Span as OtelSpan } from '@opentelemetry/api';\nimport { VALID_SPAN_KINDS } from '../span-kinds/mapping.js';\nimport { decorateSpan, safeJsonDumps, serializeObj, type DecorateSpanOptions } from './base.js';\nimport { getLogger } from '../core/logger.js';\nimport type { SpanOptions, SpanKind } from '../types.js';\n\nconst logger = getLogger();\n\n/**\n * Wrap a function with OpenTelemetry span instrumentation.\n *\n * @example\n * ```typescript\n * const myWorkflow = span({ kind: 'WORKFLOW' }, async (query: string) => {\n * return await process(query);\n * });\n * await myWorkflow('What is TypeScript?');\n * ```\n */\nexport function span<TArgs extends any[], TReturn>(\n options: SpanOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn extends Promise<any> ? TReturn : Promise<Awaited<TReturn>> {\n // Validate kind\n if (!VALID_SPAN_KINDS.has(options.kind)) {\n throw new Error(\n `Invalid span kind: '${options.kind}'. Must be one of: ${[...VALID_SPAN_KINDS].join(', ')}`,\n );\n }\n\n const decorateOpts: DecorateSpanOptions = { ...options };\n\n // Kind-specific attribute setup\n switch (options.kind) {\n case 'AGENT':\n decorateOpts.postprocessResult = _agentPostprocessor(options);\n break;\n case 'TOOL':\n decorateOpts.postprocessResult = _toolPostprocessor(options);\n break;\n case 'EMBEDDING':\n decorateOpts.postprocessResult = _embeddingPostprocessor(options);\n break;\n case 'RETRIEVER':\n decorateOpts.postprocessResult = retrieverPostprocessor;\n break;\n case 'MCP_TOOL':\n return _createMcpToolWrapper(options, fn);\n default:\n break;\n }\n\n return decorateSpan(decorateOpts, fn);\n}\n\n/** Agent-specific: set role and goal attributes. */\nfunction _agentPostprocessor(options: SpanOptions) {\n return (span: OtelSpan, _result: any, _boundInputs: Record<string, any>) => {\n if (options.role) {\n span.setAttribute('neatlogs.agent.role', options.role);\n }\n if (options.goal) {\n span.setAttribute('neatlogs.agent.goal', options.goal);\n }\n };\n}\n\n/** Tool-specific: set tool_name and parameters attributes. */\nfunction _toolPostprocessor(options: SpanOptions) {\n return (span: OtelSpan, _result: any, _boundInputs: Record<string, any>) => {\n if (options.toolName) {\n span.setAttribute('tool.name', options.toolName);\n }\n if (options.parameters) {\n span.setAttribute('tool.parameters', safeJsonDumps(options.parameters));\n }\n };\n}\n\n/** Embedding-specific: set model and dimension attributes. */\nfunction _embeddingPostprocessor(options: SpanOptions) {\n return (span: OtelSpan, _result: any, _boundInputs: Record<string, any>) => {\n if (options.model) {\n span.setAttribute('embedding.model_name', options.model);\n }\n if (options.dimension) {\n span.setAttribute('embedding.dimension', options.dimension);\n }\n };\n}\n\n/**\n * RETRIEVER postprocessor: extract documents from result.\n * Looks for query in 'query', 'question', 'text' keys.\n * Extracts documents from list results or dict with 'documents'/'docs'/'results' keys.\n * Sets retrieval.documents.N.document.* attributes (up to 20 docs).\n */\nexport function retrieverPostprocessor(\n span: OtelSpan,\n result: any,\n boundInputs: Record<string, any>,\n): void {\n // Extract query\n for (const key of ['query', 'question', 'text']) {\n if (key in boundInputs && typeof boundInputs[key] === 'string') {\n span.setAttribute('retrieval.query', boundInputs[key]);\n break;\n }\n }\n\n // Extract documents\n let docs: any[] | null = null;\n\n if (Array.isArray(result)) {\n docs = result;\n } else if (result && typeof result === 'object') {\n for (const key of ['documents', 'docs', 'results']) {\n if (Array.isArray(result[key])) {\n docs = result[key];\n break;\n }\n }\n }\n\n if (!docs) return;\n\n // Set document attributes (up to 20)\n const maxDocs = Math.min(docs.length, 20);\n for (let i = 0; i < maxDocs; i++) {\n const doc = docs[i];\n const prefix = `retrieval.documents.${i}.document`;\n\n if (typeof doc === 'string') {\n span.setAttribute(`${prefix}.content`, doc);\n } else if (doc && typeof doc === 'object') {\n if (doc.content || doc.page_content || doc.text) {\n span.setAttribute(`${prefix}.content`, doc.content ?? doc.page_content ?? doc.text);\n }\n if (doc.id) {\n span.setAttribute(`${prefix}.id`, String(doc.id));\n }\n if (doc.score !== undefined) {\n span.setAttribute(`${prefix}.score`, doc.score);\n }\n if (doc.metadata) {\n span.setAttribute(`${prefix}.metadata`, safeJsonDumps(doc.metadata));\n }\n }\n }\n}\n\n/**\n * MCP_TOOL special handling.\n * Checks first arg for .toJSON() / plain object.\n * Wraps string results as { result: \"...\" }.\n * Sets both mcp.* and standard attributes.\n */\nfunction _createMcpToolWrapper<TArgs extends any[], TReturn>(\n options: SpanOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => any {\n const decorateOpts: DecorateSpanOptions = {\n ...options,\n postprocessResult: (span: OtelSpan, result: any, boundInputs: Record<string, any>) => {\n // Set MCP-specific attributes\n if (options.toolName) {\n span.setAttribute('mcp.tool.name', options.toolName);\n span.setAttribute('tool.name', options.toolName);\n }\n if (options.parameters) {\n span.setAttribute('mcp.tool.parameters', safeJsonDumps(options.parameters));\n span.setAttribute('tool.parameters', safeJsonDumps(options.parameters));\n }\n if (options.toolJsonSchema) {\n span.setAttribute('tool.json_schema', safeJsonDumps(options.toolJsonSchema));\n }\n\n // Wrap string results\n if (typeof result === 'string') {\n span.setAttribute('output.value', safeJsonDumps({ result }));\n }\n\n // Extract input from first arg if it has toJSON or is a plain object\n if (boundInputs && Object.keys(boundInputs).length > 0) {\n const firstArg = Object.values(boundInputs)[0];\n if (firstArg && typeof firstArg === 'object') {\n const serialized = typeof firstArg.toJSON === 'function'\n ? firstArg.toJSON()\n : serializeObj(firstArg);\n span.setAttribute('mcp.tool.input', safeJsonDumps(serialized));\n }\n }\n },\n };\n\n return decorateSpan(decorateOpts, fn);\n}\n\n/**\n * TC39 Stage 3 class-method decorator variant.\n *\n * @example\n * ```typescript\n * class MyAgent {\n * @Span({ kind: 'AGENT', role: 'researcher' })\n * async run(query: string) { ... }\n * }\n * ```\n */\nexport function Span(options: SpanOptions) {\n return function <T extends (...args: any[]) => any>(\n target: T,\n context: ClassMethodDecoratorContext,\n ): T {\n // Validate eagerly at decoration-time (same behaviour as before this fix)\n // by building a temporary wrapper with a no-op target. span() will throw\n // here for invalid kinds before the class is instantiated.\n span(options, target);\n\n // TC39 stage-3 decorators replace the method on the prototype, so `this`\n // is the instance when the method is called normally (e.g. agent.run()).\n // `decorateSpan`'s closure calls `fn(...args)` without a receiver, which\n // loses `this` for instance methods that call other instance methods.\n // Wrap at the call site: bind `target` to the live `this` on every call\n // so that `fn(…args)` inside `decorateSpan` retains the correct receiver.\n function decoratorWrapper(this: unknown, ...args: Parameters<T>): ReturnType<T> {\n const boundTarget = target.bind(this) as T;\n const wrapped = span(options, boundTarget);\n return wrapped(...args) as ReturnType<T>;\n }\n Object.defineProperty(decoratorWrapper, 'name', { value: context.name, configurable: true });\n return decoratorWrapper as unknown as T;\n };\n}\n","import { getTracerProvider } from './init.js';\n\nlet _cached: any = null;\n\nexport async function getMastraObservability(): Promise<any> {\n if (_cached) return _cached;\n\n const tracerProvider = getTracerProvider();\n\n let createFn: any;\n try {\n const mod = await import('@neatlogs/instrumentation-mastra');\n createFn = mod.createNeatlogsMastraObservability;\n } catch {\n throw new Error(\n '@neatlogs/instrumentation-mastra is required for getMastraObservability(). ' +\n 'Install it with: npm install @neatlogs/instrumentation-mastra',\n );\n }\n\n const { observability } = await createFn(tracerProvider);\n _cached = observability;\n return _cached;\n}\n","/**\n * Vercel AI SDK wrapper — inline implementation.\n *\n * Wraps `generateText`, `streamText`, `generateObject`, `streamObject` from\n * the `ai` package with OTel parent spans + forced telemetry. Static export,\n * no dynamic imports — bundler-friendly (works with Turbopack, webpack, esbuild).\n *\n * Usage:\n * import { wrapAISDK } from 'neatlogs';\n * import * as ai from 'ai';\n * const { streamText, generateText } = wrapAISDK(ai);\n */\n\nimport { trace, context as otelContext, ROOT_CONTEXT, SpanStatusCode, type Span, type Tracer } from '@opentelemetry/api';\n\nconst TRACER_NAME = 'neatlogs.ai-sdk';\n\n// -- Telemetry config --------------------------------------------------------\n\nexport interface CreateAITelemetryOptions {\n metadata?: Record<string, unknown>;\n}\n\nexport interface AITelemetryConfig {\n isEnabled: true;\n recordInputs: true;\n recordOutputs: true;\n tracer: Tracer;\n metadata: Record<string, unknown>;\n}\n\nexport function createAITelemetry(\n opts: CreateAITelemetryOptions = {},\n): AITelemetryConfig {\n const userMeta = opts.metadata ?? {};\n return {\n isEnabled: true,\n recordInputs: true,\n recordOutputs: true,\n tracer: trace.getTracer(TRACER_NAME),\n metadata: { ...userMeta, neatlogsWrapped: true },\n };\n}\n\n// -- Span attributes ---------------------------------------------------------\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return '';\n }\n}\n\nfunction setInputValue(span: Span, opts: Record<string, unknown>): void {\n // For generateText/streamText — only capture prompt or messages, not full model config\n if (opts && ('prompt' in opts || 'messages' in opts)) {\n const input = opts.messages ?? opts.prompt;\n const stringified = safeStringify(input);\n if (stringified) {\n span.setAttribute('input.value', stringified);\n }\n return;\n }\n const stringified = safeStringify(opts);\n if (stringified) {\n span.setAttribute('input.value', stringified);\n }\n}\n\nfunction setOutputValue(span: Span, result: unknown): void {\n if (result && typeof result === 'object') {\n const r = result as Record<string, unknown>;\n // GenerateTextResult / StreamTextResult — extract meaningful fields\n if ('text' in r && 'finishReason' in r) {\n const text = String(r.text ?? '');\n if (text) {\n span.setAttribute('output.value', text);\n }\n if (r.finishReason) {\n span.setAttribute('gen_ai.finish_reason', String(r.finishReason));\n }\n return;\n }\n }\n const stringified = safeStringify(result);\n if (stringified) {\n span.setAttribute('output.value', stringified);\n }\n}\n\n// -- Wrapping ----------------------------------------------------------------\n\ntype WrappedFunctionName = 'generateText' | 'streamText' | 'generateObject' | 'streamObject' | 'embed' | 'embedMany' | 'rerank';\n\nconst WRAPPED_FUNCTIONS: readonly WrappedFunctionName[] = [\n 'generateText',\n 'streamText',\n 'generateObject',\n 'streamObject',\n 'embed',\n 'embedMany',\n 'rerank',\n] as const;\n\n/**\n * Wrap the `ai` module namespace so that every `generateText` / `streamText` /\n * `generateObject` / `streamObject` call:\n *\n * 1. Opens a parent OTel span on the active TracerProvider.\n * 2. Forces `experimental_telemetry: { isEnabled: true }`, merging user metadata.\n * 3. Records input/output on the parent span and propagates errors.\n *\n * Other exports (types, helpers) pass through unchanged.\n */\nexport function wrapAISDK<T extends Record<string, unknown>>(aiModule: T): T {\n const wrapped: Record<string, unknown> = { ...aiModule };\n\n for (const name of WRAPPED_FUNCTIONS) {\n const original = aiModule[name];\n if (typeof original !== 'function') continue;\n\n if (name === 'streamText' || name === 'streamObject') {\n wrapped[name] = createSyncWrapper(name, original as (opts: any) => unknown);\n } else {\n wrapped[name] = createAsyncWrapper(name, original as (opts: any) => Promise<unknown>);\n }\n }\n\n return wrapped as T;\n}\n\nfunction rootSpanKind(name: WrappedFunctionName): string {\n if (name === 'embed' || name === 'embedMany' || name === 'rerank') return 'CHAIN';\n return 'WORKFLOW';\n}\n\n\nfunction getParentContext() {\n const activeSpan = trace.getActiveSpan();\n if (activeSpan) {\n const instrScope = (activeSpan as any).instrumentationLibrary?.name ?? '';\n if (instrScope === 'next.js') {\n return ROOT_CONTEXT;\n }\n }\n return otelContext.active();\n}\n\nfunction createAsyncWrapper(\n name: WrappedFunctionName,\n original: (opts: any) => Promise<unknown>,\n): (opts: any) => Promise<unknown> {\n return async function wrappedAsyncFn(opts: any): Promise<unknown> {\n const tracer = trace.getTracer(TRACER_NAME);\n return tracer.startActiveSpan(\n `ai.${name}`,\n { attributes: { 'openinference.span.kind': rootSpanKind(name) } },\n getParentContext(),\n async (span) => {\n try {\n const isEmbedOrRerank = name === 'embed' || name === 'embedMany' || name === 'rerank';\n if (!isEmbedOrRerank) {\n setInputValue(span, opts);\n }\n if (name === 'rerank' && opts?.query) {\n span.setAttribute('ai.rerank.query', String(opts.query));\n }\n const merged = mergeTelemetry(opts);\n const result = await original(merged);\n if (!isEmbedOrRerank) {\n setOutputValue(span, result);\n }\n return result;\n } catch (err) {\n recordSpanError(span, err);\n throw err;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\nfunction createSyncWrapper(\n name: WrappedFunctionName,\n original: (opts: any) => unknown,\n): (opts: any) => unknown {\n return function wrappedSyncFn(opts: any): unknown {\n const tracer = trace.getTracer(TRACER_NAME);\n return tracer.startActiveSpan(`ai.${name}`, { attributes: { 'openinference.span.kind': rootSpanKind(name) } }, getParentContext(), (span) => {\n try {\n setInputValue(span, opts);\n const merged = mergeTelemetry(opts);\n const result = original(merged);\n return result;\n } catch (err) {\n recordSpanError(span, err);\n throw err;\n } finally {\n span.end();\n }\n });\n };\n}\n\nfunction mergeTelemetry(opts: any): any {\n const baseTelemetry: AITelemetryConfig = createAITelemetry({\n metadata: opts?.experimental_telemetry?.metadata,\n });\n return {\n ...opts,\n experimental_telemetry: {\n ...opts?.experimental_telemetry,\n ...baseTelemetry,\n },\n };\n}\n\n\nfunction recordSpanError(span: Span, err: unknown): void {\n if (err instanceof Error) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: err.message });\n span.recordException(err);\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) });\n }\n}\n","/**\n * Neatlogs OpenAI wrapper — ES6 Proxy-based.\n *\n * Usage:\n * import { wrapOpenAI, traceTool } from 'neatlogs/openai';\n * import OpenAI from 'openai';\n * const client = wrapOpenAI(new OpenAI());\n *\n * Intercepts:\n * - client.chat.completions.create() — non-streaming and streaming\n * - client.responses.create() — Responses API\n *\n * Also exports traceTool() to wrap user-defined tool functions with TOOL spans.\n */\n\nimport { trace, context as otelContext, SpanStatusCode, type Span } from '@opentelemetry/api';\n\nconst TRACER_NAME = 'neatlogs.openai';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function wrapOpenAI<T extends object>(client: T): T {\n return wrapNamespace(client, []) as T;\n}\n\n/**\n * Wrap a tool/function implementation to emit TOOL spans when executed.\n *\n * Usage:\n * const getWeather = traceTool('get_weather', async (args: { city: string }) => {\n * return `Weather in ${args.city}: sunny`;\n * });\n */\nexport function traceTool<TArgs = any, TResult = any>(\n name: string,\n fn: (args: TArgs) => TResult | Promise<TResult>,\n): (args: TArgs) => Promise<TResult> {\n return async function tracedTool(args: TArgs): Promise<TResult> {\n const tracer = trace.getTracer(TRACER_NAME);\n return tracer.startActiveSpan(\n `tool.${name}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': safeStringify(args),\n },\n },\n otelContext.active(),\n async (span) => {\n try {\n const result = await fn(args);\n span.setAttribute('output.value', safeStringify(result));\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (err) {\n recordError(span, err);\n throw err;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n// ---------------------------------------------------------------------------\n// Proxy wrapping\n// ---------------------------------------------------------------------------\n\nfunction wrapNamespace(target: any, path: string[]): any {\n return new Proxy(target, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver);\n if (typeof prop === 'symbol' || String(prop).startsWith('_')) return value;\n\n const currentPath = [...path, String(prop)];\n const pathStr = currentPath.join('.');\n\n if (pathStr === 'chat.completions.create' && typeof value === 'function') {\n return tracedChatCompletionsCreate(value.bind(obj));\n }\n if (pathStr === 'responses.create' && typeof value === 'function') {\n return tracedResponsesCreate(value.bind(obj));\n }\n\n if (value && typeof value === 'object' && !Array.isArray(value) && isNamespace(currentPath)) {\n return wrapNamespace(value, currentPath);\n }\n\n return value;\n },\n });\n}\n\nfunction isNamespace(path: string[]): boolean {\n if (path.length > 3) return false;\n const key = path[path.length - 1];\n return ['chat', 'completions', 'responses', 'beta'].includes(key);\n}\n\n// ---------------------------------------------------------------------------\n// chat.completions.create — non-streaming + streaming\n// ---------------------------------------------------------------------------\n\nfunction tracedChatCompletionsCreate(original: (...args: any[]) => any) {\n return function (opts: any, ...rest: any[]): any {\n const tracer = trace.getTracer(TRACER_NAME);\n const model = opts?.model ?? '';\n const messages: any[] = opts?.messages ?? [];\n const isStream = opts?.stream === true;\n\n const span = tracer.startSpan('openai.chat.completions.create', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': 'openai',\n 'neatlogs.llm.system': 'openai',\n 'neatlogs.llm.model_name': model,\n 'neatlogs.llm.is_streaming': isStream,\n },\n }, otelContext.active());\n\n // Input messages\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n span.setAttribute(`neatlogs.llm.input_messages.${i}.role`, msg.role ?? '');\n if (typeof msg.content === 'string') {\n span.setAttribute(`neatlogs.llm.input_messages.${i}.content`, msg.content);\n } else if (msg.content) {\n span.setAttribute(`neatlogs.llm.input_messages.${i}.content`, safeStringify(msg.content));\n }\n if (msg.tool_call_id) {\n span.setAttribute(`neatlogs.llm.input_messages.${i}.tool_call_id`, msg.tool_call_id);\n }\n }\n\n // Tools\n if (opts?.tools) {\n for (let i = 0; i < opts.tools.length; i++) {\n const fn = opts.tools[i]?.function ?? {};\n span.setAttribute(`neatlogs.llm.tools.${i}.name`, fn.name ?? '');\n if (fn.description) span.setAttribute(`neatlogs.llm.tools.${i}.description`, fn.description);\n if (fn.parameters) span.setAttribute(`neatlogs.llm.tools.${i}.input_schema`, safeStringify(fn.parameters));\n }\n }\n\n // Invocation parameters\n setInvocationParams(span, opts);\n\n // Force stream_options.include_usage for streaming\n if (isStream) {\n opts = { ...opts };\n const streamOpts = opts.stream_options ?? {};\n if (!streamOpts.include_usage) {\n opts.stream_options = { ...streamOpts, include_usage: true };\n }\n }\n\n const ctx = trace.setSpan(otelContext.active(), span);\n const promise = otelContext.with(ctx, () => original(opts, ...rest));\n\n return promise.then(\n (response: any) => {\n if (isStream) {\n return wrapAsyncIterableStream(response, span);\n }\n finalizeChatResponse(span, response);\n return response;\n },\n (err: any) => {\n recordError(span, err);\n throw err;\n },\n );\n };\n}\n\n// ---------------------------------------------------------------------------\n// responses.create\n// ---------------------------------------------------------------------------\n\nfunction tracedResponsesCreate(original: (...args: any[]) => any) {\n return function (opts: any, ...rest: any[]): any {\n const tracer = trace.getTracer(TRACER_NAME);\n const model = opts?.model ?? '';\n\n const span = tracer.startSpan('openai.responses.create', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': 'openai',\n 'neatlogs.llm.system': 'openai',\n 'neatlogs.llm.model_name': model,\n 'input.value': safeStringify(opts?.input ?? ''),\n },\n }, otelContext.active());\n\n const ctx = trace.setSpan(otelContext.active(), span);\n const promise = otelContext.with(ctx, () => original(opts, ...rest));\n\n return promise.then(\n (response: any) => {\n if (response?.output_text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', response.output_text);\n }\n if (response?.model) span.setAttribute('neatlogs.llm.model_name', response.model);\n if (response?.usage) {\n if (response.usage.input_tokens != null) span.setAttribute('neatlogs.llm.token_count.prompt', response.usage.input_tokens);\n if (response.usage.output_tokens != null) span.setAttribute('neatlogs.llm.token_count.completion', response.usage.output_tokens);\n }\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return response;\n },\n (err: any) => {\n recordError(span, err);\n throw err;\n },\n );\n };\n}\n\n// ---------------------------------------------------------------------------\n// Streaming support\n// ---------------------------------------------------------------------------\n\nfunction wrapAsyncIterableStream(stream: any, span: Span): any {\n const chunks: any[] = [];\n const originalAsyncIterator = stream[Symbol.asyncIterator]?.bind(stream);\n\n if (!originalAsyncIterator) {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return stream;\n }\n\n const wrapped = Object.create(Object.getPrototypeOf(stream));\n Object.assign(wrapped, stream);\n\n wrapped[Symbol.asyncIterator] = function () {\n const iterator = originalAsyncIterator();\n return {\n async next(): Promise<IteratorResult<any>> {\n try {\n const result = await iterator.next();\n if (result.done) {\n finalizeStreamChunks(span, chunks);\n return result;\n }\n chunks.push(result.value);\n return result;\n } catch (err) {\n recordError(span, err);\n throw err;\n }\n },\n async return(value?: any): Promise<IteratorResult<any>> {\n finalizeStreamChunks(span, chunks);\n return iterator.return?.(value) ?? { done: true, value: undefined };\n },\n async throw(err?: any): Promise<IteratorResult<any>> {\n recordError(span, err);\n return iterator.throw?.(err) ?? { done: true, value: undefined };\n },\n };\n };\n\n return wrapped;\n}\n\nfunction finalizeStreamChunks(span: Span, chunks: any[]): void {\n const textParts: string[] = [];\n const toolCallsAcc: Record<number, { id: string; name: string; arguments: string }> = {};\n let finishReason = '';\n let model = '';\n let usage: any = null;\n\n for (const chunk of chunks) {\n if (!chunk?.choices?.length) {\n if (chunk?.usage) usage = chunk.usage;\n continue;\n }\n const choice = chunk.choices[0];\n const delta = choice?.delta;\n if (delta?.content) textParts.push(delta.content);\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index ?? 0;\n if (!toolCallsAcc[idx]) toolCallsAcc[idx] = { id: '', name: '', arguments: '' };\n if (tc.id) toolCallsAcc[idx].id = tc.id;\n if (tc.function?.name) toolCallsAcc[idx].name = tc.function.name;\n if (tc.function?.arguments) toolCallsAcc[idx].arguments += tc.function.arguments;\n }\n }\n if (choice?.finish_reason) finishReason = choice.finish_reason;\n if (chunk?.model) model = chunk.model;\n }\n\n const fullText = textParts.join('');\n if (fullText) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', fullText);\n }\n\n let j = 0;\n for (const tc of Object.values(toolCallsAcc)) {\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.id`, tc.id);\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.name`, tc.name);\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.arguments`, tc.arguments);\n j++;\n }\n\n if (model) span.setAttribute('neatlogs.llm.model_name', model);\n if (finishReason) span.setAttribute('neatlogs.llm.finish_reason', finishReason);\n\n if (usage) {\n if (usage.prompt_tokens != null) span.setAttribute('neatlogs.llm.token_count.prompt', usage.prompt_tokens);\n if (usage.completion_tokens != null) span.setAttribute('neatlogs.llm.token_count.completion', usage.completion_tokens);\n if (usage.total_tokens != null) span.setAttribute('neatlogs.llm.token_count.total', usage.total_tokens);\n if (usage.prompt_tokens_details?.cached_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.cache_read', usage.prompt_tokens_details.cached_tokens);\n }\n if (usage.completion_tokens_details?.reasoning_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.reasoning', usage.completion_tokens_details.reasoning_tokens);\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\n// ---------------------------------------------------------------------------\n// Non-streaming response finalization\n// ---------------------------------------------------------------------------\n\nfunction finalizeChatResponse(span: Span, response: any): void {\n const choices = response?.choices ?? [];\n for (let i = 0; i < choices.length; i++) {\n const message = choices[i]?.message;\n if (!message) continue;\n\n span.setAttribute(`neatlogs.llm.output_messages.${i}.role`, 'assistant');\n if (message.content) {\n span.setAttribute(`neatlogs.llm.output_messages.${i}.content`, message.content);\n }\n if (message.tool_calls) {\n for (let j = 0; j < message.tool_calls.length; j++) {\n const tc = message.tool_calls[j];\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.id`, tc.id ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.name`, tc.function?.name ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.arguments`, tc.function?.arguments ?? '');\n }\n }\n if (choices[i].finish_reason) {\n span.setAttribute('neatlogs.llm.finish_reason', choices[i].finish_reason);\n }\n }\n\n const usage = response?.usage;\n if (usage) {\n if (usage.prompt_tokens != null) span.setAttribute('neatlogs.llm.token_count.prompt', usage.prompt_tokens);\n if (usage.completion_tokens != null) span.setAttribute('neatlogs.llm.token_count.completion', usage.completion_tokens);\n if (usage.total_tokens != null) span.setAttribute('neatlogs.llm.token_count.total', usage.total_tokens);\n if (usage.prompt_tokens_details?.cached_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.cache_read', usage.prompt_tokens_details.cached_tokens);\n }\n if (usage.completion_tokens_details?.reasoning_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.reasoning', usage.completion_tokens_details.reasoning_tokens);\n }\n }\n\n if (response?.model) span.setAttribute('neatlogs.llm.model_name', response.model);\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction setInvocationParams(span: Span, opts: any): void {\n if (opts?.temperature != null) span.setAttribute('neatlogs.llm.temperature', opts.temperature);\n if (opts?.top_p != null) span.setAttribute('neatlogs.llm.top_p', opts.top_p);\n if (opts?.max_tokens != null) span.setAttribute('neatlogs.llm.max_tokens', opts.max_tokens);\n if (opts?.frequency_penalty != null) span.setAttribute('neatlogs.llm.frequency_penalty', opts.frequency_penalty);\n if (opts?.presence_penalty != null) span.setAttribute('neatlogs.llm.presence_penalty', opts.presence_penalty);\n if (opts?.stop) span.setAttribute('neatlogs.llm.stop_sequences', safeStringify(opts.stop));\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return typeof value === 'string' ? value : JSON.stringify(value);\n } catch {\n return '';\n }\n}\n\nfunction recordError(span: Span, err: unknown): void {\n if (err instanceof Error) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: err.message });\n span.recordException(err);\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) });\n }\n span.end();\n}\n","/**\n * Neatlogs Anthropic wrapper — ES6 Proxy-based.\n *\n * Usage:\n * import { wrapAnthropic, traceTool } from 'neatlogs/anthropic';\n * import Anthropic from '@anthropic-ai/sdk';\n * const client = wrapAnthropic(new Anthropic());\n *\n * Intercepts:\n * - client.messages.create() — non-streaming and streaming (stream: true)\n * - client.messages.stream() — Anthropic's streaming helper (MessageStream)\n *\n * Also exports traceTool() to wrap user-defined tool functions with TOOL spans.\n * Handles thinking blocks, tool_use blocks, and cache tokens.\n */\n\nimport { trace, context as otelContext, SpanStatusCode, type Span } from '@opentelemetry/api';\n\nconst TRACER_NAME = 'neatlogs.anthropic';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function wrapAnthropic<T extends object>(client: T): T {\n return wrapNamespace(client, []) as T;\n}\n\n/**\n * Wrap a tool/function implementation to emit TOOL spans when executed.\n *\n * Usage:\n * const getWeather = traceTool('get_weather', async (input: { city: string }) => {\n * return `Weather in ${input.city}: sunny`;\n * });\n */\nexport function traceTool<TInput = any, TResult = any>(\n name: string,\n fn: (input: TInput) => TResult | Promise<TResult>,\n): (input: TInput) => Promise<TResult> {\n return async function tracedTool(input: TInput): Promise<TResult> {\n const tracer = trace.getTracer(TRACER_NAME);\n return tracer.startActiveSpan(\n `tool.${name}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': safeStringify(input),\n },\n },\n otelContext.active(),\n async (span) => {\n try {\n const result = await fn(input);\n span.setAttribute('output.value', safeStringify(result));\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (err) {\n recordError(span, err);\n throw err;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n// ---------------------------------------------------------------------------\n// Proxy wrapping\n// ---------------------------------------------------------------------------\n\nfunction wrapNamespace(target: any, path: string[]): any {\n return new Proxy(target, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver);\n if (typeof prop === 'symbol' || String(prop).startsWith('_')) return value;\n\n const currentPath = [...path, String(prop)];\n const pathStr = currentPath.join('.');\n\n if (pathStr === 'messages.create' && typeof value === 'function') {\n return tracedMessagesCreate(value.bind(obj));\n }\n if (pathStr === 'messages.stream' && typeof value === 'function') {\n return tracedMessagesStream(value.bind(obj));\n }\n\n if (value && typeof value === 'object' && !Array.isArray(value) && isNamespace(currentPath)) {\n return wrapNamespace(value, currentPath);\n }\n\n return value;\n },\n });\n}\n\nfunction isNamespace(path: string[]): boolean {\n if (path.length > 3) return false;\n const key = path[path.length - 1];\n return ['messages', 'beta'].includes(key);\n}\n\n// ---------------------------------------------------------------------------\n// messages.create — non-streaming + streaming (stream: true)\n// ---------------------------------------------------------------------------\n\nfunction tracedMessagesCreate(original: (...args: any[]) => any) {\n return function (opts: any, ...rest: any[]): any {\n const tracer = trace.getTracer(TRACER_NAME);\n const model = opts?.model ?? '';\n const messages: any[] = opts?.messages ?? [];\n const isStream = opts?.stream === true;\n\n const span = tracer.startSpan('anthropic.messages.create', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': 'anthropic',\n 'neatlogs.llm.system': 'anthropic',\n 'neatlogs.llm.model_name': model,\n 'neatlogs.llm.is_streaming': isStream,\n },\n }, otelContext.active());\n\n setInputMessages(span, opts?.system, messages);\n setTools(span, opts?.tools);\n setInvocationParams(span, opts);\n\n const ctx = trace.setSpan(otelContext.active(), span);\n const promise = otelContext.with(ctx, () => original(opts, ...rest));\n\n return promise.then(\n (response: any) => {\n if (isStream) {\n return wrapStreamIterable(response, span);\n }\n finalizeMessageResponse(span, response);\n return response;\n },\n (err: any) => {\n recordError(span, err);\n throw err;\n },\n );\n };\n}\n\n// ---------------------------------------------------------------------------\n// messages.stream() — returns a MessageStream object\n// ---------------------------------------------------------------------------\n\nfunction tracedMessagesStream(original: (...args: any[]) => any) {\n return function (opts: any, ...rest: any[]): any {\n const tracer = trace.getTracer(TRACER_NAME);\n const model = opts?.model ?? '';\n const messages: any[] = opts?.messages ?? [];\n\n const span = tracer.startSpan('anthropic.messages.stream', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': 'anthropic',\n 'neatlogs.llm.system': 'anthropic',\n 'neatlogs.llm.model_name': model,\n 'neatlogs.llm.is_streaming': true,\n },\n }, otelContext.active());\n\n setInputMessages(span, opts?.system, messages);\n setTools(span, opts?.tools);\n setInvocationParams(span, opts);\n\n const ctx = trace.setSpan(otelContext.active(), span);\n const messageStream = otelContext.with(ctx, () => original(opts, ...rest));\n\n return wrapMessageStream(messageStream, span);\n };\n}\n\n// ---------------------------------------------------------------------------\n// Streaming: async iterable (stream: true returns events)\n// ---------------------------------------------------------------------------\n\nfunction wrapStreamIterable(stream: any, span: Span): any {\n const events: any[] = [];\n const originalAsyncIterator = stream[Symbol.asyncIterator]?.bind(stream);\n\n if (!originalAsyncIterator) {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return stream;\n }\n\n const wrapped = Object.create(Object.getPrototypeOf(stream));\n Object.assign(wrapped, stream);\n\n wrapped[Symbol.asyncIterator] = function () {\n const iterator = originalAsyncIterator();\n return {\n async next(): Promise<IteratorResult<any>> {\n try {\n const result = await iterator.next();\n if (result.done) {\n finalizeStreamEvents(span, events);\n return result;\n }\n events.push(result.value);\n return result;\n } catch (err) {\n recordError(span, err);\n throw err;\n }\n },\n async return(value?: any): Promise<IteratorResult<any>> {\n finalizeStreamEvents(span, events);\n return iterator.return?.(value) ?? { done: true, value: undefined };\n },\n async throw(err?: any): Promise<IteratorResult<any>> {\n recordError(span, err);\n return iterator.throw?.(err) ?? { done: true, value: undefined };\n },\n };\n };\n\n if (typeof stream.finalMessage === 'function') {\n const origFinal = stream.finalMessage.bind(stream);\n wrapped.finalMessage = async function () {\n return origFinal();\n };\n }\n\n return wrapped;\n}\n\n// ---------------------------------------------------------------------------\n// Streaming: MessageStream (.on('end'), .finalMessage())\n// ---------------------------------------------------------------------------\n\nfunction wrapMessageStream(messageStream: any, span: Span): any {\n const origOn = messageStream.on?.bind(messageStream);\n if (origOn) {\n origOn('end', () => {\n const finalMsg = messageStream._finalMessage ?? messageStream.currentMessage;\n if (finalMsg) {\n finalizeMessageResponse(span, finalMsg);\n } else {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n }\n });\n origOn('error', (err: any) => {\n if (span.isRecording()) recordError(span, err);\n });\n }\n\n if (typeof messageStream.finalMessage === 'function') {\n const origFinal = messageStream.finalMessage.bind(messageStream);\n messageStream.finalMessage = async function () {\n const result = await origFinal();\n if (span.isRecording()) {\n finalizeMessageResponse(span, result);\n }\n return result;\n };\n }\n\n return messageStream;\n}\n\n// ---------------------------------------------------------------------------\n// Stream event finalization\n// ---------------------------------------------------------------------------\n\nfunction finalizeStreamEvents(span: Span, events: any[]): void {\n const textParts: string[] = [];\n const thinkingParts: string[] = [];\n const toolCalls: Array<{ id: string; name: string; input: string }> = [];\n let currentToolInput = '';\n let currentToolId = '';\n let currentToolName = '';\n let usage: any = null;\n let model = '';\n let stopReason = '';\n\n for (const event of events) {\n const type = event?.type ?? '';\n\n if (type === 'content_block_delta') {\n const delta = event?.delta;\n if (delta?.type === 'text_delta' && delta.text) textParts.push(delta.text);\n else if (delta?.type === 'thinking_delta' && delta.thinking) thinkingParts.push(delta.thinking);\n else if (delta?.type === 'input_json_delta' && delta.partial_json) currentToolInput += delta.partial_json;\n } else if (type === 'content_block_start') {\n const block = event?.content_block;\n if (block?.type === 'tool_use') {\n currentToolId = block.id ?? '';\n currentToolName = block.name ?? '';\n currentToolInput = '';\n }\n } else if (type === 'content_block_stop') {\n if (currentToolName) {\n toolCalls.push({ id: currentToolId, name: currentToolName, input: currentToolInput });\n currentToolId = '';\n currentToolName = '';\n currentToolInput = '';\n }\n } else if (type === 'message_start') {\n const msg = event?.message;\n if (msg?.model) model = msg.model;\n if (msg?.usage) usage = msg.usage;\n } else if (type === 'message_delta') {\n const delta = event?.delta;\n if (delta?.stop_reason) stopReason = delta.stop_reason;\n if (event?.usage) usage = { ...(usage ?? {}), ...event.usage };\n }\n }\n\n const fullText = textParts.join('');\n if (fullText) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', fullText);\n }\n\n const thinking = thinkingParts.join('');\n if (thinking) {\n span.setAttribute('neatlogs.llm.output_messages.0.thinking', thinking);\n }\n\n for (let j = 0; j < toolCalls.length; j++) {\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.id`, toolCalls[j].id);\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.name`, toolCalls[j].name);\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.arguments`, toolCalls[j].input);\n }\n\n if (model) span.setAttribute('neatlogs.llm.model_name', model);\n if (stopReason) span.setAttribute('neatlogs.llm.stop_reason', stopReason);\n setUsageAttrs(span, usage);\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\n// ---------------------------------------------------------------------------\n// Non-streaming response finalization\n// ---------------------------------------------------------------------------\n\nfunction finalizeMessageResponse(span: Span, response: any): void {\n const content: any[] = response?.content ?? [];\n const textParts: string[] = [];\n const thinkingParts: string[] = [];\n const toolCalls: Array<{ id: string; name: string; input: string }> = [];\n\n for (const block of content) {\n if (block.type === 'text' && block.text) textParts.push(block.text);\n else if (block.type === 'thinking' && block.thinking) thinkingParts.push(block.thinking);\n else if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id ?? '',\n name: block.name ?? '',\n input: safeStringify(block.input ?? {}),\n });\n }\n }\n\n if (textParts.length) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', textParts.join(''));\n }\n if (thinkingParts.length) {\n span.setAttribute('neatlogs.llm.output_messages.0.thinking', thinkingParts.join(''));\n }\n\n for (let j = 0; j < toolCalls.length; j++) {\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.id`, toolCalls[j].id);\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.name`, toolCalls[j].name);\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.arguments`, toolCalls[j].input);\n }\n\n setUsageAttrs(span, response?.usage);\n if (response?.model) span.setAttribute('neatlogs.llm.model_name', response.model);\n if (response?.stop_reason) span.setAttribute('neatlogs.llm.stop_reason', response.stop_reason);\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction setInputMessages(span: Span, system: any, messages: any[]): void {\n let idx = 0;\n if (system) {\n const content = typeof system === 'string' ? system : safeStringify(system);\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'system');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, content);\n idx++;\n }\n for (const msg of messages) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, msg.role ?? '');\n if (typeof msg.content === 'string') {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, msg.content);\n } else if (msg.content) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, safeStringify(msg.content));\n }\n idx++;\n }\n}\n\nfunction setTools(span: Span, tools: any[] | undefined): void {\n if (!tools) return;\n for (let i = 0; i < tools.length; i++) {\n const tool = tools[i];\n span.setAttribute(`neatlogs.llm.tools.${i}.name`, tool.name ?? '');\n if (tool.description) span.setAttribute(`neatlogs.llm.tools.${i}.description`, tool.description);\n if (tool.input_schema) span.setAttribute(`neatlogs.llm.tools.${i}.input_schema`, safeStringify(tool.input_schema));\n }\n}\n\nfunction setInvocationParams(span: Span, opts: any): void {\n if (opts?.temperature != null) span.setAttribute('neatlogs.llm.temperature', opts.temperature);\n if (opts?.top_p != null) span.setAttribute('neatlogs.llm.top_p', opts.top_p);\n if (opts?.top_k != null) span.setAttribute('neatlogs.llm.top_k', opts.top_k);\n if (opts?.max_tokens != null) span.setAttribute('neatlogs.llm.max_tokens', opts.max_tokens);\n if (opts?.stop_sequences) span.setAttribute('neatlogs.llm.stop_sequences', safeStringify(opts.stop_sequences));\n}\n\nfunction setUsageAttrs(span: Span, usage: any): void {\n if (!usage) return;\n if (usage.input_tokens != null) span.setAttribute('neatlogs.llm.token_count.prompt', usage.input_tokens);\n if (usage.output_tokens != null) span.setAttribute('neatlogs.llm.token_count.completion', usage.output_tokens);\n if (usage.cache_read_input_tokens != null) span.setAttribute('neatlogs.llm.token_count.cache_read', usage.cache_read_input_tokens);\n if (usage.cache_creation_input_tokens != null) span.setAttribute('neatlogs.llm.token_count.cache_write', usage.cache_creation_input_tokens);\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return typeof value === 'string' ? value : JSON.stringify(value);\n } catch {\n return '';\n }\n}\n\nfunction recordError(span: Span, err: unknown): void {\n if (err instanceof Error) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: err.message });\n span.recordException(err);\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) });\n }\n span.end();\n}\n","/**\n * Neatlogs LangChain/LangGraph callback handler.\n *\n * Usage:\n * import { langchainHandler } from 'neatlogs/langchain';\n * const result = await chain.invoke(input, { callbacks: [langchainHandler()] });\n *\n * Creates spans: CHAIN (chain/graph runs), LLM (model calls), TOOL (tool invocations).\n * Works with LangChain, LangGraph, and Deep Agents (same callback interface).\n */\n\nimport { trace, context as otelContext, SpanStatusCode, type Span } from '@opentelemetry/api';\n\nconst TRACER_NAME = 'neatlogs.langchain';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport interface LangchainHandlerOptions {\n workflowName?: string;\n}\n\nexport function langchainHandler(opts?: LangchainHandlerOptions): any {\n return new NeatlogsCallbackHandler(opts);\n}\n\n// ---------------------------------------------------------------------------\n// Callback Handler\n// ---------------------------------------------------------------------------\n\nclass NeatlogsCallbackHandler {\n name = 'neatlogs';\n private _spans: Map<string, Span> = new Map();\n private _workflowName: string | undefined;\n\n constructor(opts?: LangchainHandlerOptions) {\n this._workflowName = opts?.workflowName;\n }\n\n // --- Chain/Graph callbacks ---\n\n async handleChainStart(\n serialized: Record<string, any>,\n inputs: Record<string, any>,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, any>,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const name = serialized?.name ?? serialized?.id?.at(-1) ?? 'chain';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'CHAIN',\n 'neatlogs.chain.name': name,\n };\n if (this._workflowName) attrs['neatlogs.workflow.name'] = this._workflowName;\n if (inputs) attrs['input.value'] = safeStringify(inputs).slice(0, 10000);\n if (tags?.length) attrs['neatlogs.tags'] = tags.join(',');\n\n const span = tracer.startSpan(`langchain.chain.${name}`, { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleChainEnd(\n outputs: Record<string, any>,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n if (outputs) span.setAttribute('output.value', safeStringify(outputs).slice(0, 10000));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleChainError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n\n // --- LLM callbacks ---\n\n async handleLLMStart(\n serialized: Record<string, any>,\n prompts: string[],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, any>,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const model = serialized?.kwargs?.model_name ?? serialized?.kwargs?.model ?? serialized?.name ?? '';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': detectProvider(model),\n 'neatlogs.llm.model_name': model,\n };\n\n for (let i = 0; i < prompts.length; i++) {\n attrs[`neatlogs.llm.input_messages.${i}.role`] = 'user';\n attrs[`neatlogs.llm.input_messages.${i}.content`] = prompts[i].slice(0, 10000);\n }\n\n if (extraParams?.invocation_params) {\n const p = extraParams.invocation_params;\n if (p.temperature != null) attrs['neatlogs.llm.temperature'] = p.temperature;\n if (p.max_tokens != null) attrs['neatlogs.llm.max_tokens'] = p.max_tokens;\n if (p.model_name) attrs['neatlogs.llm.model_name'] = p.model_name;\n }\n\n const span = tracer.startSpan('langchain.llm', { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleChatModelStart(\n serialized: Record<string, any>,\n messages: any[][],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, any>,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const model = serialized?.kwargs?.model_name ?? serialized?.kwargs?.model ?? serialized?.name ?? '';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': detectProvider(model),\n 'neatlogs.llm.model_name': model,\n };\n\n const flatMessages = messages.flat();\n for (let i = 0; i < flatMessages.length; i++) {\n const msg = flatMessages[i];\n const role = msg?.role ?? msg?._getType?.() ?? msg?.constructor?.name ?? 'unknown';\n const content = typeof msg?.content === 'string' ? msg.content : safeStringify(msg?.content);\n attrs[`neatlogs.llm.input_messages.${i}.role`] = mapRole(role);\n attrs[`neatlogs.llm.input_messages.${i}.content`] = content.slice(0, 10000);\n }\n\n if (extraParams?.invocation_params) {\n const p = extraParams.invocation_params;\n if (p.temperature != null) attrs['neatlogs.llm.temperature'] = p.temperature;\n if (p.max_tokens != null) attrs['neatlogs.llm.max_tokens'] = p.max_tokens;\n if (p.model_name) attrs['neatlogs.llm.model_name'] = p.model_name;\n }\n\n const span = tracer.startSpan('langchain.chat_model', { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleLLMEnd(\n output: any,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n const generations = output?.generations ?? [];\n for (let i = 0; i < generations.length; i++) {\n const gen = generations[i];\n if (!Array.isArray(gen)) continue;\n for (let j = 0; j < gen.length; j++) {\n const msg = gen[j]?.message ?? gen[j];\n const content = msg?.content ?? msg?.text ?? '';\n span.setAttribute(`neatlogs.llm.output_messages.${i}.role`, 'assistant');\n span.setAttribute(`neatlogs.llm.output_messages.${i}.content`, String(content).slice(0, 10000));\n\n const toolCalls = msg?.tool_calls ?? msg?.additional_kwargs?.tool_calls;\n if (toolCalls && Array.isArray(toolCalls)) {\n for (let k = 0; k < toolCalls.length; k++) {\n const tc = toolCalls[k];\n span.setAttribute(`neatlogs.llm.tool_calls.${k}.id`, tc.id ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${k}.name`, tc.name ?? tc.function?.name ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${k}.arguments`, tc.args ? safeStringify(tc.args) : (tc.function?.arguments ?? ''));\n }\n }\n }\n }\n\n const usage = output?.llmOutput?.tokenUsage ?? output?.llmOutput?.usage;\n if (usage) {\n if (usage.promptTokens != null || usage.prompt_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.prompt', usage.promptTokens ?? usage.prompt_tokens);\n }\n if (usage.completionTokens != null || usage.completion_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.completion', usage.completionTokens ?? usage.completion_tokens);\n }\n if (usage.totalTokens != null || usage.total_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.total', usage.totalTokens ?? usage.total_tokens);\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleLLMNewToken(\n _token: string,\n _idx: any,\n _runId: string,\n ): Promise<void> {}\n\n async handleLLMError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n\n // --- Tool callbacks ---\n\n async handleToolStart(\n serialized: Record<string, any>,\n input: string,\n runId: string,\n parentRunId?: string,\n _tags?: string[],\n _metadata?: Record<string, unknown>,\n runName?: string,\n toolCallId?: string,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n // LangChain 1.x: serialized.name is absent and serialized.id is the class\n // name (e.g. \"DynamicStructuredTool\"); the real tool name arrives as `runName`.\n // Prefer serialized.name (older LC), then runName, then the class id, then 'tool'.\n const name =\n serialized?.name ||\n runName ||\n (Array.isArray(serialized?.id) ? serialized.id[serialized.id.length - 1] : undefined) ||\n 'tool';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': String(input).slice(0, 10000),\n };\n if (toolCallId) attrs['neatlogs.tool_call.id'] = toolCallId;\n\n const span = tracer.startSpan(`langchain.tool.${name}`, { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleToolEnd(\n output: string,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setAttribute('output.value', String(output).slice(0, 10000));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleToolError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n\n // --- Retriever callbacks ---\n\n async handleRetrieverStart(\n serialized: Record<string, any>,\n query: string,\n runId: string,\n parentRunId?: string,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const name = serialized?.name ?? 'retriever';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'RETRIEVER',\n 'neatlogs.retriever.name': name,\n 'input.value': query.slice(0, 10000),\n };\n\n const span = tracer.startSpan(`langchain.retriever.${name}`, { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleRetrieverEnd(\n documents: any[],\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n if (documents?.length) {\n span.setAttribute('neatlogs.retriever.document_count', documents.length);\n for (let i = 0; i < Math.min(documents.length, 10); i++) {\n const doc = documents[i];\n if (doc?.pageContent) {\n span.setAttribute(`neatlogs.retriever.documents.${i}.content`, doc.pageContent.slice(0, 2000));\n }\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleRetrieverError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction detectProvider(model: string): string {\n const m = model.toLowerCase();\n if (m.includes('gpt') || m.includes('o1') || m.includes('o3') || m.includes('o4')) return 'openai';\n if (m.includes('claude')) return 'anthropic';\n if (m.includes('gemini')) return 'google';\n if (m.includes('command')) return 'cohere';\n if (m.includes('llama') || m.includes('mixtral')) return 'meta';\n return 'unknown';\n}\n\nfunction mapRole(role: string): string {\n const r = role.toLowerCase();\n if (r === 'human' || r === 'humanmessage') return 'user';\n if (r === 'ai' || r === 'aimessage') return 'assistant';\n if (r === 'system' || r === 'systemmessage') return 'system';\n if (r === 'function' || r === 'functionmessage') return 'function';\n if (r === 'tool' || r === 'toolmessage') return 'tool';\n return role;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return typeof value === 'string' ? value : JSON.stringify(value);\n } catch {\n return '';\n }\n}\n","/**\n * Neatlogs Strands Agents integration.\n *\n * Usage:\n * import { init } from 'neatlogs';\n * import { strandsHooks } from 'neatlogs/strands';\n * import { Agent } from '@strands-agents/sdk';\n *\n * await init({ apiKey, workflowName }); // registers the OTel tracer provider\n * const agent = strandsHooks(new Agent({ model }));\n *\n * The Strands Agents SDK emits its own OpenTelemetry spans (gen_ai.* semantic\n * conventions) for agent invocations, model calls, and tool calls. Those spans\n * flow into neatlogs automatically once `init()` has registered the global\n * tracer provider — and the neatlogs attribute mapper translates Strands'\n * `gen_ai.*` attributes into the `neatlogs.*` namespace (span kind, tool name,\n * model, token counts, etc.).\n *\n * Because Strands self-instruments and its native tracing cannot be disabled,\n * `strandsHooks()` does NOT emit its own spans — doing so would duplicate every\n * agent/model/tool span. It is a pass-through kept for API symmetry with the\n * other framework integrations: call it (or don't) — `init()` is what enables\n * capture. The function marks the agent so re-wrapping is a no-op.\n */\n\nexport function strandsHooks<T extends object>(agent: T): T {\n if (agent && typeof agent === 'object') {\n try {\n Object.defineProperty(agent, '_neatlogs_patched', {\n value: true,\n enumerable: false,\n configurable: true,\n });\n } catch {\n (agent as any)._neatlogs_patched = true;\n }\n }\n return agent;\n}\n","/**\n * Neatlogs OpenAI Agents SDK trace processor.\n *\n * Usage:\n * import { openaiAgentsProcessor } from 'neatlogs/openai-agents';\n * import { addTraceProcessor } from '@openai/agents';\n * addTraceProcessor(openaiAgentsProcessor());\n *\n * Creates spans: WORKFLOW (traces), AGENT (agent runs), LLM (generations), TOOL (function calls).\n */\n\nimport { trace, context as otelContext, SpanStatusCode, type Span } from '@opentelemetry/api';\n\nconst TRACER_NAME = 'neatlogs.openai_agents';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function openaiAgentsProcessor(): any {\n return new NeatlogsTraceProcessor();\n}\n\n// ---------------------------------------------------------------------------\n// Trace Processor (implements OpenAI Agents SDK TracingProcessor protocol)\n// ---------------------------------------------------------------------------\n\nclass NeatlogsTraceProcessor {\n private _spans: Map<string, Span> = new Map();\n private _startTimes: Map<string, number> = new Map();\n\n // The @openai/agents SDK passes a Trace object: { traceId, name, groupId, metadata }.\n onTraceStart(traceData: any): void {\n const tracer = trace.getTracer(TRACER_NAME);\n const attrs: Record<string, any> = { 'neatlogs.span.kind': 'WORKFLOW' };\n\n const workflowName = traceData?.name ?? traceData?.workflow_name;\n if (workflowName) attrs['neatlogs.workflow.name'] = workflowName;\n\n const traceId = traceData?.traceId ?? traceData?.trace_id;\n if (traceId) attrs['neatlogs.agent.trace_id'] = String(traceId);\n\n const span = tracer.startSpan('openai_agents.trace', { attributes: attrs }, otelContext.active());\n const key = String(traceId ?? `trace_${Date.now()}`);\n this._spans.set(key, span);\n this._startTimes.set(key, Date.now());\n }\n\n onTraceEnd(traceData: any): void {\n const key = String(traceData?.traceId ?? traceData?.trace_id ?? '');\n const span = this._spans.get(key);\n if (!span) return;\n\n const startTime = this._startTimes.get(key);\n if (startTime) {\n span.setAttribute('neatlogs.metrics.duration_ms', Date.now() - startTime);\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(key);\n this._startTimes.delete(key);\n }\n\n // The SDK passes a Span object: { type, spanId, traceId, parentId?, spanData: {...} }.\n // The meaningful payload (type, name, input, output, usage, ...) lives in `spanData`.\n onSpanStart(span: any): void {\n const tracer = trace.getTracer(TRACER_NAME);\n const data = span?.spanData ?? span ?? {};\n const spanType = data?.type ?? data?.span_type ?? span?.type ?? '';\n const spanId = String(span?.spanId ?? span?.span_id ?? data?.span_id ?? `span_${Date.now()}`);\n\n // Parent context: nest under the trace span (or a parent span) so the tree forms.\n const parentKey = String(span?.parentId ?? span?.traceId ?? span?.trace_id ?? '');\n const parentSpan = this._spans.get(parentKey);\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n let otelSpan: Span;\n\n if (spanType === 'agent' || spanType === 'agent_run') {\n const agentName = data?.name ?? data?.agent_name ?? 'agent';\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'AGENT',\n 'neatlogs.agent.name': agentName,\n };\n if (Array.isArray(data?.tools) && data.tools.length) {\n attrs['neatlogs.agent.available_tools'] = data.tools.join(',');\n }\n otelSpan = tracer.startSpan(`openai_agents.agent.${agentName}`, { attributes: attrs }, parentCtx);\n\n } else if (spanType === 'response' || spanType === 'generation' || spanType === 'llm') {\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': 'openai',\n };\n\n const model = data?.model;\n if (model) attrs['neatlogs.llm.model_name'] = model;\n\n const inputMsgs = data?.input ?? data?.messages;\n if (inputMsgs && Array.isArray(inputMsgs)) {\n for (let i = 0; i < inputMsgs.length; i++) {\n const msg = inputMsgs[i];\n const role = typeof msg === 'object' ? (msg.role ?? '') : '';\n const content = typeof msg === 'object' ? (msg.content ?? '') : String(msg);\n if (role) attrs[`neatlogs.llm.input_messages.${i}.role`] = role;\n if (content) attrs[`neatlogs.llm.input_messages.${i}.content`] = (typeof content === 'string' ? content : safeStringify(content)).slice(0, 10000);\n }\n }\n\n otelSpan = tracer.startSpan('openai_agents.generation', { attributes: attrs }, parentCtx);\n\n } else if (spanType === 'function' || spanType === 'tool' || spanType === 'tool_call') {\n const toolName = data?.name ?? data?.function_name ?? 'tool';\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': toolName,\n };\n\n const toolInput = data?.input ?? data?.arguments;\n if (toolInput !== undefined) {\n attrs['input.value'] = (typeof toolInput === 'string' ? toolInput : safeStringify(toolInput)).slice(0, 10000);\n }\n\n otelSpan = tracer.startSpan(`openai_agents.tool.${toolName}`, { attributes: attrs }, parentCtx);\n\n } else if (spanType === 'handoff') {\n const attrs: Record<string, any> = { 'neatlogs.span.kind': 'AGENT' };\n if (data?.from_agent) attrs['neatlogs.agent.handoff_from'] = String(data.from_agent);\n if (data?.to_agent) attrs['neatlogs.agent.name'] = String(data.to_agent);\n\n otelSpan = tracer.startSpan('openai_agents.handoff', { attributes: attrs }, parentCtx);\n\n } else {\n const attrs: Record<string, any> = { 'neatlogs.span.kind': 'CHAIN' };\n otelSpan = tracer.startSpan(`openai_agents.${spanType || 'span'}`, { attributes: attrs }, parentCtx);\n }\n\n this._spans.set(spanId, otelSpan);\n this._startTimes.set(spanId, Date.now());\n }\n\n onSpanEnd(span: any): void {\n const data = span?.spanData ?? span ?? {};\n const spanId = String(span?.spanId ?? span?.span_id ?? data?.span_id ?? '');\n const otelSpan = this._spans.get(spanId);\n if (!otelSpan) return;\n\n const spanType = data?.type ?? data?.span_type ?? span?.type ?? '';\n const startTime = this._startTimes.get(spanId);\n\n if (spanType === 'response' || spanType === 'generation' || spanType === 'llm') {\n // @openai/agents 'response' span nests the full Responses API object under\n // `_response` and the request under `_input`. Older shapes use output/usage/model directly.\n const resp = data?._response ?? data?.response ?? {};\n const model = data?.model ?? resp?.model;\n if (model) otelSpan.setAttribute('neatlogs.llm.model_name', model);\n\n // Output text: Responses API output[] has message items with content[].text\n const outputItems = data?.output ?? resp?.output;\n if (Array.isArray(outputItems)) {\n const text = outputItems\n .filter((o: any) => o?.type === 'message' || o?.role === 'assistant')\n .flatMap((o: any) => (Array.isArray(o.content) ? o.content : [o.content]))\n .map((c: any) => (typeof c === 'string' ? c : c?.text ?? ''))\n .join('');\n if (text) {\n otelSpan.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n otelSpan.setAttribute('neatlogs.llm.output_messages.0.content', text.slice(0, 10000));\n }\n // Tool-call items advertised in the response output\n const toolCalls = outputItems.filter((o: any) => o?.type === 'function_call');\n for (let i = 0; i < toolCalls.length; i++) {\n const tc = toolCalls[i];\n otelSpan.setAttribute(`neatlogs.llm.tool_calls.${i}.name`, tc.name ?? '');\n otelSpan.setAttribute(`neatlogs.llm.tool_calls.${i}.arguments`, typeof tc.arguments === 'string' ? tc.arguments : safeStringify(tc.arguments ?? {}));\n if (tc.callId ?? tc.id) otelSpan.setAttribute(`neatlogs.llm.tool_calls.${i}.id`, tc.callId ?? tc.id);\n }\n } else if (outputItems?.content) {\n otelSpan.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n const c = outputItems.content;\n otelSpan.setAttribute('neatlogs.llm.output_messages.0.content', (typeof c === 'string' ? c : safeStringify(c)).slice(0, 10000));\n }\n\n const usage = data?.usage ?? resp?.usage;\n if (usage) {\n const inputTokens = usage.input_tokens ?? usage.prompt_tokens ?? usage.inputTokens;\n const outputTokens = usage.output_tokens ?? usage.completion_tokens ?? usage.outputTokens;\n const totalTokens = usage.total_tokens ?? usage.totalTokens;\n if (inputTokens != null) otelSpan.setAttribute('neatlogs.llm.token_count.prompt', inputTokens);\n if (outputTokens != null) otelSpan.setAttribute('neatlogs.llm.token_count.completion', outputTokens);\n if (totalTokens != null) otelSpan.setAttribute('neatlogs.llm.token_count.total', totalTokens);\n else if (inputTokens != null && outputTokens != null) {\n otelSpan.setAttribute('neatlogs.llm.token_count.total', inputTokens + outputTokens);\n }\n }\n\n } else if (spanType === 'function' || spanType === 'tool' || spanType === 'tool_call') {\n const output = data?.output ?? data?.result;\n if (output != null) {\n otelSpan.setAttribute('output.value', (typeof output === 'string' ? output : safeStringify(output)).slice(0, 10000));\n }\n\n } else if (spanType === 'agent' || spanType === 'agent_run') {\n const output = data?.output;\n if (output != null) {\n otelSpan.setAttribute('output.value', (typeof output === 'string' ? output : safeStringify(output)).slice(0, 10000));\n }\n }\n\n const error = data?.error ?? span?.error;\n if (error) {\n if (error instanceof Error) {\n otelSpan.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n otelSpan.recordException(error);\n } else {\n otelSpan.setStatus({ code: SpanStatusCode.ERROR, message: String(error) });\n }\n } else {\n otelSpan.setStatus({ code: SpanStatusCode.OK });\n }\n\n if (startTime) {\n otelSpan.setAttribute('neatlogs.llm.metrics.duration_ms', Date.now() - startTime);\n }\n\n otelSpan.end();\n this._spans.delete(spanId);\n this._startTimes.delete(spanId);\n }\n\n shutdown(): void {\n for (const [, span] of this._spans) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: 'Processor shutdown before span completed' });\n span.end();\n }\n this._spans.clear();\n this._startTimes.clear();\n }\n\n forceFlush(): void {}\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction safeStringify(value: unknown): string {\n try {\n return typeof value === 'string' ? value : JSON.stringify(value);\n } catch {\n return '';\n }\n}\n","/**\n * Neatlogs Mastra wrapper — full nested tracing via method-wrapping.\n *\n * Usage:\n * import { wrapMastra } from 'neatlogs/mastra';\n * import { Agent } from '@mastra/core/agent';\n * const agent = wrapMastra(new Agent({ ... }));\n * const result = await agent.generate('Hello');\n *\n * Philosophy (same as wrapAISDK): we own the capturing layer. Instead of\n * depending on Mastra's internal observability bus or @mastra/observability,\n * we wrap Mastra's own methods and emit OpenTelemetry spans ourselves. Every\n * parent span is opened as the ACTIVE span, so child operations (LLM calls,\n * tool executions, workflow steps) nest automatically.\n *\n * Coverage (duck-typed by the methods present on the entity):\n * - Agent.generate()/stream() → AGENT (parent)\n * ↳ resolved model doGenerate/doStream → LLM (child, per model step)\n * ↳ each tool's execute() → TOOL (child, per tool call)\n * - Workflow.createRun().start()/resume() → WORKFLOW\n * - MastraVector.query() → RETRIEVER\n * - MastraVector.upsert/update/delete() → VECTOR_STORE\n * - MastraMemory.recall/saveMessages/... → CHAIN (memory ops)\n * - MDocument.chunk() → CHAIN\n * - rerank() (standalone fn) → RERANKER\n * - root Mastra (getAgent + getWorkflow) → proxy that wraps what it returns\n */\n\nimport { trace, context as otelContext, SpanStatusCode, type Span } from '@opentelemetry/api';\n\nconst TRACER_NAME = 'neatlogs.mastra';\nconst PATCH_FLAG = '_neatlogs_patched';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function wrapMastra<T extends object>(entity: T): T {\n if (!entity || (entity as any)[PATCH_FLAG]) return entity;\n\n const e = entity as any;\n const className = entity.constructor?.name ?? '';\n\n // Root Mastra: wrap the agents/workflows it hands out (it itself has neither\n // generate nor createRun). Detect by the getter pair.\n if (isRootMastra(e)) {\n const proxied = wrapRootMastra(e);\n markPatched(proxied);\n return proxied as T;\n }\n\n if (isAgent(e, className)) {\n patchAgent(e);\n } else if (isWorkflow(e, className)) {\n patchWorkflow(e);\n } else if (isVector(e, className)) {\n patchVector(e);\n } else if (isMemory(e, className)) {\n patchMemory(e);\n } else if (isDocument(e, className)) {\n patchDocument(e);\n }\n\n markPatched(e);\n return entity;\n}\n\n/**\n * Wrap a standalone `rerank()` function (from `@mastra/rag`) so each call emits\n * a RERANKER span. Returns a wrapped function; the original is unchanged.\n *\n * import { rerank } from '@mastra/rag';\n * const tracedRerank = wrapMastraRerank(rerank);\n */\nexport function wrapMastraRerank<F extends (...args: any[]) => any>(rerankFn: F): F {\n return (async function tracedRerank(...args: any[]) {\n return withSpan('mastra.rerank', { 'neatlogs.span.kind': 'RERANKER' }, (span) => {\n // rerank(results, query, model, options)\n const results = args?.[0];\n const query = args?.[1];\n const options = args?.[3];\n if (typeof query === 'string') {\n span.setAttribute('neatlogs.reranker.query', query.slice(0, 10000));\n span.setAttribute('input.value', query.slice(0, 10000));\n }\n if (Array.isArray(results)) span.setAttribute('neatlogs.reranker.input_documents', safeStringify(results).slice(0, 10000));\n if (options?.topK != null) span.setAttribute('neatlogs.reranker.top_k', options.topK);\n return Promise.resolve(rerankFn(...args)).then((result) => {\n span.setAttribute('neatlogs.reranker.output_documents', safeStringify(result).slice(0, 10000));\n span.setAttribute('output.value', safeStringify(result).slice(0, 10000));\n return result;\n });\n });\n }) as unknown as F;\n}\n\n// ---------------------------------------------------------------------------\n// Detection (duck-typed — robust across Mastra versions / build shapes)\n// ---------------------------------------------------------------------------\n\nfunction isRootMastra(e: any): boolean {\n return typeof e.getAgent === 'function' && typeof e.getWorkflow === 'function';\n}\n\nfunction isAgent(e: any, className: string): boolean {\n // An agent exposes generate()/stream(). getLLM()/listTools() are wrapped\n // opportunistically when present (installAgentLlmHook/installAgentToolHooks\n // no-op otherwise), so they are not required for detection.\n return className === 'Agent' || typeof e.generate === 'function' || typeof e.stream === 'function';\n}\n\nfunction isWorkflow(e: any, className: string): boolean {\n return className === 'Workflow' || typeof e.createRun === 'function';\n}\n\nfunction isVector(e: any, className: string): boolean {\n return /Vector/.test(className) || (typeof e.query === 'function' && typeof e.upsert === 'function');\n}\n\nfunction isMemory(e: any, className: string): boolean {\n return /Memory/.test(className) || (typeof e.recall === 'function' && typeof e.saveMessages === 'function');\n}\n\nfunction isDocument(e: any, className: string): boolean {\n return className === 'MDocument' || (typeof e.chunk === 'function' && typeof e.getDocs === 'function');\n}\n\n// ---------------------------------------------------------------------------\n// Agent\n// ---------------------------------------------------------------------------\n\nfunction patchAgent(agent: any): void {\n patchAgentMethod(agent, 'generate', false);\n patchAgentMethod(agent, 'stream', true);\n}\n\n/**\n * Wrap generate()/stream() with an AGENT parent span. Before delegating, also\n * install child-span hooks on this agent's resolved model (LLM) and tools\n * (TOOL) so they nest under the AGENT span. Hooks are installed lazily/once.\n */\nfunction patchAgentMethod(agent: any, method: 'generate' | 'stream', streaming: boolean): void {\n if (typeof agent[method] !== 'function') return;\n const orig = agent[method].bind(agent);\n\n agent[method] = async function tracedAgentMethod(input: any, opts?: any): Promise<any> {\n const agentName = agent.name ?? agent.id ?? 'mastra_agent';\n const model = extractModelId(agent.model);\n\n // Ensure LLM + TOOL child hooks are present (idempotent).\n installAgentLlmHook(agent);\n installAgentToolHooks(agent);\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'AGENT',\n 'neatlogs.agent.name': agentName,\n 'input.value': toInputValue(input),\n };\n if (model) attrs['neatlogs.llm.model_name'] = model;\n if (agent.instructions && typeof agent.instructions === 'string') {\n attrs['neatlogs.llm.system_prompt'] = agent.instructions.slice(0, 5000);\n }\n if (streaming) attrs['neatlogs.llm.is_streaming'] = true;\n\n if (streaming) {\n // stream() returns immediately; the model only runs when the caller drains\n // the stream. Keep the AGENT span open + active across the whole stream so\n // doStream (LLM) children nest, and finalize when the output completes.\n const tracer = trace.getTracer(TRACER_NAME);\n const span = tracer.startSpan(`mastra.agent.${agentName}`, { attributes: attrs }, otelContext.active());\n const ctx = trace.setSpan(otelContext.active(), span);\n try {\n const result = await otelContext.with(ctx, () => orig(input, opts));\n return wrapStreamingOutput(result, span, ctx);\n } catch (err) {\n recordError(span, err);\n span.end();\n throw err;\n }\n }\n\n return withActiveSpan(`mastra.agent.${agentName}`, attrs, async (span) => {\n const result = await orig(input, opts);\n finalizeAgentResult(span, result);\n return result;\n });\n };\n}\n\n/**\n * Patch agent.getLLM so the model it returns has doGenerate/doStream wrapped\n * (emitting LLM child spans). Mastra calls this.getLLM() inside generate/stream,\n * and the resolved model is the single chokepoint for the real provider call.\n */\nfunction installAgentLlmHook(agent: any): void {\n if (agent.__neatlogs_llm_hook || typeof agent.getLLM !== 'function') return;\n agent.__neatlogs_llm_hook = true;\n\n const origGetLLM = agent.getLLM.bind(agent);\n agent.getLLM = function patchedGetLLM(...args: any[]): any {\n const out = origGetLLM(...args);\n return Promise.resolve(out).then((llm: any) => {\n try {\n const model = typeof llm?.getModel === 'function' ? llm.getModel() : llm;\n patchModelInPlace(model);\n } catch {\n /* best-effort */\n }\n return llm;\n });\n };\n}\n\n/** Wrap a resolved language model's doGenerate/doStream in place (idempotent). */\nfunction patchModelInPlace(model: any): void {\n if (!model || model.__neatlogs_model_patched) return;\n model.__neatlogs_model_patched = true;\n const modelId = model.modelId ?? model.modelName ?? '';\n const provider = model.provider ?? '';\n\n for (const fn of ['doGenerate', 'doStream'] as const) {\n if (typeof model[fn] !== 'function') continue;\n const orig = model[fn].bind(model);\n const isStream = fn === 'doStream';\n\n model[fn] = function tracedModelCall(callOpts: any): any {\n const attrs: Record<string, any> = { 'neatlogs.span.kind': 'LLM' };\n if (modelId) attrs['neatlogs.llm.model_name'] = modelId;\n if (provider) attrs['neatlogs.llm.provider'] = provider;\n if (isStream) attrs['neatlogs.llm.is_streaming'] = true;\n const promptInput = callOpts?.prompt ?? callOpts?.messages;\n if (promptInput !== undefined) attrs['input.value'] = safeStringify(promptInput).slice(0, 10000);\n captureInvocationParams(attrs, callOpts);\n\n return withActiveSpan(`mastra.llm.${modelId || 'model'}.${fn}`, attrs, async (span) => {\n const result = await orig(callOpts);\n if (!isStream) finalizeModelResult(span, result);\n // Streaming doGenerate-style results serialize lazily; record what we can.\n else if (result?.usage) recordUsage(span, result.usage);\n return result;\n });\n };\n }\n}\n\n/** Patch each tool's execute() so tool calls become TOOL child spans. */\nfunction installAgentToolHooks(agent: any): void {\n if (agent.__neatlogs_tool_hook) return;\n let tools: Record<string, any> | undefined;\n try {\n tools = typeof agent.listTools === 'function' ? agent.listTools() : undefined;\n } catch {\n tools = undefined;\n }\n if (!tools || typeof tools !== 'object') return;\n agent.__neatlogs_tool_hook = true;\n\n for (const [key, tool] of Object.entries<any>(tools)) {\n patchToolExecute(tool, key);\n }\n}\n\nfunction patchToolExecute(tool: any, key: string): void {\n if (!tool || typeof tool.execute !== 'function' || tool.__neatlogs_tool_patched) return;\n tool.__neatlogs_tool_patched = true;\n const toolName = tool.id ?? key;\n const orig = tool.execute.bind(tool);\n\n tool.execute = function tracedToolExecute(params: any, options?: any): any {\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': toolName,\n 'input.value': safeStringify(params).slice(0, 10000),\n };\n if (tool.description) attrs['neatlogs.tool.description'] = String(tool.description).slice(0, 2000);\n\n return withActiveSpan(`mastra.tool.${toolName}`, attrs, async (span) => {\n const result = await orig(params, options);\n span.setAttribute('output.value', safeStringify(result).slice(0, 10000));\n return result;\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// Workflow\n// ---------------------------------------------------------------------------\n\nfunction patchWorkflow(workflow: any): void {\n if (typeof workflow.createRun !== 'function') return;\n const origCreateRun = workflow.createRun.bind(workflow);\n const workflowName = workflow.name ?? workflow.id ?? 'mastra_workflow';\n\n workflow.createRun = async function tracedCreateRun(...args: any[]): Promise<any> {\n const run = await origCreateRun(...args);\n if (!run) return run;\n patchRunMethod(run, 'start', workflowName);\n patchRunMethod(run, 'resume', workflowName);\n return run;\n };\n}\n\nfunction patchRunMethod(run: any, method: 'start' | 'resume', workflowName: string): void {\n if (typeof run[method] !== 'function') return;\n const orig = run[method].bind(run);\n\n run[method] = async function tracedRunMethod(startOpts: any): Promise<any> {\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'WORKFLOW',\n 'neatlogs.workflow.name': workflowName,\n };\n if (startOpts?.inputData !== undefined) {\n attrs['input.value'] = safeStringify(startOpts.inputData).slice(0, 10000);\n }\n\n return withActiveSpan(`mastra.workflow.${workflowName}`, attrs, async (span) => {\n const result = await orig(startOpts);\n if (result?.status) span.setAttribute('neatlogs.metadata', safeStringify({ status: result.status }));\n if (result?.result !== undefined) {\n span.setAttribute('output.value', safeStringify(result.result).slice(0, 10000));\n }\n return result;\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// Vector store\n// ---------------------------------------------------------------------------\n\nconst VECTOR_READ_OPS = ['query'];\nconst VECTOR_WRITE_OPS = ['upsert', 'updateVector', 'deleteVector', 'createIndex', 'deleteIndex'];\n\nfunction patchVector(vector: any): void {\n for (const op of VECTOR_READ_OPS) patchVectorOp(vector, op, 'RETRIEVER');\n for (const op of VECTOR_WRITE_OPS) patchVectorOp(vector, op, 'VECTOR_STORE');\n}\n\nfunction patchVectorOp(vector: any, op: string, kind: 'RETRIEVER' | 'VECTOR_STORE'): void {\n if (typeof vector[op] !== 'function') return;\n const orig = vector[op].bind(vector);\n const dbName = vector.constructor?.name ?? 'vector';\n\n vector[op] = async function tracedVectorOp(params: any): Promise<any> {\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': kind,\n 'neatlogs.db.system': dbName,\n 'neatlogs.db.operation': op,\n 'input.value': safeStringify(params).slice(0, 10000),\n };\n const indexName = params?.indexName;\n if (indexName) attrs['neatlogs.vectordb.index_name'] = String(indexName);\n if (kind === 'RETRIEVER' && params?.topK != null) attrs['neatlogs.retriever.top_k'] = params.topK;\n return withActiveSpan(`mastra.vector.${op}`, attrs, async (span) => {\n const result = await orig(params);\n span.setAttribute('output.value', safeStringify(result).slice(0, 10000));\n return result;\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// Memory\n// ---------------------------------------------------------------------------\n\nconst MEMORY_OPS = ['recall', 'saveMessages', 'updateWorkingMemory', 'deleteMessages'];\n\nfunction patchMemory(memory: any): void {\n for (const op of MEMORY_OPS) {\n if (typeof memory[op] !== 'function') continue;\n const orig = memory[op].bind(memory);\n memory[op] = async function tracedMemoryOp(...args: any[]): Promise<any> {\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'CHAIN',\n 'neatlogs.db.operation': op,\n 'input.value': safeStringify(args?.[0]).slice(0, 10000),\n };\n return withActiveSpan(`mastra.memory.${op}`, attrs, async (span) => {\n const result = await orig(...args);\n span.setAttribute('output.value', safeStringify(result).slice(0, 8000));\n return result;\n });\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// MDocument\n// ---------------------------------------------------------------------------\n\nfunction patchDocument(doc: any): void {\n if (typeof doc.chunk !== 'function') return;\n const orig = doc.chunk.bind(doc);\n doc.chunk = async function tracedChunk(...args: any[]): Promise<any> {\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'CHAIN',\n 'neatlogs.db.operation': 'chunk',\n };\n return withActiveSpan('mastra.document.chunk', attrs, async (span) => {\n const result = await orig(...args);\n if (Array.isArray(result)) span.setAttribute('neatlogs.db.documents_count', result.length);\n return result;\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// Root Mastra proxy\n// ---------------------------------------------------------------------------\n\nfunction wrapRootMastra(mastra: any): any {\n const AGENT_GETTERS = new Set(['getAgent', 'getAgentById']);\n const WORKFLOW_GETTERS = new Set(['getWorkflow', 'getWorkflowById']);\n\n return new Proxy(mastra, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n if (typeof value !== 'function') return value;\n const name = String(prop);\n\n if (AGENT_GETTERS.has(name) || WORKFLOW_GETTERS.has(name)) {\n return (...args: any[]) => {\n const entity = value.apply(target, args);\n return entity && typeof entity === 'object' ? wrapMastra(entity) : entity;\n };\n }\n return value.bind(target);\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Streaming output wrapping\n// ---------------------------------------------------------------------------\n\n/**\n * Finalize the AGENT span for a streaming result.\n *\n * Mastra's `stream()` returns a `MastraModelOutput` (NOT a plain async-iterable):\n * the model only runs when the caller drains `.textStream`/`.fullStream` or\n * awaits `.text`. We therefore:\n * 1. Re-establish the AGENT span's context around stream consumption so the\n * model's `doStream` (LLM) child nests under it.\n * 2. Tap the `.text`/`.usage`/`.finishReason` promises — which resolve when the\n * stream completes regardless of how the caller consumes — to record output\n * and end the span exactly once.\n * Falls back to legacy async-iterable / thenable shapes for older Mastra.\n */\nfunction wrapStreamingOutput(output: any, span: Span, ctx: ReturnType<typeof otelContext.active>): any {\n if (!output) {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return output;\n }\n\n let ended = false;\n const endOnce = (err?: unknown) => {\n if (ended) return;\n ended = true;\n if (err) recordError(span, err);\n else span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n };\n\n // MastraModelOutput: has awaitable .text (thenable). Tap completion promises.\n if (output.text && typeof output.text.then === 'function') {\n const finalize = async () => {\n try {\n const [text, usage, finishReason] = await Promise.all([\n Promise.resolve(output.text).catch(() => undefined),\n Promise.resolve(output.usage).catch(() => undefined),\n Promise.resolve(output.finishReason).catch(() => undefined),\n ]);\n if (typeof text === 'string' && text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', text.slice(0, 10000));\n }\n if (usage) recordUsage(span, usage);\n if (finishReason) span.setAttribute('neatlogs.llm.stop_reason', normalizeFinishReason(finishReason));\n endOnce();\n } catch (err) {\n endOnce(err);\n }\n };\n // Drive finalization without requiring the caller to consume; the promises\n // resolve when Mastra finishes the stream internally.\n void finalize();\n\n // Re-establish span context around stream getters so doStream children nest.\n return rebindStreamContext(output, ctx);\n }\n\n // Legacy async-iterable\n if (output[Symbol.asyncIterator]) {\n const origIterator = output[Symbol.asyncIterator].bind(output);\n const textParts: string[] = [];\n const wrapped = Object.create(Object.getPrototypeOf(output));\n Object.assign(wrapped, output);\n wrapped[Symbol.asyncIterator] = function () {\n const iterator = origIterator();\n const finish = () => {\n if (textParts.length) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', textParts.join('').slice(0, 10000));\n }\n endOnce();\n };\n return {\n async next(): Promise<IteratorResult<any>> {\n try {\n const r = await iterator.next();\n if (r.done) { finish(); return r; }\n const chunk = r.value;\n if (typeof chunk === 'string') textParts.push(chunk);\n else if (chunk?.text) textParts.push(chunk.text);\n else if (chunk?.delta) textParts.push(chunk.delta);\n return r;\n } catch (err) { endOnce(err); throw err; }\n },\n async return(value?: any): Promise<IteratorResult<any>> {\n finish();\n return iterator.return?.(value) ?? { done: true, value: undefined };\n },\n async throw(err?: any): Promise<IteratorResult<any>> {\n endOnce(err);\n return iterator.throw?.(err) ?? { done: true, value: undefined };\n },\n };\n };\n return wrapped;\n }\n\n // Thenable (awaited result)\n if (typeof output.then === 'function') {\n return output\n .then((resolved: any) => { finalizeAgentResult(span, resolved); endOnce(); return resolved; })\n .catch((err: any) => { endOnce(err); throw err; });\n }\n\n endOnce();\n return output;\n}\n\n/**\n * Wrap the async-iterable getters on a MastraModelOutput so that draining the\n * stream runs inside the AGENT span's context (lets the model's doStream child\n * span attach to the right parent). Returns a proxy; non-stream props pass through.\n */\nfunction rebindStreamContext(output: any, ctx: ReturnType<typeof otelContext.active>): any {\n const STREAM_PROPS = new Set(['textStream', 'fullStream', 'objectStream', 'elementStream']);\n return new Proxy(output, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n if (typeof prop === 'string' && STREAM_PROPS.has(prop) && value && value[Symbol.asyncIterator]) {\n const origIterator = value[Symbol.asyncIterator].bind(value);\n return {\n [Symbol.asyncIterator]() {\n return otelContext.with(ctx, () => origIterator());\n },\n };\n }\n if (typeof value === 'function') return value.bind(target);\n return value;\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Result finalization\n// ---------------------------------------------------------------------------\n\nfunction finalizeAgentResult(span: Span, result: any): void {\n if (!result) return;\n\n if (result.text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', String(result.text).slice(0, 10000));\n }\n\n if (Array.isArray(result.toolCalls)) {\n for (let i = 0; i < result.toolCalls.length; i++) {\n const tc = result.toolCalls[i];\n const p = tc.payload ?? tc;\n setToolCall(span, i, p.toolName ?? p.name, p.args ?? p.arguments, p.toolCallId ?? p.id);\n }\n }\n\n if (result.usage) recordUsage(span, result.usage);\n if (result.finishReason) span.setAttribute('neatlogs.llm.stop_reason', normalizeFinishReason(result.finishReason));\n if (result.model) span.setAttribute('neatlogs.llm.model_name', result.model);\n}\n\nfunction finalizeModelResult(span: Span, result: any): void {\n if (!result) return;\n // AI SDK v5 doGenerate result: { content[], finishReason, usage, ... }.\n // `content` is an array of typed parts (text / tool-call); `text` may be absent.\n if (typeof result.text === 'string' && result.text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', result.text.slice(0, 10000));\n } else if (Array.isArray(result.content)) {\n const text = result.content\n .filter((p: any) => p?.type === 'text' && typeof p.text === 'string')\n .map((p: any) => p.text)\n .join('');\n if (text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', text.slice(0, 10000));\n }\n // Tool-call parts → indexed tool_calls\n const toolCalls = result.content.filter((p: any) => p?.type === 'tool-call');\n for (let i = 0; i < toolCalls.length; i++) {\n const tc = toolCalls[i];\n setToolCall(span, i, tc.toolName, tc.input ?? tc.args, tc.toolCallId);\n }\n span.setAttribute('output.value', safeStringify(result.content).slice(0, 10000));\n }\n if (result.usage) recordUsage(span, result.usage);\n span.setAttribute('neatlogs.llm.stop_reason', normalizeFinishReason(result.finishReason));\n}\n\nfunction normalizeFinishReason(fr: any): string {\n if (fr == null) return '';\n if (typeof fr === 'string') return fr;\n // AI SDK v5 raw model returns { unified: 'tool-calls', ... }\n return String(fr.unified ?? fr.reason ?? fr.type ?? safeStringify(fr));\n}\n\n/** Read a possibly-nested token count: 42, or { total: 42 }. */\nfunction tokenValue(v: any): number | undefined {\n if (v == null) return undefined;\n if (typeof v === 'number') return v;\n if (typeof v === 'object' && typeof v.total === 'number') return v.total;\n const n = Number(v);\n return Number.isFinite(n) ? n : undefined;\n}\n\n/**\n * Capture LLM sampling/invocation parameters from the model call options onto\n * the span, using only canonical neatlogs.* keys. Present-only — absent params\n * are skipped. Mirrors AI SDK LanguageModelV2CallOptions field names.\n */\nfunction captureInvocationParams(attrs: Record<string, any>, callOpts: any): void {\n if (!callOpts) return;\n const map: Array<[string, string]> = [\n ['temperature', 'neatlogs.llm.temperature'],\n ['maxOutputTokens', 'neatlogs.llm.max_tokens'],\n ['maxTokens', 'neatlogs.llm.max_tokens'],\n ['topP', 'neatlogs.llm.top_p'],\n ['topK', 'neatlogs.llm.top_k'],\n ['frequencyPenalty', 'neatlogs.llm.frequency_penalty'],\n ['presencePenalty', 'neatlogs.llm.presence_penalty'],\n ];\n const invocation: Record<string, any> = {};\n for (const [src, target] of map) {\n const v = callOpts[src];\n if (v != null) {\n attrs[target] = v;\n invocation[src] = v;\n }\n }\n if (Array.isArray(callOpts.stopSequences) && callOpts.stopSequences.length) {\n attrs['neatlogs.llm.stop_sequences'] = safeStringify(callOpts.stopSequences);\n invocation.stopSequences = callOpts.stopSequences;\n }\n // Tool definitions advertised to the model → neatlogs.llm.tools.{i}\n if (Array.isArray(callOpts.tools)) {\n for (let i = 0; i < callOpts.tools.length; i++) {\n attrs[`neatlogs.llm.tools.${i}`] = safeStringify(callOpts.tools[i]).slice(0, 4000);\n }\n invocation.toolChoice = callOpts.toolChoice;\n }\n if (Object.keys(invocation).length) {\n attrs['neatlogs.llm.invocation_parameters'] = safeStringify(invocation).slice(0, 4000);\n }\n}\n\n/**\n * Emit an indexed tool call directly in the neatlogs target namespace\n * `neatlogs.llm.tool_calls.{i}.{id,name,arguments}` — matching how the validated\n * openai/anthropic wrappers (src/openai.ts) emit them. The backend's\n * tool_calls.{i} target is an indexed object with these sub-fields.\n */\nfunction setToolCall(span: Span, i: number, name: any, args: any, id: any): void {\n span.setAttribute(`neatlogs.llm.tool_calls.${i}.name`, name ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${i}.arguments`, safeStringify(args ?? {}));\n if (id) span.setAttribute(`neatlogs.llm.tool_calls.${i}.id`, id);\n}\n\nfunction recordUsage(span: Span, usage: any): void {\n if (!usage) return;\n // Shapes seen:\n // - AISDK v5 raw model: { inputTokens: {total}, outputTokens: {total} }\n // - Mastra result: { inputTokens, outputTokens, totalTokens }\n // - AISDK v3: { promptTokens, completionTokens, totalTokens }\n const prompt = tokenValue(usage.promptTokens ?? usage.inputTokens ?? usage.input_tokens);\n const completion = tokenValue(usage.completionTokens ?? usage.outputTokens ?? usage.output_tokens);\n const total = tokenValue(usage.totalTokens);\n if (prompt != null) span.setAttribute('neatlogs.llm.token_count.prompt', prompt);\n if (completion != null) span.setAttribute('neatlogs.llm.token_count.completion', completion);\n if (total != null) span.setAttribute('neatlogs.llm.token_count.total', total);\n else if (prompt != null && completion != null) {\n span.setAttribute('neatlogs.llm.token_count.total', prompt + completion);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Span helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Open a span as the ACTIVE span for the duration of `fn`, so any spans created\n * inside `fn` (model calls, tool executions, workflow steps) nest under it.\n */\nfunction withActiveSpan<T>(name: string, attrs: Record<string, any>, fn: (span: Span) => Promise<T>): Promise<T> {\n const tracer = trace.getTracer(TRACER_NAME);\n const span = tracer.startSpan(name, { attributes: attrs }, otelContext.active());\n const ctx = trace.setSpan(otelContext.active(), span);\n return otelContext.with(ctx, async () => {\n try {\n const result = await fn(span);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (err) {\n recordError(span, err);\n throw err;\n } finally {\n // Stream wrappers end the span themselves once the stream drains; guard\n // against double-end via the OTel SDK (ending twice is a no-op there).\n span.end();\n }\n });\n}\n\n/** Like withActiveSpan but for non-async-context-sensitive leaf operations. */\nfunction withSpan<T>(name: string, attrs: Record<string, any>, fn: (span: Span) => Promise<T> | T): Promise<T> {\n const tracer = trace.getTracer(TRACER_NAME);\n const span = tracer.startSpan(name, { attributes: attrs }, otelContext.active());\n return Promise.resolve()\n .then(() => fn(span))\n .then((result) => {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n })\n .catch((err) => {\n recordError(span, err);\n span.end();\n throw err;\n });\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction markPatched(e: any): void {\n try {\n Object.defineProperty(e, PATCH_FLAG, { value: true, enumerable: false, configurable: true });\n } catch {\n e[PATCH_FLAG] = true;\n }\n}\n\nfunction extractModelId(model: any): string {\n if (!model) return '';\n if (typeof model === 'string') return model;\n return model.modelId ?? model.name ?? '';\n}\n\nfunction toInputValue(input: any): string {\n return (typeof input === 'string' ? input : safeStringify(input)).slice(0, 10000);\n}\n\nfunction safeStringify(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value) ?? '';\n } catch {\n return '';\n }\n}\n\nfunction recordError(span: Span, err: unknown): void {\n if (err instanceof Error) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: err.message });\n span.recordException(err);\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) });\n }\n}\n","/**\n * LLM template binding for frameworks that manage LLM calls internally (e.g. CrewAI).\n *\n * Usage:\n * const boundLlm = bindTemplates(llm, systemTpl, userTpl, { content: '...' });\n * const agent = new Agent({ llm: boundLlm, ... });\n *\n * When the LLM's invoke/call method runs, this wrapper fires first:\n * 1. Sets prompt template + user prompt template in OTel context\n * 2. Calls the instrumented class-level invoke (creates the LLM span)\n * 3. span_processor reads context -> templates land on the LLM span\n */\n\nimport { context as otelContext, type Context } from '@opentelemetry/api';\nimport { getLogger } from './logger.js';\nimport { PromptContext, UserPromptContext } from '../prompt/template.js';\n\nconst logger = getLogger();\n\n/**\n * Return a copy of `llm` whose invoke()/call() injects prompt template context\n * before the instrumented LLM span is created.\n *\n * @param llm - Any LangChain-compatible chat model or crewai.LLM\n * @param systemTpl - PromptTemplate for the agent backstory / system role\n * @param userTpl - Optional UserPromptTemplate for the task description\n * @param compiledVars - Variable values to pass to userTpl.compile()\n * @returns A new LLM instance with template context pre-wired\n */\nexport function bindTemplates(\n llm: any,\n systemTpl: any,\n userTpl?: any,\n compiledVars?: Record<string, any>,\n): any {\n const systemStr = String(systemTpl.template);\n const userStr = userTpl ? String(userTpl.template) : null;\n\n // Clone the LLM so different agents can each have their own binding.\n // Prefer Object.create (preserves prototype chain and methods) over\n // structuredClone (which strips functions).\n let llmCopy: any;\n try {\n // Shallow copy that preserves prototype chain (like Python's copy.copy)\n llmCopy = Object.create(Object.getPrototypeOf(llm), Object.getOwnPropertyDescriptors(llm));\n } catch {\n try {\n // Try structured clone for plain data objects\n llmCopy = structuredClone(llm);\n } catch {\n // Fall back to binding in place\n llmCopy = llm;\n logger.debug(\n `LLM type ${llm?.constructor?.name ?? 'unknown'} is not copyable — binding in place.`,\n );\n }\n }\n\n // Find the method to wrap: prefer invoke(), fall back to call()\n let methodName: string;\n if (typeof llmCopy.invoke === 'function') {\n methodName = 'invoke';\n } else if (typeof llmCopy.call === 'function') {\n methodName = 'call';\n } else {\n logger.warn(\n `LLM type ${llm?.constructor?.name ?? 'unknown'} has neither invoke() nor call() — ` +\n 'prompt templates will not be captured on spans.',\n );\n return llmCopy;\n }\n\n const originalMethod = llmCopy[methodName].bind(llmCopy);\n\n llmCopy[methodName] = function wrappedWithTemplates(...args: any[]) {\n // Compile system template (stores in PromptContext)\n systemTpl.compile();\n\n // Compile user template if provided\n if (userTpl && compiledVars) {\n userTpl.compile(compiledVars);\n }\n\n // Call the original (instrumented) method\n try {\n return originalMethod(...args);\n } finally {\n PromptContext.clear();\n if (userTpl && compiledVars) {\n UserPromptContext.clear();\n }\n }\n };\n\n logger.debug(\n `Wrapped ${llm?.constructor?.name ?? 'unknown'}.${methodName}() with template injection.`,\n );\n\n return llmCopy;\n}\n"],"mappings":"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","names":["trace","traceTool","path","import_api","import_api","logger","logger","import_api","logger","span","logger","span","trace","otelTrace","otelContext","logger","logger","result","logger","resolve","span","otelContext","spanId","otelTrace","logger","fs","path","import_api","context","ExportResultCode","logger","import_api","logger","logger","import_api","path","logger","_debugMode","logger","span","context","import_api","TRACER_NAME","safeStringify","span","stringified","otelContext","import_api","TRACER_NAME","safeStringify","otelContext","span","path","import_api","TRACER_NAME","wrapNamespace","traceTool","safeStringify","otelContext","span","recordError","path","isNamespace","setInvocationParams","import_api","TRACER_NAME","otelContext","safeStringify","span","import_api","TRACER_NAME","span","otelContext","safeStringify","import_api","TRACER_NAME","TRACER_NAME","span","otelContext","recordError","safeStringify","safeStringify","recordError","span","logger"]}