neatlogs 1.1.9 → 1.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +40 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +40 -2
- package/dist/index.mjs.map +1 -1
- package/dist/opencode-plugin.cjs +40 -2
- package/dist/opencode-plugin.cjs.map +1 -1
- package/dist/opencode-plugin.mjs +40 -2
- package/dist/opencode-plugin.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -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/core/identity.ts","../src/core/session.ts","../src/core/provider.ts","../src/core/end-user.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/log.ts","../src/instrumentation/registry.ts","../src/instrumentation/manager.ts","../src/prompt/client.ts","../node_modules/@opentelemetry/core/src/trace/suppress-tracing.ts","../src/mastra.ts","../src/version.ts","../src/decorators/orchestration.ts","../src/core/propagation.ts","../src/ai-sdk.ts","../src/openai.ts","../src/core/auto-root.ts","../src/anthropic.ts","../src/azure-openai.ts","../src/vertex-ai.ts","../src/google-genai.ts","../src/bedrock.ts","../src/langchain.ts","../src/strands.ts","../src/openai-agents.ts","../src/mastra-wrap.ts","../src/pi-agent.ts","../src/claude-agent-sdk.ts","../src/openrouter-agent.ts","../src/opencode-trace-shipper.ts","../src/opencode-plugin.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, setTraceOutput } from './core/context.js';\nexport { log } from './core/log.js';\n\n// Request-scoped session & end-user identity (per-request, not process-global).\nexport { identify } from './core/identity.js';\nexport {\n injectTraceContext,\n type TraceContextCarrier,\n} from './core/propagation.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';\nexport { wrapAzureOpenAI, traceTool as traceToolAzureOpenAI } from './azure-openai.js';\nexport { wrapVertexAI, wrapVertexAIChat, traceTool as traceToolVertexAI } from './vertex-ai.js';\nexport { wrapGoogleGenAI, wrapGoogleGenAIChat, traceTool as traceToolGoogleGenAI } from './google-genai.js';\nexport { wrapBedrock, traceTool as traceToolBedrock } from './bedrock.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';\nexport { piAgentHooks } from './pi-agent.js';\nexport { wrapClaudeAgentSDK } from './claude-agent-sdk.js';\nexport { wrapOpenRouterAgent, wrapCallModel } from './openrouter-agent.js';\nexport { NeatlogsOpencodePlugin } from './opencode-plugin.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 * as path from 'node:path';\n\nimport { Resource } from '@opentelemetry/resources';\nimport { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';\nimport { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport {\n BatchSpanProcessor,\n type BasicTracerProvider,\n} from '@opentelemetry/sdk-trace-base';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport { LoggerProvider, 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 { _setOtelLogger } from './core/log.js';\nimport { _setSessionConfig } from './core/context.js';\nimport { _setNeatlogsProvider } from './core/provider.js';\nimport { getLogger, enableDebugLogging } from './core/logger.js';\nimport {\n InstrumentationManager,\n assertInstrumentationsIsolationSafe,\n} from './instrumentation/manager.js';\nimport { PromptClient, setSharedClient } from './prompt/client.js';\nimport { _resetMastraCache } from './mastra.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: BasicTracerProvider | null = null;\nlet _ownsTracerProvider = false;\nlet _logProvider: LoggerProvider | null = null;\nlet _spanProcessor: NeatlogsSpanProcessor | null = null;\nlet _debugMode = false;\n// Retained so shutdown() can disable the instrumentors it installed; otherwise a\n// stale instrumentor stays bound to the shut-down provider after reinit.\nlet _instrumentationManager: InstrumentationManager | null = null;\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// 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 // 1b. Validate the requested instrumentations against the isolation policy\n // BEFORE touching any module state (debug flag, session config, provider, …).\n // The check is a pure function of the registry + the requested set, so failing\n // here keeps init() atomic: a rejected init leaves no half-installed provider\n // or stale state behind, and the next init() starts clean. Neatlogs always\n // uses a private provider, so this rejects any instrumentor that would drive\n // the global OTel context.\n if (options.instrumentations?.length) {\n assertInstrumentationsIsolationSafe(options.instrumentations);\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. Parse base URL from endpoint\n const endpoint =\n options.endpoint ??\n 'https://ingest.neatlogs.com';\n const baseUrl = new URL(endpoint).origin;\n\n // 7. Set session config. Session & end-user identity are PER-REQUEST (set via\n // trace()/span() or identify()), never on init() — only the operator userId\n // and workflow/transport config live here.\n _setSessionConfig({\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 // Operator identity only — whoever RUNS the SDK. Session & end-user identity\n // are per-request (trace()/span()/identify()), never resource attributes.\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 or adopt a PRIVATE TracerProvider. Neatlogs never reads,\n // registers onto, or shuts down a foreign global provider, so Datadog,\n // Braintrust, and other co-tenants can neither export nor parent our spans\n // (and vice versa).\n const provider =\n options.tracerProvider ??\n new NodeTracerProvider({\n resource,\n spanLimits: { attributeCountLimit: 10_000 },\n });\n _ownsTracerProvider = options.tracerProvider === undefined;\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. Store privately. Neatlogs never registers an OTel provider globally.\n _tracerProvider = provider;\n _setNeatlogsProvider(provider);\n\n if (options.debug) {\n logger.debug('Neatlogs tracer provider initialized');\n }\n\n // 14. Never replace the process-global meter provider.\n if (options.debug) {\n logger.debug('Global meter provider left unchanged');\n }\n\n // 15. Set up LoggerProvider (if captureLogs)\n const captureLogs = options.captureLogs ?? false;\n if (captureLogs) {\n const logRecordProcessors: BatchLogRecordProcessor[] = [];\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 logRecordProcessors.push(\n new BatchLogRecordProcessor(otlpLogExporter, {\n maxExportBatchSize: options.batchSize ?? 100,\n scheduledDelayMillis: (options.flushInterval ?? 5) * 1000,\n }),\n );\n if (options.debug) {\n logger.debug(`OTLP log exporter configured: ${logsEndpoint}`);\n }\n }\n\n // sdk-logs >= 0.200 configures processors in the constructor and removed\n // addLogRecordProcessor(). Retain the older path so Neatlogs stays\n // compatible with applications that still resolve sdk-logs 0.57.\n const supportsDynamicProcessors =\n typeof LoggerProvider.prototype.addLogRecordProcessor === 'function';\n _logProvider = supportsDynamicProcessors\n ? new LoggerProvider({ resource })\n : new LoggerProvider({\n resource,\n processors: logRecordProcessors,\n } as ConstructorParameters<typeof LoggerProvider>[0]);\n if (supportsDynamicProcessors) {\n for (const processor of logRecordProcessors) {\n _logProvider.addLogRecordProcessor(processor);\n }\n }\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. Retained in module state so shutdown() can disable\n // the instrumentors it installed. The manager rejects any requested library\n // whose auto-instrumentor drives the global OTel context.\n _instrumentationManager = new InstrumentationManager({\n provider,\n debug: options.debug,\n });\n\n if (options.instrumentations?.length) {\n await _instrumentationManager.instrument(options.instrumentations);\n if (options.debug) {\n logger.debug(\n `Instrumented libraries: ${_instrumentationManager.instrumented.join(', ')}`,\n );\n }\n }\n\n // 17. Register shutdown handlers. Default to flushing on exit whenever we own\n // the private provider so standalone scripts drain their spans;\n // only a caller-supplied provider defaults off (its owner controls shutdown).\n const registerShutdownHandlers =\n options.registerShutdownHandlers ?? _ownsTracerProvider;\n if (registerShutdownHandlers && !_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(`User: ${options.userId ?? '(none)'}`);\n logger.info(`Tags: ${tags ?? []}`);\n logger.info(\n `Instrumentations: ${_instrumentationManager.instrumented.join(', ') || '(none)'}`,\n );\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 // Flush regardless of ownership: our processors are attached to the provider\n // (owned or caller-supplied), so draining them is always ours to do. Shutdown\n // is what's ownership-gated — we never shut down a provider we didn't create.\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 (_logProvider) {\n try {\n logger.debug('Flushing log provider...');\n await _logProvider.forceFlush();\n logger.debug('Log provider 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 // Disable instrumentors BEFORE tearing down the provider so they stop emitting\n // spans against it, and clear the Mastra bridge cache so a subsequent init()\n // rebinds to the fresh provider instead of a stale one.\n _instrumentationManager?.disable();\n _instrumentationManager = null;\n _resetMastraCache();\n\n // Only shut down a provider we created. A caller-supplied provider is flushed\n // (above / in flush()) but never shut down — its owner controls its lifecycle,\n // per the tracerProvider contract in InitOptions. Flush it here so a caller\n // that shuts down right after us doesn't lose our still-buffered spans.\n if (_tracerProvider && _ownsTracerProvider) {\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 } else if (_tracerProvider) {\n try {\n logger.debug('Flushing caller-owned tracer provider (not shutting down)...');\n await _tracerProvider.forceFlush();\n } catch (e) {\n logger.error(`Error flushing caller-owned tracer 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 // Reset all module-level state\n _initialized = false;\n _tracerProvider = null;\n _ownsTracerProvider = false;\n _setNeatlogsProvider(null);\n _logProvider = 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(): BasicTracerProvider {\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 ROOT_CONTEXT,\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 { applySessionAttributes } from './session.js';\nimport { applyEndUserAttributes } from './end-user.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';\nimport { getNeatlogsTracer } from './provider.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 // Stamp request-scoped identity (identify()) onto ANY root span as a\n // fallback. trace()/span() set it explicitly (overriding this); direct\n // wrappers' auto-roots stamp it themselves. This catch-all is what lets\n // identify() reach FRAMEWORK roots (openai-agents/strands/pi-agent) that\n // open their own root without stamping identity. No-ops when identify() is\n // inactive; child spans are skipped.\n if (!span.parentSpanId) {\n applySessionAttributes(span, undefined, true);\n applyEndUserAttributes(span, undefined, undefined, true);\n }\n\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 only from the span's OWN parentContext. The global\n // OTel context belongs to another SDK and must never be consulted.\n const getFrom = (ctx: Context | undefined, key: symbol): string | undefined =>\n typeof ctx?.getValue === 'function'\n ? (ctx.getValue(key) as string | undefined)\n : undefined;\n const readValue = (key: symbol): string | undefined =>\n getFrom(parentContext, key);\n let variablesJson = readValue(PROMPT_VARIABLES_KEY);\n let template = readValue(PROMPT_TEMPLATE_KEY);\n const versionVal = readValue(PROMPT_VERSION_KEY);\n let userTemplate = readValue(USER_PROMPT_TEMPLATE_KEY);\n let userVariablesJson = readValue(USER_PROMPT_VARIABLES_KEY);\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(ROOT_CONTEXT, wrappedSpan);\n\n const tracer = getNeatlogsTracer('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 // The completion marker may be exported in a batch without the root span.\n // Carry the root-owned identity so ingestion can finalize the trace under\n // the correct conversation and end-user without depending on batch order.\n for (const key of [\n 'neatlogs.session.id',\n 'neatlogs.end_user.id',\n 'neatlogs.end_user.metadata',\n ]) {\n const value = rootSpan.attributes[key];\n if (value !== undefined) {\n marker.setAttribute(key, value);\n }\n }\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);\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 // generateObject/streamObject emit ai.response.object (structured), not\n // ai.response.text — build the same output message from it so the doGenerate\n // LLM child shows the object instead of a blank output.\n if (\n 'ai.response.object' in attrs &&\n !('llm.output_messages.0.message.content' in attrs)\n ) {\n const obj = attrs['ai.response.object'];\n attrs['llm.output_messages.0.message.role'] = 'assistant';\n attrs['llm.output_messages.0.message.content'] =\n typeof obj === 'string' ? obj : JSON.stringify(obj);\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);\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","/**\n * Request-scoped session & end-user identity.\n *\n * Session and end-user identity are PER-REQUEST, not process-global, so they are\n * never set on `init()`. The primary way to set them is at the trace root\n * (`trace({ sessionId })` / `span({ sessionId })`). For code that only uses\n * `wrap()` — where the trace root is created internally by the wrapper and the\n * caller has no root to put arguments on — use the `identify()` context:\n *\n * await neatlogs.identify(\n * { sessionId: 'chat_123', endUserId: 'user_456', endUserMetadata: { plan: 'pro' } },\n * async () => {\n * await wrappedClient.chat.completions.create(...); // auto-root reads this\n * },\n * );\n *\n * Resolution at the trace root (per field): explicit per-call argument wins, then\n * the `identify()` context, then nothing. Identity is stamped on the ROOT span\n * only; the backend rolls it up to the trace and its session.\n *\n * Backed by `AsyncLocalStorage` so it propagates across `await` boundaries (and\n * nested async tasks), exactly like OpenTelemetry's own context propagation.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\nexport interface IdentityStore {\n sessionId?: string;\n endUserId?: string;\n endUserMetadata?: Record<string, any>;\n}\n\nexport interface IdentifyOptions {\n sessionId?: string;\n endUserId?: string;\n endUserMetadata?: Record<string, any>;\n}\n\n// tsup bundles each entry point (index, openai, azure-openai, ...) separately,\n// so a plain module-level `new AsyncLocalStorage()` would be DUPLICATED per\n// bundle — identify() (in index) would write to a different store than a\n// provider wrapper's auto-root (in e.g. azure-openai) reads, silently losing\n// identity on the wrapper-only path. Pin a single instance on globalThis so all\n// bundled copies (ESM + CJS) resolve to the same store.\nconst _GLOBAL_KEY = Symbol.for('neatlogs.identity.storage');\ntype _GlobalWithStore = typeof globalThis & {\n [_GLOBAL_KEY]?: AsyncLocalStorage<IdentityStore>;\n};\nconst _g = globalThis as _GlobalWithStore;\nconst _storage: AsyncLocalStorage<IdentityStore> =\n _g[_GLOBAL_KEY] ?? (_g[_GLOBAL_KEY] = new AsyncLocalStorage<IdentityStore>());\n\nexport function currentSessionId(): string | undefined {\n return _storage.getStore()?.sessionId;\n}\n\nexport function currentEndUserId(): string | undefined {\n return _storage.getStore()?.endUserId;\n}\n\nexport function currentEndUserMetadata(): Record<string, any> | undefined {\n return _storage.getStore()?.endUserMetadata;\n}\n\n/**\n * Bind session / end-user identity for the duration of `fn`.\n *\n * Only defined fields are set, so a nested `identify()` overrides one field\n * without clearing the others (it merges onto the enclosing store). The previous\n * store is automatically restored when `fn` returns / rejects. Returns whatever\n * `fn` returns (sync value or Promise).\n *\n * @example\n * ```typescript\n * await neatlogs.identify({ sessionId: 'chat_123' }, async () => {\n * await wrappedClient.chat.completions.create(...);\n * });\n * ```\n */\nexport function identify<T>(opts: IdentifyOptions, fn: () => T): T {\n const prev = _storage.getStore();\n const next: IdentityStore = { ...(prev ?? {}) };\n if (opts.sessionId !== undefined) next.sessionId = opts.sessionId;\n if (opts.endUserId !== undefined) next.endUserId = opts.endUserId;\n if (opts.endUserMetadata !== undefined) next.endUserMetadata = opts.endUserMetadata;\n return _storage.run(next, fn);\n}\n","/**\n * Session identity.\n *\n * A *session* is one conversation / thread / journey — it groups the multiple\n * traces of a multi-turn interaction (one turn = one trace). Identity is\n * declared once at a trace boundary — `init()` (process-global default),\n * `trace()` (per-turn), or `span()` (per root) — via the `sessionId` option on\n * those existing constructs. The SDK stamps only the trace's ROOT span; the\n * backend rolls the value up to group the traces of a session together.\n *\n * For single-turn workflows a session maps 1:1 to a trace: when no session is\n * declared the backend backfills `session_id = trace_id`.\n *\n * Canonical span attribute:\n * `neatlogs.session.id` — the session identifier (string)\n */\n\nimport { type Span } from '@opentelemetry/api';\nimport { getLogger } from './logger.js';\nimport { currentSessionId } from './identity.js';\n\nconst logger = getLogger();\n\nexport const SESSION_ID_KEY = 'neatlogs.session.id';\n\n/**\n * Stamp the session id onto a ROOT span (best-effort). When `isRoot` is false\n * the span is a child and the value is ignored — the backend reads session from\n * the root span and groups traces by it.\n */\nexport function applySessionAttributes(\n span: Span,\n sessionId?: string,\n isRoot = true,\n): void {\n // Resolution at the root: explicit per-call arg wins, else the identify()\n // context (request-scoped). Non-root spans never carry session identity.\n const resolved = isRoot ? (sessionId ?? currentSessionId()) : sessionId;\n if (!resolved) return;\n if (!isRoot) {\n logger.debug(\n '[session] Ignoring sessionId on a non-root span — declare it on the ' +\n 'trace root (top-level trace()/span()) or identify().',\n );\n return;\n }\n span.setAttribute(SESSION_ID_KEY, String(resolved));\n}\n","/**\n * Neatlogs-owned tracing state.\n *\n * Spans are created by the private Neatlogs provider and their parent is carried\n * in a private context key. The process-global OpenTelemetry span is\n * deliberately left untouched so other observability SDKs cannot export or\n * become parents of Neatlogs spans.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n ROOT_CONTEXT,\n INVALID_SPAN_CONTEXT,\n createContextKey,\n trace as otelTrace,\n type Context,\n type Span,\n type SpanOptions,\n type Tracer,\n type TracerProvider,\n} from '@opentelemetry/api';\n\n// Carries the trace-ROOT span down the private context so descendants can target\n// it (e.g. setTraceOutput). getActiveNeatlogsSpan() returns the innermost span,\n// which is not the root once nested; this key preserves the root reference.\nconst NEATLOGS_ROOT_SPAN_KEY = createContextKey('neatlogs.root_span');\n\n// Entry points are bundled independently (`neatlogs`, `neatlogs/openai`,\n// `neatlogs/ai`, `neatlogs/mastra`, … each in both CJS and ESM), so every piece\n// of shared tracing state — the private span store AND the resolved provider /\n// provider — must live on `globalThis` behind a `Symbol.for` key.\n// Otherwise `init()` (run from the `neatlogs` bundle) sets `_provider` in ITS\n// module copy while a wrapper imported from `neatlogs/openai` reads a different,\n// still-null copy and silently falls back to the foreign global provider.\nconst PRIVATE_SPAN_STORAGE_KEY = Symbol.for(\n 'neatlogs.private_span_async_local_storage',\n);\nconst PRIVATE_PROVIDER_STATE_KEY = Symbol.for(\n 'neatlogs.private_provider_state',\n);\ninterface PrivateProviderState {\n provider: TracerProvider | null;\n}\ntype NeatlogsGlobal = typeof globalThis & {\n [PRIVATE_SPAN_STORAGE_KEY]?: AsyncLocalStorage<Context>;\n [PRIVATE_PROVIDER_STATE_KEY]?: PrivateProviderState;\n};\nconst neatlogsGlobal = globalThis as NeatlogsGlobal;\n// Stores the full Neatlogs Context (parent span PLUS any threaded values such as\n// trace()'s prompt-template keys), not just the span. We never\n// activate the OTel global context, so this private store is the ONLY channel\n// through which those values propagate down to descendant spans.\nconst privateContextStorage =\n neatlogsGlobal[PRIVATE_SPAN_STORAGE_KEY] ??\n (neatlogsGlobal[PRIVATE_SPAN_STORAGE_KEY] = new AsyncLocalStorage<Context>());\nconst providerState: PrivateProviderState =\n neatlogsGlobal[PRIVATE_PROVIDER_STATE_KEY] ??\n (neatlogsGlobal[PRIVATE_PROVIDER_STATE_KEY] = {\n provider: null,\n });\n// Wrappers may be constructed or accidentally invoked before init(). They must\n// never fall back to a foreign process-global provider, so pre-init calls use a\n// local no-op tracer and safely emit no exported spans.\nconst preInitTracer: Tracer = {\n startSpan(): Span {\n return otelTrace.wrapSpanContext(INVALID_SPAN_CONTEXT);\n },\n startActiveSpan<F extends (span: Span) => unknown>(\n _name: string,\n arg2?: SpanOptions | Context | F,\n arg3?: Context | F,\n arg4?: F,\n ): ReturnType<F> {\n const fn =\n typeof arg2 === 'function'\n ? arg2\n : typeof arg3 === 'function'\n ? arg3\n : arg4;\n return fn!(otelTrace.wrapSpanContext(INVALID_SPAN_CONTEXT)) as ReturnType<F>;\n },\n};\n\n/** @internal Configure the provider used by Neatlogs-created spans. */\nexport function _setNeatlogsProvider(provider: TracerProvider | null): void {\n providerState.provider = provider;\n}\n\n/** Resolve a tracer from the private provider when one is configured. */\nexport function getNeatlogsTracer(name: string): Tracer {\n return providerState.provider?.getTracer(name) ?? preInitTracer;\n}\n\n/**\n * @internal The private Neatlogs provider, or null before\n * init(). Used by integrations that must repoint a self-instrumenting library's\n * captured provider onto ours.\n */\nexport function getNeatlogsProvider(): TracerProvider | null {\n return providerState.provider;\n}\n\n/**\n * Wrap a tracer so that spans it creates parent from — and, for\n * `startActiveSpan`, activate on — the PRIVATE Neatlogs context instead of the\n * global one.\n *\n * We hand this to libraries that create their own spans off a tracer we give\n * them (the Vercel AI SDK's `experimental_telemetry.tracer`, which calls\n * `tracer.startActiveSpan()` internally). Without the facade the AI SDK's native\n * spans would parent from `context.active()` — the foreign co-tenant's context —\n * and `startActiveSpan` would push them onto the GLOBAL context, so a foreign\n * tracer's next span reads our native span as its parent. Both directions leak.\n *\n */\nexport function isolateTracer(tracer: Tracer): Tracer {\n const facade: Tracer = {\n startSpan(name: string, options?: SpanOptions, context?: Context): Span {\n const parent = context ?? getNeatlogsActiveContext();\n return tracer.startSpan(name, options, parent);\n },\n startActiveSpan<F extends (span: Span) => unknown>(\n name: string,\n arg2?: SpanOptions | Context | F,\n arg3?: Context | F,\n arg4?: F,\n ): ReturnType<F> {\n // Normalize the 2/3/4-arg overloads of startActiveSpan.\n let options: SpanOptions | undefined;\n let context: Context | undefined;\n let fn: F;\n if (typeof arg2 === 'function') {\n fn = arg2 as F;\n } else if (typeof arg3 === 'function') {\n options = arg2 as SpanOptions;\n fn = arg3 as F;\n } else {\n options = arg2 as SpanOptions;\n context = arg3 as Context;\n fn = arg4 as F;\n }\n const parent = context ?? getNeatlogsActiveContext();\n const span = tracer.startSpan(name, options, parent);\n return withNeatlogsSpan(span, () => fn(span), parent) as ReturnType<F>;\n },\n };\n return facade;\n}\n\n/**\n * The base context to build new Neatlogs spans and values on. NEVER contains a\n * foreign provider's span: it reads our private store, or ROOT_CONTEXT when\n * nothing is active.\n */\nexport function getNeatlogsActiveContext(): Context {\n return privateContextStorage.getStore() ?? ROOT_CONTEXT;\n}\n\n/** Return only the active Neatlogs span (never a foreign provider's span). */\nexport function getActiveNeatlogsSpan(): Span | undefined {\n return otelTrace.getSpan(getNeatlogsActiveContext());\n}\n\n/**\n * Return the trace-ROOT Neatlogs span, or undefined when no trace is active.\n *\n * Unlike {@link getActiveNeatlogsSpan} (innermost), this is the outermost span\n * of the current trace — the one the backend derives trace-level output from\n * (`parent_span_id=''`). It is stashed on the private context the first time a\n * span becomes active, so nested calls still resolve to the root.\n */\nexport function getNeatlogsRootSpan(): Span | undefined {\n return getNeatlogsActiveContext().getValue(NEATLOGS_ROOT_SPAN_KEY) as\n | Span\n | undefined;\n}\n\n/**\n * Build a parent context that cannot contain a foreign provider's span.\n *\n * The active Neatlogs context already carries the parent span AND any values\n * the caller threaded in upstream (e.g. `trace()`'s prompt-template values), so\n * those values reach the span processor via `onStart(parentContext)`. An\n * explicit `baseContext` (a caller's own value-carrying context) is honored as-is.\n */\nexport function getNeatlogsParentContext(baseContext?: Context): Context {\n return baseContext ?? getNeatlogsActiveContext();\n}\n\n/**\n * A base context for callers that thread parent linkage themselves\n * (callback/event handlers that keep their own run-id → span map: LangChain,\n * OpenAI-Agents, Claude Agent SDK).\n *\n * This is the ACTIVE Neatlogs context — the private store's\n * context if a Neatlogs `trace()`/`span()` encloses this call, else\n * ROOT_CONTEXT. So a handler's own root/entry span nests under an enclosing\n * Neatlogs trace (preserving its session + end-user id) when one exists, and\n * auto-roots cleanly when one doesn't. A foreign provider's active span can\n * never leak in as an ancestor because the global context is never read.\n */\nexport function getNeatlogsBaseContext(baseContext?: Context): Context {\n return baseContext ?? getNeatlogsActiveContext();\n}\n\n/**\n * Build an execution context for a Neatlogs span while preserving the active\n * foreign context. The span rides our private context store.\n */\nexport function getNeatlogsExecutionContext(\n span: Span,\n baseContext: Context = ROOT_CONTEXT,\n): Context {\n return otelTrace.setSpan(baseContext, span);\n}\n\n/**\n * Run a callback with a Neatlogs span active under the appropriate policy.\n *\n * The stored context is `setSpan(base, span)` — carrying the span PLUS whatever\n * values `base` holds — so threaded values (prompt templates)\n * propagate to descendant spans through our private store instead of the global\n * OTel context we deliberately never touch.\n */\nexport function withNeatlogsSpan<T>(\n span: Span,\n fn: () => T,\n baseContext?: Context,\n): T {\n const base = baseContext ?? getNeatlogsActiveContext();\n let ctx = otelTrace.setSpan(base, span);\n // The first span activated in a context with no root recorded IS the root of\n // this trace; remember it so descendants (setTraceOutput) can target it.\n if (base.getValue(NEATLOGS_ROOT_SPAN_KEY) === undefined) {\n ctx = ctx.setValue(NEATLOGS_ROOT_SPAN_KEY, span);\n }\n return privateContextStorage.run(ctx, fn);\n}\n","/**\n * End-user identity.\n *\n * The *end user* is the user of OUR CUSTOMER'S application — the person\n * interacting with the AI product our customer built. This is deliberately\n * distinct from the operator-level `userId` set in {@link init}, which identifies\n * whoever is running the SDK (a developer, a service account, a CI job).\n *\n * Model: **one end-user per trace.** Identity is declared once at a trace\n * boundary — `init()` (process-global default), `trace()` (per-request), or\n * `span()` (per root) — via new options on those existing constructs. There is\n * no separate `identify()` call and no nested per-span override: a trace belongs\n * to a single end-user.\n *\n * End-user identity belongs to the trace as a whole, so the SDK only stamps it\n * on the trace's ROOT span (any span kind, created via `trace()` / `span()`). A\n * non-root child span never carries it. The backend reads end-user from the root\n * span and rolls the value up to the trace (and its session) so\n * filtering/analytics are trace- and session-level, not per-span.\n *\n * Canonical span attributes:\n * `neatlogs.end_user.id` — the end-user identifier (string)\n * `neatlogs.end_user.metadata` — JSON object of arbitrary end-user fields\n */\n\nimport { type Span } from '@opentelemetry/api';\nimport { getLogger } from './logger.js';\nimport { currentEndUserId, currentEndUserMetadata } from './identity.js';\nimport { getActiveNeatlogsSpan } from './provider.js';\n\nconst logger = getLogger();\n\nexport const END_USER_ID_KEY = 'neatlogs.end_user.id';\nexport const END_USER_METADATA_KEY = 'neatlogs.end_user.metadata';\n\n/** Coerce end-user metadata to a JSON string. Returns undefined when empty. */\nexport function normalizeEndUserMetadata(\n metadata: string | Record<string, any> | undefined | null,\n): string | undefined {\n if (metadata === undefined || metadata === null) return undefined;\n if (typeof metadata === 'string') return metadata || undefined;\n try {\n return JSON.stringify(metadata);\n } catch {\n return JSON.stringify(String(metadata));\n }\n}\n\n/**\n * True when no recording span is currently active — i.e. a span created now\n * would be the trace root.\n */\nexport function isRootSpan(): boolean {\n // Resolve from the private span store in isolated mode (a foreign provider's\n // active span must not count as our parent), else the active OTel span.\n const current = getActiveNeatlogsSpan();\n return !(current && current.isRecording());\n}\n\n/**\n * Stamp end-user id/metadata onto a ROOT span (best-effort). When `isRoot` is\n * false the span is a child and the value is ignored — the backend reads\n * end-user from the root span and rolls it up to the trace and session.\n */\nexport function applyEndUserAttributes(\n span: Span,\n endUserId?: string,\n endUserMetadata?: string | Record<string, any> | null,\n isRoot = true,\n): void {\n // Resolution at the root (per field): explicit per-call arg wins, else the\n // identify() context (request-scoped). Non-root spans never carry identity.\n const resolvedId = isRoot ? (endUserId ?? currentEndUserId()) : endUserId;\n const resolvedMeta = isRoot\n ? (endUserMetadata ?? currentEndUserMetadata())\n : endUserMetadata;\n if (!resolvedId && !resolvedMeta) return;\n if (!isRoot) {\n logger.debug(\n '[end_user] Ignoring endUserId/endUserMetadata on a non-root span — ' +\n 'declare it on the trace root (top-level trace()/span()) or identify().',\n );\n return;\n }\n if (resolvedId) {\n span.setAttribute(END_USER_ID_KEY, String(resolvedId));\n }\n const metaJson = normalizeEndUserMetadata(resolvedMeta);\n if (metaJson) {\n span.setAttribute(END_USER_METADATA_KEY, metaJson);\n }\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';\nimport { applyEndUserAttributes } from './end-user.js';\nimport { applySessionAttributes } from './session.js';\nimport { currentSessionId } from './identity.js';\n\nimport { getLogger } from './logger.js';\nimport { safeJsonDumps, serializeObj } from '../decorators/base.js';\nimport type { TraceOptions, MaskFunction } from '../types.js';\nimport {\n getActiveNeatlogsSpan,\n getNeatlogsActiveContext,\n getNeatlogsParentContext,\n getNeatlogsRootSpan,\n getNeatlogsTracer,\n withNeatlogsSpan,\n} from './provider.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 'sessionId',\n 'endUserId',\n 'endUserMetadata',\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// Explicit trace-level output\n// ---------------------------------------------------------------------------\n\n/**\n * Explicitly set the trace-level \"final output\" shown for the current trace.\n *\n * By default the trace's displayed output is derived from the root span's\n * captured output. Call this to declare it instead — useful when the turn's\n * meaningful result lives in a tool call or is a status object you don't want\n * shown (e.g. an agent that suspends awaiting user input). The value is stamped\n * as `neatlogs.trace.output` on the trace ROOT span, which the backend prefers\n * over the derived output.\n *\n * No-op when called outside an active trace. Never throws.\n *\n * @param value - The value to show as the trace's final output.\n *\n * @example\n * ```typescript\n * await trace({ name: 'turn', sessionId }, async () => {\n * const plan = await proposePlan();\n * setTraceOutput(plan.title); // show the plan, not the raw status object\n * });\n * ```\n */\nexport function setTraceOutput(value: unknown): void {\n try {\n const span = getNeatlogsRootSpan() ?? getActiveNeatlogsSpan();\n if (!span) return;\n span.setAttribute('neatlogs.trace.output', safeJsonDumps(serializeObj(value)));\n } catch (err) {\n logger.warn(`[setTraceOutput] failed to set trace output: ${err}`);\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 a session id is resolved (per-call `sessionId` or the request-scoped\n * `identify()` context) AND no active parent span exists, this creates a NEW\n * 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 sessionId: sessionIdOption,\n endUserId,\n endUserMetadata,\n attributes: explicitAttributes,\n ...extraOptions\n } = options;\n\n // Per-call sessionId wins, else the request-scoped identify() context.\n // Session identity is NOT process-global — init() never sets it.\n const sessionId = sessionIdOption ?? currentSessionId();\n\n // Determine whether we are inside an existing active trace\n const currentSpan = getActiveNeatlogsSpan();\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 // Start from the Neatlogs active context (private store in isolated mode), NOT\n // otelContext.active() — the latter is the foreign co-tenant's context, whose\n // active span must never become our parent. Prompt values threaded here then\n // propagate to descendant LLM spans through the private store.\n let ctx = getNeatlogsActiveContext();\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 // End-user belongs to the trace root only. This trace() call is a root when it\n // creates a new root trace, or when it isn't nested in an already-active trace.\n const isRootTrace = shouldCreateRootTrace || !isInActiveTrace;\n\n // ---------------------------------------------------------------------------\n // Create span and execute callback\n // ---------------------------------------------------------------------------\n\n const tracer = getNeatlogsTracer('neatlogs.trace');\n\n const spanCallback = async (span: Span): Promise<T> => {\n _setSpanAttributes(span, kind, extraAttributes);\n\n // Session/end-user belong to the trace root only; skipped on a non-root span.\n applySessionAttributes(span, sessionId, isRootTrace);\n applyEndUserAttributes(span, endUserId, endUserMetadata, isRootTrace);\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 const parentContext = shouldCreateRootTrace\n ? ROOT_CONTEXT\n : getNeatlogsParentContext(ctx);\n // Seed the span kind at CREATION, not just in the callback: the span processor\n // classifies LLM spans in onStart() (which fires from startSpan, before the\n // callback runs). Without this, a trace({ kind: 'LLM', promptTemplate }) span\n // isn't recognized as LLM in time and its prompt-template attributes are dropped.\n const startAttributes = kind ? { 'openinference.span.kind': kind } : undefined;\n const span = tracer.startSpan(name, startAttributes ? { attributes: startAttributes } : {}, parentContext);\n\n if (shouldCreateRootTrace) {\n logger.debug(`[trace] Creating NEW root trace '${name}' (sessionId=${sessionId})`);\n } else {\n logger.debug(`[trace] Creating child span '${name}'`);\n }\n\n return withNeatlogsSpan(span, () => spanCallback(span), ctx);\n}\n","/**\n * Core span decoration utilities.\n * Provides the low-level wrapping logic used by span() and Span().\n */\n\nimport { ROOT_CONTEXT, SpanStatusCode, type Span as OtelSpan } from '@opentelemetry/api';\nimport { getLogger } from '../core/logger.js';\nimport { registerMask } from '../core/mask.js';\nimport { applyEndUserAttributes, isRootSpan } from '../core/end-user.js';\nimport { applySessionAttributes } from '../core/session.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from '../core/provider.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 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 // Resolve the tracer at CALL time, not definition time: a decorator applied\n // before init() would otherwise capture the no-op global provider forever\n // and emit zero spans once the private provider is configured.\n const tracer = getNeatlogsTracer(TRACER_NAME);\n // End-user belongs to the trace root only. Capture root status BEFORE the\n // span is created (once it's active, it would be the \"current\" span).\n const isRoot = isRootSpan();\n // Parent from our private span store; a root decorated function anchors a\n // fresh trace under ROOT_CONTEXT.\n const parentContext = isRoot ? ROOT_CONTEXT : getNeatlogsParentContext();\n const span = tracer.startSpan(spanName, {}, parentContext);\n return withNeatlogsSpan(span, () => {\n try {\n // Set common attributes\n setCommonSpanAttrs(span, opts);\n\n // Session/end-user identity (root span only; skipped on a non-root child).\n applySessionAttributes(span, opts.sessionId, isRoot);\n applyEndUserAttributes(span, opts.endUserId, opts.endUserMetadata, isRoot);\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 * 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 { getLogger } from './logger.js';\nimport {\n getActiveNeatlogsSpan,\n getNeatlogsActiveContext,\n} from './provider.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 // Correlate to the active NEATLOGS span, not the global active span: in\n // isolated mode the latter is the foreign co-tenant's (Datadog/Braintrust)\n // span, which would either mis-correlate the log or attach a foreign context.\n const activeSpan = getActiveNeatlogsSpan();\n const activeContext = activeSpan ? getNeatlogsActiveContext() : undefined;\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 // The OTel Logs API accepts a Context, not a raw SpanContext. Passing\n // `spanContext` is silently ignored by sdk-logs, producing a log with\n // no trace id that the Neatlogs ingest route correctly discards.\n ...(activeContext ? { context: activeContext } : {}),\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 // Correlate to the active Neatlogs span (not the global active span) — same\n // reasoning as log(): in isolated mode the global span is a co-tenant's.\n const activeSpan = getActiveNeatlogsSpan();\n const activeContext = activeSpan ? getNeatlogsActiveContext() : undefined;\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 ...(activeContext ? { context: activeContext } : {}),\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 * Whether this library's manager-loaded auto-instrumentor is safe to run\n * with Neatlogs' always-private provider. Manager-loaded OTel/OpenInference instrumentors\n * create and activate spans through the GLOBAL OpenTelemetry context\n * (`context.active()` / `context.with()`), which cannot be intercepted by a\n * private-provider facade — so a foreign co-tenant (Datadog, …) can still\n * parent or be parented by their spans in both directions. Such instrumentors\n * are therefore NOT isolation-safe and `init()` rejects them.\n *\n * Absent/false = not isolation-safe (the fail-closed default). Set `true` only\n * for an instrumentor that creates AND activates its spans exclusively through\n * Neatlogs' private context runtime. Explicit wrappers (wrapOpenAI, etc.) are\n * a separate, always-allowed path and don't go through the manager.\n */\n isolationSafe?: boolean;\n /**\n * Human-readable pointer to the explicit, fully-isolated Neatlogs wrapper for\n * this library — used to build the rejection message so users\n * know the supported alternative (e.g. \"wrapOpenAI() from 'neatlogs/openai'\").\n */\n explicitWrapper?: 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 'azure_openai',\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 'claude_agent_sdk',\n 'openrouter_agent',\n 'opencode',\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 explicitWrapper: \"wrapAISDK() from 'neatlogs/ai'\",\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 explicitWrapper: \"wrapOpenAI() from 'neatlogs/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 explicitWrapper: \"wrapAnthropic() from 'neatlogs/anthropic'\",\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 // The wrapper is opt-in per call site (wrapBedrock); this entry keeps\n // scope detection and tagging consistent.\n neatlogs: 'neatlogs/bedrock',\n default_span_kind: 'LLM',\n explicitWrapper: \"wrapBedrock() from 'neatlogs/bedrock'\",\n },\n azure_openai: {\n openinference: null,\n openllmetry: null,\n neatlogs: 'neatlogs/azure-openai',\n default_span_kind: 'LLM',\n explicitWrapper: \"wrapAzureOpenAI() from 'neatlogs/azure-openai'\",\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: 'neatlogs/vertex-ai',\n default_span_kind: 'LLM',\n explicitWrapper: \"wrapVertexAI() from 'neatlogs/vertex-ai'\",\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 explicitWrapper: \"langchainHandler() from 'neatlogs/langchain'\",\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 // The MastraInstrumentor path monkey-patches the (sealed) Mastra\n // constructor and its bridge activates spans on the global context, so it\n // is neither reliable nor isolation-safe. Use the explicit wrapper.\n explicitWrapper: \"wrapMastra() from 'neatlogs/mastra'\",\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 // The instrumentor calls startActiveSpan on a global-context-bound tracer.\n explicitWrapper: \"wrapGoogleGenAI() from 'neatlogs/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 // Opt-in wrapper (wrapClaudeAgentSDK); entry kept for scope detection/tagging.\n neatlogs: 'neatlogs/claude-agent-sdk',\n default_span_kind: 'AGENT',\n explicitWrapper: \"wrapClaudeAgentSDK() from 'neatlogs/claude-agent-sdk'\",\n },\n openrouter_agent: {\n openinference: null,\n openllmetry: null,\n neatlogs: 'neatlogs/openrouter-agent',\n default_span_kind: 'AGENT',\n explicitWrapper: \"wrapOpenRouterAgent() from 'neatlogs/openrouter-agent'\",\n },\n opencode: {\n openinference: null,\n openllmetry: null,\n neatlogs: 'neatlogs/opencode',\n default_span_kind: 'AGENT',\n explicitWrapper: \"NeatlogsOpencodePlugin from 'neatlogs/opencode'\",\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, type LibraryInfo } from './registry.js';\n\nconst logger = getLogger();\n\nexport interface InstrumentationManagerOptions {\n provider: TracerProvider;\n debug?: boolean;\n}\n\n/**\n * Build the rejection message for a manager-loaded instrumentor\n * that isn't isolation-safe. Names the explicit, fully-isolated wrapper when the\n * registry knows one.\n */\nfunction isolationRejectionMessage(lib: string, info: LibraryInfo): string {\n const alt = info.explicitWrapper\n ? `Use ${info.explicitWrapper} for isolated tracing`\n : `Use an explicit Neatlogs wrapper for isolated tracing if one exists`;\n return (\n `The \"${lib}\" auto-instrumentation uses the global OpenTelemetry context ` +\n `and cannot guarantee isolation from other tracing SDKs (Datadog, etc.).\\n\\n` +\n `${alt}. Neatlogs does not support shared global-context instrumentation.`\n );\n}\n\n/**\n * Throw if any requested library's auto-instrumentor would drive the global OTel\n * context under isolation. A PURE function of the registry + the requested set —\n * it touches no provider or module state — so `init()` can call it BEFORE creating\n * or installing the private provider, keeping initialization atomic: a rejected\n * `init()` leaves no abandoned provider or half-set state behind. The manager's\n * own instance gate delegates here too (for direct manager users).\n */\nexport function assertInstrumentationsIsolationSafe(libraries: string[]): void {\n for (const lib of libraries) {\n const info = getLibraryInfo(lib);\n // Only reject libs that actually LOAD an instrumentor (openinference or\n // neatlogs package set). A registry entry with both null is a no-op kept only\n // for scope detection/tagging — it patches nothing, so nothing can leak\n // through the global context. Unknown libs (info undefined) likewise can't leak.\n const loadsInstrumentor = !!(info && (info.openinference || info.neatlogs));\n if (info && loadsInstrumentor && !info.isolationSafe) {\n throw new Error(isolationRejectionMessage(lib, info));\n }\n }\n}\n\nexport class InstrumentationManager {\n private provider: TracerProvider;\n private _instrumented: string[] = [];\n // Retained so shutdown() can disable them (unpatch the target module) — else a\n // stale instrumentor stays bound to the shut-down provider across reinit.\n private _instances: Array<{ lib: string; instance: any }> = [];\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 * This first rejects (throws) any requested library whose\n * registry entry is not `isolationSafe`: those instrumentors create/activate\n * spans on the global OTel context, which a private provider cannot isolate in\n * either direction. Failing here (before patching anything) keeps the isolation\n * guarantee strict rather than best-effort.\n */\n async instrument(libraries: string[]): Promise<void> {\n assertInstrumentationsIsolationSafe(libraries);\n\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._instances.push({ lib, instance: instrumentor });\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._instances.push({ lib, instance: instrumentor });\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._instances.push({ lib, instance: instrumentor });\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._instances.push({ lib, instance: instrumentor });\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._instances.push({ lib, instance: instrumentor });\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 /**\n * Disable every instrumentor this manager installed, unpatching the target\n * modules so they stop emitting spans against the (now shut-down) provider.\n * Called from shutdown() so a subsequent init() rebinds cleanly instead of\n * leaving a stale instrumentor pointed at a dead provider.\n */\n disable(): void {\n for (const { lib, instance } of this._instances) {\n try {\n if (typeof instance.disable === 'function') {\n instance.disable();\n } else if (typeof instance.uninstrument === 'function') {\n instance.uninstrument();\n }\n } catch (e) {\n logger.debug(`Failed to disable instrumentor for '${lib}': ${e}`);\n }\n }\n this._instances = [];\n this._instrumented = [];\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 * 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 * @deprecated Use `wrapMastra()` from `neatlogs/mastra`.\n *\n * The current `@neatlogs/instrumentation-mastra`\n * bridge activates its spans on the GLOBAL OpenTelemetry context\n * (`context.active()` / `context.with()`), so a foreign co-tenant (Datadog, …)\n * can still parent or be parented by Mastra's spans in both directions — the\n * private provider alone cannot isolate that. Until the bridge is redesigned to\n * accept the injected Neatlogs private-context runtime, use the explicit\n * `wrapMastra()` wrapper instead.\n */\nexport async function getMastraObservability(): Promise<any> {\n throw new Error(\n 'getMastraObservability() is not supported because the ' +\n '@neatlogs/instrumentation-mastra bridge activates spans on the global ' +\n 'OpenTelemetry context, which cannot be isolated from other tracing SDKs ' +\n '(Datadog, etc.).\\n\\n' +\n \"Use wrapMastra() from 'neatlogs/mastra' instead.\",\n );\n}\n\n/** @internal Legacy lifecycle hook retained until this export is removed. */\nexport function _resetMastraCache(): void {\n // Kept as an internal lifecycle hook until the legacy bridge export is\n // removed in the next major release.\n}\n","/**\n * SDK version. Kept in sync with package.json by the `version:sync` script\n * (runs automatically on `prebuild`). Do not edit by hand — bump package.json.\n */\nexport const __version__ = '1.1.9';\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","/**\n * Explicit W3C propagation for the private Neatlogs trace context.\n *\n * The global OpenTelemetry propagator is deliberately not used or changed:\n * callers opt in at the exact cross-process boundary where Neatlogs context\n * should travel.\n */\n\nimport { TraceFlags } from '@opentelemetry/api';\nimport { getActiveNeatlogsSpan } from './provider.js';\n\nexport type TraceContextCarrier =\n | Record<string, string>\n | { set(name: string, value: string): unknown };\n\n/**\n * Inject the active private Neatlogs span as W3C `traceparent`/`tracestate`\n * headers. Returns false when no valid Neatlogs span is active.\n */\nexport function injectTraceContext(carrier: TraceContextCarrier): boolean {\n const spanContext = getActiveNeatlogsSpan()?.spanContext();\n if (!spanContext?.traceId || !spanContext.spanId) {\n return false;\n }\n if (\n spanContext.traceId === '00000000000000000000000000000000' ||\n spanContext.spanId === '0000000000000000'\n ) {\n return false;\n }\n\n const flags =\n spanContext.traceFlags & TraceFlags.SAMPLED\n ? TraceFlags.SAMPLED\n : TraceFlags.NONE;\n setHeader(\n carrier,\n 'traceparent',\n `00-${spanContext.traceId}-${spanContext.spanId}-${flags\n .toString(16)\n .padStart(2, '0')}`,\n );\n\n const traceState = spanContext.traceState?.serialize();\n if (traceState) {\n setHeader(carrier, 'tracestate', traceState);\n }\n return true;\n}\n\nfunction setHeader(\n carrier: TraceContextCarrier,\n name: string,\n value: string,\n): void {\n if ('set' in carrier && typeof carrier.set === 'function') {\n carrier.set(name, value);\n return;\n }\n (carrier as Record<string, string>)[name] = value;\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 { SpanStatusCode, type Span, type Tracer } from '@opentelemetry/api';\nimport { getNeatlogsTracer, getNeatlogsParentContext, isolateTracer, withNeatlogsSpan } from './core/provider.js';\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 // Hand the AI SDK an isolation-aware tracer: it calls startActiveSpan()\n // internally, which would otherwise parent its native spans from the foreign\n // global context AND push them onto it (so a co-tenant's next span inherits\n // ours). The facade routes both through the private Neatlogs context.\n tracer: isolateTracer(getNeatlogsTracer(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 // GenerateObjectResult — the structured object is the output, not `text`.\n // Without this the envelope (object+usage+response+…) gets stringified whole.\n if ('object' in r && 'finishReason' in r) {\n if (r.object !== undefined) {\n span.setAttribute('output.value', safeStringify(r.object));\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// Extract output from a streamText/streamObject `onFinish` event. The event\n// extends StepResult, so `text` (streamText) / `object` (streamObject) sit at\n// the top level alongside `finishReason` — but the event also carries `steps`,\n// `usage`, etc., so we pull only the meaningful fields instead of stringifying\n// the whole envelope.\nfunction setStreamOutputValue(span: Span, event: unknown): void {\n if (!event || typeof event !== 'object') return;\n const e = event as Record<string, unknown>;\n if (typeof e.text === 'string' && e.text) {\n span.setAttribute('output.value', e.text);\n } else if ('object' in e && e.object !== undefined) {\n const stringified = safeStringify(e.object);\n if (stringified) span.setAttribute('output.value', stringified);\n }\n if (e.finishReason) {\n span.setAttribute('gen_ai.finish_reason', String(e.finishReason));\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] = createStreamWrapper(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 // Our parent comes solely from the private span store; a\n // foreign provider's active span must never become our ancestor.\n return getNeatlogsParentContext();\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 = getNeatlogsTracer(TRACER_NAME);\n // startSpan (NOT startActiveSpan) + withNeatlogsSpan: startActiveSpan would\n // push our span onto the GLOBAL OTel context, so a foreign tracer's\n // startSpan() inside generateText() would read it as parent and inherit our\n // trace id. withNeatlogsSpan carries the parent in the private store in\n // the private context, leaving the global context untouched.\n const parentContext = getParentContext();\n const span = tracer.startSpan(\n `ai.${name}`,\n { attributes: { 'openinference.span.kind': rootSpanKind(name) } },\n parentContext,\n );\n return withNeatlogsSpan(\n span,\n async () => {\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 parentContext,\n );\n };\n}\n\n// streamText/streamObject return synchronously while the model keeps producing\n// tokens for seconds afterwards. Ending the span in a `finally` (as a plain sync\n// wrapper would) closes it in ~2ms with no output — the output only exists once\n// the stream finishes. Instead we keep the span open and end it from the AI SDK's\n// `onFinish` callback, where the final text/object is available. Any user-provided\n// `onFinish` is preserved and invoked first.\nfunction createStreamWrapper(\n name: WrappedFunctionName,\n original: (opts: any) => unknown,\n): (opts: any) => unknown {\n return function wrappedStreamFn(opts: any): unknown {\n const tracer = getNeatlogsTracer(TRACER_NAME);\n // startSpan + withNeatlogsSpan (see createAsyncWrapper) so streamText's\n // internals never see our span on the global OTel context. The span stays\n // open past the run scope and is ended from onFinish/onError.\n const parentContext = getParentContext();\n const span = tracer.startSpan(\n `ai.${name}`,\n { attributes: { 'openinference.span.kind': rootSpanKind(name) } },\n parentContext,\n );\n return withNeatlogsSpan(\n span,\n () => {\n let spanEnded = false;\n const endOnce = () => {\n if (spanEnded) return;\n spanEnded = true;\n span.end();\n };\n try {\n setInputValue(span, opts);\n const merged = mergeTelemetry(opts);\n const userOnFinish = opts?.onFinish;\n const userOnError = opts?.onError;\n const wrappedOpts = {\n ...merged,\n onFinish: async (event: any) => {\n try {\n setStreamOutputValue(span, event);\n } finally {\n endOnce();\n }\n if (typeof userOnFinish === 'function') {\n return userOnFinish(event);\n }\n },\n onError: (event: any) => {\n recordSpanError(span, (event && event.error) ?? event);\n endOnce();\n if (typeof userOnError === 'function') {\n return userOnError(event);\n }\n },\n };\n return original(wrappedOpts);\n } catch (err) {\n // Synchronous throw (e.g. bad arguments) — the stream never started.\n recordSpanError(span, err);\n endOnce();\n throw err;\n }\n },\n parentContext,\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 { SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { getProviderTracer } from './core/auto-root.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from './core/provider.js';\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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n `tool.${name}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': safeStringify(args),\n },\n },\n getNeatlogsParentContext(),\n );\n return withNeatlogsSpan(span, async () => {\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// 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 = getProviderTracer(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 }, getNeatlogsParentContext());\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 promise = withNeatlogsSpan(span, () => 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 = getProviderTracer(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 }, getNeatlogsParentContext());\n\n const promise = withNeatlogsSpan(span, () => 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 * Auto-root for direct-provider wrappers.\n *\n * The backend only renders a trace once it contains a *parentless* span of a\n * root-eligible kind (WORKFLOW / CHAIN / AGENT / MCP_TOOL). Direct-provider\n * wrappers (wrapOpenAI, wrapAnthropic, wrapBedrock, ...) only ever emit\n * non-root spans (LLM / EMBEDDING / TOOL). So a bare\n * `const client = wrapOpenAI(new OpenAI())` with no surrounding `span()` /\n * `trace()` produces an orphan span and the trace never renders.\n *\n * `getProviderTracer(name)` returns a Tracer facade used *only* by those\n * direct-provider wrappers: when `startSpan` would otherwise produce a\n * parentless, non-root span, it transparently opens a WORKFLOW root (named\n * after the configured `workflowName`) and ends it when the provider span\n * ends. Every wrapper path — non-streaming, streaming finalize, error —\n * funnels through `span.end()`, so wrapping `end()` covers them all with no\n * changes to the wrappers' streaming code.\n *\n * Framework wrappers (langchain, mastra, openai-agents, ai-sdk, ...) keep\n * using `trace.getTracer(...)` directly — they already emit their own root and\n * thread context explicitly, so auto-root must never fire for them.\n */\n\nimport {\n trace as otelTrace,\n type Tracer,\n type Span,\n type Context,\n type SpanOptions,\n} from '@opentelemetry/api';\n\nimport { getSessionConfig } from './context.js';\nimport { applySessionAttributes } from './session.js';\nimport { applyEndUserAttributes } from './end-user.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n getActiveNeatlogsSpan,\n} from './provider.js';\n\n// A parentless span of one of these kinds already satisfies the backend's\n// root requirement, so it must NOT be wrapped in another root.\nconst ROOT_KINDS = new Set(['workflow', 'chain', 'agent', 'mcp_tool']);\n\nfunction autoRootEnabled(): boolean {\n const val = (process.env.NEATLOGS_AUTO_ROOT ?? '').trim().toLowerCase();\n return !['false', '0', 'no', 'off'].includes(val);\n}\n\nfunction resolveRootWorkflowName(): string {\n try {\n const name = getSessionConfig()?.workflowName;\n if (typeof name === 'string' && name.trim()) return name;\n } catch {\n /* ignore */\n }\n return 'workflow';\n}\n\n/**\n * Stamp request-scoped identify() identity onto a freshly-created auto-root.\n * The auto-root IS the trace root, and wrapper-only code has no user-controlled\n * root to put trace()/span() args on, so identity comes purely from the\n * identify() context (passed undefined per-call values fall back to it).\n */\nfunction stampAutoRootIdentity(root: Span): void {\n applySessionAttributes(root, undefined, true);\n applyEndUserAttributes(root, undefined, undefined, true);\n}\n\n/**\n * Wrap a provider span so that ending it also ends the auto-created WORKFLOW\n * root. A Proxy keeps this transparent across OTel versions: every property /\n * method except `end` passes straight through to the child span.\n */\nfunction wrapSpanWithRoot(child: Span, root: Span): Span {\n let ended = false;\n return new Proxy(child, {\n get(target, prop, _receiver) {\n if (prop === 'end') {\n return (...args: any[]): void => {\n if (ended) return;\n ended = true;\n try {\n (target.end as (...a: any[]) => void)(...args);\n } finally {\n try {\n root.end();\n } catch {\n /* ignore */\n }\n }\n };\n }\n const value = Reflect.get(target, prop, target);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n}\n\n/**\n * Self-root helper for callback/event-driven handlers (LangChain, etc.).\n *\n * A callback handler builds its own parent context per run-id rather than going\n * through {@link AutoRootTracer}. When a run BEGINS with a non-root kind (a bare\n * `llm.invoke()` fires the LLM callback with no chain above it; a standalone\n * tool/retriever similarly), the span it creates is parentless and non-root, so\n * the backend can't anchor the trace and it never renders. Call this when there\n * is no LangChain parent: if the kind is non-root and nothing is actively\n * recording in `baseCtx`, it opens a WORKFLOW root and returns it plus the\n * child context to create the span in. The caller MUST end the returned\n * `root` after the child span ends (see {@link endAutoRoot}).\n *\n * Returns `{ root, ctx }` when a root was opened, or `{ root: undefined, ctx: baseCtx }`\n * when no auto-root is needed (root-eligible kind, already-recording parent, or\n * disabled).\n */\nexport function maybeOpenAutoRoot(\n tracer: Tracer,\n kind: string,\n baseCtx: Context,\n): { root: Span | undefined; ctx: Context } {\n const k = String(kind ?? '').toLowerCase();\n // A foreign provider's span must never count as our parent.\n const existing = getActiveNeatlogsSpan();\n if (\n !autoRootEnabled() ||\n ROOT_KINDS.has(k) ||\n (existing !== undefined && existing.isRecording())\n ) {\n return { root: undefined, ctx: baseCtx };\n }\n const root = tracer.startSpan(\n resolveRootWorkflowName(),\n { attributes: { 'neatlogs.span.kind': 'workflow', 'neatlogs.auto_root': true } },\n baseCtx,\n );\n stampAutoRootIdentity(root);\n return { root, ctx: otelTrace.setSpan(baseCtx, root) };\n}\n\n/** End an auto-root opened by {@link maybeOpenAutoRoot}. Safe on undefined. */\nexport function endAutoRoot(root: Span | undefined): void {\n if (!root) return;\n try {\n root.end();\n } catch {\n /* ignore */\n }\n}\n\nclass AutoRootTracer implements Tracer {\n constructor(private readonly _tracer: Tracer) {}\n\n startSpan(name: string, options?: SpanOptions, context?: Context): Span {\n const kind = String(\n (options?.attributes as Record<string, unknown> | undefined)?.[\n 'neatlogs.span.kind'\n ] ?? '',\n ).toLowerCase();\n\n // Parent from our private context, never the foreign global.\n const ctx = context ?? getNeatlogsParentContext();\n const parent = getActiveNeatlogsSpan();\n const needsRoot =\n autoRootEnabled() &&\n !ROOT_KINDS.has(kind) &&\n !(parent !== undefined && parent.isRecording());\n\n if (!needsRoot) {\n return this._tracer.startSpan(name, options, ctx);\n }\n\n const root = this._tracer.startSpan(\n resolveRootWorkflowName(),\n { attributes: { 'neatlogs.span.kind': 'workflow', 'neatlogs.auto_root': true } },\n ctx,\n );\n stampAutoRootIdentity(root);\n const childCtx = otelTrace.setSpan(ctx, root);\n const child = this._tracer.startSpan(name, options, childCtx);\n return wrapSpanWithRoot(child, root);\n }\n\n // startActiveSpan is used by traceTool (callback-scoped, always under an\n // active span in practice) — pass straight through, no auto-root.\n startActiveSpan = ((...args: any[]) =>\n (this._tracer.startActiveSpan as (...a: any[]) => any)(\n ...args,\n )) as Tracer['startActiveSpan'];\n}\n\n/**\n * Tracer for direct-provider wrappers (wrapOpenAI, wrapAnthropic, ...).\n * Identical to `trace.getTracer(name)` but adds transparent auto-root so a\n * bare `wrapOpenAI(new OpenAI())` renders a trace without a manual `span()` /\n * `trace()` wrapper. Do NOT use for framework wrappers.\n */\nexport function getProviderTracer(name: string): Tracer {\n // Resolve from the private provider.\n return new AutoRootTracer(getNeatlogsTracer(name));\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 { SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { getProviderTracer } from './core/auto-root.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from './core/provider.js';\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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n `tool.${name}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': safeStringify(input),\n },\n },\n getNeatlogsParentContext(),\n );\n return withNeatlogsSpan(span, async () => {\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// 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 = getProviderTracer(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 }, getNeatlogsParentContext());\n\n setInputMessages(span, opts?.system, messages);\n setTools(span, opts?.tools);\n setInvocationParams(span, opts);\n\n const promise = withNeatlogsSpan(span, () => 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 = getProviderTracer(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 }, getNeatlogsParentContext());\n\n setInputMessages(span, opts?.system, messages);\n setTools(span, opts?.tools);\n setInvocationParams(span, opts);\n\n const messageStream = withNeatlogsSpan(span, () => 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 Azure OpenAI wrapper — ES6 Proxy-based.\n *\n * Azure OpenAI is accessed through the `openai` SDK's `AzureOpenAI` client,\n * which exposes the same `chat.completions.create()` shape as `OpenAI`. This\n * wrapper traces those calls with provider `azure` so Azure traffic is\n * distinguished from direct OpenAI traffic.\n *\n * Usage:\n * import { wrapAzureOpenAI } from 'neatlogs/azure-openai';\n * import { AzureOpenAI } from 'openai';\n * const client = wrapAzureOpenAI(new AzureOpenAI({ endpoint, apiKey, apiVersion }));\n * await client.chat.completions.create({ model: 'gpt-4o', messages: [...] });\n *\n * Intercepts:\n * - client.chat.completions.create() — non-streaming and streaming\n * - client.responses.create() — Responses API\n */\n\nimport { SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { getProviderTracer } from './core/auto-root.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from './core/provider.js';\n\nconst TRACER_NAME = 'neatlogs.azure_openai';\nconst PROVIDER = 'azure';\nconst SYSTEM = 'azure';\n\nexport function wrapAzureOpenAI<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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n `tool.${name}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': safeStringify(args),\n },\n },\n getNeatlogsParentContext(),\n );\n return withNeatlogsSpan(span, async () => {\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\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 = getProviderTracer(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('azure_openai.chat.completions.create', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.system': SYSTEM,\n 'neatlogs.llm.model_name': model,\n 'neatlogs.llm.is_streaming': isStream,\n },\n }, getNeatlogsParentContext());\n\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 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 setInvocationParams(span, opts);\n\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 promise = withNeatlogsSpan(span, () => 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 = getProviderTracer(TRACER_NAME);\n const model = opts?.model ?? '';\n\n const span = tracer.startSpan('azure_openai.responses.create', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.system': SYSTEM,\n 'neatlogs.llm.model_name': model,\n 'input.value': safeStringify(opts?.input ?? ''),\n },\n }, getNeatlogsParentContext());\n\n const promise = withNeatlogsSpan(span, () => 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 Vertex AI wrapper — ES6 Proxy-based.\n *\n * Vertex AI is accessed through the same `@google/genai` SDK as Gemini, but in\n * Vertex mode (`new GoogleGenAI({ vertexai: true, project, location })`). This\n * wrapper traces those clients with provider `vertex_ai` so Vertex traffic is\n * distinguished from Google AI Studio (Gemini) traffic.\n *\n * Usage:\n * import { wrapVertexAI } from 'neatlogs/vertex-ai';\n * import { GoogleGenAI } from '@google/genai';\n * const client = wrapVertexAI(new GoogleGenAI({ vertexai: true, project: 'p', location: 'us-central1' }));\n * const res = await client.models.generateContent({ model: 'gemini-2.0-flash', contents: 'Hello' });\n *\n * Intercepts:\n * - client.models.generateContent() — non-streaming\n * - client.models.generateContentStream() — streaming (async iterable)\n * - client.models.embedContent() — embeddings\n * - client.models.countTokens() — token counting\n * - chat.sendMessage() / sendMessageStream() — chat sessions\n */\n\nimport { SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { getProviderTracer } from './core/auto-root.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from './core/provider.js';\n\nconst TRACER_NAME = 'neatlogs.vertex_ai';\nconst PROVIDER = 'vertex_ai';\nconst SYSTEM = 'vertexai';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function wrapVertexAI<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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n `tool.${name}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': safeStringify(args),\n },\n },\n getNeatlogsParentContext(),\n );\n return withNeatlogsSpan(span, async () => {\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// 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 === 'models.generateContent' && typeof value === 'function') {\n return tracedGenerateContent(value.bind(obj), false);\n }\n if (pathStr === 'models.generateContentStream' && typeof value === 'function') {\n return tracedGenerateContent(value.bind(obj), true);\n }\n if (pathStr === 'models.embedContent' && typeof value === 'function') {\n return tracedEmbedContent(value.bind(obj));\n }\n if (pathStr === 'models.countTokens' && typeof value === 'function') {\n return tracedCountTokens(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 > 2) return false;\n return ['models', 'chats'].includes(path[path.length - 1]);\n}\n\n/**\n * Wrap a chat session returned by `client.chats.create(...)`. The `@google/genai`\n * Chat object exposes `sendMessage` / `sendMessageStream`; wrap them so each turn\n * emits an LLM span. Returns the same chat instance.\n */\nexport function wrapVertexAIChat<T extends object>(chat: T): T {\n const c = chat as any;\n if (!c || c._neatlogsVertexPatched) return chat;\n\n if (typeof c.sendMessage === 'function') {\n const orig = c.sendMessage.bind(c);\n c.sendMessage = (params: any, ...rest: any[]) => tracedChatSend(orig, c, params, rest, false);\n }\n if (typeof c.sendMessageStream === 'function') {\n const orig = c.sendMessageStream.bind(c);\n c.sendMessageStream = (params: any, ...rest: any[]) => tracedChatSend(orig, c, params, rest, true);\n }\n\n try {\n Object.defineProperty(c, '_neatlogsVertexPatched', { value: true, enumerable: false, configurable: true });\n } catch {\n c._neatlogsVertexPatched = true;\n }\n return chat;\n}\n\nfunction tracedChatSend(\n original: (...a: any[]) => any,\n chat: any,\n params: any,\n rest: any[],\n isStream: boolean,\n): any {\n const tracer = getProviderTracer(TRACER_NAME);\n const model = chat?.model ?? chat?.modelVersion ?? '';\n const span = tracer.startSpan('vertex_ai.chat.send_message', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.system': SYSTEM,\n 'neatlogs.llm.model_name': model,\n 'neatlogs.llm.is_streaming': isStream,\n },\n }, getNeatlogsParentContext());\n\n // The chat sendMessage param shape is { message } (string or Part[]).\n const message = params?.message ?? params;\n span.setAttribute('neatlogs.llm.input_messages.0.role', 'user');\n span.setAttribute(\n 'neatlogs.llm.input_messages.0.content',\n (typeof message === 'string' ? message : safeStringify(message)),\n );\n\n const result = withNeatlogsSpan(span, () => original(params, ...rest));\n\n return Promise.resolve(result).then(\n (response: any) => {\n if (isStream) return wrapStream(response, span);\n finalizeResponse(span, response);\n return response;\n },\n (err: any) => {\n recordError(span, err);\n throw err;\n },\n );\n}\n\nfunction tracedEmbedContent(original: (...a: any[]) => any) {\n return function (opts: any, ...rest: any[]): any {\n const tracer = getProviderTracer(TRACER_NAME);\n const span = tracer.startSpan('vertex_ai.models.embed_content', {\n attributes: {\n 'neatlogs.span.kind': 'EMBEDDING',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.embedding.model_name': opts?.model ?? '',\n 'neatlogs.embedding.text': safeStringify(opts?.contents ?? ''),\n },\n }, getNeatlogsParentContext());\n\n const result = withNeatlogsSpan(span, () => original(opts, ...rest));\n\n return Promise.resolve(result).then(\n (response: any) => {\n const embeddings = response?.embeddings;\n if (Array.isArray(embeddings)) {\n span.setAttribute('neatlogs.embedding.count', embeddings.length);\n const vals = embeddings[0]?.values;\n if (Array.isArray(vals)) span.setAttribute('neatlogs.embedding.dimensions', vals.length);\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\nfunction tracedCountTokens(original: (...a: any[]) => any) {\n return function (opts: any, ...rest: any[]): any {\n const tracer = getProviderTracer(TRACER_NAME);\n const span = tracer.startSpan('vertex_ai.models.count_tokens', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.task': 'count_tokens',\n 'neatlogs.llm.model_name': opts?.model ?? '',\n },\n }, getNeatlogsParentContext());\n\n const result = withNeatlogsSpan(span, () => original(opts, ...rest));\n\n return Promise.resolve(result).then(\n (response: any) => {\n if (response?.totalTokens != null) span.setAttribute('neatlogs.llm.token_count.prompt', response.totalTokens);\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// generateContent / generateContentStream\n// ---------------------------------------------------------------------------\n\nfunction tracedGenerateContent(original: (...args: any[]) => any, isStream: boolean) {\n return function (opts: any, ...rest: any[]): any {\n const tracer = getProviderTracer(TRACER_NAME);\n const model = opts?.model ?? '';\n\n const span = tracer.startSpan('vertex_ai.models.generate_content', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.system': SYSTEM,\n 'neatlogs.llm.model_name': model,\n 'neatlogs.llm.is_streaming': isStream,\n },\n }, getNeatlogsParentContext());\n\n setInputAttributes(span, opts);\n\n const result = withNeatlogsSpan(span, () => original(opts, ...rest));\n\n return Promise.resolve(result).then(\n (response: any) => {\n if (isStream) {\n return wrapStream(response, span);\n }\n finalizeResponse(span, response);\n return response;\n },\n (err: any) => {\n recordError(span, err);\n throw err;\n },\n );\n };\n}\n\nfunction setInputAttributes(span: Span, opts: any): void {\n let idx = 0;\n\n const config = opts?.config;\n const systemInstruction = config?.systemInstruction ?? config?.system_instruction;\n if (systemInstruction) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'system');\n span.setAttribute(\n `neatlogs.llm.input_messages.${idx}.content`,\n typeof systemInstruction === 'string' ? systemInstruction : safeStringify(systemInstruction),\n );\n idx++;\n }\n\n const contents = opts?.contents;\n if (typeof contents === 'string') {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, contents);\n } else if (Array.isArray(contents)) {\n for (const item of contents) {\n if (typeof item === 'string') {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, item);\n idx++;\n } else if (item && typeof item === 'object') {\n const role = item.role ?? 'user';\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, role);\n const parts = item.parts ?? [];\n const textParts: string[] = [];\n for (const part of parts) {\n if (typeof part === 'string') textParts.push(part);\n else if (part?.text) textParts.push(part.text);\n }\n span.setAttribute(\n `neatlogs.llm.input_messages.${idx}.content`,\n textParts.length ? textParts.join('\\n') : safeStringify(parts),\n );\n idx++;\n }\n }\n } else if (contents) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, safeStringify(contents));\n }\n\n // Tools (function declarations)\n const tools = config?.tools;\n if (Array.isArray(tools)) {\n let t = 0;\n for (const tool of tools) {\n const decls = tool?.functionDeclarations ?? tool?.function_declarations ?? [];\n for (const fn of decls) {\n span.setAttribute(`neatlogs.llm.tools.${t}.name`, fn?.name ?? '');\n if (fn?.description) span.setAttribute(`neatlogs.llm.tools.${t}.description`, fn.description);\n if (fn?.parameters) span.setAttribute(`neatlogs.llm.tools.${t}.input_schema`, safeStringify(fn.parameters));\n t++;\n }\n }\n }\n\n // Invocation params\n if (config) {\n if (config.temperature != null) span.setAttribute('neatlogs.llm.temperature', config.temperature);\n if (config.topP != null) span.setAttribute('neatlogs.llm.top_p', config.topP);\n if (config.topK != null) span.setAttribute('neatlogs.llm.top_k', config.topK);\n const maxTokens = config.maxOutputTokens ?? config.max_output_tokens;\n if (maxTokens != null) span.setAttribute('neatlogs.llm.max_tokens', maxTokens);\n\n // Blob the backend reads for metadata.model_settings (the UI source).\n const params: Record<string, any> = {};\n if (config.temperature != null) params.temperature = config.temperature;\n if (config.topP != null) params.top_p = config.topP;\n if (config.topK != null) params.top_k = config.topK;\n if (maxTokens != null) params.max_tokens = maxTokens;\n if (config.frequencyPenalty != null) params.frequency_penalty = config.frequencyPenalty;\n if (config.presencePenalty != null) params.presence_penalty = config.presencePenalty;\n if (Object.keys(params).length > 0) {\n span.setAttribute('neatlogs.llm.invocation_parameters', JSON.stringify(params));\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Streaming support — @google/genai stream is an async iterable of chunks\n// ---------------------------------------------------------------------------\n\nfunction wrapStream(stream: any, span: Span): any {\n const chunks: any[] = [];\n const originalAsyncIterator = stream?.[Symbol.asyncIterator]?.bind(stream);\n\n if (!originalAsyncIterator) {\n finalizeStreamChunks(span, chunks);\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 let finishReason = '';\n let usage: any = null;\n\n for (const chunk of chunks) {\n for (const candidate of chunk?.candidates ?? []) {\n for (const part of candidate?.content?.parts ?? []) {\n if (part?.text && !part?.thought) textParts.push(part.text);\n }\n if (candidate?.finishReason) finishReason = candidate.finishReason;\n }\n if (chunk?.usageMetadata) usage = chunk.usageMetadata;\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 if (finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(finishReason));\n setUsage(span, usage);\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\n// ---------------------------------------------------------------------------\n// Non-streaming response finalization\n// ---------------------------------------------------------------------------\n\nfunction finalizeResponse(span: Span, response: any): void {\n const textParts: string[] = [];\n let toolIdx = 0;\n\n for (const candidate of response?.candidates ?? []) {\n for (const part of candidate?.content?.parts ?? []) {\n if (part?.text && !part?.thought) {\n textParts.push(part.text);\n } else if (part?.thought && part?.text) {\n span.setAttribute('neatlogs.llm.output_messages.0.thinking', part.text);\n } else if (part?.functionCall) {\n const fc = part.functionCall;\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.name`, fc?.name ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.arguments`, safeStringify(fc?.args ?? {}));\n toolIdx++;\n }\n }\n if (candidate?.finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(candidate.finishReason));\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\n setUsage(span, response?.usageMetadata);\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\nfunction setUsage(span: Span, usage: any): void {\n if (!usage) return;\n if (usage.promptTokenCount != null) span.setAttribute('neatlogs.llm.token_count.prompt', usage.promptTokenCount);\n if (usage.candidatesTokenCount != null) span.setAttribute('neatlogs.llm.token_count.completion', usage.candidatesTokenCount);\n if (usage.totalTokenCount != null) span.setAttribute('neatlogs.llm.token_count.total', usage.totalTokenCount);\n if (usage.cachedContentTokenCount != null) span.setAttribute('neatlogs.llm.token_count.cache_read', usage.cachedContentTokenCount);\n if (usage.thoughtsTokenCount != null) span.setAttribute('neatlogs.llm.token_count.reasoning', usage.thoughtsTokenCount);\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\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 Google Gemini wrapper — ES6 Proxy-based.\n *\n * Gemini (Google AI Studio) is accessed through the `@google/genai` SDK\n * (`new GoogleGenAI({ apiKey })`). This wrapper traces those clients with\n * provider `google` so Gemini traffic is distinguished from Vertex AI traffic\n * (see `wrapVertexAI`, which is the same SDK in `vertexai: true` mode).\n *\n * Mirrors Python's `neatlogs.wrap(genai.Client())`. If you prefer zero-code\n * instrumentation, pass `instrumentations: ['google_genai']` to `init()` instead.\n *\n * Usage:\n * import { wrapGoogleGenAI } from 'neatlogs/google-genai';\n * import { GoogleGenAI } from '@google/genai';\n * const client = wrapGoogleGenAI(new GoogleGenAI({ apiKey: process.env.GOOGLE_API_KEY }));\n * const res = await client.models.generateContent({ model: 'gemini-2.5-flash', contents: 'Hello' });\n *\n * Intercepts:\n * - client.models.generateContent() — non-streaming\n * - client.models.generateContentStream() — streaming (async iterable)\n * - client.models.embedContent() — embeddings\n * - client.models.countTokens() — token counting\n * - chat.sendMessage() / sendMessageStream() — chat sessions\n */\n\nimport { SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { getProviderTracer } from './core/auto-root.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from './core/provider.js';\n\nconst TRACER_NAME = 'neatlogs.google_genai';\nconst PROVIDER = 'google';\nconst SYSTEM = 'google_genai';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function wrapGoogleGenAI<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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n `tool.${name}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': safeStringify(args),\n },\n },\n getNeatlogsParentContext(),\n );\n return withNeatlogsSpan(span, async () => {\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// 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 === 'models.generateContent' && typeof value === 'function') {\n return tracedGenerateContent(value.bind(obj), false);\n }\n if (pathStr === 'models.generateContentStream' && typeof value === 'function') {\n return tracedGenerateContent(value.bind(obj), true);\n }\n if (pathStr === 'models.embedContent' && typeof value === 'function') {\n return tracedEmbedContent(value.bind(obj));\n }\n if (pathStr === 'models.countTokens' && typeof value === 'function') {\n return tracedCountTokens(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 > 2) return false;\n return ['models', 'chats'].includes(path[path.length - 1]);\n}\n\n/**\n * Wrap a chat session returned by `client.chats.create(...)`. The `@google/genai`\n * Chat object exposes `sendMessage` / `sendMessageStream`; wrap them so each turn\n * emits an LLM span. Returns the same chat instance.\n */\nexport function wrapGoogleGenAIChat<T extends object>(chat: T): T {\n const c = chat as any;\n if (!c || c._neatlogsGoogleGenAIPatched) return chat;\n\n if (typeof c.sendMessage === 'function') {\n const orig = c.sendMessage.bind(c);\n c.sendMessage = (params: any, ...rest: any[]) => tracedChatSend(orig, c, params, rest, false);\n }\n if (typeof c.sendMessageStream === 'function') {\n const orig = c.sendMessageStream.bind(c);\n c.sendMessageStream = (params: any, ...rest: any[]) => tracedChatSend(orig, c, params, rest, true);\n }\n\n try {\n Object.defineProperty(c, '_neatlogsGoogleGenAIPatched', { value: true, enumerable: false, configurable: true });\n } catch {\n c._neatlogsGoogleGenAIPatched = true;\n }\n return chat;\n}\n\nfunction tracedChatSend(\n original: (...a: any[]) => any,\n chat: any,\n params: any,\n rest: any[],\n isStream: boolean,\n): any {\n const tracer = getProviderTracer(TRACER_NAME);\n const model = chat?.model ?? chat?.modelVersion ?? '';\n const span = tracer.startSpan('google_genai.chat.send_message', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.system': SYSTEM,\n 'neatlogs.llm.model_name': model,\n 'neatlogs.llm.is_streaming': isStream,\n },\n }, getNeatlogsParentContext());\n\n // The chat sendMessage param shape is { message } (string or Part[]).\n const message = params?.message ?? params;\n span.setAttribute('neatlogs.llm.input_messages.0.role', 'user');\n span.setAttribute(\n 'neatlogs.llm.input_messages.0.content',\n (typeof message === 'string' ? message : safeStringify(message)),\n );\n\n const result = withNeatlogsSpan(span, () => original(params, ...rest));\n\n return Promise.resolve(result).then(\n (response: any) => {\n if (isStream) return wrapStream(response, span);\n finalizeResponse(span, response);\n return response;\n },\n (err: any) => {\n recordError(span, err);\n throw err;\n },\n );\n}\n\nfunction tracedEmbedContent(original: (...a: any[]) => any) {\n return function (opts: any, ...rest: any[]): any {\n const tracer = getProviderTracer(TRACER_NAME);\n const span = tracer.startSpan('google_genai.models.embed_content', {\n attributes: {\n 'neatlogs.span.kind': 'EMBEDDING',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.embedding.model_name': opts?.model ?? '',\n 'neatlogs.embedding.text': safeStringify(opts?.contents ?? ''),\n },\n }, getNeatlogsParentContext());\n\n const result = withNeatlogsSpan(span, () => original(opts, ...rest));\n\n return Promise.resolve(result).then(\n (response: any) => {\n const embeddings = response?.embeddings;\n if (Array.isArray(embeddings)) {\n span.setAttribute('neatlogs.embedding.count', embeddings.length);\n const vals = embeddings[0]?.values;\n if (Array.isArray(vals)) span.setAttribute('neatlogs.embedding.dimensions', vals.length);\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\nfunction tracedCountTokens(original: (...a: any[]) => any) {\n return function (opts: any, ...rest: any[]): any {\n const tracer = getProviderTracer(TRACER_NAME);\n const span = tracer.startSpan('google_genai.models.count_tokens', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.task': 'count_tokens',\n 'neatlogs.llm.model_name': opts?.model ?? '',\n },\n }, getNeatlogsParentContext());\n\n const result = withNeatlogsSpan(span, () => original(opts, ...rest));\n\n return Promise.resolve(result).then(\n (response: any) => {\n if (response?.totalTokens != null) span.setAttribute('neatlogs.llm.token_count.prompt', response.totalTokens);\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// generateContent / generateContentStream\n// ---------------------------------------------------------------------------\n\nfunction tracedGenerateContent(original: (...args: any[]) => any, isStream: boolean) {\n return function (opts: any, ...rest: any[]): any {\n const tracer = getProviderTracer(TRACER_NAME);\n const model = opts?.model ?? '';\n\n const span = tracer.startSpan('google_genai.models.generate_content', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.system': SYSTEM,\n 'neatlogs.llm.model_name': model,\n 'neatlogs.llm.is_streaming': isStream,\n },\n }, getNeatlogsParentContext());\n\n setInputAttributes(span, opts);\n\n const result = withNeatlogsSpan(span, () => original(opts, ...rest));\n\n return Promise.resolve(result).then(\n (response: any) => {\n if (isStream) {\n return wrapStream(response, span);\n }\n finalizeResponse(span, response);\n return response;\n },\n (err: any) => {\n recordError(span, err);\n throw err;\n },\n );\n };\n}\n\nfunction setInputAttributes(span: Span, opts: any): void {\n let idx = 0;\n\n const config = opts?.config;\n const systemInstruction = config?.systemInstruction ?? config?.system_instruction;\n if (systemInstruction) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'system');\n span.setAttribute(\n `neatlogs.llm.input_messages.${idx}.content`,\n typeof systemInstruction === 'string' ? systemInstruction : safeStringify(systemInstruction),\n );\n idx++;\n }\n\n const contents = opts?.contents;\n if (typeof contents === 'string') {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, contents);\n } else if (Array.isArray(contents)) {\n for (const item of contents) {\n if (typeof item === 'string') {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, item);\n idx++;\n } else if (item && typeof item === 'object') {\n const role = item.role ?? 'user';\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, role);\n const parts = item.parts ?? [];\n const textParts: string[] = [];\n for (const part of parts) {\n if (typeof part === 'string') textParts.push(part);\n else if (part?.text) textParts.push(part.text);\n }\n span.setAttribute(\n `neatlogs.llm.input_messages.${idx}.content`,\n textParts.length ? textParts.join('\\n') : safeStringify(parts),\n );\n idx++;\n }\n }\n } else if (contents) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, safeStringify(contents));\n }\n\n // Tools (function declarations)\n const tools = config?.tools;\n if (Array.isArray(tools)) {\n let t = 0;\n for (const tool of tools) {\n const decls = tool?.functionDeclarations ?? tool?.function_declarations ?? [];\n for (const fn of decls) {\n span.setAttribute(`neatlogs.llm.tools.${t}.name`, fn?.name ?? '');\n if (fn?.description) span.setAttribute(`neatlogs.llm.tools.${t}.description`, fn.description);\n if (fn?.parameters) span.setAttribute(`neatlogs.llm.tools.${t}.input_schema`, safeStringify(fn.parameters));\n t++;\n }\n }\n }\n\n // Invocation params\n if (config) {\n if (config.temperature != null) span.setAttribute('neatlogs.llm.temperature', config.temperature);\n if (config.topP != null) span.setAttribute('neatlogs.llm.top_p', config.topP);\n if (config.topK != null) span.setAttribute('neatlogs.llm.top_k', config.topK);\n const maxTokens = config.maxOutputTokens ?? config.max_output_tokens;\n if (maxTokens != null) span.setAttribute('neatlogs.llm.max_tokens', maxTokens);\n\n // Blob the backend reads for metadata.model_settings (the UI source).\n const params: Record<string, any> = {};\n if (config.temperature != null) params.temperature = config.temperature;\n if (config.topP != null) params.top_p = config.topP;\n if (config.topK != null) params.top_k = config.topK;\n if (maxTokens != null) params.max_tokens = maxTokens;\n if (config.frequencyPenalty != null) params.frequency_penalty = config.frequencyPenalty;\n if (config.presencePenalty != null) params.presence_penalty = config.presencePenalty;\n if (Object.keys(params).length > 0) {\n span.setAttribute('neatlogs.llm.invocation_parameters', JSON.stringify(params));\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Streaming support — @google/genai stream is an async iterable of chunks\n// ---------------------------------------------------------------------------\n\nfunction wrapStream(stream: any, span: Span): any {\n const chunks: any[] = [];\n const originalAsyncIterator = stream?.[Symbol.asyncIterator]?.bind(stream);\n\n if (!originalAsyncIterator) {\n finalizeStreamChunks(span, chunks);\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 let finishReason = '';\n let usage: any = null;\n\n for (const chunk of chunks) {\n for (const candidate of chunk?.candidates ?? []) {\n for (const part of candidate?.content?.parts ?? []) {\n if (part?.text && !part?.thought) textParts.push(part.text);\n }\n if (candidate?.finishReason) finishReason = candidate.finishReason;\n }\n if (chunk?.usageMetadata) usage = chunk.usageMetadata;\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 if (finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(finishReason));\n setUsage(span, usage);\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\n// ---------------------------------------------------------------------------\n// Non-streaming response finalization\n// ---------------------------------------------------------------------------\n\nfunction finalizeResponse(span: Span, response: any): void {\n const textParts: string[] = [];\n let toolIdx = 0;\n\n for (const candidate of response?.candidates ?? []) {\n for (const part of candidate?.content?.parts ?? []) {\n if (part?.text && !part?.thought) {\n textParts.push(part.text);\n } else if (part?.thought && part?.text) {\n span.setAttribute('neatlogs.llm.output_messages.0.thinking', part.text);\n } else if (part?.functionCall) {\n const fc = part.functionCall;\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.name`, fc?.name ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.arguments`, safeStringify(fc?.args ?? {}));\n toolIdx++;\n }\n }\n if (candidate?.finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(candidate.finishReason));\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\n setUsage(span, response?.usageMetadata);\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\nfunction setUsage(span: Span, usage: any): void {\n if (!usage) return;\n if (usage.promptTokenCount != null) span.setAttribute('neatlogs.llm.token_count.prompt', usage.promptTokenCount);\n if (usage.candidatesTokenCount != null) span.setAttribute('neatlogs.llm.token_count.completion', usage.candidatesTokenCount);\n if (usage.totalTokenCount != null) span.setAttribute('neatlogs.llm.token_count.total', usage.totalTokenCount);\n if (usage.cachedContentTokenCount != null) span.setAttribute('neatlogs.llm.token_count.cache_read', usage.cachedContentTokenCount);\n if (usage.thoughtsTokenCount != null) span.setAttribute('neatlogs.llm.token_count.reasoning', usage.thoughtsTokenCount);\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\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 AWS Bedrock wrapper.\n *\n * The AWS SDK v3 `BedrockRuntimeClient` dispatches every API through\n * `client.send(new XCommand({...}))`. This wrapper intercepts `send`, inspects\n * the command, and traces the Converse and InvokeModel APIs. Token extraction\n * handles Claude, Titan, and Llama response formats.\n *\n * Usage:\n * import { wrapBedrock } from 'neatlogs/bedrock';\n * import { BedrockRuntimeClient, ConverseCommand } from '@aws-sdk/client-bedrock-runtime';\n * const client = wrapBedrock(new BedrockRuntimeClient({ region: 'us-east-1' }));\n * await client.send(new ConverseCommand({ modelId, messages }));\n *\n * `neatlogs.llm.provider` is always `bedrock`; `neatlogs.llm.system` is the\n * underlying model vendor (anthropic / amazon / meta / ...), inferred from modelId.\n */\n\nimport { SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { getProviderTracer } from './core/auto-root.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from './core/provider.js';\n\nconst TRACER_NAME = 'neatlogs.bedrock';\nconst PROVIDER = 'bedrock';\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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n `tool.${name}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': safeStringify(args),\n },\n },\n getNeatlogsParentContext(),\n );\n return withNeatlogsSpan(span, async () => {\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\nexport function wrapBedrock<T extends object>(client: T): T {\n const c = client as any;\n if (c._neatlogsBedrockPatched) return client;\n if (typeof c.send !== 'function') return client;\n\n const originalSend = c.send.bind(c);\n\n c.send = function (command: any, ...rest: any[]): any {\n const name = command?.constructor?.name ?? '';\n const input = command?.input ?? {};\n\n if (name === 'ConverseCommand') {\n return tracedConverse(originalSend, command, input, rest, false);\n }\n if (name === 'ConverseStreamCommand') {\n return tracedConverse(originalSend, command, input, rest, true);\n }\n if (name === 'InvokeModelCommand') {\n return tracedInvokeModel(originalSend, command, input, rest, false);\n }\n if (name === 'InvokeModelWithResponseStreamCommand') {\n return tracedInvokeModel(originalSend, command, input, rest, true);\n }\n\n return originalSend(command, ...rest);\n };\n\n c._neatlogsBedrockPatched = true;\n return client;\n}\n\n// ---------------------------------------------------------------------------\n// Vendor / span helpers\n// ---------------------------------------------------------------------------\n\nfunction vendorFromModel(modelId: any): string {\n let tail = String(modelId ?? '').split('/').pop() ?? '';\n for (const prefix of ['us.', 'eu.', 'apac.', 'us-gov.']) {\n if (tail.startsWith(prefix)) tail = tail.slice(prefix.length);\n }\n const vendor = tail.includes('.') ? tail.split('.')[0] : '';\n return vendor || 'bedrock';\n}\n\nfunction startSpan(name: string, modelId: any, isStream: boolean): Span {\n return getProviderTracer(TRACER_NAME).startSpan(name, {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.system': vendorFromModel(modelId),\n 'neatlogs.llm.model_name': String(modelId ?? ''),\n 'neatlogs.llm.is_streaming': isStream,\n },\n }, getNeatlogsParentContext());\n}\n\n// ---------------------------------------------------------------------------\n// Converse API\n// ---------------------------------------------------------------------------\n\nfunction tracedConverse(\n originalSend: (...a: any[]) => any,\n command: any,\n input: any,\n rest: any[],\n isStream: boolean,\n): any {\n const span = startSpan(\n isStream ? 'bedrock.converse_stream' : 'bedrock.converse',\n input?.modelId,\n isStream,\n );\n setConverseInput(span, input);\n\n const promise = withNeatlogsSpan(span, () => originalSend(command, ...rest));\n\n return promise.then(\n (response: any) => {\n if (isStream) {\n return wrapConverseStream(response, span);\n }\n finalizeConverse(span, response);\n return response;\n },\n (err: any) => {\n recordError(span, err);\n throw err;\n },\n );\n}\n\nfunction setConverseInput(span: Span, input: any): void {\n let idx = 0;\n\n if (Array.isArray(input?.system)) {\n const text = input.system.map((b: any) => b?.text ?? '').join(' ').trim();\n if (text) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'system');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, text);\n idx++;\n }\n }\n\n for (const msg of input?.messages ?? []) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, msg?.role ?? 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, converseBlocksToText(msg?.content));\n idx++;\n }\n\n const cfg = input?.inferenceConfig ?? {};\n if (cfg.temperature != null) span.setAttribute('neatlogs.llm.temperature', cfg.temperature);\n if (cfg.topP != null) span.setAttribute('neatlogs.llm.top_p', cfg.topP);\n if (cfg.maxTokens != null) span.setAttribute('neatlogs.llm.max_tokens', cfg.maxTokens);\n\n const tools = input?.toolConfig?.tools ?? [];\n for (let i = 0; i < tools.length; i++) {\n const spec = tools[i]?.toolSpec ?? {};\n if (spec.name) span.setAttribute(`neatlogs.llm.tools.${i}.name`, spec.name);\n if (spec.description) span.setAttribute(`neatlogs.llm.tools.${i}.description`, spec.description);\n if (spec.inputSchema) span.setAttribute(`neatlogs.llm.tools.${i}.input_schema`, safeStringify(spec.inputSchema));\n }\n}\n\nfunction converseBlocksToText(content: any): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return safeStringify(content);\n const parts: string[] = [];\n for (const block of content) {\n if (block && typeof block === 'object') {\n if ('text' in block) parts.push(String(block.text));\n else if ('toolResult' in block) parts.push(safeStringify(block.toolResult));\n else if ('toolUse' in block) parts.push(safeStringify(block.toolUse));\n else parts.push(safeStringify(block));\n } else {\n parts.push(String(block));\n }\n }\n return parts.join('\\n');\n}\n\nfunction finalizeConverse(span: Span, response: any): void {\n const content = response?.output?.message?.content ?? [];\n const textParts: string[] = [];\n let toolIdx = 0;\n\n for (const block of content) {\n if (!block || typeof block !== 'object') continue;\n if ('text' in block) {\n textParts.push(String(block.text));\n } else if ('toolUse' in block) {\n const tu = block.toolUse;\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.id`, String(tu?.toolUseId ?? ''));\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.name`, String(tu?.name ?? ''));\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.arguments`, safeStringify(tu?.input ?? {}));\n toolIdx++;\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 (response?.stopReason) span.setAttribute('neatlogs.llm.finish_reason', String(response.stopReason));\n setConverseUsage(span, response?.usage);\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\nfunction setConverseUsage(span: Span, usage: any): void {\n if (!usage) return;\n if (usage.inputTokens != null) span.setAttribute('neatlogs.llm.token_count.prompt', usage.inputTokens);\n if (usage.outputTokens != null) span.setAttribute('neatlogs.llm.token_count.completion', usage.outputTokens);\n if (usage.totalTokens != null) span.setAttribute('neatlogs.llm.token_count.total', usage.totalTokens);\n if (usage.cacheReadInputTokens != null) span.setAttribute('neatlogs.llm.token_count.cache_read', usage.cacheReadInputTokens);\n if (usage.cacheWriteInputTokens != null) span.setAttribute('neatlogs.llm.token_count.cache_write', usage.cacheWriteInputTokens);\n}\n\nfunction wrapConverseStream(response: any, span: Span): any {\n const stream = response?.stream;\n if (!stream || typeof stream[Symbol.asyncIterator] !== 'function') {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return response;\n }\n\n const originalIterator = stream[Symbol.asyncIterator].bind(stream);\n const textParts: string[] = [];\n const toolCalls: Record<number, { id: string; name: string; arguments: string }> = {};\n let finishReason = '';\n let usage: any = null;\n\n const wrappedStream = {\n [Symbol.asyncIterator]() {\n const iterator = originalIterator();\n return {\n async next(): Promise<IteratorResult<any>> {\n try {\n const result = await iterator.next();\n if (result.done) {\n finalizeConverseStream(span, textParts, toolCalls, finishReason, usage);\n return result;\n }\n const ev = result.value;\n const delta = ev?.contentBlockDelta?.delta;\n if (delta?.text) textParts.push(delta.text);\n if (delta?.toolUse?.input) {\n const idx = ev.contentBlockDelta.contentBlockIndex ?? 0;\n toolCalls[idx] = toolCalls[idx] ?? { id: '', name: '', arguments: '' };\n toolCalls[idx].arguments += delta.toolUse.input;\n }\n const startBlk = ev?.contentBlockStart?.start?.toolUse;\n if (startBlk) {\n const idx = ev.contentBlockStart.contentBlockIndex ?? 0;\n toolCalls[idx] = toolCalls[idx] ?? { id: '', name: '', arguments: '' };\n toolCalls[idx].name = startBlk.name ?? '';\n toolCalls[idx].id = startBlk.toolUseId ?? '';\n }\n if (ev?.messageStop?.stopReason) finishReason = ev.messageStop.stopReason;\n if (ev?.metadata?.usage) usage = ev.metadata.usage;\n return result;\n } catch (err) {\n recordError(span, err);\n throw err;\n }\n },\n async return(value?: any): Promise<IteratorResult<any>> {\n finalizeConverseStream(span, textParts, toolCalls, finishReason, usage);\n return iterator.return?.(value) ?? { done: true, value: undefined };\n },\n };\n },\n };\n\n response.stream = wrappedStream;\n return response;\n}\n\nfunction finalizeConverseStream(\n span: Span,\n textParts: string[],\n toolCalls: Record<number, { id: string; name: string; arguments: string }>,\n finishReason: string,\n usage: any,\n): void {\n const full = textParts.join('');\n if (full) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', full);\n }\n let j = 0;\n for (const tc of Object.values(toolCalls)) {\n if (tc.id) 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 if (finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(finishReason));\n setConverseUsage(span, usage);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\n// ---------------------------------------------------------------------------\n// InvokeModel API (vendor-specific body formats)\n// ---------------------------------------------------------------------------\n\nfunction isEmbeddingModel(modelId: any): boolean {\n return String(modelId ?? '').toLowerCase().includes('embed');\n}\n\nfunction tracedInvokeModel(\n originalSend: (...a: any[]) => any,\n command: any,\n input: any,\n rest: any[],\n isStream: boolean,\n): any {\n const vendor = vendorFromModel(input?.modelId);\n const isEmbedding = !isStream && isEmbeddingModel(input?.modelId);\n const bodyIn = decodeBody(input?.body);\n\n let span: Span;\n if (isEmbedding) {\n span = getProviderTracer(TRACER_NAME).startSpan('bedrock.invoke_model', {\n attributes: {\n 'neatlogs.span.kind': 'EMBEDDING',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.embedding.model_name': String(input?.modelId ?? ''),\n },\n }, getNeatlogsParentContext());\n const text = bodyIn?.inputText ?? bodyIn?.texts ?? bodyIn?.input_text;\n if (text) {\n span.setAttribute('neatlogs.embedding.text', (typeof text === 'string' ? text : safeStringify(text)));\n }\n } else {\n span = startSpan(\n isStream ? 'bedrock.invoke_model_with_response_stream' : 'bedrock.invoke_model',\n input?.modelId,\n isStream,\n );\n setInvokeInput(span, vendor, bodyIn);\n }\n\n const promise = withNeatlogsSpan(span, () => originalSend(command, ...rest));\n\n return promise.then(\n (response: any) => {\n if (isStream) {\n return wrapInvokeStream(response, span, vendor);\n }\n try {\n if (isEmbedding) {\n finalizeInvokeEmbedding(span, decodeBody(response?.body));\n } else {\n finalizeInvoke(span, vendor, decodeBody(response?.body));\n }\n } catch {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n }\n return response;\n },\n (err: any) => {\n recordError(span, err);\n throw err;\n },\n );\n}\n\nfunction finalizeInvokeEmbedding(span: Span, body: any): void {\n const emb = body?.embedding;\n const embs = body?.embeddings;\n if (Array.isArray(emb)) {\n span.setAttribute('neatlogs.embedding.count', 1);\n span.setAttribute('neatlogs.embedding.dimensions', emb.length);\n } else if (Array.isArray(embs) && embs.length) {\n span.setAttribute('neatlogs.embedding.count', embs.length);\n if (Array.isArray(embs[0])) span.setAttribute('neatlogs.embedding.dimensions', embs[0].length);\n }\n if (body?.inputTextTokenCount != null) {\n span.setAttribute('neatlogs.llm.token_count.prompt', body.inputTextTokenCount);\n span.setAttribute('neatlogs.embedding.token_count', body.inputTextTokenCount);\n }\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\nfunction decodeBody(body: any): any {\n try {\n if (body == null) return {};\n if (typeof body === 'string') return JSON.parse(body);\n // Uint8Array (AWS SDK v3 returns the response body as bytes)\n if (body instanceof Uint8Array) return JSON.parse(new TextDecoder().decode(body));\n if (typeof body === 'object' && typeof body.byteLength === 'number') {\n return JSON.parse(new TextDecoder().decode(body));\n }\n if (typeof body === 'object') return body;\n } catch {\n /* fall through */\n }\n return {};\n}\n\nfunction setInvokeInput(span: Span, vendor: string, body: any): void {\n let idx = 0;\n if (body?.system) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'system');\n span.setAttribute(\n `neatlogs.llm.input_messages.${idx}.content`,\n typeof body.system === 'string' ? body.system : safeStringify(body.system),\n );\n idx++;\n }\n if (Array.isArray(body?.messages)) {\n for (const msg of body.messages) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, msg?.role ?? 'user');\n span.setAttribute(\n `neatlogs.llm.input_messages.${idx}.content`,\n typeof msg?.content === 'string' ? msg.content : safeStringify(msg?.content),\n );\n idx++;\n }\n } else if (body?.prompt) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, String(body.prompt));\n } else if (body?.inputText) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, String(body.inputText));\n }\n\n if (body?.temperature != null) span.setAttribute('neatlogs.llm.temperature', body.temperature);\n if (body?.top_p != null) span.setAttribute('neatlogs.llm.top_p', body.top_p);\n const maxTokens = body?.max_tokens ?? body?.maxTokens ?? body?.max_tokens_to_sample;\n if (maxTokens != null) span.setAttribute('neatlogs.llm.max_tokens', maxTokens);\n const cfg = body?.textGenerationConfig;\n if (cfg) {\n if (cfg.temperature != null) span.setAttribute('neatlogs.llm.temperature', cfg.temperature);\n if (cfg.topP != null) span.setAttribute('neatlogs.llm.top_p', cfg.topP);\n if (cfg.maxTokenCount != null) span.setAttribute('neatlogs.llm.max_tokens', cfg.maxTokenCount);\n }\n}\n\nfunction finalizeInvoke(span: Span, vendor: string, body: any): void {\n let text: string | undefined;\n let promptTokens: number | undefined;\n let completionTokens: number | undefined;\n let finishReason: string | undefined;\n\n if (vendor === 'anthropic') {\n if (Array.isArray(body?.content)) {\n text = body.content.filter((b: any) => b?.type === 'text').map((b: any) => b.text).join('');\n let toolIdx = 0;\n for (const b of body.content) {\n if (b?.type === 'tool_use') {\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.id`, String(b.id ?? ''));\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.name`, String(b.name ?? ''));\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.arguments`, safeStringify(b.input ?? {}));\n toolIdx++;\n }\n }\n } else if (body?.completion != null) {\n text = body.completion;\n }\n promptTokens = body?.usage?.input_tokens;\n completionTokens = body?.usage?.output_tokens;\n finishReason = body?.stop_reason;\n } else if (vendor === 'amazon') {\n const r = Array.isArray(body?.results) ? body.results[0] : undefined;\n if (r) {\n text = r.outputText;\n completionTokens = r.tokenCount;\n finishReason = r.completionReason;\n }\n promptTokens = body?.inputTextTokenCount;\n } else if (vendor === 'meta') {\n text = body?.generation;\n promptTokens = body?.prompt_token_count;\n completionTokens = body?.generation_token_count;\n finishReason = body?.stop_reason;\n } else if (vendor === 'cohere') {\n const g = Array.isArray(body?.generations) ? body.generations[0] : undefined;\n if (g) {\n text = g.text;\n finishReason = g.finish_reason;\n }\n } else {\n text = body?.generation ?? body?.completion ?? body?.outputText;\n }\n\n if (text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', String(text));\n }\n if (promptTokens != null) span.setAttribute('neatlogs.llm.token_count.prompt', promptTokens);\n if (completionTokens != null) span.setAttribute('neatlogs.llm.token_count.completion', completionTokens);\n if (promptTokens != null && completionTokens != null) {\n span.setAttribute('neatlogs.llm.token_count.total', promptTokens + completionTokens);\n }\n if (finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(finishReason));\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\nfunction wrapInvokeStream(response: any, span: Span, vendor: string): any {\n const body = response?.body;\n if (!body || typeof body[Symbol.asyncIterator] !== 'function') {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return response;\n }\n\n const originalIterator = body[Symbol.asyncIterator].bind(body);\n const textParts: string[] = [];\n let promptTokens: number | undefined;\n let completionTokens: number | undefined;\n let finishReason: string | undefined;\n\n const finalize = () => {\n const full = textParts.join('');\n if (full) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', full);\n }\n if (promptTokens != null) span.setAttribute('neatlogs.llm.token_count.prompt', promptTokens);\n if (completionTokens != null) span.setAttribute('neatlogs.llm.token_count.completion', completionTokens);\n if (finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(finishReason));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n };\n\n const wrappedBody = {\n [Symbol.asyncIterator]() {\n const iterator = originalIterator();\n return {\n async next(): Promise<IteratorResult<any>> {\n try {\n const result = await iterator.next();\n if (result.done) {\n finalize();\n return result;\n }\n const data = decodeBody(result.value?.chunk?.bytes);\n if (data?.type === 'content_block_delta') {\n textParts.push(data?.delta?.text ?? '');\n } else if (data?.type === 'message_delta') {\n if (data?.delta?.stop_reason) finishReason = data.delta.stop_reason;\n if (data?.usage?.output_tokens != null) completionTokens = data.usage.output_tokens;\n }\n if (data?.outputText) textParts.push(data.outputText);\n if (data?.generation) textParts.push(data.generation);\n const metrics = data?.['amazon-bedrock-invocationMetrics'];\n if (metrics) {\n promptTokens = metrics.inputTokenCount ?? promptTokens;\n completionTokens = metrics.outputTokenCount ?? completionTokens;\n }\n return result;\n } catch (err) {\n recordError(span, err);\n throw err;\n }\n },\n async return(value?: any): Promise<IteratorResult<any>> {\n finalize();\n return iterator.return?.(value) ?? { done: true, value: undefined };\n },\n };\n },\n };\n\n response.body = wrappedBody;\n return response;\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\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, SpanStatusCode, type Span, type Context } from '@opentelemetry/api';\nimport { maybeOpenAutoRoot, endAutoRoot } from './core/auto-root.js';\nimport { getNeatlogsTracer, getNeatlogsBaseContext } from './core/provider.js';\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 // Auto-root spans keyed by the run-id of the child that triggered them.\n private _autoRoots: Map<string, Span> = new Map();\n private _workflowName: string | undefined;\n\n constructor(opts?: LangchainHandlerOptions) {\n this._workflowName = opts?.workflowName;\n }\n\n // --- Self-rooting ----------------------------------------------------------\n //\n // A LangChain run can begin with ANY callback. When it begins with a non-root\n // kind (a bare `llm.invoke()` fires handleChatModelStart/handleLLMStart with no\n // chain above it; a standalone tool/retriever similarly), the span we create is\n // parentless and non-root -> the backend can't anchor the trace and it never\n // renders. Open a WORKFLOW root transparently in that case so just adding the\n // handler yields a complete trace. A top-level CHAIN is already root-eligible.\n private _startCtx(parentRunId: string | undefined, runId: string, kind: string): Context {\n // Base context is ROOT_CONTEXT in isolated mode so a foreign provider's\n // active span can never leak in as our ancestor; parent linkage comes\n // solely from our own run-id → span map.\n const base = getNeatlogsBaseContext();\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n if (parentSpan) {\n return trace.setSpan(base, parentSpan);\n }\n const tracer = getNeatlogsTracer(TRACER_NAME);\n const { root, ctx } = maybeOpenAutoRoot(tracer, kind, base);\n if (root) this._autoRoots.set(runId, root);\n return ctx;\n }\n\n private _endAutoRoot(runId: string): void {\n const root = this._autoRoots.get(runId);\n if (root) {\n endAutoRoot(root);\n this._autoRoots.delete(runId);\n }\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 = getNeatlogsTracer(TRACER_NAME);\n const name = serialized?.name ?? serialized?.id?.at(-1) ?? 'chain';\n\n const parentCtx = this._startCtx(parentRunId, runId, 'chain');\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);\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));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n this._endAutoRoot(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 this._endAutoRoot(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 = getNeatlogsTracer(TRACER_NAME);\n const model = serialized?.kwargs?.model_name ?? serialized?.kwargs?.model ?? serialized?.name ?? '';\n\n const parentCtx = this._startCtx(parentRunId, runId, 'llm');\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];\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 = getNeatlogsTracer(TRACER_NAME);\n const model = serialized?.kwargs?.model_name ?? serialized?.kwargs?.model ?? serialized?.name ?? '';\n\n const parentCtx = this._startCtx(parentRunId, runId, 'llm');\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;\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));\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 this._endAutoRoot(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 this._endAutoRoot(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 = getNeatlogsTracer(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 parentCtx = this._startCtx(parentRunId, runId, 'tool');\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': String(input),\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));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n this._endAutoRoot(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 this._endAutoRoot(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 = getNeatlogsTracer(TRACER_NAME);\n const name = serialized?.name ?? 'retriever';\n\n const parentCtx = this._startCtx(parentRunId, runId, 'retriever');\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'RETRIEVER',\n 'neatlogs.retriever.name': name,\n 'input.value': query,\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);\n }\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n this._endAutoRoot(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 this._endAutoRoot(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 * Strands currently creates and activates spans through the process-global\n * OpenTelemetry context. Neatlogs always uses a private provider, so this\n * integration is rejected until Strands can accept an injected private-context\n * runtime or Neatlogs ships an explicit wrapper that owns span creation.\n */\nexport function strandsHooks<T extends object>(_agent: T): T {\n throw new Error(\n 'strandsHooks() is not supported because the Strands Agents tracer creates ' +\n 'and activates spans on the global OpenTelemetry context ' +\n '(context.active() / context.with()), which cannot be isolated from other ' +\n 'tracing SDKs (Datadog, etc.).',\n );\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, SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { getNeatlogsTracer, getNeatlogsBaseContext } from './core/provider.js';\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 = getNeatlogsTracer(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 }, getNeatlogsBaseContext());\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 = getNeatlogsTracer(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\n // forms. Base is ROOT_CONTEXT in isolated mode so a foreign provider's\n // active span can never leak in as our ancestor.\n const base = getNeatlogsBaseContext();\n const parentKey = String(span?.parentId ?? span?.traceId ?? span?.trace_id ?? '');\n const parentSpan = this._spans.get(parentKey);\n const parentCtx = parentSpan ? trace.setSpan(base, parentSpan) : base;\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));\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));\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);\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)));\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)));\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)));\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 {\n SpanStatusCode,\n type Span,\n} from '@opentelemetry/api';\nimport {\n getNeatlogsParentContext,\n getNeatlogsTracer,\n withNeatlogsSpan,\n} from './core/provider.js';\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', {\n 'neatlogs.span.kind': 'RERANKER',\n 'input.value': safeStringify({\n documents: args?.[0],\n query: args?.[1],\n options: args?.[3],\n }),\n }, (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);\n span.setAttribute('input.value', query);\n }\n if (Array.isArray(results)) span.setAttribute('neatlogs.reranker.input_documents', safeStringify(results));\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));\n span.setAttribute('output.value', toOutputValue(result));\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 patchDynamicToolsets(opts?.toolsets);\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;\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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n `mastra.agent.${agentName}`,\n { attributes: attrs },\n getNeatlogsParentContext(),\n );\n try {\n const result = await withNeatlogsSpan(span, () => orig(input, opts));\n return wrapStreamingOutput(result, span);\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/** Patch per-call Mastra toolsets (for example dynamically loaded MCP tools). */\nfunction patchDynamicToolsets(toolsets: any): void {\n if (!toolsets || typeof toolsets !== 'object') return;\n for (const [toolsetName, tools] of Object.entries<any>(toolsets)) {\n if (!tools || typeof tools !== 'object') continue;\n for (const [key, tool] of Object.entries<any>(tools)) {\n patchToolExecute(tool, `${toolsetName}.${key}`);\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);\n captureInvocationParams(attrs, callOpts);\n\n const spanName = `mastra.llm.${modelId || 'model'}.${fn}`;\n if (isStream) {\n return traceStreamingModelCall(spanName, attrs, callOpts, orig);\n }\n return withActiveSpan(spanName, attrs, async (span) => {\n const result = await orig(callOpts);\n finalizeModelResult(span, result);\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 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\n // Resolve and scan on every agent invocation. Workspace/skill tools can be\n // materialized lazily or change per request; patchToolExecute itself is\n // idempotent, so rescanning catches new tools without double-wrapping old\n // ones.\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),\n };\n if (tool.description) attrs['neatlogs.tool.description'] = String(tool.description);\n\n return withActiveSpan(`mastra.tool.${toolName}`, attrs, async (span) => {\n const result = await orig(params, options);\n span.setAttribute('output.value', toOutputValue(result));\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 'input.value': safeStringify(startOpts ?? {}),\n };\n if (startOpts?.inputData !== undefined) attrs['input.value'] = safeStringify(startOpts.inputData);\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));\n } else {\n span.setAttribute('output.value', toOutputValue(result));\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),\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', toOutputValue(result));\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]),\n };\n return withActiveSpan(`mastra.memory.${op}`, attrs, async (span) => {\n const result = await orig(...args);\n span.setAttribute('output.value', summarizeMemoryOutput(op, args?.[0], result));\n return result;\n });\n };\n }\n}\n\nfunction summarizeMemoryOutput(op: string, input: any, result: unknown): string {\n if (result !== undefined) return toOutputValue(result);\n\n const summary: Record<string, unknown> = { completed: true };\n if (op === 'saveMessages') {\n summary.messageCount = Array.isArray(input?.messages) ? input.messages.length : 0;\n } else if (op === 'deleteMessages') {\n const ids = input?.messageIds ?? input?.ids;\n if (Array.isArray(ids)) summary.requestedCount = ids.length;\n } else if (op === 'recall') {\n summary.resultCount = 0;\n }\n return safeStringify(summary);\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 'input.value': safeStringify(args),\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 span.setAttribute('output.value', toOutputValue(result));\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): any {\n if (!output) {\n span.setAttribute('output.value', toOutputValue(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);\n span.setAttribute('output.value', text);\n } else {\n span.setAttribute('output.value', safeStringify({\n finishReason: finishReason ?? 'completed',\n }));\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, span);\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 const text = textParts.join('');\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', text);\n span.setAttribute('output.value', text);\n } else {\n span.setAttribute('output.value', safeStringify({ streamCompleted: true }));\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, span: Span): 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 return new Proxy(value, {\n get(stream, streamProp, streamReceiver) {\n if (streamProp === Symbol.asyncIterator) {\n return () => wrapBoundIterator(stream[Symbol.asyncIterator](), span);\n }\n const streamValue = Reflect.get(stream, streamProp, streamReceiver);\n if (streamProp === 'getReader' && typeof streamValue === 'function') {\n return (...args: any[]) => {\n const reader: any = Reflect.apply(streamValue, stream, args);\n return new Proxy(reader, {\n get(readerTarget, readerProp, readerReceiver) {\n const readerValue = Reflect.get(readerTarget, readerProp, readerReceiver);\n if (typeof readerValue !== 'function') return readerValue;\n if (readerProp === 'read' || readerProp === 'cancel') {\n return (...readerArgs: any[]) =>\n withNeatlogsSpan(span, () =>\n Reflect.apply(readerValue, readerTarget, readerArgs),\n );\n }\n return readerValue.bind(readerTarget);\n },\n });\n };\n }\n return typeof streamValue === 'function'\n ? streamValue.bind(stream)\n : streamValue;\n },\n });\n }\n if (typeof value === 'function') return value.bind(target);\n return value;\n },\n });\n}\n\nfunction wrapBoundIterator(iterator: any, span: Span): any {\n return {\n next: (...args: any[]) =>\n withNeatlogsSpan(span, () => iterator.next(...args)),\n return: iterator.return\n ? (...args: any[]) =>\n withNeatlogsSpan(span, () => iterator.return(...args))\n : undefined,\n throw: iterator.throw\n ? (...args: any[]) =>\n withNeatlogsSpan(span, () => iterator.throw(...args))\n : undefined,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Result finalization\n// ---------------------------------------------------------------------------\n\nfunction finalizeAgentResult(span: Span, result: any): void {\n if (result === undefined) {\n span.setAttribute('output.value', toOutputValue(result));\n return;\n }\n\n if (result.text) {\n const text = String(result.text);\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', text);\n span.setAttribute('output.value', text);\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 if (!result.text) {\n span.setAttribute('output.value', safeStringify({ toolCalls: result.toolCalls }));\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 if (!result.text && !Array.isArray(result.toolCalls)) {\n span.setAttribute('output.value', safeStringify(result));\n }\n}\n\nfunction finalizeModelResult(span: Span, result: any): void {\n if (result === undefined) {\n span.setAttribute('output.value', toOutputValue(result));\n return;\n }\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);\n span.setAttribute('output.value', result.text);\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);\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));\n } else {\n span.setAttribute('output.value', safeStringify(result));\n }\n if (result.usage) recordUsage(span, result.usage);\n span.setAttribute('neatlogs.llm.stop_reason', normalizeFinishReason(result.finishReason));\n}\n\n// ---------------------------------------------------------------------------\n// Provider-model stream wrapping\n// ---------------------------------------------------------------------------\n\ninterface ModelStreamCapture {\n textParts: string[];\n toolCalls: any[];\n finishReason?: unknown;\n usage?: unknown;\n}\n\n/**\n * AI SDK model `doStream()` returns a lazy stream container. The provider call\n * has only started when the container is returned; output, usage, and the real\n * duration arrive while `result.stream` is consumed. Keep the LLM span open\n * across that consumption and replace only the stream property.\n */\nasync function traceStreamingModelCall(\n spanName: string,\n attrs: Record<string, any>,\n callOpts: any,\n orig: (options: any) => any,\n): Promise<any> {\n const tracer = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n spanName,\n { attributes: attrs },\n getNeatlogsParentContext(),\n );\n try {\n const result = await withNeatlogsSpan(span, () => orig(callOpts));\n return wrapModelStreamingResult(result, span);\n } catch (err) {\n recordError(span, err);\n span.end();\n throw err;\n }\n}\n\nfunction wrapModelStreamingResult(result: any, span: Span): any {\n const stream = result?.stream;\n if (!stream || typeof stream.getReader !== 'function') {\n if (result?.usage) recordUsage(span, result.usage);\n span.setAttribute('output.value', safeStringify(result ?? { streamCompleted: true }));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n }\n\n const capture: ModelStreamCapture = { textParts: [], toolCalls: [] };\n let ended = false;\n const endOnce = (err?: unknown) => {\n if (ended) return;\n ended = true;\n if (err) {\n recordError(span, err);\n } else {\n finalizeModelStreamSpan(span, capture);\n span.setStatus({ code: SpanStatusCode.OK });\n }\n span.end();\n };\n\n const sourceReader = stream.getReader();\n const wrappedStream = new ReadableStream({\n async pull(controller) {\n try {\n const next = await withNeatlogsSpan(span, () => sourceReader.read());\n if (next.done) {\n endOnce();\n controller.close();\n return;\n }\n captureModelStreamPart(span, capture, next.value);\n controller.enqueue(next.value);\n } catch (err) {\n endOnce(err);\n controller.error(err);\n }\n },\n async cancel(reason) {\n try {\n await withNeatlogsSpan(span, () => sourceReader.cancel(reason));\n endOnce();\n } catch (err) {\n endOnce(err);\n throw err;\n }\n },\n });\n\n return new Proxy(result, {\n get(target, prop, receiver) {\n if (prop === 'stream') return wrappedStream;\n const value = Reflect.get(target, prop, receiver);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n}\n\nfunction captureModelStreamPart(\n span: Span,\n capture: ModelStreamCapture,\n part: any,\n): void {\n const type = part?.type;\n if (type === 'text-delta') {\n const text = part.delta ?? part.text ?? part.payload?.text;\n if (typeof text === 'string' && text) capture.textParts.push(text);\n }\n if (type === 'tool-call') {\n const index = capture.toolCalls.length;\n const toolCall = {\n id: part.toolCallId ?? part.id,\n name: part.toolName ?? part.name,\n arguments: part.input ?? part.args ?? part.arguments,\n };\n capture.toolCalls.push(toolCall);\n setToolCall(span, index, toolCall.name, toolCall.arguments, toolCall.id);\n }\n if (type === 'finish') {\n capture.finishReason = part.finishReason;\n capture.usage = part.usage;\n }\n if (part?.usage) capture.usage = part.usage;\n if (part?.finishReason !== undefined) capture.finishReason = part.finishReason;\n}\n\nfunction finalizeModelStreamSpan(span: Span, capture: ModelStreamCapture): void {\n const text = capture.textParts.join('');\n if (text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', text);\n }\n if (capture.usage) recordUsage(span, capture.usage);\n if (capture.finishReason !== undefined) {\n span.setAttribute(\n 'neatlogs.llm.stop_reason',\n normalizeFinishReason(capture.finishReason),\n );\n }\n\n if (text && capture.toolCalls.length === 0) {\n span.setAttribute('output.value', text);\n return;\n }\n span.setAttribute('output.value', safeStringify({\n ...(text ? { text } : {}),\n ...(capture.toolCalls.length ? { toolCalls: capture.toolCalls } : {}),\n finishReason: capture.finishReason ?? 'completed',\n }));\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]);\n }\n invocation.toolChoice = callOpts.toolChoice;\n }\n if (Object.keys(invocation).length) {\n attrs['neatlogs.llm.invocation_parameters'] = safeStringify(invocation);\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, cacheRead, cacheWrite},\n // outputTokens: {total, reasoning} }\n // - Mastra result: { inputTokens, outputTokens, totalTokens,\n // cachedInputTokens, cacheCreationInputTokens }\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 const reasoning = tokenValue(\n usage.reasoningTokens ?? usage.outputTokens?.reasoning ?? usage.output_tokens?.reasoning,\n );\n const cacheRead = tokenValue(\n usage.cachedInputTokens ??\n usage.cacheReadInputTokens ??\n usage.cache_read_input_tokens ??\n usage.inputTokens?.cacheRead ??\n usage.input_tokens?.cache_read,\n );\n const cacheWrite = tokenValue(\n usage.cacheCreationInputTokens ??\n usage.cacheWriteInputTokens ??\n usage.cache_creation_input_tokens ??\n usage.inputTokens?.cacheWrite ??\n usage.input_tokens?.cache_write,\n );\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 (reasoning != null) span.setAttribute('neatlogs.llm.token_count.reasoning', reasoning);\n if (cacheRead != null) span.setAttribute('neatlogs.llm.token_count.cache_read', cacheRead);\n if (cacheWrite != null) span.setAttribute('neatlogs.llm.token_count.cache_write', cacheWrite);\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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n name,\n { attributes: attrs },\n getNeatlogsParentContext(),\n );\n return withNeatlogsSpan(span, 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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n name,\n { attributes: attrs },\n getNeatlogsParentContext(),\n );\n return Promise.resolve(\n withNeatlogsSpan(span, () => fn(span)),\n )\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));\n}\n\nfunction safeStringify(value: unknown): string {\n if (typeof value === 'string') return value;\n if (value === undefined) {\n return JSON.stringify({ value_type: 'undefined' });\n }\n try {\n return JSON.stringify(value) ?? '';\n } catch {\n return JSON.stringify({\n serialization_error: 'circular_or_unsupported_value',\n value_type: typeof value,\n });\n }\n}\n\nfunction toOutputValue(value: unknown): string {\n return safeStringify(value === undefined ? { completed: true } : value);\n}\n\nfunction recordError(span: Span, err: unknown): void {\n span.setAttribute('output.value', safeStringify({\n error: err instanceof Error\n ? { name: err.name, message: err.message }\n : { message: String(err) },\n }));\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 Pi Agent integration.\n *\n * Usage:\n * import { init } from 'neatlogs';\n * import { piAgentHooks } from 'neatlogs/pi-agent';\n * import { Agent } from '@mariozechner/pi-agent-core';\n *\n * await init({ apiKey, workflowName });\n * const agent = piAgentHooks(new Agent({ initialState: { systemPrompt, model } }));\n * await agent.prompt('Hello');\n *\n * Pi Agent's `Agent` exposes a first-class `subscribe(listener)` API and emits\n * AgentEvents for its run lifecycle (message_*, tool_execution_*, turn_*,\n * agent_*). It does NOT emit its own OpenTelemetry spans — so we LISTEN to those\n * events (no monkey-patching) and translate them into neatlogs OTel spans:\n *\n * AGENT agent run (agent_start → agent_end)\n * ↳ LLM assistant message (each assistant message_end)\n * ↳ TOOL tool call (tool_execution_start → tool_execution_end)\n *\n * The AGENT span is opened as the active span so the LLM/TOOL children nest under\n * it (and under any user @span / trace() block active when prompt() is called).\n */\n\nimport {\n trace,\n SpanStatusCode,\n type Span,\n type Context,\n} from '@opentelemetry/api';\nimport { getNeatlogsTracer, getNeatlogsParentContext } from './core/provider.js';\n\nconst TRACER_NAME = 'neatlogs.pi-agent';\nconst PATCH_FLAG = '_neatlogs_patched';\n\n// Minimal structural types for the Pi Agent event surface (we duck-type — no\n// hard dependency on the pi-agent-core package).\ninterface PiUsage {\n input?: number;\n output?: number;\n cacheRead?: number;\n cacheWrite?: number;\n totalTokens?: number;\n}\ninterface PiToolCall {\n type: 'toolCall';\n id?: string;\n name?: string;\n arguments?: Record<string, unknown>;\n}\ninterface PiAssistantMessage {\n role: 'assistant';\n content?: Array<{ type: string; text?: string; name?: string; arguments?: unknown }>;\n model?: string;\n provider?: string;\n usage?: PiUsage;\n stopReason?: string;\n}\ninterface PiAgentEvent {\n type: string;\n message?: any;\n messages?: any[];\n toolCallId?: string;\n toolName?: string;\n args?: unknown;\n result?: unknown;\n isError?: boolean;\n}\n\ninterface PerAgentState {\n agentSpan?: Span;\n agentCtx?: Context;\n toolSpans: Map<string, Span>;\n /** Running conversation (system/user/tool turns) to use as LLM-span input.\n * Pi Agent's assistant message_end carries only the response, not the prompt. */\n inputMessages: Array<{ role: string; content: string }>;\n}\n\n/**\n * Subscribe neatlogs tracing to a Pi Agent instance. Returns the same agent\n * (marked so re-subscribing is a no-op). Idempotent per agent.\n */\nexport function piAgentHooks<T extends object>(agent: T): T {\n if (!agent || (agent as any)[PATCH_FLAG]) return agent;\n const a = agent as any;\n if (typeof a.subscribe !== 'function') return agent; // not a Pi Agent — leave alone\n\n const state: PerAgentState = { toolSpans: new Map(), inputMessages: [] };\n const tracer = getNeatlogsTracer(TRACER_NAME);\n\n a.subscribe((event: PiAgentEvent) => {\n try {\n handleEvent(tracer, state, event);\n } catch {\n // never let tracing break the agent run\n }\n });\n\n markPatched(a);\n return agent;\n}\n\nfunction handleEvent(\n tracer: ReturnType<typeof trace.getTracer>,\n state: PerAgentState,\n event: PiAgentEvent,\n): void {\n switch (event.type) {\n case 'agent_start': {\n // Open the AGENT (run) span as the active span so children nest under it.\n const base = getNeatlogsParentContext();\n const span = tracer.startSpan(\n 'pi_agent.run',\n { attributes: { 'neatlogs.span.kind': 'AGENT' } },\n base,\n );\n state.agentSpan = span;\n state.agentCtx = trace.setSpan(base, span);\n state.inputMessages = [];\n break;\n }\n\n case 'message_end': {\n const msg = event.message as any;\n if (!msg) return;\n if (msg.role === 'assistant') {\n // Assistant message = the LLM response. Emit an LLM span using the\n // accumulated conversation as input, then record the assistant turn too.\n emitLlmSpan(tracer, state, msg as PiAssistantMessage);\n const { text } = splitAssistantContent(msg.content);\n if (text) state.inputMessages.push({ role: 'assistant', content: text });\n } else {\n // user / toolResult turns — accumulate as input context for later LLM spans.\n const role = msg.role === 'toolResult' ? 'tool' : String(msg.role || 'user');\n const content = messageText(msg);\n if (content) state.inputMessages.push({ role, content });\n }\n break;\n }\n\n case 'tool_execution_start': {\n const parent = state.agentCtx ?? getNeatlogsParentContext();\n const span = tracer.startSpan(\n `pi_agent.tool.${event.toolName ?? 'tool'}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n ...(event.toolName ? { 'neatlogs.tool.name': String(event.toolName) } : {}),\n ...(event.args !== undefined\n ? { 'input.value': safeStringify(event.args) }\n : {}),\n },\n },\n parent,\n );\n if (event.toolCallId) state.toolSpans.set(event.toolCallId, span);\n break;\n }\n\n case 'tool_execution_end': {\n const span = event.toolCallId ? state.toolSpans.get(event.toolCallId) : undefined;\n if (!span) return;\n if (event.result !== undefined) {\n span.setAttribute('output.value', safeStringify(event.result));\n }\n if (event.isError) {\n span.setStatus({ code: SpanStatusCode.ERROR });\n span.setAttribute('neatlogs.tool.is_error', true);\n } else {\n span.setStatus({ code: SpanStatusCode.OK });\n }\n span.end();\n if (event.toolCallId) state.toolSpans.delete(event.toolCallId);\n break;\n }\n\n case 'agent_end': {\n // Close any tool spans that never received an end event, then the agent span.\n for (const ts of state.toolSpans.values()) {\n try {\n ts.end();\n } catch {\n /* ignore */\n }\n }\n state.toolSpans.clear();\n if (state.agentSpan) {\n // Agent input = the first user message of the run; output = final answer.\n const firstUser = state.inputMessages.find((m) => m.role === 'user');\n if (firstUser) state.agentSpan.setAttribute('input.value', firstUser.content);\n const finalText = lastAssistantText(event.messages);\n if (finalText) state.agentSpan.setAttribute('output.value', finalText);\n state.agentSpan.setStatus({ code: SpanStatusCode.OK });\n state.agentSpan.end();\n state.agentSpan = undefined;\n state.agentCtx = undefined;\n }\n break;\n }\n\n default:\n break;\n }\n}\n\nfunction emitLlmSpan(\n tracer: ReturnType<typeof trace.getTracer>,\n state: PerAgentState,\n msg: PiAssistantMessage,\n): void {\n const attrs: Record<string, any> = { 'neatlogs.span.kind': 'LLM' };\n if (msg.model) attrs['neatlogs.llm.model_name'] = String(msg.model);\n if (msg.provider) attrs['neatlogs.llm.provider'] = String(msg.provider);\n if (msg.stopReason) attrs['neatlogs.llm.stop_reason'] = String(msg.stopReason);\n\n // Input = the conversation accumulated up to this assistant turn (system +\n // user + prior assistant/tool messages). Pi Agent's message_end doesn't carry\n // the prompt, so we reconstruct it from the running inputMessages list.\n const inMsgs = state.inputMessages;\n if (inMsgs.length) {\n inMsgs.forEach((m, i) => {\n attrs[`neatlogs.llm.input_messages.${i}.role`] = m.role;\n attrs[`neatlogs.llm.input_messages.${i}.content`] = m.content;\n });\n attrs['neatlogs.llm.input'] = safeStringify({ messages: inMsgs });\n attrs['input.value'] = safeStringify({ messages: inMsgs });\n }\n\n const { text, toolCalls } = splitAssistantContent(msg.content);\n // Output: text if present, else a readable tool-call summary so the span isn't blank.\n const outText = text || toolCalls.map((tc) => `${tc.name}(${safeStringify(tc.arguments)})`).join('\\n');\n if (outText || toolCalls.length) {\n attrs['neatlogs.llm.output_messages.0.role'] = 'assistant';\n attrs['neatlogs.llm.output_messages.0.content'] = (outText || '');\n const outBlob: Record<string, unknown> = { role: 'assistant', content: outText || '' };\n if (toolCalls.length) {\n outBlob.tool_calls = toolCalls.map((tc) => ({ name: tc.name, arguments: tc.arguments }));\n toolCalls.forEach((tc, j) => {\n if (tc.name) attrs[`neatlogs.llm.tool_calls.${j}.name`] = tc.name;\n if (tc.arguments !== undefined)\n attrs[`neatlogs.llm.tool_calls.${j}.arguments`] = safeStringify(tc.arguments);\n if (tc.id) attrs[`neatlogs.llm.tool_calls.${j}.id`] = String(tc.id);\n });\n }\n attrs['neatlogs.llm.output'] = safeStringify(outBlob);\n attrs['output.value'] = (outText || '');\n }\n\n const usage = msg.usage;\n if (usage) {\n if (usage.input != null) attrs['neatlogs.llm.token_count.prompt'] = usage.input;\n if (usage.output != null) attrs['neatlogs.llm.token_count.completion'] = usage.output;\n const total = usage.totalTokens ?? ((usage.input ?? 0) + (usage.output ?? 0));\n if (total) attrs['neatlogs.llm.token_count.total'] = total;\n if (usage.cacheRead) attrs['neatlogs.llm.token_count.cache_read'] = usage.cacheRead;\n if (usage.cacheWrite) attrs['neatlogs.llm.token_count.cache_write'] = usage.cacheWrite;\n }\n\n const parent = state.agentCtx ?? getNeatlogsParentContext();\n const span = tracer.startSpan(\n `pi_agent.llm.${msg.model || 'model'}`,\n { attributes: attrs },\n parent,\n );\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\n// ---------------------------------------------------------------------------\n// Content helpers\n// ---------------------------------------------------------------------------\n\nfunction splitAssistantContent(\n content: PiAssistantMessage['content'],\n): { text: string; toolCalls: PiToolCall[] } {\n const texts: string[] = [];\n const toolCalls: PiToolCall[] = [];\n if (Array.isArray(content)) {\n for (const block of content) {\n if (!block || typeof block !== 'object') continue;\n if (block.type === 'text' && typeof block.text === 'string') texts.push(block.text);\n else if (block.type === 'toolCall')\n toolCalls.push(block as unknown as PiToolCall);\n // thinking blocks intentionally omitted from the main output text\n }\n } else if (typeof content === 'string') {\n texts.push(content);\n }\n return { text: texts.join(''), toolCalls };\n}\n\n/** Flatten any message's content (string or block array) to readable text. */\nfunction messageText(msg: any): string {\n if (!msg) return '';\n const c = msg.content;\n if (typeof c === 'string') return c;\n if (!Array.isArray(c)) return '';\n const parts: string[] = [];\n for (const block of c) {\n if (typeof block === 'string') parts.push(block);\n else if (block && typeof block === 'object') {\n if (typeof block.text === 'string') parts.push(block.text);\n else if (block.type === 'toolCall') parts.push(`${block.name ?? 'tool'}(${safeStringify(block.arguments)})`);\n }\n }\n return parts.join('');\n}\n\nfunction lastAssistantText(messages: any[] | undefined): string {\n if (!Array.isArray(messages)) return '';\n for (let i = messages.length - 1; i >= 0; i--) {\n const m = messages[i];\n if (m && m.role === 'assistant') {\n const { text } = splitAssistantContent(m.content);\n if (text) return text;\n }\n }\n return '';\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 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","/**\n * Neatlogs Claude Agent SDK integration.\n *\n * Wraps Anthropic's `@anthropic-ai/claude-agent-sdk` so every `query()` run is\n * traced. The SDK's `query()` returns an async-iterable of SDKMessages\n * (system init → assistant (text + tool_use) → user (tool_result) → … →\n * result). Each message carries `parent_tool_use_id`: null for the main\n * (orchestrator) agent, or the id of the spawning Task tool call for a subagent.\n * We translate that into a neatlogs span tree:\n *\n * AGENT claude_agent.query (orchestrator = trace root)\n * ↳ LLM orchestrator turn (one per model turn; text + tool_calls)\n * ↳ TOOL Read / Edit / Bash …\n * ↳ TOOL Task (spawns a subagent)\n * ↳ AGENT claude_agent.subagent.<type> (each subagent, nested)\n * ↳ LLM subagent turn\n * ↳ TOOL subagent tool call\n *\n * The orchestrator is the single root AGENT span — there is NO redundant WORKFLOW\n * wrapper. Subagents (Task-tool invocations, e.g. the wizard's parallel per-file\n * edits) get their own AGENT spans nested under the Task TOOL span that spawned\n * them, so a multi-agent run is represented faithfully and each agent's I/O is\n * distinct.\n *\n * Usage:\n * import { init } from 'neatlogs';\n * import { wrapClaudeAgentSDK } from 'neatlogs/claude-agent-sdk';\n * import * as claudeAgentSDK from '@anthropic-ai/claude-agent-sdk';\n *\n * await init({ apiKey, workflowName });\n * const { query } = wrapClaudeAgentSDK(claudeAgentSDK);\n * for await (const msg of query({ prompt: 'Hello', options: {...} })) { ... }\n *\n * Conversation tracking: Claude's `session_id` is captured on the root AGENT span\n * as `neatlogs.conversation.id`. Tool calls are traced only through the wrapped\n * `query` — calling the unwrapped SDK directly produces no tracing.\n */\n\nimport { trace, SpanStatusCode, type Span, type Context } from '@opentelemetry/api';\nimport { getNeatlogsTracer, getNeatlogsBaseContext, withNeatlogsSpan } from './core/provider.js';\n\nconst TRACER_NAME = 'neatlogs.claude_agent_sdk';\nconst ROOT_SCOPE = '__root__';\n\nexport interface WrapClaudeAgentSDKOptions {\n /** Logical grouping for traces (also settable globally via init({ workflowName })). */\n workflowName?: string;\n}\n\n/**\n * Wrap the Claude Agent SDK module. Returns a shallow copy of the module with an\n * instrumented `query`; all other exports (createSdkMcpServer, tool, the built-in\n * Tool helpers, etc.) are passed through unchanged.\n */\nexport function wrapClaudeAgentSDK<T extends Record<string, any>>(\n sdk: T,\n options: WrapClaudeAgentSDKOptions = {},\n): T {\n if (!sdk || typeof sdk.query !== 'function') return sdk;\n if ((sdk as any)._neatlogsWrapped) return sdk;\n\n const wrapped: Record<string, any> = { ...sdk };\n wrapped.query = wrapQuery(sdk.query.bind(sdk), options);\n\n try {\n Object.defineProperty(wrapped, '_neatlogsWrapped', {\n value: true,\n enumerable: false,\n configurable: true,\n });\n } catch {\n wrapped._neatlogsWrapped = true;\n }\n\n return wrapped as T;\n}\n\n// ---------------------------------------------------------------------------\n// query() wrapping\n// ---------------------------------------------------------------------------\n\nfunction wrapQuery(original: (...args: any[]) => any, options: WrapClaudeAgentSDKOptions) {\n return function (params: any, ...rest: any[]): any {\n const tracer = getNeatlogsTracer(TRACER_NAME);\n const workflowName = options.workflowName ?? 'claude_agent.query';\n\n // Shared ref the input-tap fills with the first user-prompt text. In\n // streaming-input mode the prompt is an async generator fed into the SDK\n // subprocess and is NOT echoed back as a `user` output message before the\n // first assistant turn — so without tapping it, the first LLM span has no\n // input. The tap reads prompt text as the SDK pulls it.\n const promptRef: { text: string } = { text: '' };\n\n // The orchestrator AGENT is the trace ROOT (no WORKFLOW wrapper — a single\n // query() is one agent run; subagents nest below as their own AGENT spans).\n const agentSpan = tracer.startSpan(\n 'claude_agent.query',\n { attributes: { 'neatlogs.span.kind': 'AGENT', 'neatlogs.workflow.name': workflowName } },\n getNeatlogsBaseContext(),\n );\n\n // Input: a string prompt is captured directly. A streaming-input prompt (an\n // async iterable) is tapped — promptRef.text fills as the SDK pulls the\n // first user message — so the agent input and the first LLM span's input are\n // populated even before any `user` message echoes back through the output.\n const promptText = extractPromptText(params?.prompt);\n if (promptText) {\n promptRef.text = promptText;\n agentSpan.setAttribute('input.value', promptText);\n } else if (params && isAsyncIterable(params.prompt)) {\n params = { ...params, prompt: tapPromptStream(params.prompt, promptRef) };\n }\n\n const agentCtx = trace.setSpan(getNeatlogsBaseContext(), agentSpan);\n\n // Call the original query with the AGENT span active only under our private\n // context so a foreign provider's spans neither parent nor nest under ours.\n const queryObj = withNeatlogsSpan(agentSpan, () => original(params, ...rest));\n\n return instrumentQueryIterable(queryObj, agentSpan, agentCtx, tracer, promptRef);\n };\n}\n\n/** True for an async iterable (streaming-input prompt). */\nfunction isAsyncIterable(v: any): boolean {\n return Boolean(v) && typeof v[Symbol.asyncIterator] === 'function';\n}\n\n/**\n * Pass-through wrapper over a streaming-input prompt that records the first\n * user message's text into `ref` as the SDK consumes it. Never alters what the\n * SDK receives.\n */\nasync function* tapPromptStream(prompt: any, ref: { text: string }): AsyncGenerator<any> {\n // userMessageText is fully defensive (returns '' for any non-text shape), so\n // no try/catch is needed — the message is always yielded through untouched.\n for await (const message of prompt) {\n if (!ref.text) {\n const text = userMessageText(message);\n if (text) ref.text = text;\n }\n yield message;\n }\n}\n\ninterface ToolCallAccum {\n id: string;\n name: string;\n input: unknown;\n}\n\ninterface AssistantTurnBuffer {\n textParts: string[];\n thinkingParts: string[];\n toolCalls: ToolCallAccum[];\n usage: any;\n model?: string;\n stopReason?: string;\n}\n\n/**\n * One agent's tracing scope. There is always a root scope (the orchestrator,\n * keyed ROOT_SCOPE). Each subagent — identified by the `parent_tool_use_id` of\n * the Task tool call that spawned it — gets its own scope created lazily, with\n * its AGENT span nested under that Task TOOL span. Per-scope state keeps each\n * agent's conversation/turn buffer independent.\n */\ninterface AgentScope {\n /** The AGENT span for this scope (root = orchestrator; others = subagents). */\n span: Span;\n /** OTel context whose active span is this scope's AGENT span (children nest here). */\n ctx: Context;\n /** Running conversation (user/tool/assistant turns) — each LLM span's input. */\n inputMessages: Array<{ role: string; content: string }>;\n /** In-progress model turn, coalesced from multiple `assistant` messages. */\n assistantBuffer: AssistantTurnBuffer | null;\n /** Last assistant text seen (subagent output = its final text). */\n finalText: string;\n /** Whether input.value has been set on this scope's AGENT span. */\n inputCaptured: boolean;\n}\n\ninterface QueryState {\n /** TOOL spans keyed by tool_use_id, closed by the matching tool_result. */\n toolSpans: Map<string, Span>;\n /** Agent scopes keyed by parent_tool_use_id (ROOT_SCOPE for the orchestrator). */\n scopes: Map<string, AgentScope>;\n sessionId?: string;\n model?: string;\n finished: boolean;\n /** Lazily-filled prompt text from a streaming-input tap. */\n promptRef: { text: string };\n}\n\n/**\n * Wrap the Query object so iteration is instrumented while preserving its own\n * methods (interrupt, setPermissionMode, …). The SDK returns an async-iterable\n * object, not a bare generator.\n */\nfunction instrumentQueryIterable(\n queryObj: any,\n agentSpan: Span,\n agentCtx: Context,\n tracer: ReturnType<typeof trace.getTracer>,\n promptRef: { text: string },\n): any {\n const originalAsyncIterator = queryObj?.[Symbol.asyncIterator]?.bind(queryObj);\n if (!originalAsyncIterator) {\n // Not iterable — nothing to trace; close the root span immediately.\n agentSpan.setStatus({ code: SpanStatusCode.OK });\n agentSpan.end();\n return queryObj;\n }\n\n // The root scope is the orchestrator agent. Seed its conversation with the\n // prompt (known up front for string prompts; filled by the tap otherwise).\n const rootScope: AgentScope = {\n span: agentSpan,\n ctx: agentCtx,\n inputMessages: promptRef.text ? [{ role: 'user', content: promptRef.text }] : [],\n assistantBuffer: null,\n finalText: '',\n inputCaptured: Boolean(promptRef.text),\n };\n const state: QueryState = {\n toolSpans: new Map(),\n scopes: new Map([[ROOT_SCOPE, rootScope]]),\n finished: false,\n promptRef,\n };\n\n const finalizeAgent = (status: 'ok' | 'error', err?: unknown) => {\n if (state.finished) return;\n state.finished = true;\n // Flush every scope's in-progress turn, then close subagent AGENT spans\n // (deepest-first) and finally the root.\n for (const scope of state.scopes.values()) flushAssistantTurn(tracer, scope, state);\n // Close any tool spans that never got a matching result.\n for (const ts of state.toolSpans.values()) {\n try {\n ts.end();\n } catch {\n /* ignore */\n }\n }\n state.toolSpans.clear();\n // Close subagent scopes first (any still open), then the root.\n for (const [key, scope] of state.scopes) {\n if (key === ROOT_SCOPE) continue;\n closeScope(scope, 'ok');\n }\n if (rootScope.finalText) agentSpan.setAttribute('output.value', rootScope.finalText);\n if (status === 'error') {\n recordError(agentSpan, err);\n } else {\n agentSpan.setStatus({ code: SpanStatusCode.OK });\n agentSpan.end();\n }\n };\n\n const wrapped = Object.create(Object.getPrototypeOf(queryObj));\n Object.assign(wrapped, queryObj);\n\n wrapped[Symbol.asyncIterator] = function () {\n const iterator = originalAsyncIterator();\n return {\n async next(): Promise<IteratorResult<any>> {\n try {\n const result = await withNeatlogsSpan(agentSpan, () => iterator.next());\n if (result.done) {\n finalizeAgent('ok');\n return result;\n }\n try {\n handleMessage(tracer, state, result.value, finalizeAgent);\n } catch {\n /* never let tracing break the run */\n }\n return result;\n } catch (err) {\n finalizeAgent('error', err);\n throw err;\n }\n },\n async return(value?: any): Promise<IteratorResult<any>> {\n finalizeAgent('ok');\n return iterator.return?.(value) ?? { done: true, value: undefined };\n },\n async throw(err?: any): Promise<IteratorResult<any>> {\n finalizeAgent('error', err);\n if (iterator.throw) return iterator.throw(err);\n throw err;\n },\n };\n };\n\n return wrapped;\n}\n\n/** End a subagent scope's AGENT span, setting its output to the subagent's final text. */\nfunction closeScope(scope: AgentScope, status: 'ok' | 'error'): void {\n try {\n if (scope.finalText) scope.span.setAttribute('output.value', scope.finalText);\n scope.span.setStatus({ code: status === 'ok' ? SpanStatusCode.OK : SpanStatusCode.ERROR });\n scope.span.end();\n } catch {\n /* ignore */\n }\n}\n\n// ---------------------------------------------------------------------------\n// Message handling\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the agent scope for a message. `parent_tool_use_id` is null for the\n * orchestrator (root scope) and the spawning Task tool_use_id for a subagent.\n * Subagent scopes are created lazily, with their AGENT span nested under the\n * Task TOOL span (looked up by that id) so the hierarchy is\n * orchestrator → Task TOOL → subagent AGENT.\n */\nfunction getScope(\n tracer: ReturnType<typeof trace.getTracer>,\n state: QueryState,\n msg: any,\n): AgentScope {\n const parentId = msg?.parent_tool_use_id ?? null;\n if (!parentId) return state.scopes.get(ROOT_SCOPE)!;\n\n const existing = state.scopes.get(parentId);\n if (existing) return existing;\n\n // New subagent. Its spawning Task tool_use may still be buffered in the root\n // turn (the SDK emits subagent messages before the Task's tool_result closes\n // the parent turn). Flush the root turn first so the Task TOOL span exists and\n // this subagent AGENT can nest under it.\n const root = state.scopes.get(ROOT_SCOPE)!;\n if (!state.toolSpans.has(parentId) && root.assistantBuffer) {\n flushAssistantTurn(tracer, root, state);\n }\n\n // Nest the subagent AGENT span under the spawning Task TOOL span if we have it;\n // otherwise under the root agent.\n const parentToolSpan = state.toolSpans.get(parentId);\n const parentCtx = parentToolSpan\n ? trace.setSpan(getNeatlogsBaseContext(), parentToolSpan)\n : state.scopes.get(ROOT_SCOPE)!.ctx;\n\n const subType = msg?.subagent_type ? String(msg.subagent_type) : 'subagent';\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'AGENT',\n 'neatlogs.agent.name': subType,\n };\n if (msg?.task_description) attrs['input.value'] = String(msg.task_description);\n const span = tracer.startSpan(`claude_agent.subagent.${subType}`, { attributes: attrs }, parentCtx);\n\n const scope: AgentScope = {\n span,\n ctx: trace.setSpan(getNeatlogsBaseContext(), span),\n inputMessages: msg?.task_description ? [{ role: 'user', content: String(msg.task_description) }] : [],\n assistantBuffer: null,\n finalText: '',\n inputCaptured: Boolean(msg?.task_description),\n };\n state.scopes.set(parentId, scope);\n return scope;\n}\n\nfunction handleMessage(\n tracer: ReturnType<typeof trace.getTracer>,\n state: QueryState,\n msg: any,\n finalizeAgent: (status: 'ok' | 'error', err?: unknown) => void,\n): void {\n if (!msg || typeof msg !== 'object') return;\n\n const rootScope = state.scopes.get(ROOT_SCOPE)!;\n\n // Backfill root input from the tapped streaming-input prompt as soon as it's\n // available (it fills before the first assistant turn).\n if (!rootScope.inputCaptured && state.promptRef.text) {\n rootScope.inputCaptured = true;\n rootScope.span.setAttribute('input.value', state.promptRef.text);\n }\n\n switch (msg.type) {\n case 'system': {\n // init message — carries session_id, model, available tools.\n if (msg.session_id) {\n state.sessionId = msg.session_id;\n rootScope.span.setAttribute('neatlogs.conversation.id', String(msg.session_id));\n }\n if (msg.model) {\n state.model = msg.model;\n rootScope.span.setAttribute('neatlogs.agent.model', String(msg.model));\n }\n break;\n }\n\n case 'user': {\n // A `user` message (prompt, or tool_result turns) is a turn boundary for\n // its scope: flush the buffered turn as ONE LLM span first.\n const scope = getScope(tracer, state, msg);\n flushAssistantTurn(tracer, scope, state);\n\n const userText = userMessageText(msg);\n if (userText) {\n if (!scope.inputCaptured) {\n scope.inputCaptured = true;\n scope.span.setAttribute('input.value', userText);\n }\n scope.inputMessages.push({ role: 'user', content: userText });\n }\n closeToolSpansFromUser(state, scope, msg);\n break;\n }\n\n case 'assistant': {\n // Don't emit yet — the SDK delivers one model turn as multiple `assistant`\n // messages (text block, then tool_use block, …). Buffer them per scope;\n // the next user/result boundary flushes the turn as a single LLM span.\n const scope = getScope(tracer, state, msg);\n bufferAssistantMessage(scope, msg);\n break;\n }\n\n case 'result': {\n // The run is complete. Flush the root turn (a final text answer may have no\n // trailing user message), then finalize.\n flushAssistantTurn(tracer, rootScope, state);\n\n const text = typeof msg.result === 'string' ? msg.result : '';\n if (text) rootScope.finalText = text;\n if (msg.session_id && !state.sessionId) {\n rootScope.span.setAttribute('neatlogs.conversation.id', String(msg.session_id));\n }\n const usage = msg.usage;\n if (usage) setUsage(rootScope.span, usage);\n if (msg.total_cost_usd != null) rootScope.span.setAttribute('neatlogs.agent.cost_usd', msg.total_cost_usd);\n if (msg.num_turns != null) rootScope.span.setAttribute('neatlogs.agent.num_turns', msg.num_turns);\n if (msg.is_error) rootScope.span.setAttribute('neatlogs.agent.is_error', true);\n\n finalizeAgent(msg.is_error ? 'error' : 'ok', msg.is_error ? new Error(String(text || 'agent run failed')) : undefined);\n break;\n }\n\n default:\n break;\n }\n}\n\n/**\n * Append one `assistant` SDK message to the in-progress turn buffer. The SDK\n * splits a single model turn into multiple assistant messages (a text block,\n * then tool_use blocks); they share token usage. We merge their text, thinking,\n * and tool_use blocks so the turn becomes ONE LLM span on flush.\n */\nfunction bufferAssistantMessage(scope: AgentScope, msg: any): void {\n const message = msg.message ?? msg;\n const content = message?.content ?? [];\n\n if (!scope.assistantBuffer) {\n scope.assistantBuffer = { textParts: [], thinkingParts: [], toolCalls: [], usage: undefined };\n }\n const buf = scope.assistantBuffer;\n if (message?.model) buf.model = message.model;\n if (message?.stop_reason) buf.stopReason = message.stop_reason;\n // Usage is reported per assistant message but is the SAME turn total — keep\n // the largest/last non-empty one rather than summing (summing double-counts).\n if (message?.usage) buf.usage = message.usage;\n\n for (const block of Array.isArray(content) ? content : []) {\n if (!block || typeof block !== 'object') continue;\n if (block.type === 'text' && typeof block.text === 'string') buf.textParts.push(block.text);\n else if (block.type === 'thinking' && typeof block.thinking === 'string') buf.thinkingParts.push(block.thinking);\n else if (block.type === 'tool_use') {\n buf.toolCalls.push({ id: block.id ?? '', name: block.name ?? '', input: block.input });\n }\n }\n}\n\n/**\n * Emit the buffered model turn as a SINGLE LLM span, then open TOOL spans for\n * its tool calls. No-op if no turn is buffered. This is what makes one LLM span\n * per real model turn (not per SDK assistant message).\n */\nfunction flushAssistantTurn(\n tracer: ReturnType<typeof trace.getTracer>,\n scope: AgentScope,\n state: QueryState,\n): void {\n const buf = scope.assistantBuffer;\n if (!buf) return;\n scope.assistantBuffer = null;\n\n const model = buf.model ?? state.model ?? '';\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': 'anthropic',\n 'neatlogs.llm.system': 'anthropic',\n };\n if (model) attrs['neatlogs.llm.model_name'] = String(model);\n\n // If this is the root scope's first turn and no user message was recorded yet\n // (streaming-input mode), seed input from the tapped prompt text.\n if (scope.inputMessages.length === 0 && state.promptRef.text) {\n scope.inputMessages.push({ role: 'user', content: state.promptRef.text });\n }\n\n // Input = the exact accumulated conversation up to this turn. Emitted BOTH as\n // structured indexed input_messages.* AND as the flat `input.value` blob —\n // per neatlogs/config/attribute-mapping.json, the main UI panel renders\n // `neatlogs.{span_kind}.input` (mapped from `input.value`); the indexed\n // messages alone do NOT populate it. Without input.value the LLM Input is blank.\n scope.inputMessages.forEach((m, i) => {\n attrs[`neatlogs.llm.input_messages.${i}.role`] = m.role;\n attrs[`neatlogs.llm.input_messages.${i}.content`] = m.content;\n });\n if (scope.inputMessages.length) {\n attrs['input.value'] = safeStringify({ messages: scope.inputMessages });\n }\n\n // Output = the turn's actual assistant content. Prefer the model's text; for a\n // tool-only turn (no text) the output IS the tool call(s), so render them as\n // the exact `name(arguments)` the model emitted (not a vague summary). The\n // structured tool_calls.* below still carry the same data for programmatic use.\n // `output.value` is the flat blob the UI maps to `neatlogs.{span_kind}.output`.\n const outText = buf.textParts.join('');\n const outValue =\n outText ||\n buf.toolCalls.map((tc) => `${tc.name}(${safeStringify(tc.input ?? {})})`).join('\\n');\n if (outValue) {\n attrs['neatlogs.llm.output_messages.0.role'] = 'assistant';\n attrs['neatlogs.llm.output_messages.0.content'] = outValue;\n attrs['output.value'] = outValue;\n }\n if (buf.thinkingParts.length) {\n attrs['neatlogs.llm.output_messages.0.thinking'] = buf.thinkingParts.join('');\n }\n buf.toolCalls.forEach((tc, j) => {\n attrs[`neatlogs.llm.tool_calls.${j}.id`] = tc.id;\n attrs[`neatlogs.llm.tool_calls.${j}.name`] = tc.name;\n attrs[`neatlogs.llm.tool_calls.${j}.arguments`] = safeStringify(tc.input ?? {});\n });\n if (buf.stopReason) attrs['neatlogs.llm.finish_reason'] = String(buf.stopReason);\n\n // The LLM span nests under THIS scope's AGENT span.\n const span = tracer.startSpan(`claude_agent.llm.${model || 'model'}`, { attributes: attrs }, scope.ctx);\n if (buf.usage) setUsage(span, buf.usage);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n\n // Track this scope's latest text as its output (the subagent/orchestrator\n // final answer is the last assistant text).\n if (outText) scope.finalText = outText;\n\n // Record this assistant turn so the NEXT turn's LLM span sees it as context.\n const turnParts: string[] = [];\n if (outText) turnParts.push(outText);\n for (const tc of buf.toolCalls) turnParts.push(`[tool_call ${tc.name} ${safeStringify(tc.input ?? {})}]`);\n if (turnParts.length) scope.inputMessages.push({ role: 'assistant', content: turnParts.join('\\n') });\n\n // Open TOOL spans for this turn's tool calls, nested under THIS scope's AGENT\n // span (closed by their tool_result). A Task tool's id becomes the key a\n // subagent's messages resolve to (see getScope).\n for (const tc of buf.toolCalls) {\n const toolSpan = tracer.startSpan(\n `claude_agent.tool.${tc.name || 'tool'}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': String(tc.name ?? ''),\n ...(tc.id ? { 'neatlogs.tool_call.id': String(tc.id) } : {}),\n 'input.value': safeStringify(tc.input ?? {}),\n },\n },\n scope.ctx,\n );\n if (tc.id) state.toolSpans.set(tc.id, toolSpan);\n }\n}\n\nfunction closeToolSpansFromUser(state: QueryState, scope: AgentScope, msg: any): void {\n const content = (msg.message ?? msg)?.content ?? [];\n for (const block of Array.isArray(content) ? content : []) {\n if (block?.type !== 'tool_result') continue;\n const id = block.tool_use_id ?? '';\n const out = block.content;\n const outText = (typeof out === 'string' ? out : safeStringify(out));\n // Feed the tool result into THIS scope's conversation so the next LLM span's\n // input reflects what the model actually saw.\n if (outText) scope.inputMessages.push({ role: 'tool', content: outText });\n const span = state.toolSpans.get(id);\n if (!span) continue;\n span.setAttribute('output.value', outText);\n if (block.is_error) {\n span.setStatus({ code: SpanStatusCode.ERROR });\n span.setAttribute('neatlogs.tool.is_error', true);\n } else {\n span.setStatus({ code: SpanStatusCode.OK });\n }\n span.end();\n state.toolSpans.delete(id);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Extract the human/text content of a `user` SDK message — the prompt, not\n * tool_result blocks (those are handled separately as tool outputs).\n */\nfunction userMessageText(msg: any): string {\n const content = (msg.message ?? msg)?.content;\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === 'string') parts.push(block);\n else if (block && typeof block === 'object' && block.type === 'text' && typeof block.text === 'string') {\n parts.push(block.text);\n }\n }\n return parts.join('\\n');\n}\n\nfunction setUsage(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.input_tokens != null && usage.output_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.total', usage.input_tokens + usage.output_tokens);\n }\n if (usage.cache_read_input_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.cache_read', usage.cache_read_input_tokens);\n }\n if (usage.cache_creation_input_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.cache_write', usage.cache_creation_input_tokens);\n }\n}\n\nfunction extractPromptText(prompt: any): string {\n if (typeof prompt === 'string') return prompt;\n // Streaming-input mode passes an async iterable of messages; we can't read it\n // synchronously without consuming it, so leave input.value unset in that case.\n return '';\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 span.end();\n}\n","/**\n * Neatlogs OpenRouter Agent integration.\n *\n * Wraps the `@openrouter/agent` SDK so each `client.callModel(...)` is traced.\n * The OpenRouter client returns a `ModelResult`; telemetry is finalized when the\n * result is consumed (via `getText()` / awaiting it / iterating it), matching the\n * SDK's lazy-evaluation model — a result that is never consumed ships no span.\n *\n * Usage:\n * import { init } from 'neatlogs';\n * import { wrapOpenRouterAgent } from 'neatlogs/openrouter-agent';\n * import { OpenRouter } from '@openrouter/agent';\n *\n * await init({ apiKey, workflowName });\n * const openrouter = wrapOpenRouterAgent(new OpenRouter({ apiKey: process.env.OPENROUTER_API_KEY }));\n * const result = openrouter.callModel({ model: 'openai/gpt-4o', messages: [...] });\n * const text = await result.getText();\n *\n * Also exports wrapCallModel() for the standalone callModel helper:\n * const trackedCallModel = wrapCallModel(callModel);\n * const result = trackedCallModel(openrouter, { model, messages });\n */\n\nimport { SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { getProviderTracer } from './core/auto-root.js';\nimport {\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from './core/provider.js';\n\nconst TRACER_NAME = 'neatlogs.openrouter_agent';\nconst PROVIDER = 'openrouter';\n\n/**\n * Wrap an OpenRouter client instance so `callModel` emits LLM spans. Returns a\n * Proxy over the client; all other methods pass through unchanged.\n */\nexport function wrapOpenRouterAgent<T extends object>(client: T): T {\n const c = client as any;\n if (!c || c._neatlogsWrapped) return client;\n\n return new Proxy(client, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver);\n if (prop === 'callModel' && typeof value === 'function') {\n return tracedCallModel(value.bind(obj));\n }\n return value;\n },\n }) as T;\n}\n\n/**\n * Wrap the standalone `callModel(client, opts)` helper. The wrapped function is\n * invoked with the client passed in: `trackedCallModel(openrouter, {...})`.\n */\nexport function wrapCallModel<F extends (...args: any[]) => any>(callModel: F): F {\n return function (this: any, clientArg: any, opts: any, ...rest: any[]): any {\n const span = startLlmSpan(opts);\n const result = withNeatlogsSpan(span, () => callModel.call(this, clientArg, opts, ...rest));\n return instrumentModelResult(result, span);\n } as unknown as F;\n}\n\n// ---------------------------------------------------------------------------\n// callModel wrapping\n// ---------------------------------------------------------------------------\n\nfunction tracedCallModel(original: (...args: any[]) => any) {\n return function (opts: any, ...rest: any[]): any {\n const span = startLlmSpan(opts);\n const result = withNeatlogsSpan(span, () => original(opts, ...rest));\n return instrumentModelResult(result, span);\n };\n}\n\nfunction startLlmSpan(opts: any): Span {\n const tracer = getProviderTracer(TRACER_NAME);\n const model = opts?.model ?? '';\n\n const span = tracer.startSpan('openrouter.call_model', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.system': PROVIDER,\n 'neatlogs.llm.model_name': model,\n },\n }, getNeatlogsParentContext());\n\n // The @openrouter/agent callModel input is `input` — either a string prompt or\n // a messages array (it also accepts `messages`/`instructions` in some shapes).\n // Capture whichever is present as indexed input messages + the flat input.value\n // blob (the canonical UI-rendered field, per attribute-mapping.json).\n const messages: any[] = Array.isArray(opts?.messages)\n ? opts.messages\n : Array.isArray(opts?.input)\n ? opts.input\n : [];\n if (messages.length) {\n messages.forEach((msg, i) => {\n span.setAttribute(`neatlogs.llm.input_messages.${i}.role`, msg?.role ?? 'user');\n const content = msg?.content;\n span.setAttribute(\n `neatlogs.llm.input_messages.${i}.content`,\n typeof content === 'string' ? content : safeStringify(content),\n );\n });\n span.setAttribute('input.value', safeStringify({ messages }));\n } else if (typeof opts?.input === 'string') {\n span.setAttribute('neatlogs.llm.input_messages.0.role', 'user');\n span.setAttribute('neatlogs.llm.input_messages.0.content', opts.input);\n span.setAttribute('input.value', opts.input);\n }\n if (typeof opts?.instructions === 'string' && opts.instructions) {\n span.setAttribute('neatlogs.llm.system_prompt', opts.instructions);\n }\n\n if (Array.isArray(opts?.tools)) {\n for (let i = 0; i < opts.tools.length; i++) {\n const t = opts.tools[i] ?? {};\n const name = t.name ?? t.function?.name;\n if (name) span.setAttribute(`neatlogs.llm.tools.${i}.name`, name);\n const desc = t.description ?? t.function?.description;\n if (desc) span.setAttribute(`neatlogs.llm.tools.${i}.description`, desc);\n }\n }\n\n // @openrouter/agent's callModel request uses camelCase sampling params\n // (topP, maxOutputTokens, frequencyPenalty, presencePenalty, topK) derived\n // from the OpenResponses ResponsesRequest. Accept both camelCase and the\n // snake_case OpenAI-style variants so params are captured regardless of how\n // the caller spelled them.\n const temperature = opts?.temperature;\n const topP = opts?.top_p ?? opts?.topP;\n const maxTokens = opts?.max_tokens ?? opts?.maxTokens ?? opts?.max_output_tokens ?? opts?.maxOutputTokens;\n const frequencyPenalty = opts?.frequency_penalty ?? opts?.frequencyPenalty;\n const presencePenalty = opts?.presence_penalty ?? opts?.presencePenalty;\n const topK = opts?.top_k ?? opts?.topK;\n\n if (temperature != null) span.setAttribute('neatlogs.llm.temperature', temperature);\n if (topP != null) span.setAttribute('neatlogs.llm.top_p', topP);\n if (maxTokens != null) span.setAttribute('neatlogs.llm.max_tokens', maxTokens);\n\n // The backend reads invocation params ONLY from this JSON-string blob (parsed\n // into metadata.model_settings, which the UI renders). Individual attrs above\n // are kept for other consumers but are NOT what the UI shows. Only include\n // keys that are actually present so we never emit nulls.\n const params: Record<string, unknown> = {};\n if (temperature != null) params.temperature = temperature;\n if (topP != null) params.top_p = topP;\n if (maxTokens != null) params.max_tokens = maxTokens;\n if (frequencyPenalty != null) params.frequency_penalty = frequencyPenalty;\n if (presencePenalty != null) params.presence_penalty = presencePenalty;\n if (topK != null) params.top_k = topK;\n if (Object.keys(params).length) {\n span.setAttribute('neatlogs.llm.invocation_parameters', JSON.stringify(params));\n }\n\n return span;\n}\n\n/**\n * Wrap a ModelResult so the span is finalized exactly once, when the caller\n * consumes the result. We patch the common consumption methods (getText,\n * getMessage, then) so finalization happens on first use; a result that is\n * never consumed never finalizes (matching SDK semantics).\n */\nfunction instrumentModelResult(result: any, span: Span): any {\n if (!result || (typeof result !== 'object' && typeof result !== 'function')) {\n // Synchronous/primitive return — nothing to defer; close immediately.\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n }\n\n let finalized = false;\n const finalizeFromResult = (resolved: any) => {\n if (finalized) return;\n finalized = true;\n try {\n finalizeLlm(span, resolved);\n } catch {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n }\n };\n const finalizeError = (err: unknown) => {\n if (finalized) return;\n finalized = true;\n recordError(span, err);\n };\n\n // The @openrouter/agent ModelResult is consumed via getText()/getResponse()/\n // getTextStream(). Wrap with a Proxy to intercept whichever the caller uses\n // first; finalize the span from that, and grab usage via getResponse().\n return new Proxy(result, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver);\n\n if (prop === 'getResponse' && typeof value === 'function') {\n return function (...args: any[]) {\n return Promise.resolve(value.apply(obj, args)).then(\n (resp: any) => {\n finalizeFromResult(resp); // full OpenResponsesResult (text + usage)\n return resp;\n },\n (err: any) => {\n finalizeError(err);\n throw err;\n },\n );\n };\n }\n\n if (prop === 'getText' && typeof value === 'function') {\n return function (...args: any[]) {\n return Promise.resolve(value.apply(obj, args)).then(\n async (textStr: any) => {\n // getText() resolves to a bare string (no usage). Usage lives on\n // getResponse(); fetch it FIRST (the SDK supports concurrent\n // consumption) so the span carries tokens — then finalize ONCE.\n // Finalizing ends the span, so late attributes would be dropped.\n let resp: any;\n if (typeof obj?.getResponse === 'function') {\n try {\n resp = await obj.getResponse();\n } catch {\n resp = undefined;\n }\n }\n finalizeFromResult(resp ? { ...resp, text: textStr } : { text: textStr });\n return textStr;\n },\n (err: any) => {\n finalizeError(err);\n throw err;\n },\n );\n };\n }\n\n if (prop === 'then' && typeof value === 'function') {\n // Result is awaitable directly: await result.\n return function (onFulfilled?: any, onRejected?: any) {\n return value.call(\n obj,\n (resolved: any) => {\n finalizeFromResult(typeof resolved === 'string' ? { text: resolved } : (resolved ?? obj));\n return onFulfilled ? onFulfilled(resolved) : resolved;\n },\n (err: any) => {\n finalizeError(err);\n return onRejected ? onRejected(err) : Promise.reject(err);\n },\n );\n };\n }\n\n return value;\n },\n });\n}\n\n/** Stamp usage from an @openrouter/agent OpenResponsesResult (inputTokens/outputTokens/...). */\nfunction setOpenResponsesUsage(span: Span, resp: any): void {\n const u = resp?.usage ?? resp;\n if (!u) return;\n const input = u.inputTokens ?? u.input_tokens ?? u.prompt_tokens;\n const output = u.outputTokens ?? u.output_tokens ?? u.completion_tokens;\n const total = u.totalTokens ?? u.total_tokens;\n const cached = u.cachedTokens ?? u.cached_tokens;\n if (input != null) span.setAttribute('neatlogs.llm.token_count.prompt', input);\n if (output != null) span.setAttribute('neatlogs.llm.token_count.completion', output);\n if (total != null) span.setAttribute('neatlogs.llm.token_count.total', total);\n else if (input != null && output != null) span.setAttribute('neatlogs.llm.token_count.total', input + output);\n if (cached != null) span.setAttribute('neatlogs.llm.token_count.cache_read', cached);\n}\n\nfunction finalizeLlm(span: Span, result: any): void {\n // Text output. getText() gives a bare string (wrapped here as {text}); the\n // OpenResponsesResult from getResponse() carries text under output[]/output_text.\n const text =\n result?.text ??\n result?.output_text ??\n result?.content ??\n extractOpenResponsesText(result) ??\n result?.choices?.[0]?.message?.content ??\n result?.message?.content;\n if (text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', String(text));\n span.setAttribute('output.value', String(text));\n }\n\n // Tool calls (OpenAI-compatible shape; OpenResponses uses output[] function_call items).\n const toolCalls =\n result?.toolCalls ??\n result?.tool_calls ??\n result?.choices?.[0]?.message?.tool_calls ??\n result?.message?.tool_calls;\n if (Array.isArray(toolCalls)) {\n toolCalls.forEach((tc: any, j: number) => {\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.id`, tc?.id ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.name`, tc?.function?.name ?? tc?.name ?? '');\n const args = tc?.function?.arguments ?? tc?.arguments;\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.arguments`, typeof args === 'string' ? args : safeStringify(args ?? {}));\n });\n }\n\n const model = result?.model ?? result?.response?.model;\n if (model) span.setAttribute('neatlogs.llm.model_name', String(model));\n\n const responseId = result?.id ?? result?.response?.id;\n if (responseId) span.setAttribute('neatlogs.llm.response_id', String(responseId));\n\n const finishReason = result?.finishReason ?? result?.finish_reason ?? result?.choices?.[0]?.finish_reason;\n if (finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(finishReason));\n\n // Usage — OpenResponsesResult uses inputTokens/outputTokens; also handle the\n // OpenAI-compatible prompt_tokens/completion_tokens shape.\n setOpenResponsesUsage(span, result);\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\n/** Pull assistant text out of an OpenResponses-style result (output[] of message items). */\nfunction extractOpenResponsesText(result: any): string | undefined {\n const output = result?.output;\n if (!Array.isArray(output)) return undefined;\n const parts: string[] = [];\n for (const item of output) {\n if (item?.type === 'message' && Array.isArray(item.content)) {\n for (const c of item.content) {\n if ((c?.type === 'output_text' || c?.type === 'text') && typeof c.text === 'string') parts.push(c.text);\n }\n }\n }\n return parts.length ? parts.join('') : undefined;\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 span.end();\n}\n","/**\n * Direct OTLP trace shipper for the opencode plugin.\n *\n * opencode loads the plugin in-process but `opencode run` is short-lived — it\n * tears down the moment a session goes idle. The OpenTelemetry BatchSpanProcessor\n * (async, scheduled-delay export + a `beforeExit` shutdown) races that teardown,\n * dropping spans or leaving aborted half-sent requests. This shipper mirrors the\n * proven `neatlogs-claude-code` design instead: spans are queued, then `flush()`\n * does a single AWAITED `fetch(POST /v1/traces)` round-trip that completes before\n * the host process can exit. No batch processor, no exit-time race.\n *\n * Self-contained (inlined OTLP protobuf schema) so it adds no runtime file I/O.\n */\n\nimport protobuf from 'protobufjs';\nimport { __version__ } from './version.js';\n\nconst PACKAGE_NAME = 'neatlogs.opencode';\n\nexport interface OtlpKeyValue {\n key: string;\n value: {\n stringValue?: string;\n intValue?: string;\n doubleValue?: number;\n boolValue?: boolean;\n };\n}\n\nexport interface OtlpSpan {\n traceId: Uint8Array;\n spanId: Uint8Array;\n parentSpanId?: Uint8Array;\n name: string;\n /** OTLP SpanKind enum (0=unspecified, 1=internal, …). Neatlogs kind rides in attributes. */\n kind: number;\n startTimeUnixNano: string;\n endTimeUnixNano: string;\n attributes: OtlpKeyValue[];\n status?: { code: number; message?: string };\n}\n\n// Inlined OTLP proto definition — avoids .proto file I/O at runtime.\nconst OTLP_PROTO_JSON: protobuf.INamespace = {\n nested: {\n opentelemetry: {\n nested: {\n proto: {\n nested: {\n common: {\n nested: {\n v1: {\n nested: {\n AnyValue: {\n oneofs: {\n value: {\n oneof: [\n 'stringValue',\n 'boolValue',\n 'intValue',\n 'doubleValue',\n 'arrayValue',\n 'kvlistValue',\n 'bytesValue',\n ],\n },\n },\n fields: {\n stringValue: { type: 'string', id: 1 },\n boolValue: { type: 'bool', id: 2 },\n intValue: { type: 'int64', id: 3 },\n doubleValue: { type: 'double', id: 4 },\n arrayValue: { type: 'ArrayValue', id: 5 },\n kvlistValue: { type: 'KeyValueList', id: 6 },\n bytesValue: { type: 'bytes', id: 7 },\n },\n },\n ArrayValue: { fields: { values: { rule: 'repeated', type: 'AnyValue', id: 1 } } },\n KeyValueList: { fields: { values: { rule: 'repeated', type: 'KeyValue', id: 1 } } },\n KeyValue: {\n fields: { key: { type: 'string', id: 1 }, value: { type: 'AnyValue', id: 2 } },\n },\n InstrumentationScope: {\n fields: { name: { type: 'string', id: 1 }, version: { type: 'string', id: 2 } },\n },\n },\n },\n },\n },\n resource: {\n nested: {\n v1: {\n nested: {\n Resource: {\n fields: {\n attributes: {\n rule: 'repeated',\n type: 'opentelemetry.proto.common.v1.KeyValue',\n id: 1,\n },\n },\n },\n },\n },\n },\n },\n trace: {\n nested: {\n v1: {\n nested: {\n ResourceSpans: {\n fields: {\n resource: { type: 'opentelemetry.proto.resource.v1.Resource', id: 1 },\n scopeSpans: { rule: 'repeated', type: 'ScopeSpans', id: 2 },\n },\n },\n ScopeSpans: {\n fields: {\n scope: { type: 'opentelemetry.proto.common.v1.InstrumentationScope', id: 1 },\n spans: { rule: 'repeated', type: 'Span', id: 2 },\n },\n },\n Span: {\n fields: {\n traceId: { type: 'bytes', id: 1 },\n spanId: { type: 'bytes', id: 2 },\n traceState: { type: 'string', id: 3 },\n parentSpanId: { type: 'bytes', id: 4 },\n name: { type: 'string', id: 5 },\n kind: { type: 'SpanKind', id: 6 },\n startTimeUnixNano: { type: 'fixed64', id: 7 },\n endTimeUnixNano: { type: 'fixed64', id: 8 },\n attributes: {\n rule: 'repeated',\n type: 'opentelemetry.proto.common.v1.KeyValue',\n id: 9,\n },\n droppedAttributesCount: { type: 'uint32', id: 10 },\n status: { type: 'Status', id: 15 },\n },\n },\n Status: {\n fields: { message: { type: 'string', id: 2 }, code: { type: 'StatusCode', id: 3 } },\n },\n StatusCode: {\n values: { STATUS_CODE_UNSET: 0, STATUS_CODE_OK: 1, STATUS_CODE_ERROR: 2 },\n },\n SpanKind: {\n values: {\n SPAN_KIND_UNSPECIFIED: 0,\n SPAN_KIND_INTERNAL: 1,\n SPAN_KIND_SERVER: 2,\n SPAN_KIND_CLIENT: 3,\n SPAN_KIND_PRODUCER: 4,\n SPAN_KIND_CONSUMER: 5,\n },\n },\n },\n },\n },\n },\n collector: {\n nested: {\n trace: {\n nested: {\n v1: {\n nested: {\n ExportTraceServiceRequest: {\n fields: {\n resourceSpans: {\n rule: 'repeated',\n type: 'opentelemetry.proto.trace.v1.ResourceSpans',\n id: 1,\n },\n },\n },\n },\n },\n },\n },\n },\n },\n },\n },\n },\n },\n },\n};\n\nconst protoRoot = protobuf.Root.fromJSON(OTLP_PROTO_JSON);\nconst ExportTraceServiceRequest = protoRoot.lookupType(\n 'opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest',\n);\n\nexport const SpanStatusCode = { UNSET: 0, OK: 1, ERROR: 2 } as const;\n\n// ---------------------------------------------------------------------------\n// ID + time + attribute helpers\n// ---------------------------------------------------------------------------\n\nfunction randomBytes(length: number): Uint8Array {\n const out = new Uint8Array(length);\n const crypto = globalThis.crypto;\n if (crypto && typeof crypto.getRandomValues === 'function') {\n crypto.getRandomValues(out);\n return out;\n }\n for (let i = 0; i < out.length; i++) out[i] = Math.floor(Math.random() * 256);\n return out;\n}\n\nexport function generateTraceId(): Uint8Array {\n return randomBytes(16);\n}\n\nexport function generateSpanId(): Uint8Array {\n return randomBytes(8);\n}\n\nexport function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nexport function nowNanoString(): string {\n return (BigInt(Date.now()) * 1_000_000n).toString();\n}\n\nexport function msToNanoString(ms: number): string {\n return (BigInt(Math.floor(ms)) * 1_000_000n).toString();\n}\n\nexport function attrStr(key: string, value: string | undefined): OtlpKeyValue | undefined {\n if (value === undefined || value === null) return undefined;\n return { key, value: { stringValue: String(value) } };\n}\n\nexport function attrInt(key: string, value: number | undefined): OtlpKeyValue | undefined {\n if (value === undefined || value === null || !Number.isFinite(value)) return undefined;\n return { key, value: { intValue: String(Math.trunc(value)) } };\n}\n\nexport function attrDouble(key: string, value: number | undefined): OtlpKeyValue | undefined {\n if (value === undefined || value === null || !Number.isFinite(value)) return undefined;\n return { key, value: { doubleValue: value } };\n}\n\nexport interface TraceShipperOptions {\n apiKey: string;\n endpoint: string;\n debug?: boolean;\n maxRetries?: number;\n workflowName?: string;\n}\n\nexport class TraceShipper {\n private apiKey: string;\n private endpoint: string;\n private debug: boolean;\n private maxRetries: number;\n workflowName: string;\n private queue: OtlpSpan[] = [];\n private prefix = '[neatlogs/opencode]';\n\n constructor(opts: TraceShipperOptions) {\n this.apiKey = opts.apiKey;\n this.endpoint = opts.endpoint.endsWith('/') ? opts.endpoint.slice(0, -1) : opts.endpoint;\n this.debug = !!opts.debug;\n this.maxRetries = opts.maxRetries ?? 3;\n this.workflowName = opts.workflowName || '';\n }\n\n enqueue(span: OtlpSpan): void {\n this.queue.push(span);\n }\n\n get pending(): number {\n return this.queue.length;\n }\n\n /**\n * Ship all queued spans in a single awaited POST. Resolves only once the HTTP\n * response is received (or all retries are exhausted) — so a short-lived host\n * can safely exit immediately after awaiting this.\n */\n async flush(): Promise<void> {\n if (this.queue.length === 0) return;\n if (!this.apiKey) {\n this.queue = [];\n return;\n }\n\n const spans = this.queue.splice(0);\n const payload = this.buildProtobuf(spans);\n const url = `${this.endpoint}/v1/traces`;\n\n if (this.debug) console.log(`${this.prefix} Shipping ${spans.length} spans to ${url}`);\n\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\n try {\n const resp = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-protobuf',\n 'x-api-key': this.apiKey,\n },\n body: payload as any,\n });\n\n if (resp.ok) {\n if (this.debug) console.log(`${this.prefix} Shipped ${spans.length} spans`);\n return;\n }\n if (resp.status === 401) {\n console.warn(`${this.prefix} Invalid API key (401) — dropping ${spans.length} spans`);\n return;\n }\n if (resp.status < 500 && resp.status !== 429) {\n if (this.debug) console.warn(`${this.prefix} HTTP ${resp.status} — dropping spans`);\n return;\n }\n // 429 / 5xx → retry\n } catch (err) {\n if (this.debug) {\n console.warn(\n `${this.prefix} Attempt ${attempt}/${this.maxRetries}: ${(err as Error).message}`,\n );\n }\n }\n if (attempt < this.maxRetries) {\n await new Promise((r) => setTimeout(r, 500 * 2 ** (attempt - 1)));\n }\n }\n console.warn(`${this.prefix} Failed to ship ${spans.length} spans after ${this.maxRetries} attempts`);\n }\n\n private buildProtobuf(spans: OtlpSpan[]): Uint8Array {\n const protoSpans = spans.map((span) => ({\n traceId: span.traceId,\n spanId: span.spanId,\n parentSpanId: span.parentSpanId || undefined,\n name: span.name,\n kind: span.kind,\n startTimeUnixNano: nanoToLong(span.startTimeUnixNano),\n endTimeUnixNano: nanoToLong(span.endTimeUnixNano),\n attributes: span.attributes.map((a) => ({\n key: a.key,\n value:\n a.value.intValue !== undefined\n ? { intValue: nanoToLong(a.value.intValue) }\n : a.value,\n })),\n status: span.status ? { code: span.status.code, message: span.status.message } : undefined,\n }));\n\n const resourceAttributes: Array<{ key: string; value: { stringValue: string } }> = [\n { key: 'service.name', value: { stringValue: 'neatlogs.opencode' } },\n { key: 'service.version', value: { stringValue: __version__ } },\n ];\n if (this.workflowName) {\n resourceAttributes.push({\n key: 'neatlogs.workflow_name',\n value: { stringValue: this.workflowName },\n });\n }\n\n const message = {\n resourceSpans: [\n {\n resource: { attributes: resourceAttributes },\n scopeSpans: [\n {\n scope: { name: PACKAGE_NAME, version: __version__ },\n spans: protoSpans,\n },\n ],\n },\n ],\n };\n\n const errMsg = ExportTraceServiceRequest.verify(message);\n if (errMsg && this.debug) console.warn(`${this.prefix} Proto verify: ${errMsg}`);\n\n return ExportTraceServiceRequest.encode(ExportTraceServiceRequest.fromObject(message)).finish();\n }\n}\n\n/** protobufjs encodes fixed64/int64 from a {low,high,unsigned} Long-like. */\nfunction nanoToLong(nanoStr: string): { low: number; high: number; unsigned: boolean } {\n const big = BigInt(nanoStr);\n const low = Number(big & 0xffffffffn);\n const high = Number((big >> 32n) & 0xffffffffn);\n return { low, high, unsigned: true };\n}\n","/**\n * Neatlogs opencode plugin.\n *\n * opencode loads plugins from its config (`opencode.json` → `\"plugin\": [...]`)\n * or from local `.opencode/plugin/*.ts` files. A plugin is an async factory that\n * receives an app context and returns lifecycle hooks. This plugin instruments\n * opencode automatically — no per-call wiring — turning each opencode TURN into\n * its own neatlogs trace (mirrors @neatlogs/claude-code):\n *\n * WORKFLOW opencode.turn (one TRACE per user turn; parents that turn's spans)\n * ↳ LLM assistant turn (per completed assistant message)\n * ↳ TOOL tool execution (tool.execute.before → tool.execute.after)\n *\n * A turn opens on `chat.message` and closes on `session.idle` (which fires after\n * the turn's full tool-loop settles) — NOT on each `message.completed`, so a\n * multi-round tool-using turn stays one trace. Every span carries\n * `neatlogs.conversation.id` = the opencode session ID and a per-turn trace id;\n * all of a session's turn-traces are grouped in the UI via `neatlogs.session.id`.\n *\n * Export model (mirrors @raindrop-ai/opencode-plugin and neatlogs-claude-code):\n * opencode loads the plugin in-process but `opencode run` is short-lived. Rather\n * than the OpenTelemetry BatchSpanProcessor (whose async, scheduled-delay export\n * + `beforeExit` shutdown races the teardown and drops spans), this plugin builds\n * spans directly and ships them via AWAITED `fetch(POST /v1/traces)` — and it\n * flushes after every completed assistant turn (incremental persistence) plus a\n * final flush on `session.idle`. A `neatlogs.trace.complete` marker is sent so\n * the backend enqueues the trace for finalization (simplification → UI).\n *\n * Setup — either:\n * • npm package, in opencode.json: `{ \"plugin\": [\"neatlogs/opencode\"] }`, OR\n * • local file `.opencode/plugin/neatlogs.ts`:\n * export { NeatlogsOpencodePlugin as default } from 'neatlogs/opencode';\n *\n * Env:\n * NEATLOGS_API_KEY required to export\n * NEATLOGS_ENDPOINT backend base URL (default https://ingest.neatlogs.com)\n * NEATLOGS_WORKFLOW_NAME logical grouping (default: \"opencode\")\n * NEATLOGS_CAPTURE_SYSTEM_PROMPT=true capture system prompt text (default off)\n */\n\nimport {\n TraceShipper,\n type OtlpSpan,\n type OtlpKeyValue,\n SpanStatusCode,\n generateTraceId,\n generateSpanId,\n nowNanoString,\n msToNanoString,\n attrStr,\n attrInt,\n attrDouble,\n} from './opencode-trace-shipper.js';\n\nconst DEFAULT_ENDPOINT = 'https://ingest.neatlogs.com';\n\n/** A span being built incrementally — ended (and shipped) later. */\ninterface OpenSpan {\n spanId: Uint8Array;\n parentSpanId?: Uint8Array;\n name: string;\n startNano: string;\n attributes: OtlpKeyValue[];\n}\n\ninterface SessionState {\n /** Per-TURN trace id — minted when the turn's root opens, so each turn is its\n * own trace. Undefined between turns. */\n traceId?: Uint8Array;\n /** The current turn's WORKFLOW root span (created on chat.message, ended on idle). */\n rootSpan?: OpenSpan;\n /** Open TOOL spans keyed by callID → start time. */\n toolStarts: Map<string, { spanId: Uint8Array; startNano: string; tool: string; args: any }>;\n /** Accumulated assistant text per messageID (from text parts). */\n outputParts: Map<string, string>;\n /** Tool calls per assistant messageID (so a tool-only turn still has output). */\n toolCalls: Map<string, Array<{ name: string; input: any; callID: string }>>;\n /** assistant messageIDs already emitted (completion can fire repeatedly). */\n processed: Set<string>;\n /** Current user prompt (this turn's input). */\n currentInput: string;\n /** Captured system prompt (if enabled). */\n systemPrompt?: string;\n /** Latest assistant text — the AGENT root's output on close. */\n lastAssistantText: string;\n}\n\nexport const NeatlogsOpencodePlugin = async (_ctx: any): Promise<Record<string, any>> => {\n const apiKey = (process.env.NEATLOGS_API_KEY ?? '').trim();\n const endpoint = (process.env.NEATLOGS_ENDPOINT ?? DEFAULT_ENDPOINT).trim();\n const workflowName = process.env.NEATLOGS_WORKFLOW_NAME || 'opencode';\n const captureSystemPrompt =\n String(process.env.NEATLOGS_CAPTURE_SYSTEM_PROMPT || '').toLowerCase() === 'true';\n const debug = String(process.env.NEATLOGS_DEBUG || '').toLowerCase() === 'true';\n\n const shipper = new TraceShipper({ apiKey, endpoint, workflowName, debug });\n const sessions = new Map<string, SessionState>();\n\n function stateFor(sessionID: string): SessionState {\n let s = sessions.get(sessionID);\n if (!s) {\n s = {\n toolStarts: new Map(),\n outputParts: new Map(),\n toolCalls: new Map(),\n processed: new Set(),\n currentInput: '',\n lastAssistantText: '',\n };\n sessions.set(sessionID, s);\n }\n return s;\n }\n\n /** Start the per-turn WORKFLOW root span, minting a fresh trace id for this\n * turn (idempotent within a turn). `neatlogs.session.id` groups the session's\n * turn-traces in the UI. */\n function startRoot(st: SessionState, sessionID: string): void {\n if (st.rootSpan) return;\n st.traceId = generateTraceId();\n st.rootSpan = {\n spanId: generateSpanId(),\n name: 'opencode.turn',\n startNano: nowNanoString(),\n attributes: [\n { key: 'neatlogs.span.kind', value: { stringValue: 'WORKFLOW' } },\n { key: 'neatlogs.agent.framework', value: { stringValue: 'opencode' } },\n { key: 'neatlogs.conversation.id', value: { stringValue: sessionID } },\n { key: 'neatlogs.session.id', value: { stringValue: sessionID } },\n ],\n };\n }\n\n /** End + enqueue the WORKFLOW turn root, send the completion marker, and flush.\n * Clears the turn's trace id + accumulators so the next turn is a fresh trace. */\n async function closeAndFlush(st: SessionState, sessionID: string): Promise<void> {\n if (st.rootSpan && st.traceId) {\n const attrs = st.rootSpan.attributes.slice();\n setIO(attrs, 'WORKFLOW', st.currentInput || undefined, st.lastAssistantText || undefined);\n shipper.enqueue({\n traceId: st.traceId,\n spanId: st.rootSpan.spanId,\n name: st.rootSpan.name,\n kind: 1,\n startTimeUnixNano: st.rootSpan.startNano,\n endTimeUnixNano: nowNanoString(),\n attributes: attrs,\n status: { code: SpanStatusCode.OK },\n });\n // Completion marker — the backend only finalizes (simplifies → UI) a trace\n // once it sees a `neatlogs.trace.complete` span. Parented to the root.\n const m = nowNanoString();\n shipper.enqueue({\n traceId: st.traceId,\n spanId: generateSpanId(),\n parentSpanId: st.rootSpan.spanId,\n name: 'neatlogs.trace.complete',\n kind: 1,\n startTimeUnixNano: m,\n endTimeUnixNano: m,\n attributes: [\n { key: 'neatlogs.trace.complete', value: { boolValue: true } },\n { key: 'neatlogs.internal', value: { boolValue: true } },\n { key: 'neatlogs.span.kind', value: { stringValue: 'Neatlogs.INTERNAL' } },\n ],\n });\n }\n // Reset per-turn state so the next chat.message opens a brand-new trace.\n st.rootSpan = undefined;\n st.traceId = undefined;\n st.currentInput = '';\n st.lastAssistantText = '';\n st.processed.clear();\n st.outputParts.clear();\n st.toolCalls.clear();\n await shipper.flush();\n void sessionID;\n }\n\n return {\n /** Fired when the user submits a prompt — open the turn's AGENT root. */\n 'chat.message': async (_input: any, output: any) => {\n try {\n const sessionID = String(_input?.sessionID ?? output?.sessionID ?? '');\n if (!sessionID) return;\n const st = stateFor(sessionID);\n const parts = output?.parts ?? [];\n const text = Array.isArray(parts)\n ? parts\n .filter((p: any) => p?.type === 'text' && typeof p.text === 'string')\n .map((p: any) => p.text)\n .join('\\n')\n : '';\n if (text) st.currentInput = text;\n startRoot(st, sessionID);\n } catch {\n /* ignore */\n }\n },\n\n /** Capture the system prompt (opt-in). */\n 'experimental.chat.system.transform': async (_input: any, output: any) => {\n try {\n if (!captureSystemPrompt) return;\n const sessionID = String(_input?.sessionID ?? '');\n const parts = output?.system ?? output?.parts ?? output;\n const joined = Array.isArray(parts) ? parts.map((p: any) => (typeof p === 'string' ? p : p?.text ?? '')).join('\\n') : String(parts ?? '');\n if (sessionID && joined) stateFor(sessionID).systemPrompt = joined;\n } catch {\n /* ignore */\n }\n },\n\n /** Global event bus — message parts, assistant completions, session idle. */\n event: async ({ event }: { event: any }) => {\n try {\n await handleEvent(shipper, sessions, stateFor, startRoot, closeAndFlush, event);\n } catch {\n // never break opencode over tracing\n }\n },\n\n /** Tool start — record start time + args (span built atomically in `after`). */\n 'tool.execute.before': async (input: any, output: any) => {\n try {\n const sessionID = String(input?.sessionID ?? '');\n if (!sessionID) return;\n const st = stateFor(sessionID);\n startRoot(st, sessionID);\n const callID = String(input?.callID ?? input?.tool ?? '');\n st.toolStarts.set(callID, {\n spanId: generateSpanId(),\n startNano: nowNanoString(),\n tool: String(input?.tool ?? 'tool'),\n args: output?.args,\n });\n } catch {\n /* ignore */\n }\n },\n\n /** Tool end — enqueue the completed TOOL span (parented to the turn root). */\n 'tool.execute.after': async (input: any, result: any) => {\n try {\n const sessionID = String(input?.sessionID ?? '');\n if (!sessionID) return;\n const st = stateFor(sessionID);\n const callID = String(input?.callID ?? input?.tool ?? '');\n const start = st.toolStarts.get(callID);\n if (!start) return;\n st.toolStarts.delete(callID);\n if (!st.traceId) return;\n\n const attrs: OtlpKeyValue[] = [\n { key: 'neatlogs.span.kind', value: { stringValue: 'TOOL' } },\n { key: 'neatlogs.tool.name', value: { stringValue: start.tool } },\n { key: 'neatlogs.conversation.id', value: { stringValue: sessionID } },\n ];\n if (start.args !== undefined) {\n // The shipper bypasses the SDK attribute-processor, so emit the\n // already-namespaced keys the backend consumer reads directly\n // (neatlogs.tool.input / .output and the generic neatlogs.input.value),\n // not the raw input.value/output.value the processor would map.\n setIO(attrs, 'TOOL', safeStringify(start.args), undefined);\n push(attrs, attrStr('neatlogs.tool.input', safeStringify(start.args)));\n }\n if (result?.title) push(attrs, attrStr('neatlogs.tool.title', String(result.title)));\n const out = result?.output ?? result?.result;\n if (out !== undefined) {\n const o = typeof out === 'string' ? out : safeStringify(out);\n setIO(attrs, 'TOOL', undefined, o);\n push(attrs, attrStr('neatlogs.tool.output', o));\n }\n if (result?.metadata !== undefined) {\n push(attrs, attrStr('neatlogs.tool.metadata', safeStringify(result.metadata)));\n }\n\n shipper.enqueue({\n traceId: st.traceId,\n spanId: start.spanId,\n parentSpanId: st.rootSpan?.spanId,\n name: `opencode.tool.${start.tool}`,\n kind: 1,\n startTimeUnixNano: start.startNano,\n endTimeUnixNano: nowNanoString(),\n attributes: attrs,\n status: { code: SpanStatusCode.OK },\n });\n } catch {\n /* ignore */\n }\n },\n };\n};\n\n// Convenience aliases so users can import under any common name.\nexport const neatlogsOpencodePlugin = NeatlogsOpencodePlugin;\nexport default NeatlogsOpencodePlugin;\n\n// ---------------------------------------------------------------------------\n// Event handling\n// ---------------------------------------------------------------------------\n\nfunction handleEvent(\n shipper: TraceShipper,\n sessions: Map<string, SessionState>,\n stateFor: (sessionID: string) => SessionState,\n startRoot: (st: SessionState, sessionID: string) => void,\n closeAndFlush: (st: SessionState, sessionID: string) => Promise<void>,\n event: any,\n): Promise<unknown> | undefined {\n const type = event?.type;\n const props = event?.properties ?? {};\n\n // Accumulate text + tool-call parts on an assistant message.\n if (type === 'message.part.updated' || type === 'message.part.completed') {\n const part = props.part ?? props;\n const messageID = part?.messageID ?? part?.message_id;\n const sessionID = part?.sessionID ?? props.sessionID;\n if (!messageID || !sessionID) return undefined;\n const st = stateFor(String(sessionID));\n if (part?.type === 'text' && typeof part?.text === 'string') {\n st.outputParts.set(String(messageID), part.text);\n } else if (part?.type === 'tool' && part?.tool) {\n const list = st.toolCalls.get(String(messageID)) ?? [];\n const callID = String(part.callID ?? part.tool);\n const input = part?.state?.input ?? {};\n const existing = list.find((t) => t.callID === callID);\n if (existing) existing.input = input;\n else list.push({ name: String(part.tool), input, callID });\n st.toolCalls.set(String(messageID), list);\n }\n return undefined;\n }\n\n // Assistant message completed → emit the LLM span, then flush this turn.\n if (type === 'message.updated' || type === 'message.completed') {\n const info = props.info ?? props.message ?? props;\n const sessionID = info?.sessionID ?? info?.session_id;\n if (!sessionID) return undefined;\n if (info?.role !== 'assistant') return undefined;\n const completed = info?.time?.completed ?? info?.completed;\n const id = String(info?.id ?? '');\n if (!completed || !id) return undefined;\n const st = stateFor(String(sessionID));\n if (st.processed.has(id)) return undefined;\n st.processed.add(id);\n startRoot(st, String(sessionID));\n emitLlmSpan(shipper, st, info, String(sessionID));\n // Incremental persistence: ship this turn's spans now (don't wait for idle).\n return shipper.flush().catch(() => undefined);\n }\n\n // Session finished → end root, send completion marker, final flush.\n if (type === 'session.idle' || type === 'session.deleted') {\n const sessionID = props.sessionID ?? props.info?.id;\n if (!sessionID) return undefined;\n const st = sessions.get(String(sessionID));\n if (!st) return undefined;\n st.toolStarts.clear();\n const p = closeAndFlush(st, String(sessionID));\n if (type === 'session.deleted') sessions.delete(String(sessionID));\n return p;\n }\n\n return undefined;\n}\n\nfunction emitLlmSpan(shipper: TraceShipper, st: SessionState, info: any, sessionID: string): void {\n if (!st.traceId) return;\n const model = info?.modelID ?? info?.model ?? '';\n const provider = info?.providerID ?? info?.provider ?? '';\n\n const attrs: OtlpKeyValue[] = [\n { key: 'neatlogs.span.kind', value: { stringValue: 'LLM' } },\n { key: 'neatlogs.conversation.id', value: { stringValue: sessionID } },\n ];\n push(attrs, attrStr('neatlogs.llm.model_name', model ? String(model) : undefined));\n push(attrs, attrStr('neatlogs.llm.provider', provider ? String(provider) : undefined));\n\n let inIdx = 0;\n if (st.systemPrompt) {\n push(attrs, attrStr(`neatlogs.llm.input_messages.${inIdx}.role`, 'system'));\n push(attrs, attrStr(`neatlogs.llm.input_messages.${inIdx}.content`, st.systemPrompt));\n inIdx++;\n }\n if (st.currentInput) {\n push(attrs, attrStr(`neatlogs.llm.input_messages.${inIdx}.role`, 'user'));\n push(attrs, attrStr(`neatlogs.llm.input_messages.${inIdx}.content`, st.currentInput));\n setIO(attrs, 'LLM', st.currentInput, undefined);\n }\n\n const outText = st.outputParts.get(String(info?.id)) || messageText(info) || '';\n const toolCalls = st.toolCalls.get(String(info?.id)) ?? [];\n\n if (outText) {\n push(attrs, attrStr('neatlogs.llm.output_messages.0.role', 'assistant'));\n push(attrs, attrStr('neatlogs.llm.output_messages.0.content', outText));\n setIO(attrs, 'LLM', undefined, outText);\n st.lastAssistantText = outText;\n }\n // Tool-deciding turns often carry no text — render the tool call(s) as output.\n if (toolCalls.length) {\n toolCalls.forEach((tc, j) => {\n push(attrs, attrStr(`neatlogs.llm.tool_calls.${j}.name`, tc.name));\n push(attrs, attrStr(`neatlogs.llm.tool_calls.${j}.arguments`, safeStringify(tc.input ?? {})));\n });\n if (!outText) {\n const rendered = toolCalls.map((tc) => `→ ${tc.name}(${safeStringify(tc.input ?? {})})`).join('\\n');\n push(attrs, attrStr('neatlogs.llm.output_messages.0.role', 'assistant'));\n push(attrs, attrStr('neatlogs.llm.output_messages.0.content', rendered));\n setIO(attrs, 'LLM', undefined, rendered);\n }\n }\n\n // Tokens: opencode message tokens { input, output, reasoning, cache:{read,write} }\n const tokens = info?.tokens;\n if (tokens) {\n push(attrs, attrInt('neatlogs.llm.token_count.prompt', tokens.input));\n push(attrs, attrInt('neatlogs.llm.token_count.completion', tokens.output));\n if (tokens.input != null && tokens.output != null) {\n push(attrs, attrInt('neatlogs.llm.token_count.total', tokens.input + tokens.output));\n }\n push(attrs, attrInt('neatlogs.llm.token_count.reasoning', tokens.reasoning));\n push(attrs, attrInt('neatlogs.llm.token_count.cache_read', tokens.cache?.read));\n push(attrs, attrInt('neatlogs.llm.token_count.cache_write', tokens.cache?.write));\n }\n push(attrs, attrDouble('neatlogs.llm.cost_usd', info?.cost));\n\n // Use opencode's real start time when available (else now).\n const createdMs = info?.time?.created;\n const startNano = typeof createdMs === 'number' ? msToNanoString(Math.floor(createdMs)) : nowNanoString();\n\n shipper.enqueue({\n traceId: st.traceId,\n spanId: generateSpanId(),\n parentSpanId: st.rootSpan?.spanId,\n name: `opencode.llm.${model || 'model'}`,\n kind: 1,\n startTimeUnixNano: startNano,\n endTimeUnixNano: nowNanoString(),\n attributes: attrs,\n status: { code: SpanStatusCode.OK },\n });\n\n // Reset accumulated parts for the next turn.\n if (info?.id) {\n st.outputParts.delete(String(info.id));\n st.toolCalls.delete(String(info.id));\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction push(arr: OtlpKeyValue[], kv: OtlpKeyValue | undefined): void {\n if (kv) arr.push(kv);\n}\n\n/**\n * Set generic input/output on a span using the ALREADY-NAMESPACED keys the\n * backend consumer reads. The OTel-SDK wrappers rely on the attribute-processor\n * to map raw `input.value` → `neatlogs.{kind}.input`; this plugin ships spans\n * directly (no processor), so it must emit the namespaced keys itself:\n * neatlogs.input.value / neatlogs.output.value (generic)\n * neatlogs.{kind}.input / neatlogs.{kind}.output (kind-specific)\n * We also keep the raw input.value/output.value for any consumer that maps it.\n */\nfunction setIO(arr: OtlpKeyValue[], kind: string, input?: string, output?: string): void {\n const k = kind.toLowerCase();\n if (input !== undefined) {\n push(arr, attrStr('input.value', input));\n push(arr, attrStr('neatlogs.input.value', input));\n push(arr, attrStr(`neatlogs.${k}.input`, input));\n }\n if (output !== undefined) {\n push(arr, attrStr('output.value', output));\n push(arr, attrStr('neatlogs.output.value', output));\n push(arr, attrStr(`neatlogs.${k}.output`, output));\n }\n}\n\n/** Flatten an opencode message's parts/content to readable text. */\nfunction messageText(info: any): string {\n if (!info) return '';\n if (typeof info.text === 'string') return info.text;\n const parts = info.parts ?? info.content;\n if (typeof parts === 'string') return parts;\n if (!Array.isArray(parts)) return '';\n const out: string[] = [];\n for (const p of parts) {\n if (typeof p === 'string') out.push(p);\n else if (p && typeof p === 'object' && typeof p.text === 'string') out.push(p.text);\n }\n return out.join('');\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 String(value);\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":["traceTool","path","import_api","logger","logger","logger","span","import_node_async_hooks","otelTrace","context","span","otelTrace","span","otelTrace","logger","span","import_node_async_hooks","import_api","import_api","logger","span","logger","span","logger","logger","result","logger","span","spanId","otelTrace","logger","logger","import_api","import_api","context","path","logger","_debugMode","_debugMode","logger","span","context","import_api","import_api","TRACER_NAME","safeStringify","span","stringified","import_api","import_api","otelTrace","context","TRACER_NAME","span","safeStringify","path","import_api","TRACER_NAME","wrapNamespace","traceTool","span","safeStringify","recordError","path","isNamespace","setInvocationParams","import_api","TRACER_NAME","wrapNamespace","traceTool","span","safeStringify","recordError","path","tracedChatCompletionsCreate","tracedResponsesCreate","isNamespace","setInvocationParams","wrapAsyncIterableStream","finalizeChatResponse","finalizeStreamChunks","import_api","TRACER_NAME","PROVIDER","SYSTEM","wrapNamespace","traceTool","span","safeStringify","recordError","path","isNamespace","finalizeStreamChunks","import_api","TRACER_NAME","PROVIDER","SYSTEM","wrapNamespace","traceTool","span","safeStringify","recordError","path","tracedGenerateContent","tracedEmbedContent","tracedCountTokens","isNamespace","tracedChatSend","wrapStream","finalizeResponse","setInputAttributes","finalizeStreamChunks","setUsage","import_api","TRACER_NAME","PROVIDER","traceTool","span","safeStringify","recordError","import_api","TRACER_NAME","safeStringify","span","import_api","TRACER_NAME","span","safeStringify","import_api","TRACER_NAME","TRACER_NAME","span","recordError","safeStringify","safeStringify","recordError","span","import_api","TRACER_NAME","PATCH_FLAG","markPatched","span","safeStringify","import_api","TRACER_NAME","recordError","span","setUsage","safeStringify","import_api","TRACER_NAME","PROVIDER","span","safeStringify","recordError","protobuf","SpanStatusCode","span","SpanStatusCode","handleEvent","safeStringify","handleEvent","emitLlmSpan","messageText","safeStringify","SpanStatusCode","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/core/identity.ts","../src/core/session.ts","../src/core/provider.ts","../src/core/end-user.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/log.ts","../src/instrumentation/registry.ts","../src/instrumentation/manager.ts","../src/prompt/client.ts","../node_modules/@opentelemetry/core/src/trace/suppress-tracing.ts","../src/mastra.ts","../src/version.ts","../src/decorators/orchestration.ts","../src/core/propagation.ts","../src/ai-sdk.ts","../src/openai.ts","../src/core/auto-root.ts","../src/anthropic.ts","../src/azure-openai.ts","../src/vertex-ai.ts","../src/google-genai.ts","../src/bedrock.ts","../src/langchain.ts","../src/strands.ts","../src/openai-agents.ts","../src/mastra-wrap.ts","../src/pi-agent.ts","../src/claude-agent-sdk.ts","../src/openrouter-agent.ts","../src/opencode-trace-shipper.ts","../src/opencode-plugin.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, setTraceOutput } from './core/context.js';\nexport { log } from './core/log.js';\n\n// Request-scoped session & end-user identity (per-request, not process-global).\nexport { identify } from './core/identity.js';\nexport {\n injectTraceContext,\n type TraceContextCarrier,\n} from './core/propagation.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';\nexport { wrapAzureOpenAI, traceTool as traceToolAzureOpenAI } from './azure-openai.js';\nexport { wrapVertexAI, wrapVertexAIChat, traceTool as traceToolVertexAI } from './vertex-ai.js';\nexport { wrapGoogleGenAI, wrapGoogleGenAIChat, traceTool as traceToolGoogleGenAI } from './google-genai.js';\nexport { wrapBedrock, traceTool as traceToolBedrock } from './bedrock.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';\nexport { piAgentHooks } from './pi-agent.js';\nexport { wrapClaudeAgentSDK } from './claude-agent-sdk.js';\nexport { wrapOpenRouterAgent, wrapCallModel } from './openrouter-agent.js';\nexport { NeatlogsOpencodePlugin } from './opencode-plugin.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 * as path from 'node:path';\n\nimport { Resource } from '@opentelemetry/resources';\nimport { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';\nimport { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport {\n BatchSpanProcessor,\n type BasicTracerProvider,\n} from '@opentelemetry/sdk-trace-base';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport { LoggerProvider, 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 { _setOtelLogger } from './core/log.js';\nimport { _setSessionConfig } from './core/context.js';\nimport { _setNeatlogsProvider } from './core/provider.js';\nimport { getLogger, enableDebugLogging } from './core/logger.js';\nimport {\n InstrumentationManager,\n assertInstrumentationsIsolationSafe,\n} from './instrumentation/manager.js';\nimport { PromptClient, setSharedClient } from './prompt/client.js';\nimport { _resetMastraCache } from './mastra.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: BasicTracerProvider | null = null;\nlet _ownsTracerProvider = false;\nlet _logProvider: LoggerProvider | null = null;\nlet _spanProcessor: NeatlogsSpanProcessor | null = null;\nlet _debugMode = false;\n// Retained so shutdown() can disable the instrumentors it installed; otherwise a\n// stale instrumentor stays bound to the shut-down provider after reinit.\nlet _instrumentationManager: InstrumentationManager | null = null;\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// 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 // 1b. Validate the requested instrumentations against the isolation policy\n // BEFORE touching any module state (debug flag, session config, provider, …).\n // The check is a pure function of the registry + the requested set, so failing\n // here keeps init() atomic: a rejected init leaves no half-installed provider\n // or stale state behind, and the next init() starts clean. Neatlogs always\n // uses a private provider, so this rejects any instrumentor that would drive\n // the global OTel context.\n if (options.instrumentations?.length) {\n assertInstrumentationsIsolationSafe(options.instrumentations);\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. Parse base URL from endpoint\n const endpoint =\n options.endpoint ??\n 'https://ingest.neatlogs.com';\n const baseUrl = new URL(endpoint).origin;\n\n // 7. Set session config. Session & end-user identity are PER-REQUEST (set via\n // trace()/span() or identify()), never on init() — only the operator userId\n // and workflow/transport config live here.\n _setSessionConfig({\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 // Operator identity only — whoever RUNS the SDK. Session & end-user identity\n // are per-request (trace()/span()/identify()), never resource attributes.\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 or adopt a PRIVATE TracerProvider. Neatlogs never reads,\n // registers onto, or shuts down a foreign global provider, so Datadog,\n // Braintrust, and other co-tenants can neither export nor parent our spans\n // (and vice versa).\n const provider =\n options.tracerProvider ??\n new NodeTracerProvider({\n resource,\n spanLimits: { attributeCountLimit: 10_000 },\n });\n _ownsTracerProvider = options.tracerProvider === undefined;\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. Store privately. Neatlogs never registers an OTel provider globally.\n _tracerProvider = provider;\n _setNeatlogsProvider(provider);\n\n if (options.debug) {\n logger.debug('Neatlogs tracer provider initialized');\n }\n\n // 14. Never replace the process-global meter provider.\n if (options.debug) {\n logger.debug('Global meter provider left unchanged');\n }\n\n // 15. Set up LoggerProvider (if captureLogs)\n const captureLogs = options.captureLogs ?? false;\n if (captureLogs) {\n const logRecordProcessors: BatchLogRecordProcessor[] = [];\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 logRecordProcessors.push(\n new BatchLogRecordProcessor(otlpLogExporter, {\n maxExportBatchSize: options.batchSize ?? 100,\n scheduledDelayMillis: (options.flushInterval ?? 5) * 1000,\n }),\n );\n if (options.debug) {\n logger.debug(`OTLP log exporter configured: ${logsEndpoint}`);\n }\n }\n\n // sdk-logs >= 0.200 configures processors in the constructor and removed\n // addLogRecordProcessor(). Retain the older path so Neatlogs stays\n // compatible with applications that still resolve sdk-logs 0.57.\n const supportsDynamicProcessors =\n typeof LoggerProvider.prototype.addLogRecordProcessor === 'function';\n _logProvider = supportsDynamicProcessors\n ? new LoggerProvider({ resource })\n : new LoggerProvider({\n resource,\n processors: logRecordProcessors,\n } as ConstructorParameters<typeof LoggerProvider>[0]);\n if (supportsDynamicProcessors) {\n for (const processor of logRecordProcessors) {\n _logProvider.addLogRecordProcessor(processor);\n }\n }\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. Retained in module state so shutdown() can disable\n // the instrumentors it installed. The manager rejects any requested library\n // whose auto-instrumentor drives the global OTel context.\n _instrumentationManager = new InstrumentationManager({\n provider,\n debug: options.debug,\n });\n\n if (options.instrumentations?.length) {\n await _instrumentationManager.instrument(options.instrumentations);\n if (options.debug) {\n logger.debug(\n `Instrumented libraries: ${_instrumentationManager.instrumented.join(', ')}`,\n );\n }\n }\n\n // 17. Register shutdown handlers. Default to flushing on exit whenever we own\n // the private provider so standalone scripts drain their spans;\n // only a caller-supplied provider defaults off (its owner controls shutdown).\n const registerShutdownHandlers =\n options.registerShutdownHandlers ?? _ownsTracerProvider;\n if (registerShutdownHandlers && !_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(`User: ${options.userId ?? '(none)'}`);\n logger.info(`Tags: ${tags ?? []}`);\n logger.info(\n `Instrumentations: ${_instrumentationManager.instrumented.join(', ') || '(none)'}`,\n );\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 // Flush regardless of ownership: our processors are attached to the provider\n // (owned or caller-supplied), so draining them is always ours to do. Shutdown\n // is what's ownership-gated — we never shut down a provider we didn't create.\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 (_logProvider) {\n try {\n logger.debug('Flushing log provider...');\n await _logProvider.forceFlush();\n logger.debug('Log provider 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 // Disable instrumentors BEFORE tearing down the provider so they stop emitting\n // spans against it, and clear the Mastra bridge cache so a subsequent init()\n // rebinds to the fresh provider instead of a stale one.\n _instrumentationManager?.disable();\n _instrumentationManager = null;\n _resetMastraCache();\n\n // Only shut down a provider we created. A caller-supplied provider is flushed\n // (above / in flush()) but never shut down — its owner controls its lifecycle,\n // per the tracerProvider contract in InitOptions. Flush it here so a caller\n // that shuts down right after us doesn't lose our still-buffered spans.\n if (_tracerProvider && _ownsTracerProvider) {\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 } else if (_tracerProvider) {\n try {\n logger.debug('Flushing caller-owned tracer provider (not shutting down)...');\n await _tracerProvider.forceFlush();\n } catch (e) {\n logger.error(`Error flushing caller-owned tracer 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 // Reset all module-level state\n _initialized = false;\n _tracerProvider = null;\n _ownsTracerProvider = false;\n _setNeatlogsProvider(null);\n _logProvider = 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(): BasicTracerProvider {\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 ROOT_CONTEXT,\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 { applySessionAttributes } from './session.js';\nimport { applyEndUserAttributes } from './end-user.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';\nimport { getNeatlogsTracer } from './provider.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 // Stamp request-scoped identity (identify()) onto ANY root span as a\n // fallback. trace()/span() set it explicitly (overriding this); direct\n // wrappers' auto-roots stamp it themselves. This catch-all is what lets\n // identify() reach FRAMEWORK roots (openai-agents/strands/pi-agent) that\n // open their own root without stamping identity. No-ops when identify() is\n // inactive; child spans are skipped.\n if (!span.parentSpanId) {\n applySessionAttributes(span, undefined, true);\n applyEndUserAttributes(span, undefined, undefined, true);\n }\n\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 only from the span's OWN parentContext. The global\n // OTel context belongs to another SDK and must never be consulted.\n const getFrom = (ctx: Context | undefined, key: symbol): string | undefined =>\n typeof ctx?.getValue === 'function'\n ? (ctx.getValue(key) as string | undefined)\n : undefined;\n const readValue = (key: symbol): string | undefined =>\n getFrom(parentContext, key);\n let variablesJson = readValue(PROMPT_VARIABLES_KEY);\n let template = readValue(PROMPT_TEMPLATE_KEY);\n const versionVal = readValue(PROMPT_VERSION_KEY);\n let userTemplate = readValue(USER_PROMPT_TEMPLATE_KEY);\n let userVariablesJson = readValue(USER_PROMPT_VARIABLES_KEY);\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(ROOT_CONTEXT, wrappedSpan);\n\n const tracer = getNeatlogsTracer('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 // The completion marker may be exported in a batch without the root span.\n // Carry the root-owned identity so ingestion can finalize the trace under\n // the correct conversation and end-user without depending on batch order.\n for (const key of [\n 'neatlogs.session.id',\n 'neatlogs.end_user.id',\n 'neatlogs.end_user.metadata',\n ]) {\n const value = rootSpan.attributes[key];\n if (value !== undefined) {\n marker.setAttribute(key, value);\n }\n }\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);\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 // generateObject/streamObject emit ai.response.object (structured), not\n // ai.response.text — build the same output message from it so the doGenerate\n // LLM child shows the object instead of a blank output.\n if (\n 'ai.response.object' in attrs &&\n !('llm.output_messages.0.message.content' in attrs)\n ) {\n const obj = attrs['ai.response.object'];\n attrs['llm.output_messages.0.message.role'] = 'assistant';\n attrs['llm.output_messages.0.message.content'] =\n typeof obj === 'string' ? obj : JSON.stringify(obj);\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);\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","/**\n * Request-scoped session & end-user identity.\n *\n * Session and end-user identity are PER-REQUEST, not process-global, so they are\n * never set on `init()`. The primary way to set them is at the trace root\n * (`trace({ sessionId })` / `span({ sessionId })`). For code that only uses\n * `wrap()` — where the trace root is created internally by the wrapper and the\n * caller has no root to put arguments on — use the `identify()` context:\n *\n * await neatlogs.identify(\n * { sessionId: 'chat_123', endUserId: 'user_456', endUserMetadata: { plan: 'pro' } },\n * async () => {\n * await wrappedClient.chat.completions.create(...); // auto-root reads this\n * },\n * );\n *\n * Resolution at the trace root (per field): explicit per-call argument wins, then\n * the `identify()` context, then nothing. Identity is stamped on the ROOT span\n * only; the backend rolls it up to the trace and its session.\n *\n * Backed by `AsyncLocalStorage` so it propagates across `await` boundaries (and\n * nested async tasks), exactly like OpenTelemetry's own context propagation.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\nexport interface IdentityStore {\n sessionId?: string;\n endUserId?: string;\n endUserMetadata?: Record<string, any>;\n}\n\nexport interface IdentifyOptions {\n sessionId?: string;\n endUserId?: string;\n endUserMetadata?: Record<string, any>;\n}\n\n// tsup bundles each entry point (index, openai, azure-openai, ...) separately,\n// so a plain module-level `new AsyncLocalStorage()` would be DUPLICATED per\n// bundle — identify() (in index) would write to a different store than a\n// provider wrapper's auto-root (in e.g. azure-openai) reads, silently losing\n// identity on the wrapper-only path. Pin a single instance on globalThis so all\n// bundled copies (ESM + CJS) resolve to the same store.\nconst _GLOBAL_KEY = Symbol.for('neatlogs.identity.storage');\ntype _GlobalWithStore = typeof globalThis & {\n [_GLOBAL_KEY]?: AsyncLocalStorage<IdentityStore>;\n};\nconst _g = globalThis as _GlobalWithStore;\nconst _storage: AsyncLocalStorage<IdentityStore> =\n _g[_GLOBAL_KEY] ?? (_g[_GLOBAL_KEY] = new AsyncLocalStorage<IdentityStore>());\n\nexport function currentSessionId(): string | undefined {\n return _storage.getStore()?.sessionId;\n}\n\nexport function currentEndUserId(): string | undefined {\n return _storage.getStore()?.endUserId;\n}\n\nexport function currentEndUserMetadata(): Record<string, any> | undefined {\n return _storage.getStore()?.endUserMetadata;\n}\n\n/**\n * Bind session / end-user identity for the duration of `fn`.\n *\n * Only defined fields are set, so a nested `identify()` overrides one field\n * without clearing the others (it merges onto the enclosing store). The previous\n * store is automatically restored when `fn` returns / rejects. Returns whatever\n * `fn` returns (sync value or Promise).\n *\n * @example\n * ```typescript\n * await neatlogs.identify({ sessionId: 'chat_123' }, async () => {\n * await wrappedClient.chat.completions.create(...);\n * });\n * ```\n */\nexport function identify<T>(opts: IdentifyOptions, fn: () => T): T {\n const prev = _storage.getStore();\n const next: IdentityStore = { ...(prev ?? {}) };\n if (opts.sessionId !== undefined) next.sessionId = opts.sessionId;\n if (opts.endUserId !== undefined) next.endUserId = opts.endUserId;\n if (opts.endUserMetadata !== undefined) next.endUserMetadata = opts.endUserMetadata;\n return _storage.run(next, fn);\n}\n","/**\n * Session identity.\n *\n * A *session* is one conversation / thread / journey — it groups the multiple\n * traces of a multi-turn interaction (one turn = one trace). Identity is\n * declared once at a trace boundary — `init()` (process-global default),\n * `trace()` (per-turn), or `span()` (per root) — via the `sessionId` option on\n * those existing constructs. The SDK stamps only the trace's ROOT span; the\n * backend rolls the value up to group the traces of a session together.\n *\n * For single-turn workflows a session maps 1:1 to a trace: when no session is\n * declared the backend backfills `session_id = trace_id`.\n *\n * Canonical span attribute:\n * `neatlogs.session.id` — the session identifier (string)\n */\n\nimport { type Span } from '@opentelemetry/api';\nimport { getLogger } from './logger.js';\nimport { currentSessionId } from './identity.js';\n\nconst logger = getLogger();\n\nexport const SESSION_ID_KEY = 'neatlogs.session.id';\n\n/**\n * Stamp the session id onto a ROOT span (best-effort). When `isRoot` is false\n * the span is a child and the value is ignored — the backend reads session from\n * the root span and groups traces by it.\n */\nexport function applySessionAttributes(\n span: Span,\n sessionId?: string,\n isRoot = true,\n): void {\n // Resolution at the root: explicit per-call arg wins, else the identify()\n // context (request-scoped). Non-root spans never carry session identity.\n const resolved = isRoot ? (sessionId ?? currentSessionId()) : sessionId;\n if (!resolved) return;\n if (!isRoot) {\n logger.debug(\n '[session] Ignoring sessionId on a non-root span — declare it on the ' +\n 'trace root (top-level trace()/span()) or identify().',\n );\n return;\n }\n span.setAttribute(SESSION_ID_KEY, String(resolved));\n}\n","/**\n * Neatlogs-owned tracing state.\n *\n * Spans are created by the private Neatlogs provider and their parent is carried\n * in a private context key. The process-global OpenTelemetry span is\n * deliberately left untouched so other observability SDKs cannot export or\n * become parents of Neatlogs spans.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n ROOT_CONTEXT,\n INVALID_SPAN_CONTEXT,\n createContextKey,\n trace as otelTrace,\n type Context,\n type Span,\n type SpanOptions,\n type Tracer,\n type TracerProvider,\n} from '@opentelemetry/api';\n\n// Carries the trace-ROOT span down the private context so descendants can target\n// it (e.g. setTraceOutput). getActiveNeatlogsSpan() returns the innermost span,\n// which is not the root once nested; this key preserves the root reference.\nconst NEATLOGS_ROOT_SPAN_KEY = createContextKey('neatlogs.root_span');\n\n// Entry points are bundled independently (`neatlogs`, `neatlogs/openai`,\n// `neatlogs/ai`, `neatlogs/mastra`, … each in both CJS and ESM), so every piece\n// of shared tracing state — the private span store AND the resolved provider /\n// provider — must live on `globalThis` behind a `Symbol.for` key.\n// Otherwise `init()` (run from the `neatlogs` bundle) sets `_provider` in ITS\n// module copy while a wrapper imported from `neatlogs/openai` reads a different,\n// still-null copy and silently falls back to the foreign global provider.\nconst PRIVATE_SPAN_STORAGE_KEY = Symbol.for(\n 'neatlogs.private_span_async_local_storage',\n);\nconst PRIVATE_PROVIDER_STATE_KEY = Symbol.for(\n 'neatlogs.private_provider_state',\n);\ninterface PrivateProviderState {\n provider: TracerProvider | null;\n}\ntype NeatlogsGlobal = typeof globalThis & {\n [PRIVATE_SPAN_STORAGE_KEY]?: AsyncLocalStorage<Context>;\n [PRIVATE_PROVIDER_STATE_KEY]?: PrivateProviderState;\n};\nconst neatlogsGlobal = globalThis as NeatlogsGlobal;\n// Stores the full Neatlogs Context (parent span PLUS any threaded values such as\n// trace()'s prompt-template keys), not just the span. We never\n// activate the OTel global context, so this private store is the ONLY channel\n// through which those values propagate down to descendant spans.\nconst privateContextStorage =\n neatlogsGlobal[PRIVATE_SPAN_STORAGE_KEY] ??\n (neatlogsGlobal[PRIVATE_SPAN_STORAGE_KEY] = new AsyncLocalStorage<Context>());\nconst providerState: PrivateProviderState =\n neatlogsGlobal[PRIVATE_PROVIDER_STATE_KEY] ??\n (neatlogsGlobal[PRIVATE_PROVIDER_STATE_KEY] = {\n provider: null,\n });\n// Wrappers may be constructed or accidentally invoked before init(). They must\n// never fall back to a foreign process-global provider, so pre-init calls use a\n// local no-op tracer and safely emit no exported spans.\nconst preInitTracer: Tracer = {\n startSpan(): Span {\n return otelTrace.wrapSpanContext(INVALID_SPAN_CONTEXT);\n },\n startActiveSpan<F extends (span: Span) => unknown>(\n _name: string,\n arg2?: SpanOptions | Context | F,\n arg3?: Context | F,\n arg4?: F,\n ): ReturnType<F> {\n const fn =\n typeof arg2 === 'function'\n ? arg2\n : typeof arg3 === 'function'\n ? arg3\n : arg4;\n return fn!(otelTrace.wrapSpanContext(INVALID_SPAN_CONTEXT)) as ReturnType<F>;\n },\n};\n\n/** @internal Configure the provider used by Neatlogs-created spans. */\nexport function _setNeatlogsProvider(provider: TracerProvider | null): void {\n providerState.provider = provider;\n}\n\n/** Resolve a tracer from the private provider when one is configured. */\nexport function getNeatlogsTracer(name: string): Tracer {\n return providerState.provider?.getTracer(name) ?? preInitTracer;\n}\n\n/**\n * @internal The private Neatlogs provider, or null before\n * init(). Used by integrations that must repoint a self-instrumenting library's\n * captured provider onto ours.\n */\nexport function getNeatlogsProvider(): TracerProvider | null {\n return providerState.provider;\n}\n\n/**\n * Wrap a tracer so that spans it creates parent from — and, for\n * `startActiveSpan`, activate on — the PRIVATE Neatlogs context instead of the\n * global one.\n *\n * We hand this to libraries that create their own spans off a tracer we give\n * them (the Vercel AI SDK's `experimental_telemetry.tracer`, which calls\n * `tracer.startActiveSpan()` internally). Without the facade the AI SDK's native\n * spans would parent from `context.active()` — the foreign co-tenant's context —\n * and `startActiveSpan` would push them onto the GLOBAL context, so a foreign\n * tracer's next span reads our native span as its parent. Both directions leak.\n *\n */\nexport function isolateTracer(tracer: Tracer): Tracer {\n const facade: Tracer = {\n startSpan(name: string, options?: SpanOptions, context?: Context): Span {\n const parent = context ?? getNeatlogsActiveContext();\n return tracer.startSpan(name, options, parent);\n },\n startActiveSpan<F extends (span: Span) => unknown>(\n name: string,\n arg2?: SpanOptions | Context | F,\n arg3?: Context | F,\n arg4?: F,\n ): ReturnType<F> {\n // Normalize the 2/3/4-arg overloads of startActiveSpan.\n let options: SpanOptions | undefined;\n let context: Context | undefined;\n let fn: F;\n if (typeof arg2 === 'function') {\n fn = arg2 as F;\n } else if (typeof arg3 === 'function') {\n options = arg2 as SpanOptions;\n fn = arg3 as F;\n } else {\n options = arg2 as SpanOptions;\n context = arg3 as Context;\n fn = arg4 as F;\n }\n const parent = context ?? getNeatlogsActiveContext();\n const span = tracer.startSpan(name, options, parent);\n return withNeatlogsSpan(span, () => fn(span), parent) as ReturnType<F>;\n },\n };\n return facade;\n}\n\n/**\n * The base context to build new Neatlogs spans and values on. NEVER contains a\n * foreign provider's span: it reads our private store, or ROOT_CONTEXT when\n * nothing is active.\n */\nexport function getNeatlogsActiveContext(): Context {\n return privateContextStorage.getStore() ?? ROOT_CONTEXT;\n}\n\n/** Return only the active Neatlogs span (never a foreign provider's span). */\nexport function getActiveNeatlogsSpan(): Span | undefined {\n return otelTrace.getSpan(getNeatlogsActiveContext());\n}\n\n/**\n * Return the trace-ROOT Neatlogs span, or undefined when no trace is active.\n *\n * Unlike {@link getActiveNeatlogsSpan} (innermost), this is the outermost span\n * of the current trace — the one the backend derives trace-level output from\n * (`parent_span_id=''`). It is stashed on the private context the first time a\n * span becomes active, so nested calls still resolve to the root.\n */\nexport function getNeatlogsRootSpan(): Span | undefined {\n return getNeatlogsActiveContext().getValue(NEATLOGS_ROOT_SPAN_KEY) as\n | Span\n | undefined;\n}\n\n/**\n * Build a parent context that cannot contain a foreign provider's span.\n *\n * The active Neatlogs context already carries the parent span AND any values\n * the caller threaded in upstream (e.g. `trace()`'s prompt-template values), so\n * those values reach the span processor via `onStart(parentContext)`. An\n * explicit `baseContext` (a caller's own value-carrying context) is honored as-is.\n */\nexport function getNeatlogsParentContext(baseContext?: Context): Context {\n return baseContext ?? getNeatlogsActiveContext();\n}\n\n/**\n * A base context for callers that thread parent linkage themselves\n * (callback/event handlers that keep their own run-id → span map: LangChain,\n * OpenAI-Agents, Claude Agent SDK).\n *\n * This is the ACTIVE Neatlogs context — the private store's\n * context if a Neatlogs `trace()`/`span()` encloses this call, else\n * ROOT_CONTEXT. So a handler's own root/entry span nests under an enclosing\n * Neatlogs trace (preserving its session + end-user id) when one exists, and\n * auto-roots cleanly when one doesn't. A foreign provider's active span can\n * never leak in as an ancestor because the global context is never read.\n */\nexport function getNeatlogsBaseContext(baseContext?: Context): Context {\n return baseContext ?? getNeatlogsActiveContext();\n}\n\n/**\n * Build an execution context for a Neatlogs span while preserving the active\n * foreign context. The span rides our private context store.\n */\nexport function getNeatlogsExecutionContext(\n span: Span,\n baseContext: Context = ROOT_CONTEXT,\n): Context {\n return otelTrace.setSpan(baseContext, span);\n}\n\n/**\n * Run a callback with a Neatlogs span active under the appropriate policy.\n *\n * The stored context is `setSpan(base, span)` — carrying the span PLUS whatever\n * values `base` holds — so threaded values (prompt templates)\n * propagate to descendant spans through our private store instead of the global\n * OTel context we deliberately never touch.\n */\nexport function withNeatlogsSpan<T>(\n span: Span,\n fn: () => T,\n baseContext?: Context,\n): T {\n const base = baseContext ?? getNeatlogsActiveContext();\n let ctx = otelTrace.setSpan(base, span);\n // The first span activated in a context with no root recorded IS the root of\n // this trace; remember it so descendants (setTraceOutput) can target it.\n if (base.getValue(NEATLOGS_ROOT_SPAN_KEY) === undefined) {\n ctx = ctx.setValue(NEATLOGS_ROOT_SPAN_KEY, span);\n }\n return privateContextStorage.run(ctx, fn);\n}\n","/**\n * End-user identity.\n *\n * The *end user* is the user of OUR CUSTOMER'S application — the person\n * interacting with the AI product our customer built. This is deliberately\n * distinct from the operator-level `userId` set in {@link init}, which identifies\n * whoever is running the SDK (a developer, a service account, a CI job).\n *\n * Model: **one end-user per trace.** Identity is declared once at a trace\n * boundary — `init()` (process-global default), `trace()` (per-request), or\n * `span()` (per root) — via new options on those existing constructs. There is\n * no separate `identify()` call and no nested per-span override: a trace belongs\n * to a single end-user.\n *\n * End-user identity belongs to the trace as a whole, so the SDK only stamps it\n * on the trace's ROOT span (any span kind, created via `trace()` / `span()`). A\n * non-root child span never carries it. The backend reads end-user from the root\n * span and rolls the value up to the trace (and its session) so\n * filtering/analytics are trace- and session-level, not per-span.\n *\n * Canonical span attributes:\n * `neatlogs.end_user.id` — the end-user identifier (string)\n * `neatlogs.end_user.metadata` — JSON object of arbitrary end-user fields\n */\n\nimport { type Span } from '@opentelemetry/api';\nimport { getLogger } from './logger.js';\nimport { currentEndUserId, currentEndUserMetadata } from './identity.js';\nimport { getActiveNeatlogsSpan } from './provider.js';\n\nconst logger = getLogger();\n\nexport const END_USER_ID_KEY = 'neatlogs.end_user.id';\nexport const END_USER_METADATA_KEY = 'neatlogs.end_user.metadata';\n\n/** Coerce end-user metadata to a JSON string. Returns undefined when empty. */\nexport function normalizeEndUserMetadata(\n metadata: string | Record<string, any> | undefined | null,\n): string | undefined {\n if (metadata === undefined || metadata === null) return undefined;\n if (typeof metadata === 'string') return metadata || undefined;\n try {\n return JSON.stringify(metadata);\n } catch {\n return JSON.stringify(String(metadata));\n }\n}\n\n/**\n * True when no recording span is currently active — i.e. a span created now\n * would be the trace root.\n */\nexport function isRootSpan(): boolean {\n // Resolve from the private span store in isolated mode (a foreign provider's\n // active span must not count as our parent), else the active OTel span.\n const current = getActiveNeatlogsSpan();\n return !(current && current.isRecording());\n}\n\n/**\n * Stamp end-user id/metadata onto a ROOT span (best-effort). When `isRoot` is\n * false the span is a child and the value is ignored — the backend reads\n * end-user from the root span and rolls it up to the trace and session.\n */\nexport function applyEndUserAttributes(\n span: Span,\n endUserId?: string,\n endUserMetadata?: string | Record<string, any> | null,\n isRoot = true,\n): void {\n // Resolution at the root (per field): explicit per-call arg wins, else the\n // identify() context (request-scoped). Non-root spans never carry identity.\n const resolvedId = isRoot ? (endUserId ?? currentEndUserId()) : endUserId;\n const resolvedMeta = isRoot\n ? (endUserMetadata ?? currentEndUserMetadata())\n : endUserMetadata;\n if (!resolvedId && !resolvedMeta) return;\n if (!isRoot) {\n logger.debug(\n '[end_user] Ignoring endUserId/endUserMetadata on a non-root span — ' +\n 'declare it on the trace root (top-level trace()/span()) or identify().',\n );\n return;\n }\n if (resolvedId) {\n span.setAttribute(END_USER_ID_KEY, String(resolvedId));\n }\n const metaJson = normalizeEndUserMetadata(resolvedMeta);\n if (metaJson) {\n span.setAttribute(END_USER_METADATA_KEY, metaJson);\n }\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';\nimport { applyEndUserAttributes } from './end-user.js';\nimport { applySessionAttributes } from './session.js';\nimport { currentSessionId } from './identity.js';\n\nimport { getLogger } from './logger.js';\nimport { safeJsonDumps, serializeObj } from '../decorators/base.js';\nimport type { TraceOptions, MaskFunction } from '../types.js';\nimport {\n getActiveNeatlogsSpan,\n getNeatlogsActiveContext,\n getNeatlogsParentContext,\n getNeatlogsRootSpan,\n getNeatlogsTracer,\n withNeatlogsSpan,\n} from './provider.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 'sessionId',\n 'endUserId',\n 'endUserMetadata',\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// Explicit trace-level output\n// ---------------------------------------------------------------------------\n\n/**\n * Explicitly set the trace-level \"final output\" shown for the current trace.\n *\n * By default the trace's displayed output is derived from the root span's\n * captured output. Call this to declare it instead — useful when the turn's\n * meaningful result lives in a tool call or is a status object you don't want\n * shown (e.g. an agent that suspends awaiting user input). The value is stamped\n * as `neatlogs.trace.output` on the trace ROOT span, which the backend prefers\n * over the derived output.\n *\n * No-op when called outside an active trace. Never throws.\n *\n * @param value - The value to show as the trace's final output.\n *\n * @example\n * ```typescript\n * await trace({ name: 'turn', sessionId }, async () => {\n * const plan = await proposePlan();\n * setTraceOutput(plan.title); // show the plan, not the raw status object\n * });\n * ```\n */\nexport function setTraceOutput(value: unknown): void {\n try {\n const span = getNeatlogsRootSpan() ?? getActiveNeatlogsSpan();\n if (!span) return;\n span.setAttribute('neatlogs.trace.output', safeJsonDumps(serializeObj(value)));\n } catch (err) {\n logger.warn(`[setTraceOutput] failed to set trace output: ${err}`);\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 a session id is resolved (per-call `sessionId` or the request-scoped\n * `identify()` context) AND no active parent span exists, this creates a NEW\n * 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 sessionId: sessionIdOption,\n endUserId,\n endUserMetadata,\n attributes: explicitAttributes,\n ...extraOptions\n } = options;\n\n // Per-call sessionId wins, else the request-scoped identify() context.\n // Session identity is NOT process-global — init() never sets it.\n const sessionId = sessionIdOption ?? currentSessionId();\n\n // Determine whether we are inside an existing active trace\n const currentSpan = getActiveNeatlogsSpan();\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 // Start from the Neatlogs active context (private store in isolated mode), NOT\n // otelContext.active() — the latter is the foreign co-tenant's context, whose\n // active span must never become our parent. Prompt values threaded here then\n // propagate to descendant LLM spans through the private store.\n let ctx = getNeatlogsActiveContext();\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 // End-user belongs to the trace root only. This trace() call is a root when it\n // creates a new root trace, or when it isn't nested in an already-active trace.\n const isRootTrace = shouldCreateRootTrace || !isInActiveTrace;\n\n // ---------------------------------------------------------------------------\n // Create span and execute callback\n // ---------------------------------------------------------------------------\n\n const tracer = getNeatlogsTracer('neatlogs.trace');\n\n const spanCallback = async (span: Span): Promise<T> => {\n _setSpanAttributes(span, kind, extraAttributes);\n\n // Session/end-user belong to the trace root only; skipped on a non-root span.\n applySessionAttributes(span, sessionId, isRootTrace);\n applyEndUserAttributes(span, endUserId, endUserMetadata, isRootTrace);\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 const parentContext = shouldCreateRootTrace\n ? ROOT_CONTEXT\n : getNeatlogsParentContext(ctx);\n // Seed the span kind at CREATION, not just in the callback: the span processor\n // classifies LLM spans in onStart() (which fires from startSpan, before the\n // callback runs). Without this, a trace({ kind: 'LLM', promptTemplate }) span\n // isn't recognized as LLM in time and its prompt-template attributes are dropped.\n const startAttributes = kind ? { 'openinference.span.kind': kind } : undefined;\n const span = tracer.startSpan(name, startAttributes ? { attributes: startAttributes } : {}, parentContext);\n\n if (shouldCreateRootTrace) {\n logger.debug(`[trace] Creating NEW root trace '${name}' (sessionId=${sessionId})`);\n } else {\n logger.debug(`[trace] Creating child span '${name}'`);\n }\n\n return withNeatlogsSpan(span, () => spanCallback(span), ctx);\n}\n","/**\n * Core span decoration utilities.\n * Provides the low-level wrapping logic used by span() and Span().\n */\n\nimport { ROOT_CONTEXT, SpanStatusCode, type Span as OtelSpan } from '@opentelemetry/api';\nimport { getLogger } from '../core/logger.js';\nimport { registerMask } from '../core/mask.js';\nimport { applyEndUserAttributes, isRootSpan } from '../core/end-user.js';\nimport { applySessionAttributes } from '../core/session.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from '../core/provider.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 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 // Resolve the tracer at CALL time, not definition time: a decorator applied\n // before init() would otherwise capture the no-op global provider forever\n // and emit zero spans once the private provider is configured.\n const tracer = getNeatlogsTracer(TRACER_NAME);\n // End-user belongs to the trace root only. Capture root status BEFORE the\n // span is created (once it's active, it would be the \"current\" span).\n const isRoot = isRootSpan();\n // Parent from our private span store; a root decorated function anchors a\n // fresh trace under ROOT_CONTEXT.\n const parentContext = isRoot ? ROOT_CONTEXT : getNeatlogsParentContext();\n const span = tracer.startSpan(spanName, {}, parentContext);\n return withNeatlogsSpan(span, () => {\n try {\n // Set common attributes\n setCommonSpanAttrs(span, opts);\n\n // Session/end-user identity (root span only; skipped on a non-root child).\n applySessionAttributes(span, opts.sessionId, isRoot);\n applyEndUserAttributes(span, opts.endUserId, opts.endUserMetadata, isRoot);\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 * 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 { getLogger } from './logger.js';\nimport {\n getActiveNeatlogsSpan,\n getNeatlogsActiveContext,\n} from './provider.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 // Correlate to the active NEATLOGS span, not the global active span: in\n // isolated mode the latter is the foreign co-tenant's (Datadog/Braintrust)\n // span, which would either mis-correlate the log or attach a foreign context.\n const activeSpan = getActiveNeatlogsSpan();\n const activeContext = activeSpan ? getNeatlogsActiveContext() : undefined;\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 // The OTel Logs API accepts a Context, not a raw SpanContext. Passing\n // `spanContext` is silently ignored by sdk-logs, producing a log with\n // no trace id that the Neatlogs ingest route correctly discards.\n ...(activeContext ? { context: activeContext } : {}),\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 // Correlate to the active Neatlogs span (not the global active span) — same\n // reasoning as log(): in isolated mode the global span is a co-tenant's.\n const activeSpan = getActiveNeatlogsSpan();\n const activeContext = activeSpan ? getNeatlogsActiveContext() : undefined;\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 ...(activeContext ? { context: activeContext } : {}),\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 * Whether this library's manager-loaded auto-instrumentor is safe to run\n * with Neatlogs' always-private provider. Manager-loaded OTel/OpenInference instrumentors\n * create and activate spans through the GLOBAL OpenTelemetry context\n * (`context.active()` / `context.with()`), which cannot be intercepted by a\n * private-provider facade — so a foreign co-tenant (Datadog, …) can still\n * parent or be parented by their spans in both directions. Such instrumentors\n * are therefore NOT isolation-safe and `init()` rejects them.\n *\n * Absent/false = not isolation-safe (the fail-closed default). Set `true` only\n * for an instrumentor that creates AND activates its spans exclusively through\n * Neatlogs' private context runtime. Explicit wrappers (wrapOpenAI, etc.) are\n * a separate, always-allowed path and don't go through the manager.\n */\n isolationSafe?: boolean;\n /**\n * Human-readable pointer to the explicit, fully-isolated Neatlogs wrapper for\n * this library — used to build the rejection message so users\n * know the supported alternative (e.g. \"wrapOpenAI() from 'neatlogs/openai'\").\n */\n explicitWrapper?: 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 'azure_openai',\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 'claude_agent_sdk',\n 'openrouter_agent',\n 'opencode',\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 explicitWrapper: \"wrapAISDK() from 'neatlogs/ai'\",\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 explicitWrapper: \"wrapOpenAI() from 'neatlogs/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 explicitWrapper: \"wrapAnthropic() from 'neatlogs/anthropic'\",\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 // The wrapper is opt-in per call site (wrapBedrock); this entry keeps\n // scope detection and tagging consistent.\n neatlogs: 'neatlogs/bedrock',\n default_span_kind: 'LLM',\n explicitWrapper: \"wrapBedrock() from 'neatlogs/bedrock'\",\n },\n azure_openai: {\n openinference: null,\n openllmetry: null,\n neatlogs: 'neatlogs/azure-openai',\n default_span_kind: 'LLM',\n explicitWrapper: \"wrapAzureOpenAI() from 'neatlogs/azure-openai'\",\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: 'neatlogs/vertex-ai',\n default_span_kind: 'LLM',\n explicitWrapper: \"wrapVertexAI() from 'neatlogs/vertex-ai'\",\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 explicitWrapper: \"langchainHandler() from 'neatlogs/langchain'\",\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 // The MastraInstrumentor path monkey-patches the (sealed) Mastra\n // constructor and its bridge activates spans on the global context, so it\n // is neither reliable nor isolation-safe. Use the explicit wrapper.\n explicitWrapper: \"wrapMastra() from 'neatlogs/mastra'\",\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 // The instrumentor calls startActiveSpan on a global-context-bound tracer.\n explicitWrapper: \"wrapGoogleGenAI() from 'neatlogs/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 // Opt-in wrapper (wrapClaudeAgentSDK); entry kept for scope detection/tagging.\n neatlogs: 'neatlogs/claude-agent-sdk',\n default_span_kind: 'AGENT',\n explicitWrapper: \"wrapClaudeAgentSDK() from 'neatlogs/claude-agent-sdk'\",\n },\n openrouter_agent: {\n openinference: null,\n openllmetry: null,\n neatlogs: 'neatlogs/openrouter-agent',\n default_span_kind: 'AGENT',\n explicitWrapper: \"wrapOpenRouterAgent() from 'neatlogs/openrouter-agent'\",\n },\n opencode: {\n openinference: null,\n openllmetry: null,\n neatlogs: 'neatlogs/opencode',\n default_span_kind: 'AGENT',\n explicitWrapper: \"NeatlogsOpencodePlugin from 'neatlogs/opencode'\",\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, type LibraryInfo } from './registry.js';\n\nconst logger = getLogger();\n\nexport interface InstrumentationManagerOptions {\n provider: TracerProvider;\n debug?: boolean;\n}\n\n/**\n * Build the rejection message for a manager-loaded instrumentor\n * that isn't isolation-safe. Names the explicit, fully-isolated wrapper when the\n * registry knows one.\n */\nfunction isolationRejectionMessage(lib: string, info: LibraryInfo): string {\n const alt = info.explicitWrapper\n ? `Use ${info.explicitWrapper} for isolated tracing`\n : `Use an explicit Neatlogs wrapper for isolated tracing if one exists`;\n return (\n `The \"${lib}\" auto-instrumentation uses the global OpenTelemetry context ` +\n `and cannot guarantee isolation from other tracing SDKs (Datadog, etc.).\\n\\n` +\n `${alt}. Neatlogs does not support shared global-context instrumentation.`\n );\n}\n\n/**\n * Throw if any requested library's auto-instrumentor would drive the global OTel\n * context under isolation. A PURE function of the registry + the requested set —\n * it touches no provider or module state — so `init()` can call it BEFORE creating\n * or installing the private provider, keeping initialization atomic: a rejected\n * `init()` leaves no abandoned provider or half-set state behind. The manager's\n * own instance gate delegates here too (for direct manager users).\n */\nexport function assertInstrumentationsIsolationSafe(libraries: string[]): void {\n for (const lib of libraries) {\n const info = getLibraryInfo(lib);\n // Only reject libs that actually LOAD an instrumentor (openinference or\n // neatlogs package set). A registry entry with both null is a no-op kept only\n // for scope detection/tagging — it patches nothing, so nothing can leak\n // through the global context. Unknown libs (info undefined) likewise can't leak.\n const loadsInstrumentor = !!(info && (info.openinference || info.neatlogs));\n if (info && loadsInstrumentor && !info.isolationSafe) {\n throw new Error(isolationRejectionMessage(lib, info));\n }\n }\n}\n\nexport class InstrumentationManager {\n private provider: TracerProvider;\n private _instrumented: string[] = [];\n // Retained so shutdown() can disable them (unpatch the target module) — else a\n // stale instrumentor stays bound to the shut-down provider across reinit.\n private _instances: Array<{ lib: string; instance: any }> = [];\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 * This first rejects (throws) any requested library whose\n * registry entry is not `isolationSafe`: those instrumentors create/activate\n * spans on the global OTel context, which a private provider cannot isolate in\n * either direction. Failing here (before patching anything) keeps the isolation\n * guarantee strict rather than best-effort.\n */\n async instrument(libraries: string[]): Promise<void> {\n assertInstrumentationsIsolationSafe(libraries);\n\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._instances.push({ lib, instance: instrumentor });\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._instances.push({ lib, instance: instrumentor });\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._instances.push({ lib, instance: instrumentor });\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._instances.push({ lib, instance: instrumentor });\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._instances.push({ lib, instance: instrumentor });\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 /**\n * Disable every instrumentor this manager installed, unpatching the target\n * modules so they stop emitting spans against the (now shut-down) provider.\n * Called from shutdown() so a subsequent init() rebinds cleanly instead of\n * leaving a stale instrumentor pointed at a dead provider.\n */\n disable(): void {\n for (const { lib, instance } of this._instances) {\n try {\n if (typeof instance.disable === 'function') {\n instance.disable();\n } else if (typeof instance.uninstrument === 'function') {\n instance.uninstrument();\n }\n } catch (e) {\n logger.debug(`Failed to disable instrumentor for '${lib}': ${e}`);\n }\n }\n this._instances = [];\n this._instrumented = [];\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 * 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 * @deprecated Use `wrapMastra()` from `neatlogs/mastra`.\n *\n * The current `@neatlogs/instrumentation-mastra`\n * bridge activates its spans on the GLOBAL OpenTelemetry context\n * (`context.active()` / `context.with()`), so a foreign co-tenant (Datadog, …)\n * can still parent or be parented by Mastra's spans in both directions — the\n * private provider alone cannot isolate that. Until the bridge is redesigned to\n * accept the injected Neatlogs private-context runtime, use the explicit\n * `wrapMastra()` wrapper instead.\n */\nexport async function getMastraObservability(): Promise<any> {\n throw new Error(\n 'getMastraObservability() is not supported because the ' +\n '@neatlogs/instrumentation-mastra bridge activates spans on the global ' +\n 'OpenTelemetry context, which cannot be isolated from other tracing SDKs ' +\n '(Datadog, etc.).\\n\\n' +\n \"Use wrapMastra() from 'neatlogs/mastra' instead.\",\n );\n}\n\n/** @internal Legacy lifecycle hook retained until this export is removed. */\nexport function _resetMastraCache(): void {\n // Kept as an internal lifecycle hook until the legacy bridge export is\n // removed in the next major release.\n}\n","/**\n * SDK version. Kept in sync with package.json by the `version:sync` script\n * (runs automatically on `prebuild`). Do not edit by hand — bump package.json.\n */\nexport const __version__ = '1.1.10';\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","/**\n * Explicit W3C propagation for the private Neatlogs trace context.\n *\n * The global OpenTelemetry propagator is deliberately not used or changed:\n * callers opt in at the exact cross-process boundary where Neatlogs context\n * should travel.\n */\n\nimport { TraceFlags } from '@opentelemetry/api';\nimport { getActiveNeatlogsSpan } from './provider.js';\n\nexport type TraceContextCarrier =\n | Record<string, string>\n | { set(name: string, value: string): unknown };\n\n/**\n * Inject the active private Neatlogs span as W3C `traceparent`/`tracestate`\n * headers. Returns false when no valid Neatlogs span is active.\n */\nexport function injectTraceContext(carrier: TraceContextCarrier): boolean {\n const spanContext = getActiveNeatlogsSpan()?.spanContext();\n if (!spanContext?.traceId || !spanContext.spanId) {\n return false;\n }\n if (\n spanContext.traceId === '00000000000000000000000000000000' ||\n spanContext.spanId === '0000000000000000'\n ) {\n return false;\n }\n\n const flags =\n spanContext.traceFlags & TraceFlags.SAMPLED\n ? TraceFlags.SAMPLED\n : TraceFlags.NONE;\n setHeader(\n carrier,\n 'traceparent',\n `00-${spanContext.traceId}-${spanContext.spanId}-${flags\n .toString(16)\n .padStart(2, '0')}`,\n );\n\n const traceState = spanContext.traceState?.serialize();\n if (traceState) {\n setHeader(carrier, 'tracestate', traceState);\n }\n return true;\n}\n\nfunction setHeader(\n carrier: TraceContextCarrier,\n name: string,\n value: string,\n): void {\n if ('set' in carrier && typeof carrier.set === 'function') {\n carrier.set(name, value);\n return;\n }\n (carrier as Record<string, string>)[name] = value;\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 { SpanStatusCode, type Span, type Tracer } from '@opentelemetry/api';\nimport { getNeatlogsTracer, getNeatlogsParentContext, isolateTracer, withNeatlogsSpan } from './core/provider.js';\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 // Hand the AI SDK an isolation-aware tracer: it calls startActiveSpan()\n // internally, which would otherwise parent its native spans from the foreign\n // global context AND push them onto it (so a co-tenant's next span inherits\n // ours). The facade routes both through the private Neatlogs context.\n tracer: isolateTracer(getNeatlogsTracer(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 // GenerateObjectResult — the structured object is the output, not `text`.\n // Without this the envelope (object+usage+response+…) gets stringified whole.\n if ('object' in r && 'finishReason' in r) {\n if (r.object !== undefined) {\n span.setAttribute('output.value', safeStringify(r.object));\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// Extract output from a streamText/streamObject `onFinish` event. The event\n// extends StepResult, so `text` (streamText) / `object` (streamObject) sit at\n// the top level alongside `finishReason` — but the event also carries `steps`,\n// `usage`, etc., so we pull only the meaningful fields instead of stringifying\n// the whole envelope.\nfunction setStreamOutputValue(span: Span, event: unknown): void {\n if (!event || typeof event !== 'object') return;\n const e = event as Record<string, unknown>;\n if (typeof e.text === 'string' && e.text) {\n span.setAttribute('output.value', e.text);\n } else if ('object' in e && e.object !== undefined) {\n const stringified = safeStringify(e.object);\n if (stringified) span.setAttribute('output.value', stringified);\n }\n if (e.finishReason) {\n span.setAttribute('gen_ai.finish_reason', String(e.finishReason));\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] = createStreamWrapper(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 // Our parent comes solely from the private span store; a\n // foreign provider's active span must never become our ancestor.\n return getNeatlogsParentContext();\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 = getNeatlogsTracer(TRACER_NAME);\n // startSpan (NOT startActiveSpan) + withNeatlogsSpan: startActiveSpan would\n // push our span onto the GLOBAL OTel context, so a foreign tracer's\n // startSpan() inside generateText() would read it as parent and inherit our\n // trace id. withNeatlogsSpan carries the parent in the private store in\n // the private context, leaving the global context untouched.\n const parentContext = getParentContext();\n const span = tracer.startSpan(\n `ai.${name}`,\n { attributes: { 'openinference.span.kind': rootSpanKind(name) } },\n parentContext,\n );\n return withNeatlogsSpan(\n span,\n async () => {\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 parentContext,\n );\n };\n}\n\n// streamText/streamObject return synchronously while the model keeps producing\n// tokens for seconds afterwards. Ending the span in a `finally` (as a plain sync\n// wrapper would) closes it in ~2ms with no output — the output only exists once\n// the stream finishes. Instead we keep the span open and end it from the AI SDK's\n// `onFinish` callback, where the final text/object is available. Any user-provided\n// `onFinish` is preserved and invoked first.\nfunction createStreamWrapper(\n name: WrappedFunctionName,\n original: (opts: any) => unknown,\n): (opts: any) => unknown {\n return function wrappedStreamFn(opts: any): unknown {\n const tracer = getNeatlogsTracer(TRACER_NAME);\n // startSpan + withNeatlogsSpan (see createAsyncWrapper) so streamText's\n // internals never see our span on the global OTel context. The span stays\n // open past the run scope and is ended from onFinish/onError.\n const parentContext = getParentContext();\n const span = tracer.startSpan(\n `ai.${name}`,\n { attributes: { 'openinference.span.kind': rootSpanKind(name) } },\n parentContext,\n );\n return withNeatlogsSpan(\n span,\n () => {\n let spanEnded = false;\n const endOnce = () => {\n if (spanEnded) return;\n spanEnded = true;\n span.end();\n };\n try {\n setInputValue(span, opts);\n const merged = mergeTelemetry(opts);\n const userOnFinish = opts?.onFinish;\n const userOnError = opts?.onError;\n const wrappedOpts = {\n ...merged,\n onFinish: async (event: any) => {\n try {\n setStreamOutputValue(span, event);\n } finally {\n endOnce();\n }\n if (typeof userOnFinish === 'function') {\n return userOnFinish(event);\n }\n },\n onError: (event: any) => {\n recordSpanError(span, (event && event.error) ?? event);\n endOnce();\n if (typeof userOnError === 'function') {\n return userOnError(event);\n }\n },\n };\n return original(wrappedOpts);\n } catch (err) {\n // Synchronous throw (e.g. bad arguments) — the stream never started.\n recordSpanError(span, err);\n endOnce();\n throw err;\n }\n },\n parentContext,\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 { SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { getProviderTracer } from './core/auto-root.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from './core/provider.js';\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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n `tool.${name}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': safeStringify(args),\n },\n },\n getNeatlogsParentContext(),\n );\n return withNeatlogsSpan(span, async () => {\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// 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 = getProviderTracer(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 }, getNeatlogsParentContext());\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 promise = withNeatlogsSpan(span, () => 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 = getProviderTracer(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 }, getNeatlogsParentContext());\n\n const promise = withNeatlogsSpan(span, () => 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 * Auto-root for direct-provider wrappers.\n *\n * The backend only renders a trace once it contains a *parentless* span of a\n * root-eligible kind (WORKFLOW / CHAIN / AGENT / MCP_TOOL). Direct-provider\n * wrappers (wrapOpenAI, wrapAnthropic, wrapBedrock, ...) only ever emit\n * non-root spans (LLM / EMBEDDING / TOOL). So a bare\n * `const client = wrapOpenAI(new OpenAI())` with no surrounding `span()` /\n * `trace()` produces an orphan span and the trace never renders.\n *\n * `getProviderTracer(name)` returns a Tracer facade used *only* by those\n * direct-provider wrappers: when `startSpan` would otherwise produce a\n * parentless, non-root span, it transparently opens a WORKFLOW root (named\n * after the configured `workflowName`) and ends it when the provider span\n * ends. Every wrapper path — non-streaming, streaming finalize, error —\n * funnels through `span.end()`, so wrapping `end()` covers them all with no\n * changes to the wrappers' streaming code.\n *\n * Framework wrappers (langchain, mastra, openai-agents, ai-sdk, ...) keep\n * using `trace.getTracer(...)` directly — they already emit their own root and\n * thread context explicitly, so auto-root must never fire for them.\n */\n\nimport {\n trace as otelTrace,\n type Tracer,\n type Span,\n type Context,\n type SpanOptions,\n} from '@opentelemetry/api';\n\nimport { getSessionConfig } from './context.js';\nimport { applySessionAttributes } from './session.js';\nimport { applyEndUserAttributes } from './end-user.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n getActiveNeatlogsSpan,\n} from './provider.js';\n\n// A parentless span of one of these kinds already satisfies the backend's\n// root requirement, so it must NOT be wrapped in another root.\nconst ROOT_KINDS = new Set(['workflow', 'chain', 'agent', 'mcp_tool']);\n\nfunction autoRootEnabled(): boolean {\n const val = (process.env.NEATLOGS_AUTO_ROOT ?? '').trim().toLowerCase();\n return !['false', '0', 'no', 'off'].includes(val);\n}\n\nfunction resolveRootWorkflowName(): string {\n try {\n const name = getSessionConfig()?.workflowName;\n if (typeof name === 'string' && name.trim()) return name;\n } catch {\n /* ignore */\n }\n return 'workflow';\n}\n\n/**\n * Stamp request-scoped identify() identity onto a freshly-created auto-root.\n * The auto-root IS the trace root, and wrapper-only code has no user-controlled\n * root to put trace()/span() args on, so identity comes purely from the\n * identify() context (passed undefined per-call values fall back to it).\n */\nfunction stampAutoRootIdentity(root: Span): void {\n applySessionAttributes(root, undefined, true);\n applyEndUserAttributes(root, undefined, undefined, true);\n}\n\n/**\n * Wrap a provider span so that ending it also ends the auto-created WORKFLOW\n * root. A Proxy keeps this transparent across OTel versions: every property /\n * method except `end` passes straight through to the child span.\n */\nfunction wrapSpanWithRoot(child: Span, root: Span): Span {\n let ended = false;\n return new Proxy(child, {\n get(target, prop, _receiver) {\n if (prop === 'end') {\n return (...args: any[]): void => {\n if (ended) return;\n ended = true;\n try {\n (target.end as (...a: any[]) => void)(...args);\n } finally {\n try {\n root.end();\n } catch {\n /* ignore */\n }\n }\n };\n }\n const value = Reflect.get(target, prop, target);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n}\n\n/**\n * Self-root helper for callback/event-driven handlers (LangChain, etc.).\n *\n * A callback handler builds its own parent context per run-id rather than going\n * through {@link AutoRootTracer}. When a run BEGINS with a non-root kind (a bare\n * `llm.invoke()` fires the LLM callback with no chain above it; a standalone\n * tool/retriever similarly), the span it creates is parentless and non-root, so\n * the backend can't anchor the trace and it never renders. Call this when there\n * is no LangChain parent: if the kind is non-root and nothing is actively\n * recording in `baseCtx`, it opens a WORKFLOW root and returns it plus the\n * child context to create the span in. The caller MUST end the returned\n * `root` after the child span ends (see {@link endAutoRoot}).\n *\n * Returns `{ root, ctx }` when a root was opened, or `{ root: undefined, ctx: baseCtx }`\n * when no auto-root is needed (root-eligible kind, already-recording parent, or\n * disabled).\n */\nexport function maybeOpenAutoRoot(\n tracer: Tracer,\n kind: string,\n baseCtx: Context,\n): { root: Span | undefined; ctx: Context } {\n const k = String(kind ?? '').toLowerCase();\n // A foreign provider's span must never count as our parent.\n const existing = getActiveNeatlogsSpan();\n if (\n !autoRootEnabled() ||\n ROOT_KINDS.has(k) ||\n (existing !== undefined && existing.isRecording())\n ) {\n return { root: undefined, ctx: baseCtx };\n }\n const root = tracer.startSpan(\n resolveRootWorkflowName(),\n { attributes: { 'neatlogs.span.kind': 'workflow', 'neatlogs.auto_root': true } },\n baseCtx,\n );\n stampAutoRootIdentity(root);\n return { root, ctx: otelTrace.setSpan(baseCtx, root) };\n}\n\n/** End an auto-root opened by {@link maybeOpenAutoRoot}. Safe on undefined. */\nexport function endAutoRoot(root: Span | undefined): void {\n if (!root) return;\n try {\n root.end();\n } catch {\n /* ignore */\n }\n}\n\nclass AutoRootTracer implements Tracer {\n constructor(private readonly _tracer: Tracer) {}\n\n startSpan(name: string, options?: SpanOptions, context?: Context): Span {\n const kind = String(\n (options?.attributes as Record<string, unknown> | undefined)?.[\n 'neatlogs.span.kind'\n ] ?? '',\n ).toLowerCase();\n\n // Parent from our private context, never the foreign global.\n const ctx = context ?? getNeatlogsParentContext();\n const parent = getActiveNeatlogsSpan();\n const needsRoot =\n autoRootEnabled() &&\n !ROOT_KINDS.has(kind) &&\n !(parent !== undefined && parent.isRecording());\n\n if (!needsRoot) {\n return this._tracer.startSpan(name, options, ctx);\n }\n\n const root = this._tracer.startSpan(\n resolveRootWorkflowName(),\n { attributes: { 'neatlogs.span.kind': 'workflow', 'neatlogs.auto_root': true } },\n ctx,\n );\n stampAutoRootIdentity(root);\n const childCtx = otelTrace.setSpan(ctx, root);\n const child = this._tracer.startSpan(name, options, childCtx);\n return wrapSpanWithRoot(child, root);\n }\n\n // startActiveSpan is used by traceTool (callback-scoped, always under an\n // active span in practice) — pass straight through, no auto-root.\n startActiveSpan = ((...args: any[]) =>\n (this._tracer.startActiveSpan as (...a: any[]) => any)(\n ...args,\n )) as Tracer['startActiveSpan'];\n}\n\n/**\n * Tracer for direct-provider wrappers (wrapOpenAI, wrapAnthropic, ...).\n * Identical to `trace.getTracer(name)` but adds transparent auto-root so a\n * bare `wrapOpenAI(new OpenAI())` renders a trace without a manual `span()` /\n * `trace()` wrapper. Do NOT use for framework wrappers.\n */\nexport function getProviderTracer(name: string): Tracer {\n // Resolve from the private provider.\n return new AutoRootTracer(getNeatlogsTracer(name));\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 { SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { getProviderTracer } from './core/auto-root.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from './core/provider.js';\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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n `tool.${name}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': safeStringify(input),\n },\n },\n getNeatlogsParentContext(),\n );\n return withNeatlogsSpan(span, async () => {\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// 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 = getProviderTracer(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 }, getNeatlogsParentContext());\n\n setInputMessages(span, opts?.system, messages);\n setTools(span, opts?.tools);\n setInvocationParams(span, opts);\n\n const promise = withNeatlogsSpan(span, () => 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 = getProviderTracer(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 }, getNeatlogsParentContext());\n\n setInputMessages(span, opts?.system, messages);\n setTools(span, opts?.tools);\n setInvocationParams(span, opts);\n\n const messageStream = withNeatlogsSpan(span, () => 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 Azure OpenAI wrapper — ES6 Proxy-based.\n *\n * Azure OpenAI is accessed through the `openai` SDK's `AzureOpenAI` client,\n * which exposes the same `chat.completions.create()` shape as `OpenAI`. This\n * wrapper traces those calls with provider `azure` so Azure traffic is\n * distinguished from direct OpenAI traffic.\n *\n * Usage:\n * import { wrapAzureOpenAI } from 'neatlogs/azure-openai';\n * import { AzureOpenAI } from 'openai';\n * const client = wrapAzureOpenAI(new AzureOpenAI({ endpoint, apiKey, apiVersion }));\n * await client.chat.completions.create({ model: 'gpt-4o', messages: [...] });\n *\n * Intercepts:\n * - client.chat.completions.create() — non-streaming and streaming\n * - client.responses.create() — Responses API\n */\n\nimport { SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { getProviderTracer } from './core/auto-root.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from './core/provider.js';\n\nconst TRACER_NAME = 'neatlogs.azure_openai';\nconst PROVIDER = 'azure';\nconst SYSTEM = 'azure';\n\nexport function wrapAzureOpenAI<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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n `tool.${name}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': safeStringify(args),\n },\n },\n getNeatlogsParentContext(),\n );\n return withNeatlogsSpan(span, async () => {\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\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 = getProviderTracer(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('azure_openai.chat.completions.create', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.system': SYSTEM,\n 'neatlogs.llm.model_name': model,\n 'neatlogs.llm.is_streaming': isStream,\n },\n }, getNeatlogsParentContext());\n\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 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 setInvocationParams(span, opts);\n\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 promise = withNeatlogsSpan(span, () => 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 = getProviderTracer(TRACER_NAME);\n const model = opts?.model ?? '';\n\n const span = tracer.startSpan('azure_openai.responses.create', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.system': SYSTEM,\n 'neatlogs.llm.model_name': model,\n 'input.value': safeStringify(opts?.input ?? ''),\n },\n }, getNeatlogsParentContext());\n\n const promise = withNeatlogsSpan(span, () => 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 Vertex AI wrapper — ES6 Proxy-based.\n *\n * Vertex AI is accessed through the same `@google/genai` SDK as Gemini, but in\n * Vertex mode (`new GoogleGenAI({ vertexai: true, project, location })`). This\n * wrapper traces those clients with provider `vertex_ai` so Vertex traffic is\n * distinguished from Google AI Studio (Gemini) traffic.\n *\n * Usage:\n * import { wrapVertexAI } from 'neatlogs/vertex-ai';\n * import { GoogleGenAI } from '@google/genai';\n * const client = wrapVertexAI(new GoogleGenAI({ vertexai: true, project: 'p', location: 'us-central1' }));\n * const res = await client.models.generateContent({ model: 'gemini-2.0-flash', contents: 'Hello' });\n *\n * Intercepts:\n * - client.models.generateContent() — non-streaming\n * - client.models.generateContentStream() — streaming (async iterable)\n * - client.models.embedContent() — embeddings\n * - client.models.countTokens() — token counting\n * - chat.sendMessage() / sendMessageStream() — chat sessions\n */\n\nimport { SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { getProviderTracer } from './core/auto-root.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from './core/provider.js';\n\nconst TRACER_NAME = 'neatlogs.vertex_ai';\nconst PROVIDER = 'vertex_ai';\nconst SYSTEM = 'vertexai';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function wrapVertexAI<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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n `tool.${name}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': safeStringify(args),\n },\n },\n getNeatlogsParentContext(),\n );\n return withNeatlogsSpan(span, async () => {\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// 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 === 'models.generateContent' && typeof value === 'function') {\n return tracedGenerateContent(value.bind(obj), false);\n }\n if (pathStr === 'models.generateContentStream' && typeof value === 'function') {\n return tracedGenerateContent(value.bind(obj), true);\n }\n if (pathStr === 'models.embedContent' && typeof value === 'function') {\n return tracedEmbedContent(value.bind(obj));\n }\n if (pathStr === 'models.countTokens' && typeof value === 'function') {\n return tracedCountTokens(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 > 2) return false;\n return ['models', 'chats'].includes(path[path.length - 1]);\n}\n\n/**\n * Wrap a chat session returned by `client.chats.create(...)`. The `@google/genai`\n * Chat object exposes `sendMessage` / `sendMessageStream`; wrap them so each turn\n * emits an LLM span. Returns the same chat instance.\n */\nexport function wrapVertexAIChat<T extends object>(chat: T): T {\n const c = chat as any;\n if (!c || c._neatlogsVertexPatched) return chat;\n\n if (typeof c.sendMessage === 'function') {\n const orig = c.sendMessage.bind(c);\n c.sendMessage = (params: any, ...rest: any[]) => tracedChatSend(orig, c, params, rest, false);\n }\n if (typeof c.sendMessageStream === 'function') {\n const orig = c.sendMessageStream.bind(c);\n c.sendMessageStream = (params: any, ...rest: any[]) => tracedChatSend(orig, c, params, rest, true);\n }\n\n try {\n Object.defineProperty(c, '_neatlogsVertexPatched', { value: true, enumerable: false, configurable: true });\n } catch {\n c._neatlogsVertexPatched = true;\n }\n return chat;\n}\n\nfunction tracedChatSend(\n original: (...a: any[]) => any,\n chat: any,\n params: any,\n rest: any[],\n isStream: boolean,\n): any {\n const tracer = getProviderTracer(TRACER_NAME);\n const model = chat?.model ?? chat?.modelVersion ?? '';\n const span = tracer.startSpan('vertex_ai.chat.send_message', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.system': SYSTEM,\n 'neatlogs.llm.model_name': model,\n 'neatlogs.llm.is_streaming': isStream,\n },\n }, getNeatlogsParentContext());\n\n // The chat sendMessage param shape is { message } (string or Part[]).\n const message = params?.message ?? params;\n span.setAttribute('neatlogs.llm.input_messages.0.role', 'user');\n span.setAttribute(\n 'neatlogs.llm.input_messages.0.content',\n (typeof message === 'string' ? message : safeStringify(message)),\n );\n\n const result = withNeatlogsSpan(span, () => original(params, ...rest));\n\n return Promise.resolve(result).then(\n (response: any) => {\n if (isStream) return wrapStream(response, span);\n finalizeResponse(span, response);\n return response;\n },\n (err: any) => {\n recordError(span, err);\n throw err;\n },\n );\n}\n\nfunction tracedEmbedContent(original: (...a: any[]) => any) {\n return function (opts: any, ...rest: any[]): any {\n const tracer = getProviderTracer(TRACER_NAME);\n const span = tracer.startSpan('vertex_ai.models.embed_content', {\n attributes: {\n 'neatlogs.span.kind': 'EMBEDDING',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.embedding.model_name': opts?.model ?? '',\n 'neatlogs.embedding.text': safeStringify(opts?.contents ?? ''),\n },\n }, getNeatlogsParentContext());\n\n const result = withNeatlogsSpan(span, () => original(opts, ...rest));\n\n return Promise.resolve(result).then(\n (response: any) => {\n const embeddings = response?.embeddings;\n if (Array.isArray(embeddings)) {\n span.setAttribute('neatlogs.embedding.count', embeddings.length);\n const vals = embeddings[0]?.values;\n if (Array.isArray(vals)) span.setAttribute('neatlogs.embedding.dimensions', vals.length);\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\nfunction tracedCountTokens(original: (...a: any[]) => any) {\n return function (opts: any, ...rest: any[]): any {\n const tracer = getProviderTracer(TRACER_NAME);\n const span = tracer.startSpan('vertex_ai.models.count_tokens', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.task': 'count_tokens',\n 'neatlogs.llm.model_name': opts?.model ?? '',\n },\n }, getNeatlogsParentContext());\n\n const result = withNeatlogsSpan(span, () => original(opts, ...rest));\n\n return Promise.resolve(result).then(\n (response: any) => {\n if (response?.totalTokens != null) span.setAttribute('neatlogs.llm.token_count.prompt', response.totalTokens);\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// generateContent / generateContentStream\n// ---------------------------------------------------------------------------\n\nfunction tracedGenerateContent(original: (...args: any[]) => any, isStream: boolean) {\n return function (opts: any, ...rest: any[]): any {\n const tracer = getProviderTracer(TRACER_NAME);\n const model = opts?.model ?? '';\n\n const span = tracer.startSpan('vertex_ai.models.generate_content', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.system': SYSTEM,\n 'neatlogs.llm.model_name': model,\n 'neatlogs.llm.is_streaming': isStream,\n },\n }, getNeatlogsParentContext());\n\n setInputAttributes(span, opts);\n\n const result = withNeatlogsSpan(span, () => original(opts, ...rest));\n\n return Promise.resolve(result).then(\n (response: any) => {\n if (isStream) {\n return wrapStream(response, span);\n }\n finalizeResponse(span, response);\n return response;\n },\n (err: any) => {\n recordError(span, err);\n throw err;\n },\n );\n };\n}\n\nfunction setInputAttributes(span: Span, opts: any): void {\n let idx = 0;\n\n const config = opts?.config;\n const systemInstruction = config?.systemInstruction ?? config?.system_instruction;\n if (systemInstruction) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'system');\n span.setAttribute(\n `neatlogs.llm.input_messages.${idx}.content`,\n typeof systemInstruction === 'string' ? systemInstruction : safeStringify(systemInstruction),\n );\n idx++;\n }\n\n const contents = opts?.contents;\n if (typeof contents === 'string') {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, contents);\n } else if (Array.isArray(contents)) {\n for (const item of contents) {\n if (typeof item === 'string') {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, item);\n idx++;\n } else if (item && typeof item === 'object') {\n const role = item.role ?? 'user';\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, role);\n const parts = item.parts ?? [];\n const textParts: string[] = [];\n for (const part of parts) {\n if (typeof part === 'string') textParts.push(part);\n else if (part?.text) textParts.push(part.text);\n }\n span.setAttribute(\n `neatlogs.llm.input_messages.${idx}.content`,\n textParts.length ? textParts.join('\\n') : safeStringify(parts),\n );\n idx++;\n }\n }\n } else if (contents) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, safeStringify(contents));\n }\n\n // Tools (function declarations)\n const tools = config?.tools;\n if (Array.isArray(tools)) {\n let t = 0;\n for (const tool of tools) {\n const decls = tool?.functionDeclarations ?? tool?.function_declarations ?? [];\n for (const fn of decls) {\n span.setAttribute(`neatlogs.llm.tools.${t}.name`, fn?.name ?? '');\n if (fn?.description) span.setAttribute(`neatlogs.llm.tools.${t}.description`, fn.description);\n if (fn?.parameters) span.setAttribute(`neatlogs.llm.tools.${t}.input_schema`, safeStringify(fn.parameters));\n t++;\n }\n }\n }\n\n // Invocation params\n if (config) {\n if (config.temperature != null) span.setAttribute('neatlogs.llm.temperature', config.temperature);\n if (config.topP != null) span.setAttribute('neatlogs.llm.top_p', config.topP);\n if (config.topK != null) span.setAttribute('neatlogs.llm.top_k', config.topK);\n const maxTokens = config.maxOutputTokens ?? config.max_output_tokens;\n if (maxTokens != null) span.setAttribute('neatlogs.llm.max_tokens', maxTokens);\n\n // Blob the backend reads for metadata.model_settings (the UI source).\n const params: Record<string, any> = {};\n if (config.temperature != null) params.temperature = config.temperature;\n if (config.topP != null) params.top_p = config.topP;\n if (config.topK != null) params.top_k = config.topK;\n if (maxTokens != null) params.max_tokens = maxTokens;\n if (config.frequencyPenalty != null) params.frequency_penalty = config.frequencyPenalty;\n if (config.presencePenalty != null) params.presence_penalty = config.presencePenalty;\n if (Object.keys(params).length > 0) {\n span.setAttribute('neatlogs.llm.invocation_parameters', JSON.stringify(params));\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Streaming support — @google/genai stream is an async iterable of chunks\n// ---------------------------------------------------------------------------\n\nfunction wrapStream(stream: any, span: Span): any {\n const chunks: any[] = [];\n const originalAsyncIterator = stream?.[Symbol.asyncIterator]?.bind(stream);\n\n if (!originalAsyncIterator) {\n finalizeStreamChunks(span, chunks);\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 let finishReason = '';\n let usage: any = null;\n\n for (const chunk of chunks) {\n for (const candidate of chunk?.candidates ?? []) {\n for (const part of candidate?.content?.parts ?? []) {\n if (part?.text && !part?.thought) textParts.push(part.text);\n }\n if (candidate?.finishReason) finishReason = candidate.finishReason;\n }\n if (chunk?.usageMetadata) usage = chunk.usageMetadata;\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 if (finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(finishReason));\n setUsage(span, usage);\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\n// ---------------------------------------------------------------------------\n// Non-streaming response finalization\n// ---------------------------------------------------------------------------\n\nfunction finalizeResponse(span: Span, response: any): void {\n const textParts: string[] = [];\n let toolIdx = 0;\n\n for (const candidate of response?.candidates ?? []) {\n for (const part of candidate?.content?.parts ?? []) {\n if (part?.text && !part?.thought) {\n textParts.push(part.text);\n } else if (part?.thought && part?.text) {\n span.setAttribute('neatlogs.llm.output_messages.0.thinking', part.text);\n } else if (part?.functionCall) {\n const fc = part.functionCall;\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.name`, fc?.name ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.arguments`, safeStringify(fc?.args ?? {}));\n toolIdx++;\n }\n }\n if (candidate?.finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(candidate.finishReason));\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\n setUsage(span, response?.usageMetadata);\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\nfunction setUsage(span: Span, usage: any): void {\n if (!usage) return;\n if (usage.promptTokenCount != null) span.setAttribute('neatlogs.llm.token_count.prompt', usage.promptTokenCount);\n if (usage.candidatesTokenCount != null) span.setAttribute('neatlogs.llm.token_count.completion', usage.candidatesTokenCount);\n if (usage.totalTokenCount != null) span.setAttribute('neatlogs.llm.token_count.total', usage.totalTokenCount);\n if (usage.cachedContentTokenCount != null) span.setAttribute('neatlogs.llm.token_count.cache_read', usage.cachedContentTokenCount);\n if (usage.thoughtsTokenCount != null) span.setAttribute('neatlogs.llm.token_count.reasoning', usage.thoughtsTokenCount);\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\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 Google Gemini wrapper — ES6 Proxy-based.\n *\n * Gemini (Google AI Studio) is accessed through the `@google/genai` SDK\n * (`new GoogleGenAI({ apiKey })`). This wrapper traces those clients with\n * provider `google` so Gemini traffic is distinguished from Vertex AI traffic\n * (see `wrapVertexAI`, which is the same SDK in `vertexai: true` mode).\n *\n * Mirrors Python's `neatlogs.wrap(genai.Client())`. If you prefer zero-code\n * instrumentation, pass `instrumentations: ['google_genai']` to `init()` instead.\n *\n * Usage:\n * import { wrapGoogleGenAI } from 'neatlogs/google-genai';\n * import { GoogleGenAI } from '@google/genai';\n * const client = wrapGoogleGenAI(new GoogleGenAI({ apiKey: process.env.GOOGLE_API_KEY }));\n * const res = await client.models.generateContent({ model: 'gemini-2.5-flash', contents: 'Hello' });\n *\n * Intercepts:\n * - client.models.generateContent() — non-streaming\n * - client.models.generateContentStream() — streaming (async iterable)\n * - client.models.embedContent() — embeddings\n * - client.models.countTokens() — token counting\n * - chat.sendMessage() / sendMessageStream() — chat sessions\n */\n\nimport { SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { getProviderTracer } from './core/auto-root.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from './core/provider.js';\n\nconst TRACER_NAME = 'neatlogs.google_genai';\nconst PROVIDER = 'google';\nconst SYSTEM = 'google_genai';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function wrapGoogleGenAI<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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n `tool.${name}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': safeStringify(args),\n },\n },\n getNeatlogsParentContext(),\n );\n return withNeatlogsSpan(span, async () => {\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// 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 === 'models.generateContent' && typeof value === 'function') {\n return tracedGenerateContent(value.bind(obj), false);\n }\n if (pathStr === 'models.generateContentStream' && typeof value === 'function') {\n return tracedGenerateContent(value.bind(obj), true);\n }\n if (pathStr === 'models.embedContent' && typeof value === 'function') {\n return tracedEmbedContent(value.bind(obj));\n }\n if (pathStr === 'models.countTokens' && typeof value === 'function') {\n return tracedCountTokens(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 > 2) return false;\n return ['models', 'chats'].includes(path[path.length - 1]);\n}\n\n/**\n * Wrap a chat session returned by `client.chats.create(...)`. The `@google/genai`\n * Chat object exposes `sendMessage` / `sendMessageStream`; wrap them so each turn\n * emits an LLM span. Returns the same chat instance.\n */\nexport function wrapGoogleGenAIChat<T extends object>(chat: T): T {\n const c = chat as any;\n if (!c || c._neatlogsGoogleGenAIPatched) return chat;\n\n if (typeof c.sendMessage === 'function') {\n const orig = c.sendMessage.bind(c);\n c.sendMessage = (params: any, ...rest: any[]) => tracedChatSend(orig, c, params, rest, false);\n }\n if (typeof c.sendMessageStream === 'function') {\n const orig = c.sendMessageStream.bind(c);\n c.sendMessageStream = (params: any, ...rest: any[]) => tracedChatSend(orig, c, params, rest, true);\n }\n\n try {\n Object.defineProperty(c, '_neatlogsGoogleGenAIPatched', { value: true, enumerable: false, configurable: true });\n } catch {\n c._neatlogsGoogleGenAIPatched = true;\n }\n return chat;\n}\n\nfunction tracedChatSend(\n original: (...a: any[]) => any,\n chat: any,\n params: any,\n rest: any[],\n isStream: boolean,\n): any {\n const tracer = getProviderTracer(TRACER_NAME);\n const model = chat?.model ?? chat?.modelVersion ?? '';\n const span = tracer.startSpan('google_genai.chat.send_message', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.system': SYSTEM,\n 'neatlogs.llm.model_name': model,\n 'neatlogs.llm.is_streaming': isStream,\n },\n }, getNeatlogsParentContext());\n\n // The chat sendMessage param shape is { message } (string or Part[]).\n const message = params?.message ?? params;\n span.setAttribute('neatlogs.llm.input_messages.0.role', 'user');\n span.setAttribute(\n 'neatlogs.llm.input_messages.0.content',\n (typeof message === 'string' ? message : safeStringify(message)),\n );\n\n const result = withNeatlogsSpan(span, () => original(params, ...rest));\n\n return Promise.resolve(result).then(\n (response: any) => {\n if (isStream) return wrapStream(response, span);\n finalizeResponse(span, response);\n return response;\n },\n (err: any) => {\n recordError(span, err);\n throw err;\n },\n );\n}\n\nfunction tracedEmbedContent(original: (...a: any[]) => any) {\n return function (opts: any, ...rest: any[]): any {\n const tracer = getProviderTracer(TRACER_NAME);\n const span = tracer.startSpan('google_genai.models.embed_content', {\n attributes: {\n 'neatlogs.span.kind': 'EMBEDDING',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.embedding.model_name': opts?.model ?? '',\n 'neatlogs.embedding.text': safeStringify(opts?.contents ?? ''),\n },\n }, getNeatlogsParentContext());\n\n const result = withNeatlogsSpan(span, () => original(opts, ...rest));\n\n return Promise.resolve(result).then(\n (response: any) => {\n const embeddings = response?.embeddings;\n if (Array.isArray(embeddings)) {\n span.setAttribute('neatlogs.embedding.count', embeddings.length);\n const vals = embeddings[0]?.values;\n if (Array.isArray(vals)) span.setAttribute('neatlogs.embedding.dimensions', vals.length);\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\nfunction tracedCountTokens(original: (...a: any[]) => any) {\n return function (opts: any, ...rest: any[]): any {\n const tracer = getProviderTracer(TRACER_NAME);\n const span = tracer.startSpan('google_genai.models.count_tokens', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.task': 'count_tokens',\n 'neatlogs.llm.model_name': opts?.model ?? '',\n },\n }, getNeatlogsParentContext());\n\n const result = withNeatlogsSpan(span, () => original(opts, ...rest));\n\n return Promise.resolve(result).then(\n (response: any) => {\n if (response?.totalTokens != null) span.setAttribute('neatlogs.llm.token_count.prompt', response.totalTokens);\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// generateContent / generateContentStream\n// ---------------------------------------------------------------------------\n\nfunction tracedGenerateContent(original: (...args: any[]) => any, isStream: boolean) {\n return function (opts: any, ...rest: any[]): any {\n const tracer = getProviderTracer(TRACER_NAME);\n const model = opts?.model ?? '';\n\n const span = tracer.startSpan('google_genai.models.generate_content', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.system': SYSTEM,\n 'neatlogs.llm.model_name': model,\n 'neatlogs.llm.is_streaming': isStream,\n },\n }, getNeatlogsParentContext());\n\n setInputAttributes(span, opts);\n\n const result = withNeatlogsSpan(span, () => original(opts, ...rest));\n\n return Promise.resolve(result).then(\n (response: any) => {\n if (isStream) {\n return wrapStream(response, span);\n }\n finalizeResponse(span, response);\n return response;\n },\n (err: any) => {\n recordError(span, err);\n throw err;\n },\n );\n };\n}\n\nfunction setInputAttributes(span: Span, opts: any): void {\n let idx = 0;\n\n const config = opts?.config;\n const systemInstruction = config?.systemInstruction ?? config?.system_instruction;\n if (systemInstruction) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'system');\n span.setAttribute(\n `neatlogs.llm.input_messages.${idx}.content`,\n typeof systemInstruction === 'string' ? systemInstruction : safeStringify(systemInstruction),\n );\n idx++;\n }\n\n const contents = opts?.contents;\n if (typeof contents === 'string') {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, contents);\n } else if (Array.isArray(contents)) {\n for (const item of contents) {\n if (typeof item === 'string') {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, item);\n idx++;\n } else if (item && typeof item === 'object') {\n const role = item.role ?? 'user';\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, role);\n const parts = item.parts ?? [];\n const textParts: string[] = [];\n for (const part of parts) {\n if (typeof part === 'string') textParts.push(part);\n else if (part?.text) textParts.push(part.text);\n }\n span.setAttribute(\n `neatlogs.llm.input_messages.${idx}.content`,\n textParts.length ? textParts.join('\\n') : safeStringify(parts),\n );\n idx++;\n }\n }\n } else if (contents) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, safeStringify(contents));\n }\n\n // Tools (function declarations)\n const tools = config?.tools;\n if (Array.isArray(tools)) {\n let t = 0;\n for (const tool of tools) {\n const decls = tool?.functionDeclarations ?? tool?.function_declarations ?? [];\n for (const fn of decls) {\n span.setAttribute(`neatlogs.llm.tools.${t}.name`, fn?.name ?? '');\n if (fn?.description) span.setAttribute(`neatlogs.llm.tools.${t}.description`, fn.description);\n if (fn?.parameters) span.setAttribute(`neatlogs.llm.tools.${t}.input_schema`, safeStringify(fn.parameters));\n t++;\n }\n }\n }\n\n // Invocation params\n if (config) {\n if (config.temperature != null) span.setAttribute('neatlogs.llm.temperature', config.temperature);\n if (config.topP != null) span.setAttribute('neatlogs.llm.top_p', config.topP);\n if (config.topK != null) span.setAttribute('neatlogs.llm.top_k', config.topK);\n const maxTokens = config.maxOutputTokens ?? config.max_output_tokens;\n if (maxTokens != null) span.setAttribute('neatlogs.llm.max_tokens', maxTokens);\n\n // Blob the backend reads for metadata.model_settings (the UI source).\n const params: Record<string, any> = {};\n if (config.temperature != null) params.temperature = config.temperature;\n if (config.topP != null) params.top_p = config.topP;\n if (config.topK != null) params.top_k = config.topK;\n if (maxTokens != null) params.max_tokens = maxTokens;\n if (config.frequencyPenalty != null) params.frequency_penalty = config.frequencyPenalty;\n if (config.presencePenalty != null) params.presence_penalty = config.presencePenalty;\n if (Object.keys(params).length > 0) {\n span.setAttribute('neatlogs.llm.invocation_parameters', JSON.stringify(params));\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Streaming support — @google/genai stream is an async iterable of chunks\n// ---------------------------------------------------------------------------\n\nfunction wrapStream(stream: any, span: Span): any {\n const chunks: any[] = [];\n const originalAsyncIterator = stream?.[Symbol.asyncIterator]?.bind(stream);\n\n if (!originalAsyncIterator) {\n finalizeStreamChunks(span, chunks);\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 let finishReason = '';\n let usage: any = null;\n\n for (const chunk of chunks) {\n for (const candidate of chunk?.candidates ?? []) {\n for (const part of candidate?.content?.parts ?? []) {\n if (part?.text && !part?.thought) textParts.push(part.text);\n }\n if (candidate?.finishReason) finishReason = candidate.finishReason;\n }\n if (chunk?.usageMetadata) usage = chunk.usageMetadata;\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 if (finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(finishReason));\n setUsage(span, usage);\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\n// ---------------------------------------------------------------------------\n// Non-streaming response finalization\n// ---------------------------------------------------------------------------\n\nfunction finalizeResponse(span: Span, response: any): void {\n const textParts: string[] = [];\n let toolIdx = 0;\n\n for (const candidate of response?.candidates ?? []) {\n for (const part of candidate?.content?.parts ?? []) {\n if (part?.text && !part?.thought) {\n textParts.push(part.text);\n } else if (part?.thought && part?.text) {\n span.setAttribute('neatlogs.llm.output_messages.0.thinking', part.text);\n } else if (part?.functionCall) {\n const fc = part.functionCall;\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.name`, fc?.name ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.arguments`, safeStringify(fc?.args ?? {}));\n toolIdx++;\n }\n }\n if (candidate?.finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(candidate.finishReason));\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\n setUsage(span, response?.usageMetadata);\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\nfunction setUsage(span: Span, usage: any): void {\n if (!usage) return;\n if (usage.promptTokenCount != null) span.setAttribute('neatlogs.llm.token_count.prompt', usage.promptTokenCount);\n if (usage.candidatesTokenCount != null) span.setAttribute('neatlogs.llm.token_count.completion', usage.candidatesTokenCount);\n if (usage.totalTokenCount != null) span.setAttribute('neatlogs.llm.token_count.total', usage.totalTokenCount);\n if (usage.cachedContentTokenCount != null) span.setAttribute('neatlogs.llm.token_count.cache_read', usage.cachedContentTokenCount);\n if (usage.thoughtsTokenCount != null) span.setAttribute('neatlogs.llm.token_count.reasoning', usage.thoughtsTokenCount);\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\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 AWS Bedrock wrapper.\n *\n * The AWS SDK v3 `BedrockRuntimeClient` dispatches every API through\n * `client.send(new XCommand({...}))`. This wrapper intercepts `send`, inspects\n * the command, and traces the Converse and InvokeModel APIs. Token extraction\n * handles Claude, Titan, and Llama response formats.\n *\n * Usage:\n * import { wrapBedrock } from 'neatlogs/bedrock';\n * import { BedrockRuntimeClient, ConverseCommand } from '@aws-sdk/client-bedrock-runtime';\n * const client = wrapBedrock(new BedrockRuntimeClient({ region: 'us-east-1' }));\n * await client.send(new ConverseCommand({ modelId, messages }));\n *\n * `neatlogs.llm.provider` is always `bedrock`; `neatlogs.llm.system` is the\n * underlying model vendor (anthropic / amazon / meta / ...), inferred from modelId.\n */\n\nimport { SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { getProviderTracer } from './core/auto-root.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from './core/provider.js';\n\nconst TRACER_NAME = 'neatlogs.bedrock';\nconst PROVIDER = 'bedrock';\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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n `tool.${name}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': safeStringify(args),\n },\n },\n getNeatlogsParentContext(),\n );\n return withNeatlogsSpan(span, async () => {\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\nexport function wrapBedrock<T extends object>(client: T): T {\n const c = client as any;\n if (c._neatlogsBedrockPatched) return client;\n if (typeof c.send !== 'function') return client;\n\n const originalSend = c.send.bind(c);\n\n c.send = function (command: any, ...rest: any[]): any {\n const name = command?.constructor?.name ?? '';\n const input = command?.input ?? {};\n\n if (name === 'ConverseCommand') {\n return tracedConverse(originalSend, command, input, rest, false);\n }\n if (name === 'ConverseStreamCommand') {\n return tracedConverse(originalSend, command, input, rest, true);\n }\n if (name === 'InvokeModelCommand') {\n return tracedInvokeModel(originalSend, command, input, rest, false);\n }\n if (name === 'InvokeModelWithResponseStreamCommand') {\n return tracedInvokeModel(originalSend, command, input, rest, true);\n }\n\n return originalSend(command, ...rest);\n };\n\n c._neatlogsBedrockPatched = true;\n return client;\n}\n\n// ---------------------------------------------------------------------------\n// Vendor / span helpers\n// ---------------------------------------------------------------------------\n\nfunction vendorFromModel(modelId: any): string {\n let tail = String(modelId ?? '').split('/').pop() ?? '';\n for (const prefix of ['us.', 'eu.', 'apac.', 'us-gov.']) {\n if (tail.startsWith(prefix)) tail = tail.slice(prefix.length);\n }\n const vendor = tail.includes('.') ? tail.split('.')[0] : '';\n return vendor || 'bedrock';\n}\n\nfunction startSpan(name: string, modelId: any, isStream: boolean): Span {\n return getProviderTracer(TRACER_NAME).startSpan(name, {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.system': vendorFromModel(modelId),\n 'neatlogs.llm.model_name': String(modelId ?? ''),\n 'neatlogs.llm.is_streaming': isStream,\n },\n }, getNeatlogsParentContext());\n}\n\n// ---------------------------------------------------------------------------\n// Converse API\n// ---------------------------------------------------------------------------\n\nfunction tracedConverse(\n originalSend: (...a: any[]) => any,\n command: any,\n input: any,\n rest: any[],\n isStream: boolean,\n): any {\n const span = startSpan(\n isStream ? 'bedrock.converse_stream' : 'bedrock.converse',\n input?.modelId,\n isStream,\n );\n setConverseInput(span, input);\n\n const promise = withNeatlogsSpan(span, () => originalSend(command, ...rest));\n\n return promise.then(\n (response: any) => {\n if (isStream) {\n return wrapConverseStream(response, span);\n }\n finalizeConverse(span, response);\n return response;\n },\n (err: any) => {\n recordError(span, err);\n throw err;\n },\n );\n}\n\nfunction setConverseInput(span: Span, input: any): void {\n let idx = 0;\n\n if (Array.isArray(input?.system)) {\n const text = input.system.map((b: any) => b?.text ?? '').join(' ').trim();\n if (text) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'system');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, text);\n idx++;\n }\n }\n\n for (const msg of input?.messages ?? []) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, msg?.role ?? 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, converseBlocksToText(msg?.content));\n idx++;\n }\n\n const cfg = input?.inferenceConfig ?? {};\n if (cfg.temperature != null) span.setAttribute('neatlogs.llm.temperature', cfg.temperature);\n if (cfg.topP != null) span.setAttribute('neatlogs.llm.top_p', cfg.topP);\n if (cfg.maxTokens != null) span.setAttribute('neatlogs.llm.max_tokens', cfg.maxTokens);\n\n const tools = input?.toolConfig?.tools ?? [];\n for (let i = 0; i < tools.length; i++) {\n const spec = tools[i]?.toolSpec ?? {};\n if (spec.name) span.setAttribute(`neatlogs.llm.tools.${i}.name`, spec.name);\n if (spec.description) span.setAttribute(`neatlogs.llm.tools.${i}.description`, spec.description);\n if (spec.inputSchema) span.setAttribute(`neatlogs.llm.tools.${i}.input_schema`, safeStringify(spec.inputSchema));\n }\n}\n\nfunction converseBlocksToText(content: any): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return safeStringify(content);\n const parts: string[] = [];\n for (const block of content) {\n if (block && typeof block === 'object') {\n if ('text' in block) parts.push(String(block.text));\n else if ('toolResult' in block) parts.push(safeStringify(block.toolResult));\n else if ('toolUse' in block) parts.push(safeStringify(block.toolUse));\n else parts.push(safeStringify(block));\n } else {\n parts.push(String(block));\n }\n }\n return parts.join('\\n');\n}\n\nfunction finalizeConverse(span: Span, response: any): void {\n const content = response?.output?.message?.content ?? [];\n const textParts: string[] = [];\n let toolIdx = 0;\n\n for (const block of content) {\n if (!block || typeof block !== 'object') continue;\n if ('text' in block) {\n textParts.push(String(block.text));\n } else if ('toolUse' in block) {\n const tu = block.toolUse;\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.id`, String(tu?.toolUseId ?? ''));\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.name`, String(tu?.name ?? ''));\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.arguments`, safeStringify(tu?.input ?? {}));\n toolIdx++;\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 (response?.stopReason) span.setAttribute('neatlogs.llm.finish_reason', String(response.stopReason));\n setConverseUsage(span, response?.usage);\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\nfunction setConverseUsage(span: Span, usage: any): void {\n if (!usage) return;\n if (usage.inputTokens != null) span.setAttribute('neatlogs.llm.token_count.prompt', usage.inputTokens);\n if (usage.outputTokens != null) span.setAttribute('neatlogs.llm.token_count.completion', usage.outputTokens);\n if (usage.totalTokens != null) span.setAttribute('neatlogs.llm.token_count.total', usage.totalTokens);\n if (usage.cacheReadInputTokens != null) span.setAttribute('neatlogs.llm.token_count.cache_read', usage.cacheReadInputTokens);\n if (usage.cacheWriteInputTokens != null) span.setAttribute('neatlogs.llm.token_count.cache_write', usage.cacheWriteInputTokens);\n}\n\nfunction wrapConverseStream(response: any, span: Span): any {\n const stream = response?.stream;\n if (!stream || typeof stream[Symbol.asyncIterator] !== 'function') {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return response;\n }\n\n const originalIterator = stream[Symbol.asyncIterator].bind(stream);\n const textParts: string[] = [];\n const toolCalls: Record<number, { id: string; name: string; arguments: string }> = {};\n let finishReason = '';\n let usage: any = null;\n\n const wrappedStream = {\n [Symbol.asyncIterator]() {\n const iterator = originalIterator();\n return {\n async next(): Promise<IteratorResult<any>> {\n try {\n const result = await iterator.next();\n if (result.done) {\n finalizeConverseStream(span, textParts, toolCalls, finishReason, usage);\n return result;\n }\n const ev = result.value;\n const delta = ev?.contentBlockDelta?.delta;\n if (delta?.text) textParts.push(delta.text);\n if (delta?.toolUse?.input) {\n const idx = ev.contentBlockDelta.contentBlockIndex ?? 0;\n toolCalls[idx] = toolCalls[idx] ?? { id: '', name: '', arguments: '' };\n toolCalls[idx].arguments += delta.toolUse.input;\n }\n const startBlk = ev?.contentBlockStart?.start?.toolUse;\n if (startBlk) {\n const idx = ev.contentBlockStart.contentBlockIndex ?? 0;\n toolCalls[idx] = toolCalls[idx] ?? { id: '', name: '', arguments: '' };\n toolCalls[idx].name = startBlk.name ?? '';\n toolCalls[idx].id = startBlk.toolUseId ?? '';\n }\n if (ev?.messageStop?.stopReason) finishReason = ev.messageStop.stopReason;\n if (ev?.metadata?.usage) usage = ev.metadata.usage;\n return result;\n } catch (err) {\n recordError(span, err);\n throw err;\n }\n },\n async return(value?: any): Promise<IteratorResult<any>> {\n finalizeConverseStream(span, textParts, toolCalls, finishReason, usage);\n return iterator.return?.(value) ?? { done: true, value: undefined };\n },\n };\n },\n };\n\n response.stream = wrappedStream;\n return response;\n}\n\nfunction finalizeConverseStream(\n span: Span,\n textParts: string[],\n toolCalls: Record<number, { id: string; name: string; arguments: string }>,\n finishReason: string,\n usage: any,\n): void {\n const full = textParts.join('');\n if (full) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', full);\n }\n let j = 0;\n for (const tc of Object.values(toolCalls)) {\n if (tc.id) 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 if (finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(finishReason));\n setConverseUsage(span, usage);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\n// ---------------------------------------------------------------------------\n// InvokeModel API (vendor-specific body formats)\n// ---------------------------------------------------------------------------\n\nfunction isEmbeddingModel(modelId: any): boolean {\n return String(modelId ?? '').toLowerCase().includes('embed');\n}\n\nfunction tracedInvokeModel(\n originalSend: (...a: any[]) => any,\n command: any,\n input: any,\n rest: any[],\n isStream: boolean,\n): any {\n const vendor = vendorFromModel(input?.modelId);\n const isEmbedding = !isStream && isEmbeddingModel(input?.modelId);\n const bodyIn = decodeBody(input?.body);\n\n let span: Span;\n if (isEmbedding) {\n span = getProviderTracer(TRACER_NAME).startSpan('bedrock.invoke_model', {\n attributes: {\n 'neatlogs.span.kind': 'EMBEDDING',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.embedding.model_name': String(input?.modelId ?? ''),\n },\n }, getNeatlogsParentContext());\n const text = bodyIn?.inputText ?? bodyIn?.texts ?? bodyIn?.input_text;\n if (text) {\n span.setAttribute('neatlogs.embedding.text', (typeof text === 'string' ? text : safeStringify(text)));\n }\n } else {\n span = startSpan(\n isStream ? 'bedrock.invoke_model_with_response_stream' : 'bedrock.invoke_model',\n input?.modelId,\n isStream,\n );\n setInvokeInput(span, vendor, bodyIn);\n }\n\n const promise = withNeatlogsSpan(span, () => originalSend(command, ...rest));\n\n return promise.then(\n (response: any) => {\n if (isStream) {\n return wrapInvokeStream(response, span, vendor);\n }\n try {\n if (isEmbedding) {\n finalizeInvokeEmbedding(span, decodeBody(response?.body));\n } else {\n finalizeInvoke(span, vendor, decodeBody(response?.body));\n }\n } catch {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n }\n return response;\n },\n (err: any) => {\n recordError(span, err);\n throw err;\n },\n );\n}\n\nfunction finalizeInvokeEmbedding(span: Span, body: any): void {\n const emb = body?.embedding;\n const embs = body?.embeddings;\n if (Array.isArray(emb)) {\n span.setAttribute('neatlogs.embedding.count', 1);\n span.setAttribute('neatlogs.embedding.dimensions', emb.length);\n } else if (Array.isArray(embs) && embs.length) {\n span.setAttribute('neatlogs.embedding.count', embs.length);\n if (Array.isArray(embs[0])) span.setAttribute('neatlogs.embedding.dimensions', embs[0].length);\n }\n if (body?.inputTextTokenCount != null) {\n span.setAttribute('neatlogs.llm.token_count.prompt', body.inputTextTokenCount);\n span.setAttribute('neatlogs.embedding.token_count', body.inputTextTokenCount);\n }\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\nfunction decodeBody(body: any): any {\n try {\n if (body == null) return {};\n if (typeof body === 'string') return JSON.parse(body);\n // Uint8Array (AWS SDK v3 returns the response body as bytes)\n if (body instanceof Uint8Array) return JSON.parse(new TextDecoder().decode(body));\n if (typeof body === 'object' && typeof body.byteLength === 'number') {\n return JSON.parse(new TextDecoder().decode(body));\n }\n if (typeof body === 'object') return body;\n } catch {\n /* fall through */\n }\n return {};\n}\n\nfunction setInvokeInput(span: Span, vendor: string, body: any): void {\n let idx = 0;\n if (body?.system) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'system');\n span.setAttribute(\n `neatlogs.llm.input_messages.${idx}.content`,\n typeof body.system === 'string' ? body.system : safeStringify(body.system),\n );\n idx++;\n }\n if (Array.isArray(body?.messages)) {\n for (const msg of body.messages) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, msg?.role ?? 'user');\n span.setAttribute(\n `neatlogs.llm.input_messages.${idx}.content`,\n typeof msg?.content === 'string' ? msg.content : safeStringify(msg?.content),\n );\n idx++;\n }\n } else if (body?.prompt) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, String(body.prompt));\n } else if (body?.inputText) {\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.role`, 'user');\n span.setAttribute(`neatlogs.llm.input_messages.${idx}.content`, String(body.inputText));\n }\n\n if (body?.temperature != null) span.setAttribute('neatlogs.llm.temperature', body.temperature);\n if (body?.top_p != null) span.setAttribute('neatlogs.llm.top_p', body.top_p);\n const maxTokens = body?.max_tokens ?? body?.maxTokens ?? body?.max_tokens_to_sample;\n if (maxTokens != null) span.setAttribute('neatlogs.llm.max_tokens', maxTokens);\n const cfg = body?.textGenerationConfig;\n if (cfg) {\n if (cfg.temperature != null) span.setAttribute('neatlogs.llm.temperature', cfg.temperature);\n if (cfg.topP != null) span.setAttribute('neatlogs.llm.top_p', cfg.topP);\n if (cfg.maxTokenCount != null) span.setAttribute('neatlogs.llm.max_tokens', cfg.maxTokenCount);\n }\n}\n\nfunction finalizeInvoke(span: Span, vendor: string, body: any): void {\n let text: string | undefined;\n let promptTokens: number | undefined;\n let completionTokens: number | undefined;\n let finishReason: string | undefined;\n\n if (vendor === 'anthropic') {\n if (Array.isArray(body?.content)) {\n text = body.content.filter((b: any) => b?.type === 'text').map((b: any) => b.text).join('');\n let toolIdx = 0;\n for (const b of body.content) {\n if (b?.type === 'tool_use') {\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.id`, String(b.id ?? ''));\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.name`, String(b.name ?? ''));\n span.setAttribute(`neatlogs.llm.tool_calls.${toolIdx}.arguments`, safeStringify(b.input ?? {}));\n toolIdx++;\n }\n }\n } else if (body?.completion != null) {\n text = body.completion;\n }\n promptTokens = body?.usage?.input_tokens;\n completionTokens = body?.usage?.output_tokens;\n finishReason = body?.stop_reason;\n } else if (vendor === 'amazon') {\n const r = Array.isArray(body?.results) ? body.results[0] : undefined;\n if (r) {\n text = r.outputText;\n completionTokens = r.tokenCount;\n finishReason = r.completionReason;\n }\n promptTokens = body?.inputTextTokenCount;\n } else if (vendor === 'meta') {\n text = body?.generation;\n promptTokens = body?.prompt_token_count;\n completionTokens = body?.generation_token_count;\n finishReason = body?.stop_reason;\n } else if (vendor === 'cohere') {\n const g = Array.isArray(body?.generations) ? body.generations[0] : undefined;\n if (g) {\n text = g.text;\n finishReason = g.finish_reason;\n }\n } else {\n text = body?.generation ?? body?.completion ?? body?.outputText;\n }\n\n if (text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', String(text));\n }\n if (promptTokens != null) span.setAttribute('neatlogs.llm.token_count.prompt', promptTokens);\n if (completionTokens != null) span.setAttribute('neatlogs.llm.token_count.completion', completionTokens);\n if (promptTokens != null && completionTokens != null) {\n span.setAttribute('neatlogs.llm.token_count.total', promptTokens + completionTokens);\n }\n if (finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(finishReason));\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\nfunction wrapInvokeStream(response: any, span: Span, vendor: string): any {\n const body = response?.body;\n if (!body || typeof body[Symbol.asyncIterator] !== 'function') {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return response;\n }\n\n const originalIterator = body[Symbol.asyncIterator].bind(body);\n const textParts: string[] = [];\n let promptTokens: number | undefined;\n let completionTokens: number | undefined;\n let finishReason: string | undefined;\n\n const finalize = () => {\n const full = textParts.join('');\n if (full) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', full);\n }\n if (promptTokens != null) span.setAttribute('neatlogs.llm.token_count.prompt', promptTokens);\n if (completionTokens != null) span.setAttribute('neatlogs.llm.token_count.completion', completionTokens);\n if (finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(finishReason));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n };\n\n const wrappedBody = {\n [Symbol.asyncIterator]() {\n const iterator = originalIterator();\n return {\n async next(): Promise<IteratorResult<any>> {\n try {\n const result = await iterator.next();\n if (result.done) {\n finalize();\n return result;\n }\n const data = decodeBody(result.value?.chunk?.bytes);\n if (data?.type === 'content_block_delta') {\n textParts.push(data?.delta?.text ?? '');\n } else if (data?.type === 'message_delta') {\n if (data?.delta?.stop_reason) finishReason = data.delta.stop_reason;\n if (data?.usage?.output_tokens != null) completionTokens = data.usage.output_tokens;\n }\n if (data?.outputText) textParts.push(data.outputText);\n if (data?.generation) textParts.push(data.generation);\n const metrics = data?.['amazon-bedrock-invocationMetrics'];\n if (metrics) {\n promptTokens = metrics.inputTokenCount ?? promptTokens;\n completionTokens = metrics.outputTokenCount ?? completionTokens;\n }\n return result;\n } catch (err) {\n recordError(span, err);\n throw err;\n }\n },\n async return(value?: any): Promise<IteratorResult<any>> {\n finalize();\n return iterator.return?.(value) ?? { done: true, value: undefined };\n },\n };\n },\n };\n\n response.body = wrappedBody;\n return response;\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\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, SpanStatusCode, type Span, type Context } from '@opentelemetry/api';\nimport { maybeOpenAutoRoot, endAutoRoot } from './core/auto-root.js';\nimport { getNeatlogsTracer, getNeatlogsBaseContext } from './core/provider.js';\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 // Auto-root spans keyed by the run-id of the child that triggered them.\n private _autoRoots: Map<string, Span> = new Map();\n private _workflowName: string | undefined;\n\n constructor(opts?: LangchainHandlerOptions) {\n this._workflowName = opts?.workflowName;\n }\n\n // --- Self-rooting ----------------------------------------------------------\n //\n // A LangChain run can begin with ANY callback. When it begins with a non-root\n // kind (a bare `llm.invoke()` fires handleChatModelStart/handleLLMStart with no\n // chain above it; a standalone tool/retriever similarly), the span we create is\n // parentless and non-root -> the backend can't anchor the trace and it never\n // renders. Open a WORKFLOW root transparently in that case so just adding the\n // handler yields a complete trace. A top-level CHAIN is already root-eligible.\n private _startCtx(parentRunId: string | undefined, runId: string, kind: string): Context {\n // Base context is ROOT_CONTEXT in isolated mode so a foreign provider's\n // active span can never leak in as our ancestor; parent linkage comes\n // solely from our own run-id → span map.\n const base = getNeatlogsBaseContext();\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n if (parentSpan) {\n return trace.setSpan(base, parentSpan);\n }\n const tracer = getNeatlogsTracer(TRACER_NAME);\n const { root, ctx } = maybeOpenAutoRoot(tracer, kind, base);\n if (root) this._autoRoots.set(runId, root);\n return ctx;\n }\n\n private _endAutoRoot(runId: string): void {\n const root = this._autoRoots.get(runId);\n if (root) {\n endAutoRoot(root);\n this._autoRoots.delete(runId);\n }\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 = getNeatlogsTracer(TRACER_NAME);\n const name = serialized?.name ?? serialized?.id?.at(-1) ?? 'chain';\n\n const parentCtx = this._startCtx(parentRunId, runId, 'chain');\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);\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));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n this._endAutoRoot(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 this._endAutoRoot(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 = getNeatlogsTracer(TRACER_NAME);\n const model = serialized?.kwargs?.model_name ?? serialized?.kwargs?.model ?? serialized?.name ?? '';\n\n const parentCtx = this._startCtx(parentRunId, runId, 'llm');\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];\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 = getNeatlogsTracer(TRACER_NAME);\n const model = serialized?.kwargs?.model_name ?? serialized?.kwargs?.model ?? serialized?.name ?? '';\n\n const parentCtx = this._startCtx(parentRunId, runId, 'llm');\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;\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));\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 this._endAutoRoot(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 this._endAutoRoot(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 = getNeatlogsTracer(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 parentCtx = this._startCtx(parentRunId, runId, 'tool');\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': String(input),\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));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n this._endAutoRoot(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 this._endAutoRoot(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 = getNeatlogsTracer(TRACER_NAME);\n const name = serialized?.name ?? 'retriever';\n\n const parentCtx = this._startCtx(parentRunId, runId, 'retriever');\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'RETRIEVER',\n 'neatlogs.retriever.name': name,\n 'input.value': query,\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);\n }\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n this._endAutoRoot(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 this._endAutoRoot(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 * Strands currently creates and activates spans through the process-global\n * OpenTelemetry context. Neatlogs always uses a private provider, so this\n * integration is rejected until Strands can accept an injected private-context\n * runtime or Neatlogs ships an explicit wrapper that owns span creation.\n */\nexport function strandsHooks<T extends object>(_agent: T): T {\n throw new Error(\n 'strandsHooks() is not supported because the Strands Agents tracer creates ' +\n 'and activates spans on the global OpenTelemetry context ' +\n '(context.active() / context.with()), which cannot be isolated from other ' +\n 'tracing SDKs (Datadog, etc.).',\n );\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, SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { getNeatlogsTracer, getNeatlogsBaseContext } from './core/provider.js';\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 = getNeatlogsTracer(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 }, getNeatlogsBaseContext());\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 = getNeatlogsTracer(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\n // forms. Base is ROOT_CONTEXT in isolated mode so a foreign provider's\n // active span can never leak in as our ancestor.\n const base = getNeatlogsBaseContext();\n const parentKey = String(span?.parentId ?? span?.traceId ?? span?.trace_id ?? '');\n const parentSpan = this._spans.get(parentKey);\n const parentCtx = parentSpan ? trace.setSpan(base, parentSpan) : base;\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));\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));\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);\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)));\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)));\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)));\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 {\n SpanStatusCode,\n type Span,\n} from '@opentelemetry/api';\nimport {\n getNeatlogsParentContext,\n getNeatlogsTracer,\n withNeatlogsSpan,\n} from './core/provider.js';\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', {\n 'neatlogs.span.kind': 'RERANKER',\n 'input.value': safeStringify({\n documents: args?.[0],\n query: args?.[1],\n options: args?.[3],\n }),\n }, (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);\n span.setAttribute('input.value', query);\n }\n if (Array.isArray(results)) span.setAttribute('neatlogs.reranker.input_documents', safeStringify(results));\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));\n span.setAttribute('output.value', toOutputValue(result));\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 patchDynamicToolsets(opts?.toolsets);\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;\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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n `mastra.agent.${agentName}`,\n { attributes: attrs },\n getNeatlogsParentContext(),\n );\n try {\n const result = await withNeatlogsSpan(span, () => orig(input, opts));\n return wrapStreamingOutput(result, span);\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/** Patch per-call Mastra toolsets (for example dynamically loaded MCP tools). */\nfunction patchDynamicToolsets(toolsets: any): void {\n if (!toolsets || typeof toolsets !== 'object') return;\n for (const [toolsetName, tools] of Object.entries<any>(toolsets)) {\n if (!tools || typeof tools !== 'object') continue;\n for (const [key, tool] of Object.entries<any>(tools)) {\n patchToolExecute(tool, `${toolsetName}.${key}`);\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);\n captureInvocationParams(attrs, callOpts);\n\n const spanName = `mastra.llm.${modelId || 'model'}.${fn}`;\n if (isStream) {\n return traceStreamingModelCall(spanName, attrs, callOpts, orig);\n }\n return withActiveSpan(spanName, attrs, async (span) => {\n const result = await orig(callOpts);\n finalizeModelResult(span, result);\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 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\n // Resolve and scan on every agent invocation. Workspace/skill tools can be\n // materialized lazily or change per request; patchToolExecute itself is\n // idempotent, so rescanning catches new tools without double-wrapping old\n // ones.\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),\n };\n if (tool.description) attrs['neatlogs.tool.description'] = String(tool.description);\n\n return withActiveSpan(`mastra.tool.${toolName}`, attrs, async (span) => {\n const result = await orig(params, options);\n span.setAttribute('output.value', toOutputValue(result));\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 'input.value': safeStringify(startOpts ?? {}),\n };\n if (startOpts?.inputData !== undefined) attrs['input.value'] = safeStringify(startOpts.inputData);\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));\n } else {\n span.setAttribute('output.value', toOutputValue(result));\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),\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', toOutputValue(result));\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]),\n };\n return withActiveSpan(`mastra.memory.${op}`, attrs, async (span) => {\n const result = await orig(...args);\n span.setAttribute('output.value', summarizeMemoryOutput(op, args?.[0], result));\n return result;\n });\n };\n }\n}\n\nfunction summarizeMemoryOutput(op: string, input: any, result: unknown): string {\n if (result !== undefined) return toOutputValue(result);\n\n const summary: Record<string, unknown> = { completed: true };\n if (op === 'saveMessages') {\n summary.messageCount = Array.isArray(input?.messages) ? input.messages.length : 0;\n } else if (op === 'deleteMessages') {\n const ids = input?.messageIds ?? input?.ids;\n if (Array.isArray(ids)) summary.requestedCount = ids.length;\n } else if (op === 'recall') {\n summary.resultCount = 0;\n }\n return safeStringify(summary);\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 'input.value': safeStringify(args),\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 span.setAttribute('output.value', toOutputValue(result));\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): any {\n if (!output) {\n span.setAttribute('output.value', toOutputValue(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);\n span.setAttribute('output.value', text);\n } else {\n span.setAttribute('output.value', safeStringify({\n finishReason: finishReason ?? 'completed',\n }));\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, span);\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 const text = textParts.join('');\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', text);\n span.setAttribute('output.value', text);\n } else {\n span.setAttribute('output.value', safeStringify({ streamCompleted: true }));\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, span: Span): 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 return new Proxy(value, {\n get(stream, streamProp, streamReceiver) {\n if (streamProp === Symbol.asyncIterator) {\n return () => wrapBoundIterator(stream[Symbol.asyncIterator](), span);\n }\n const streamValue = Reflect.get(stream, streamProp, streamReceiver);\n if (streamProp === 'getReader' && typeof streamValue === 'function') {\n return (...args: any[]) => {\n const reader: any = Reflect.apply(streamValue, stream, args);\n return new Proxy(reader, {\n get(readerTarget, readerProp, readerReceiver) {\n const readerValue = Reflect.get(readerTarget, readerProp, readerReceiver);\n if (typeof readerValue !== 'function') return readerValue;\n if (readerProp === 'read' || readerProp === 'cancel') {\n return (...readerArgs: any[]) =>\n withNeatlogsSpan(span, () =>\n Reflect.apply(readerValue, readerTarget, readerArgs),\n );\n }\n return readerValue.bind(readerTarget);\n },\n });\n };\n }\n return typeof streamValue === 'function'\n ? streamValue.bind(stream)\n : streamValue;\n },\n });\n }\n if (typeof value === 'function') return value.bind(target);\n return value;\n },\n });\n}\n\nfunction wrapBoundIterator(iterator: any, span: Span): any {\n return {\n next: (...args: any[]) =>\n withNeatlogsSpan(span, () => iterator.next(...args)),\n return: iterator.return\n ? (...args: any[]) =>\n withNeatlogsSpan(span, () => iterator.return(...args))\n : undefined,\n throw: iterator.throw\n ? (...args: any[]) =>\n withNeatlogsSpan(span, () => iterator.throw(...args))\n : undefined,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Result finalization\n// ---------------------------------------------------------------------------\n\nfunction finalizeAgentResult(span: Span, result: any): void {\n if (result === undefined) {\n span.setAttribute('output.value', toOutputValue(result));\n return;\n }\n\n if (result.text) {\n const text = String(result.text);\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', text);\n span.setAttribute('output.value', text);\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 if (!result.text) {\n span.setAttribute('output.value', safeStringify({ toolCalls: result.toolCalls }));\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 if (!result.text && !Array.isArray(result.toolCalls)) {\n span.setAttribute('output.value', safeStringify(result));\n }\n}\n\nfunction finalizeModelResult(span: Span, result: any): void {\n if (result === undefined) {\n span.setAttribute('output.value', toOutputValue(result));\n return;\n }\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);\n span.setAttribute('output.value', result.text);\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);\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));\n } else {\n span.setAttribute('output.value', safeStringify(result));\n }\n if (result.usage) recordUsage(span, result.usage);\n span.setAttribute('neatlogs.llm.stop_reason', normalizeFinishReason(result.finishReason));\n}\n\n// ---------------------------------------------------------------------------\n// Provider-model stream wrapping\n// ---------------------------------------------------------------------------\n\ninterface ModelStreamCapture {\n textParts: string[];\n toolCalls: any[];\n finishReason?: unknown;\n usage?: unknown;\n}\n\n/**\n * AI SDK model `doStream()` returns a lazy stream container. The provider call\n * has only started when the container is returned; output, usage, and the real\n * duration arrive while `result.stream` is consumed. Keep the LLM span open\n * across that consumption and replace only the stream property.\n */\nasync function traceStreamingModelCall(\n spanName: string,\n attrs: Record<string, any>,\n callOpts: any,\n orig: (options: any) => any,\n): Promise<any> {\n const tracer = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n spanName,\n { attributes: attrs },\n getNeatlogsParentContext(),\n );\n try {\n const result = await withNeatlogsSpan(span, () => orig(callOpts));\n return wrapModelStreamingResult(result, span);\n } catch (err) {\n recordError(span, err);\n span.end();\n throw err;\n }\n}\n\nfunction wrapModelStreamingResult(result: any, span: Span): any {\n const stream = result?.stream;\n if (!stream || typeof stream.getReader !== 'function') {\n if (result?.usage) recordUsage(span, result.usage);\n span.setAttribute('output.value', safeStringify(result ?? { streamCompleted: true }));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n }\n\n const capture: ModelStreamCapture = { textParts: [], toolCalls: [] };\n let ended = false;\n const endOnce = (err?: unknown) => {\n if (ended) return;\n ended = true;\n if (err) {\n recordError(span, err);\n } else {\n finalizeModelStreamSpan(span, capture);\n span.setStatus({ code: SpanStatusCode.OK });\n }\n span.end();\n };\n\n const sourceReader = stream.getReader();\n const wrappedStream = new ReadableStream({\n async pull(controller) {\n try {\n const next = await withNeatlogsSpan(span, () => sourceReader.read());\n if (next.done) {\n endOnce();\n controller.close();\n return;\n }\n captureModelStreamPart(span, capture, next.value);\n controller.enqueue(next.value);\n } catch (err) {\n endOnce(err);\n controller.error(err);\n }\n },\n async cancel(reason) {\n try {\n await withNeatlogsSpan(span, () => sourceReader.cancel(reason));\n endOnce();\n } catch (err) {\n endOnce(err);\n throw err;\n }\n },\n });\n\n return new Proxy(result, {\n get(target, prop, receiver) {\n if (prop === 'stream') return wrappedStream;\n const value = Reflect.get(target, prop, receiver);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n}\n\nfunction captureModelStreamPart(\n span: Span,\n capture: ModelStreamCapture,\n part: any,\n): void {\n const type = part?.type;\n if (type === 'text-delta') {\n const text = part.delta ?? part.text ?? part.payload?.text;\n if (typeof text === 'string' && text) capture.textParts.push(text);\n }\n if (type === 'tool-call') {\n const index = capture.toolCalls.length;\n const toolCall = {\n id: part.toolCallId ?? part.id,\n name: part.toolName ?? part.name,\n arguments: part.input ?? part.args ?? part.arguments,\n };\n capture.toolCalls.push(toolCall);\n setToolCall(span, index, toolCall.name, toolCall.arguments, toolCall.id);\n }\n if (type === 'finish') {\n capture.finishReason = part.finishReason;\n capture.usage = part.usage;\n }\n if (part?.usage) capture.usage = part.usage;\n if (part?.finishReason !== undefined) capture.finishReason = part.finishReason;\n}\n\nfunction finalizeModelStreamSpan(span: Span, capture: ModelStreamCapture): void {\n const text = capture.textParts.join('');\n if (text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', text);\n }\n if (capture.usage) recordUsage(span, capture.usage);\n if (capture.finishReason !== undefined) {\n span.setAttribute(\n 'neatlogs.llm.stop_reason',\n normalizeFinishReason(capture.finishReason),\n );\n }\n\n if (text && capture.toolCalls.length === 0) {\n span.setAttribute('output.value', text);\n return;\n }\n span.setAttribute('output.value', safeStringify({\n ...(text ? { text } : {}),\n ...(capture.toolCalls.length ? { toolCalls: capture.toolCalls } : {}),\n finishReason: capture.finishReason ?? 'completed',\n }));\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]);\n }\n invocation.toolChoice = callOpts.toolChoice;\n }\n if (Object.keys(invocation).length) {\n attrs['neatlogs.llm.invocation_parameters'] = safeStringify(invocation);\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, cacheRead, cacheWrite},\n // outputTokens: {total, reasoning} }\n // - Mastra result: { inputTokens, outputTokens, totalTokens,\n // cachedInputTokens, cacheCreationInputTokens }\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 const reasoning = tokenValue(\n usage.reasoningTokens ?? usage.outputTokens?.reasoning ?? usage.output_tokens?.reasoning,\n );\n const cacheRead = tokenValue(\n usage.cachedInputTokens ??\n usage.cacheReadInputTokens ??\n usage.cache_read_input_tokens ??\n usage.inputTokens?.cacheRead ??\n usage.input_tokens?.cache_read,\n );\n const cacheWrite = tokenValue(\n usage.cacheCreationInputTokens ??\n usage.cacheWriteInputTokens ??\n usage.cache_creation_input_tokens ??\n usage.inputTokens?.cacheWrite ??\n usage.input_tokens?.cache_write,\n );\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 (reasoning != null) span.setAttribute('neatlogs.llm.token_count.reasoning', reasoning);\n if (cacheRead != null) span.setAttribute('neatlogs.llm.token_count.cache_read', cacheRead);\n if (cacheWrite != null) span.setAttribute('neatlogs.llm.token_count.cache_write', cacheWrite);\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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n name,\n { attributes: attrs },\n getNeatlogsParentContext(),\n );\n return withNeatlogsSpan(span, 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 = getNeatlogsTracer(TRACER_NAME);\n const span = tracer.startSpan(\n name,\n { attributes: attrs },\n getNeatlogsParentContext(),\n );\n return Promise.resolve(\n withNeatlogsSpan(span, () => fn(span)),\n )\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));\n}\n\nfunction safeStringify(value: unknown): string {\n if (typeof value === 'string') return value;\n if (value === undefined) {\n return JSON.stringify({ value_type: 'undefined' });\n }\n try {\n return JSON.stringify(value) ?? '';\n } catch {\n return JSON.stringify({\n serialization_error: 'circular_or_unsupported_value',\n value_type: typeof value,\n });\n }\n}\n\nfunction toOutputValue(value: unknown): string {\n return safeStringify(value === undefined ? { completed: true } : value);\n}\n\nfunction recordError(span: Span, err: unknown): void {\n span.setAttribute('output.value', safeStringify({\n error: err instanceof Error\n ? { name: err.name, message: err.message }\n : { message: String(err) },\n }));\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 Pi Agent integration.\n *\n * Usage:\n * import { init } from 'neatlogs';\n * import { piAgentHooks } from 'neatlogs/pi-agent';\n * import { Agent } from '@mariozechner/pi-agent-core';\n *\n * await init({ apiKey, workflowName });\n * const agent = piAgentHooks(new Agent({ initialState: { systemPrompt, model } }));\n * await agent.prompt('Hello');\n *\n * Pi Agent's `Agent` exposes a first-class `subscribe(listener)` API and emits\n * AgentEvents for its run lifecycle (message_*, tool_execution_*, turn_*,\n * agent_*). It does NOT emit its own OpenTelemetry spans — so we LISTEN to those\n * events (no monkey-patching) and translate them into neatlogs OTel spans:\n *\n * AGENT agent run (agent_start → agent_end)\n * ↳ LLM assistant message (each assistant message_end)\n * ↳ TOOL tool call (tool_execution_start → tool_execution_end)\n *\n * The AGENT span is opened as the active span so the LLM/TOOL children nest under\n * it (and under any user @span / trace() block active when prompt() is called).\n */\n\nimport {\n trace,\n SpanStatusCode,\n type Span,\n type Context,\n} from '@opentelemetry/api';\nimport { getNeatlogsTracer, getNeatlogsParentContext } from './core/provider.js';\n\nconst TRACER_NAME = 'neatlogs.pi-agent';\nconst PATCH_FLAG = '_neatlogs_patched';\n\n// Minimal structural types for the Pi Agent event surface (we duck-type — no\n// hard dependency on the pi-agent-core package).\ninterface PiUsage {\n input?: number;\n output?: number;\n cacheRead?: number;\n cacheWrite?: number;\n totalTokens?: number;\n}\ninterface PiToolCall {\n type: 'toolCall';\n id?: string;\n name?: string;\n arguments?: Record<string, unknown>;\n}\ninterface PiAssistantMessage {\n role: 'assistant';\n content?: Array<{ type: string; text?: string; name?: string; arguments?: unknown }>;\n model?: string;\n provider?: string;\n usage?: PiUsage;\n stopReason?: string;\n}\ninterface PiAgentEvent {\n type: string;\n message?: any;\n messages?: any[];\n toolCallId?: string;\n toolName?: string;\n args?: unknown;\n result?: unknown;\n isError?: boolean;\n}\n\ninterface PerAgentState {\n agentSpan?: Span;\n agentCtx?: Context;\n toolSpans: Map<string, Span>;\n /** Running conversation (system/user/tool turns) to use as LLM-span input.\n * Pi Agent's assistant message_end carries only the response, not the prompt. */\n inputMessages: Array<{ role: string; content: string }>;\n}\n\n/**\n * Subscribe neatlogs tracing to a Pi Agent instance. Returns the same agent\n * (marked so re-subscribing is a no-op). Idempotent per agent.\n */\nexport function piAgentHooks<T extends object>(agent: T): T {\n if (!agent || (agent as any)[PATCH_FLAG]) return agent;\n const a = agent as any;\n if (typeof a.subscribe !== 'function') return agent; // not a Pi Agent — leave alone\n\n const state: PerAgentState = { toolSpans: new Map(), inputMessages: [] };\n const tracer = getNeatlogsTracer(TRACER_NAME);\n\n a.subscribe((event: PiAgentEvent) => {\n try {\n handleEvent(tracer, state, event);\n } catch {\n // never let tracing break the agent run\n }\n });\n\n markPatched(a);\n return agent;\n}\n\nfunction handleEvent(\n tracer: ReturnType<typeof trace.getTracer>,\n state: PerAgentState,\n event: PiAgentEvent,\n): void {\n switch (event.type) {\n case 'agent_start': {\n // Open the AGENT (run) span as the active span so children nest under it.\n const base = getNeatlogsParentContext();\n const span = tracer.startSpan(\n 'pi_agent.run',\n { attributes: { 'neatlogs.span.kind': 'AGENT' } },\n base,\n );\n state.agentSpan = span;\n state.agentCtx = trace.setSpan(base, span);\n state.inputMessages = [];\n break;\n }\n\n case 'message_end': {\n const msg = event.message as any;\n if (!msg) return;\n if (msg.role === 'assistant') {\n // Assistant message = the LLM response. Emit an LLM span using the\n // accumulated conversation as input, then record the assistant turn too.\n emitLlmSpan(tracer, state, msg as PiAssistantMessage);\n const { text } = splitAssistantContent(msg.content);\n if (text) state.inputMessages.push({ role: 'assistant', content: text });\n } else {\n // user / toolResult turns — accumulate as input context for later LLM spans.\n const role = msg.role === 'toolResult' ? 'tool' : String(msg.role || 'user');\n const content = messageText(msg);\n if (content) state.inputMessages.push({ role, content });\n }\n break;\n }\n\n case 'tool_execution_start': {\n const parent = state.agentCtx ?? getNeatlogsParentContext();\n const span = tracer.startSpan(\n `pi_agent.tool.${event.toolName ?? 'tool'}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n ...(event.toolName ? { 'neatlogs.tool.name': String(event.toolName) } : {}),\n ...(event.args !== undefined\n ? { 'input.value': safeStringify(event.args) }\n : {}),\n },\n },\n parent,\n );\n if (event.toolCallId) state.toolSpans.set(event.toolCallId, span);\n break;\n }\n\n case 'tool_execution_end': {\n const span = event.toolCallId ? state.toolSpans.get(event.toolCallId) : undefined;\n if (!span) return;\n if (event.result !== undefined) {\n span.setAttribute('output.value', safeStringify(event.result));\n }\n if (event.isError) {\n span.setStatus({ code: SpanStatusCode.ERROR });\n span.setAttribute('neatlogs.tool.is_error', true);\n } else {\n span.setStatus({ code: SpanStatusCode.OK });\n }\n span.end();\n if (event.toolCallId) state.toolSpans.delete(event.toolCallId);\n break;\n }\n\n case 'agent_end': {\n // Close any tool spans that never received an end event, then the agent span.\n for (const ts of state.toolSpans.values()) {\n try {\n ts.end();\n } catch {\n /* ignore */\n }\n }\n state.toolSpans.clear();\n if (state.agentSpan) {\n // Agent input = the first user message of the run; output = final answer.\n const firstUser = state.inputMessages.find((m) => m.role === 'user');\n if (firstUser) state.agentSpan.setAttribute('input.value', firstUser.content);\n const finalText = lastAssistantText(event.messages);\n if (finalText) state.agentSpan.setAttribute('output.value', finalText);\n state.agentSpan.setStatus({ code: SpanStatusCode.OK });\n state.agentSpan.end();\n state.agentSpan = undefined;\n state.agentCtx = undefined;\n }\n break;\n }\n\n default:\n break;\n }\n}\n\nfunction emitLlmSpan(\n tracer: ReturnType<typeof trace.getTracer>,\n state: PerAgentState,\n msg: PiAssistantMessage,\n): void {\n const attrs: Record<string, any> = { 'neatlogs.span.kind': 'LLM' };\n if (msg.model) attrs['neatlogs.llm.model_name'] = String(msg.model);\n if (msg.provider) attrs['neatlogs.llm.provider'] = String(msg.provider);\n if (msg.stopReason) attrs['neatlogs.llm.stop_reason'] = String(msg.stopReason);\n\n // Input = the conversation accumulated up to this assistant turn (system +\n // user + prior assistant/tool messages). Pi Agent's message_end doesn't carry\n // the prompt, so we reconstruct it from the running inputMessages list.\n const inMsgs = state.inputMessages;\n if (inMsgs.length) {\n inMsgs.forEach((m, i) => {\n attrs[`neatlogs.llm.input_messages.${i}.role`] = m.role;\n attrs[`neatlogs.llm.input_messages.${i}.content`] = m.content;\n });\n attrs['neatlogs.llm.input'] = safeStringify({ messages: inMsgs });\n attrs['input.value'] = safeStringify({ messages: inMsgs });\n }\n\n const { text, toolCalls } = splitAssistantContent(msg.content);\n // Output: text if present, else a readable tool-call summary so the span isn't blank.\n const outText = text || toolCalls.map((tc) => `${tc.name}(${safeStringify(tc.arguments)})`).join('\\n');\n if (outText || toolCalls.length) {\n attrs['neatlogs.llm.output_messages.0.role'] = 'assistant';\n attrs['neatlogs.llm.output_messages.0.content'] = (outText || '');\n const outBlob: Record<string, unknown> = { role: 'assistant', content: outText || '' };\n if (toolCalls.length) {\n outBlob.tool_calls = toolCalls.map((tc) => ({ name: tc.name, arguments: tc.arguments }));\n toolCalls.forEach((tc, j) => {\n if (tc.name) attrs[`neatlogs.llm.tool_calls.${j}.name`] = tc.name;\n if (tc.arguments !== undefined)\n attrs[`neatlogs.llm.tool_calls.${j}.arguments`] = safeStringify(tc.arguments);\n if (tc.id) attrs[`neatlogs.llm.tool_calls.${j}.id`] = String(tc.id);\n });\n }\n attrs['neatlogs.llm.output'] = safeStringify(outBlob);\n attrs['output.value'] = (outText || '');\n }\n\n const usage = msg.usage;\n if (usage) {\n if (usage.input != null) attrs['neatlogs.llm.token_count.prompt'] = usage.input;\n if (usage.output != null) attrs['neatlogs.llm.token_count.completion'] = usage.output;\n const total = usage.totalTokens ?? ((usage.input ?? 0) + (usage.output ?? 0));\n if (total) attrs['neatlogs.llm.token_count.total'] = total;\n if (usage.cacheRead) attrs['neatlogs.llm.token_count.cache_read'] = usage.cacheRead;\n if (usage.cacheWrite) attrs['neatlogs.llm.token_count.cache_write'] = usage.cacheWrite;\n }\n\n const parent = state.agentCtx ?? getNeatlogsParentContext();\n const span = tracer.startSpan(\n `pi_agent.llm.${msg.model || 'model'}`,\n { attributes: attrs },\n parent,\n );\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\n// ---------------------------------------------------------------------------\n// Content helpers\n// ---------------------------------------------------------------------------\n\nfunction splitAssistantContent(\n content: PiAssistantMessage['content'],\n): { text: string; toolCalls: PiToolCall[] } {\n const texts: string[] = [];\n const toolCalls: PiToolCall[] = [];\n if (Array.isArray(content)) {\n for (const block of content) {\n if (!block || typeof block !== 'object') continue;\n if (block.type === 'text' && typeof block.text === 'string') texts.push(block.text);\n else if (block.type === 'toolCall')\n toolCalls.push(block as unknown as PiToolCall);\n // thinking blocks intentionally omitted from the main output text\n }\n } else if (typeof content === 'string') {\n texts.push(content);\n }\n return { text: texts.join(''), toolCalls };\n}\n\n/** Flatten any message's content (string or block array) to readable text. */\nfunction messageText(msg: any): string {\n if (!msg) return '';\n const c = msg.content;\n if (typeof c === 'string') return c;\n if (!Array.isArray(c)) return '';\n const parts: string[] = [];\n for (const block of c) {\n if (typeof block === 'string') parts.push(block);\n else if (block && typeof block === 'object') {\n if (typeof block.text === 'string') parts.push(block.text);\n else if (block.type === 'toolCall') parts.push(`${block.name ?? 'tool'}(${safeStringify(block.arguments)})`);\n }\n }\n return parts.join('');\n}\n\nfunction lastAssistantText(messages: any[] | undefined): string {\n if (!Array.isArray(messages)) return '';\n for (let i = messages.length - 1; i >= 0; i--) {\n const m = messages[i];\n if (m && m.role === 'assistant') {\n const { text } = splitAssistantContent(m.content);\n if (text) return text;\n }\n }\n return '';\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 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","/**\n * Neatlogs Claude Agent SDK integration.\n *\n * Wraps Anthropic's `@anthropic-ai/claude-agent-sdk` so every `query()` run is\n * traced. The SDK's `query()` returns an async-iterable of SDKMessages\n * (system init → assistant (text + tool_use) → user (tool_result) → … →\n * result). Each message carries `parent_tool_use_id`: null for the main\n * (orchestrator) agent, or the id of the spawning Task tool call for a subagent.\n * We translate that into a neatlogs span tree:\n *\n * AGENT claude_agent.query (orchestrator = trace root)\n * ↳ LLM orchestrator turn (one per model turn; text + tool_calls)\n * ↳ TOOL Read / Edit / Bash …\n * ↳ TOOL Task (spawns a subagent)\n * ↳ AGENT claude_agent.subagent.<type> (each subagent, nested)\n * ↳ LLM subagent turn\n * ↳ TOOL subagent tool call\n *\n * The orchestrator is the single root AGENT span — there is NO redundant WORKFLOW\n * wrapper. Subagents (Task-tool invocations, e.g. the wizard's parallel per-file\n * edits) get their own AGENT spans nested under the Task TOOL span that spawned\n * them, so a multi-agent run is represented faithfully and each agent's I/O is\n * distinct.\n *\n * Usage:\n * import { init } from 'neatlogs';\n * import { wrapClaudeAgentSDK } from 'neatlogs/claude-agent-sdk';\n * import * as claudeAgentSDK from '@anthropic-ai/claude-agent-sdk';\n *\n * await init({ apiKey, workflowName });\n * const { query } = wrapClaudeAgentSDK(claudeAgentSDK);\n * for await (const msg of query({ prompt: 'Hello', options: {...} })) { ... }\n *\n * Conversation tracking: Claude's `session_id` is captured on the root AGENT span\n * as `neatlogs.conversation.id`. Tool calls are traced only through the wrapped\n * `query` — calling the unwrapped SDK directly produces no tracing.\n */\n\nimport { trace, SpanStatusCode, type Span, type Context } from '@opentelemetry/api';\nimport { getNeatlogsTracer, getNeatlogsBaseContext, withNeatlogsSpan } from './core/provider.js';\n\nconst TRACER_NAME = 'neatlogs.claude_agent_sdk';\nconst ROOT_SCOPE = '__root__';\n\nexport interface WrapClaudeAgentSDKOptions {\n /** Logical grouping for traces (also settable globally via init({ workflowName })). */\n workflowName?: string;\n}\n\n/**\n * Wrap the Claude Agent SDK module. Returns a shallow copy of the module with an\n * instrumented `query`; all other exports (createSdkMcpServer, tool, the built-in\n * Tool helpers, etc.) are passed through unchanged.\n */\nexport function wrapClaudeAgentSDK<T extends Record<string, any>>(\n sdk: T,\n options: WrapClaudeAgentSDKOptions = {},\n): T {\n if (!sdk || typeof sdk.query !== 'function') return sdk;\n if ((sdk as any)._neatlogsWrapped) return sdk;\n\n const wrapped: Record<string, any> = { ...sdk };\n wrapped.query = wrapQuery(sdk.query.bind(sdk), options);\n\n try {\n Object.defineProperty(wrapped, '_neatlogsWrapped', {\n value: true,\n enumerable: false,\n configurable: true,\n });\n } catch {\n wrapped._neatlogsWrapped = true;\n }\n\n return wrapped as T;\n}\n\n// ---------------------------------------------------------------------------\n// query() wrapping\n// ---------------------------------------------------------------------------\n\nfunction wrapQuery(original: (...args: any[]) => any, options: WrapClaudeAgentSDKOptions) {\n return function (params: any, ...rest: any[]): any {\n const tracer = getNeatlogsTracer(TRACER_NAME);\n const workflowName = options.workflowName ?? 'claude_agent.query';\n\n // Shared ref the input-tap fills with the first user-prompt text. In\n // streaming-input mode the prompt is an async generator fed into the SDK\n // subprocess and is NOT echoed back as a `user` output message before the\n // first assistant turn — so without tapping it, the first LLM span has no\n // input. The tap reads prompt text as the SDK pulls it.\n const promptRef: { text: string } = { text: '' };\n\n // The orchestrator AGENT is the trace ROOT (no WORKFLOW wrapper — a single\n // query() is one agent run; subagents nest below as their own AGENT spans).\n const agentSpan = tracer.startSpan(\n 'claude_agent.query',\n { attributes: { 'neatlogs.span.kind': 'AGENT', 'neatlogs.workflow.name': workflowName } },\n getNeatlogsBaseContext(),\n );\n\n // Input: a string prompt is captured directly. A streaming-input prompt (an\n // async iterable) is tapped — promptRef.text fills as the SDK pulls the\n // first user message — so the agent input and the first LLM span's input are\n // populated even before any `user` message echoes back through the output.\n const promptText = extractPromptText(params?.prompt);\n if (promptText) {\n promptRef.text = promptText;\n agentSpan.setAttribute('input.value', promptText);\n } else if (params && isAsyncIterable(params.prompt)) {\n params = { ...params, prompt: tapPromptStream(params.prompt, promptRef) };\n }\n\n const agentCtx = trace.setSpan(getNeatlogsBaseContext(), agentSpan);\n\n // Call the original query with the AGENT span active only under our private\n // context so a foreign provider's spans neither parent nor nest under ours.\n const queryObj = withNeatlogsSpan(agentSpan, () => original(params, ...rest));\n\n return instrumentQueryIterable(queryObj, agentSpan, agentCtx, tracer, promptRef);\n };\n}\n\n/** True for an async iterable (streaming-input prompt). */\nfunction isAsyncIterable(v: any): boolean {\n return Boolean(v) && typeof v[Symbol.asyncIterator] === 'function';\n}\n\n/**\n * Pass-through wrapper over a streaming-input prompt that records the first\n * user message's text into `ref` as the SDK consumes it. Never alters what the\n * SDK receives.\n */\nasync function* tapPromptStream(prompt: any, ref: { text: string }): AsyncGenerator<any> {\n // userMessageText is fully defensive (returns '' for any non-text shape), so\n // no try/catch is needed — the message is always yielded through untouched.\n for await (const message of prompt) {\n if (!ref.text) {\n const text = userMessageText(message);\n if (text) ref.text = text;\n }\n yield message;\n }\n}\n\ninterface ToolCallAccum {\n id: string;\n name: string;\n input: unknown;\n}\n\ninterface AssistantTurnBuffer {\n textParts: string[];\n thinkingParts: string[];\n toolCalls: ToolCallAccum[];\n usage: any;\n model?: string;\n stopReason?: string;\n}\n\n/**\n * One agent's tracing scope. There is always a root scope (the orchestrator,\n * keyed ROOT_SCOPE). Each subagent — identified by the `parent_tool_use_id` of\n * the Task tool call that spawned it — gets its own scope created lazily, with\n * its AGENT span nested under that Task TOOL span. Per-scope state keeps each\n * agent's conversation/turn buffer independent.\n */\ninterface AgentScope {\n /** The AGENT span for this scope (root = orchestrator; others = subagents). */\n span: Span;\n /** OTel context whose active span is this scope's AGENT span (children nest here). */\n ctx: Context;\n /** Running conversation (user/tool/assistant turns) — each LLM span's input. */\n inputMessages: Array<{ role: string; content: string }>;\n /** In-progress model turn, coalesced from multiple `assistant` messages. */\n assistantBuffer: AssistantTurnBuffer | null;\n /** Last assistant text seen (subagent output = its final text). */\n finalText: string;\n /** Whether input.value has been set on this scope's AGENT span. */\n inputCaptured: boolean;\n}\n\ninterface QueryState {\n /** TOOL spans keyed by tool_use_id, closed by the matching tool_result. */\n toolSpans: Map<string, Span>;\n /** Agent scopes keyed by parent_tool_use_id (ROOT_SCOPE for the orchestrator). */\n scopes: Map<string, AgentScope>;\n sessionId?: string;\n model?: string;\n finished: boolean;\n /** Lazily-filled prompt text from a streaming-input tap. */\n promptRef: { text: string };\n}\n\n/**\n * Wrap the Query object so iteration is instrumented while preserving its own\n * methods (interrupt, setPermissionMode, …). The SDK returns an async-iterable\n * object, not a bare generator.\n */\nfunction instrumentQueryIterable(\n queryObj: any,\n agentSpan: Span,\n agentCtx: Context,\n tracer: ReturnType<typeof trace.getTracer>,\n promptRef: { text: string },\n): any {\n const originalAsyncIterator = queryObj?.[Symbol.asyncIterator]?.bind(queryObj);\n if (!originalAsyncIterator) {\n // Not iterable — nothing to trace; close the root span immediately.\n agentSpan.setStatus({ code: SpanStatusCode.OK });\n agentSpan.end();\n return queryObj;\n }\n\n // The root scope is the orchestrator agent. Seed its conversation with the\n // prompt (known up front for string prompts; filled by the tap otherwise).\n const rootScope: AgentScope = {\n span: agentSpan,\n ctx: agentCtx,\n inputMessages: promptRef.text ? [{ role: 'user', content: promptRef.text }] : [],\n assistantBuffer: null,\n finalText: '',\n inputCaptured: Boolean(promptRef.text),\n };\n const state: QueryState = {\n toolSpans: new Map(),\n scopes: new Map([[ROOT_SCOPE, rootScope]]),\n finished: false,\n promptRef,\n };\n\n const finalizeAgent = (status: 'ok' | 'error', err?: unknown) => {\n if (state.finished) return;\n state.finished = true;\n // Flush every scope's in-progress turn, then close subagent AGENT spans\n // (deepest-first) and finally the root.\n for (const scope of state.scopes.values()) flushAssistantTurn(tracer, scope, state);\n // Close any tool spans that never got a matching result.\n for (const ts of state.toolSpans.values()) {\n try {\n ts.end();\n } catch {\n /* ignore */\n }\n }\n state.toolSpans.clear();\n // Close subagent scopes first (any still open), then the root.\n for (const [key, scope] of state.scopes) {\n if (key === ROOT_SCOPE) continue;\n closeScope(scope, 'ok');\n }\n if (rootScope.finalText) agentSpan.setAttribute('output.value', rootScope.finalText);\n if (status === 'error') {\n recordError(agentSpan, err);\n } else {\n agentSpan.setStatus({ code: SpanStatusCode.OK });\n agentSpan.end();\n }\n };\n\n const wrapped = Object.create(Object.getPrototypeOf(queryObj));\n Object.assign(wrapped, queryObj);\n\n wrapped[Symbol.asyncIterator] = function () {\n const iterator = originalAsyncIterator();\n return {\n async next(): Promise<IteratorResult<any>> {\n try {\n const result = await withNeatlogsSpan(agentSpan, () => iterator.next());\n if (result.done) {\n finalizeAgent('ok');\n return result;\n }\n try {\n handleMessage(tracer, state, result.value, finalizeAgent);\n } catch {\n /* never let tracing break the run */\n }\n return result;\n } catch (err) {\n finalizeAgent('error', err);\n throw err;\n }\n },\n async return(value?: any): Promise<IteratorResult<any>> {\n finalizeAgent('ok');\n return iterator.return?.(value) ?? { done: true, value: undefined };\n },\n async throw(err?: any): Promise<IteratorResult<any>> {\n finalizeAgent('error', err);\n if (iterator.throw) return iterator.throw(err);\n throw err;\n },\n };\n };\n\n return wrapped;\n}\n\n/** End a subagent scope's AGENT span, setting its output to the subagent's final text. */\nfunction closeScope(scope: AgentScope, status: 'ok' | 'error'): void {\n try {\n if (scope.finalText) scope.span.setAttribute('output.value', scope.finalText);\n scope.span.setStatus({ code: status === 'ok' ? SpanStatusCode.OK : SpanStatusCode.ERROR });\n scope.span.end();\n } catch {\n /* ignore */\n }\n}\n\n// ---------------------------------------------------------------------------\n// Message handling\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the agent scope for a message. `parent_tool_use_id` is null for the\n * orchestrator (root scope) and the spawning Task tool_use_id for a subagent.\n * Subagent scopes are created lazily, with their AGENT span nested under the\n * Task TOOL span (looked up by that id) so the hierarchy is\n * orchestrator → Task TOOL → subagent AGENT.\n */\nfunction getScope(\n tracer: ReturnType<typeof trace.getTracer>,\n state: QueryState,\n msg: any,\n): AgentScope {\n const parentId = msg?.parent_tool_use_id ?? null;\n if (!parentId) return state.scopes.get(ROOT_SCOPE)!;\n\n const existing = state.scopes.get(parentId);\n if (existing) return existing;\n\n // New subagent. Its spawning Task tool_use may still be buffered in the root\n // turn (the SDK emits subagent messages before the Task's tool_result closes\n // the parent turn). Flush the root turn first so the Task TOOL span exists and\n // this subagent AGENT can nest under it.\n const root = state.scopes.get(ROOT_SCOPE)!;\n if (!state.toolSpans.has(parentId) && root.assistantBuffer) {\n flushAssistantTurn(tracer, root, state);\n }\n\n // Nest the subagent AGENT span under the spawning Task TOOL span if we have it;\n // otherwise under the root agent.\n const parentToolSpan = state.toolSpans.get(parentId);\n const parentCtx = parentToolSpan\n ? trace.setSpan(getNeatlogsBaseContext(), parentToolSpan)\n : state.scopes.get(ROOT_SCOPE)!.ctx;\n\n const subType = msg?.subagent_type ? String(msg.subagent_type) : 'subagent';\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'AGENT',\n 'neatlogs.agent.name': subType,\n };\n if (msg?.task_description) attrs['input.value'] = String(msg.task_description);\n const span = tracer.startSpan(`claude_agent.subagent.${subType}`, { attributes: attrs }, parentCtx);\n\n const scope: AgentScope = {\n span,\n ctx: trace.setSpan(getNeatlogsBaseContext(), span),\n inputMessages: msg?.task_description ? [{ role: 'user', content: String(msg.task_description) }] : [],\n assistantBuffer: null,\n finalText: '',\n inputCaptured: Boolean(msg?.task_description),\n };\n state.scopes.set(parentId, scope);\n return scope;\n}\n\nfunction handleMessage(\n tracer: ReturnType<typeof trace.getTracer>,\n state: QueryState,\n msg: any,\n finalizeAgent: (status: 'ok' | 'error', err?: unknown) => void,\n): void {\n if (!msg || typeof msg !== 'object') return;\n\n const rootScope = state.scopes.get(ROOT_SCOPE)!;\n\n // Backfill root input from the tapped streaming-input prompt as soon as it's\n // available (it fills before the first assistant turn).\n if (!rootScope.inputCaptured && state.promptRef.text) {\n rootScope.inputCaptured = true;\n rootScope.span.setAttribute('input.value', state.promptRef.text);\n }\n\n switch (msg.type) {\n case 'system': {\n // init message — carries session_id, model, available tools.\n if (msg.session_id) {\n state.sessionId = msg.session_id;\n rootScope.span.setAttribute('neatlogs.conversation.id', String(msg.session_id));\n }\n if (msg.model) {\n state.model = msg.model;\n rootScope.span.setAttribute('neatlogs.agent.model', String(msg.model));\n }\n break;\n }\n\n case 'user': {\n // A `user` message (prompt, or tool_result turns) is a turn boundary for\n // its scope: flush the buffered turn as ONE LLM span first.\n const scope = getScope(tracer, state, msg);\n flushAssistantTurn(tracer, scope, state);\n\n const userText = userMessageText(msg);\n if (userText) {\n if (!scope.inputCaptured) {\n scope.inputCaptured = true;\n scope.span.setAttribute('input.value', userText);\n }\n scope.inputMessages.push({ role: 'user', content: userText });\n }\n closeToolSpansFromUser(state, scope, msg);\n break;\n }\n\n case 'assistant': {\n // Don't emit yet — the SDK delivers one model turn as multiple `assistant`\n // messages (text block, then tool_use block, …). Buffer them per scope;\n // the next user/result boundary flushes the turn as a single LLM span.\n const scope = getScope(tracer, state, msg);\n bufferAssistantMessage(scope, msg);\n break;\n }\n\n case 'result': {\n // The run is complete. Flush the root turn (a final text answer may have no\n // trailing user message), then finalize.\n flushAssistantTurn(tracer, rootScope, state);\n\n const text = typeof msg.result === 'string' ? msg.result : '';\n if (text) rootScope.finalText = text;\n if (msg.session_id && !state.sessionId) {\n rootScope.span.setAttribute('neatlogs.conversation.id', String(msg.session_id));\n }\n const usage = msg.usage;\n if (usage) setUsage(rootScope.span, usage);\n if (msg.total_cost_usd != null) rootScope.span.setAttribute('neatlogs.agent.cost_usd', msg.total_cost_usd);\n if (msg.num_turns != null) rootScope.span.setAttribute('neatlogs.agent.num_turns', msg.num_turns);\n if (msg.is_error) rootScope.span.setAttribute('neatlogs.agent.is_error', true);\n\n finalizeAgent(msg.is_error ? 'error' : 'ok', msg.is_error ? new Error(String(text || 'agent run failed')) : undefined);\n break;\n }\n\n default:\n break;\n }\n}\n\n/**\n * Append one `assistant` SDK message to the in-progress turn buffer. The SDK\n * splits a single model turn into multiple assistant messages (a text block,\n * then tool_use blocks); they share token usage. We merge their text, thinking,\n * and tool_use blocks so the turn becomes ONE LLM span on flush.\n */\nfunction bufferAssistantMessage(scope: AgentScope, msg: any): void {\n const message = msg.message ?? msg;\n const content = message?.content ?? [];\n\n if (!scope.assistantBuffer) {\n scope.assistantBuffer = { textParts: [], thinkingParts: [], toolCalls: [], usage: undefined };\n }\n const buf = scope.assistantBuffer;\n if (message?.model) buf.model = message.model;\n if (message?.stop_reason) buf.stopReason = message.stop_reason;\n // Usage is reported per assistant message but is the SAME turn total — keep\n // the largest/last non-empty one rather than summing (summing double-counts).\n if (message?.usage) buf.usage = message.usage;\n\n for (const block of Array.isArray(content) ? content : []) {\n if (!block || typeof block !== 'object') continue;\n if (block.type === 'text' && typeof block.text === 'string') buf.textParts.push(block.text);\n else if (block.type === 'thinking' && typeof block.thinking === 'string') buf.thinkingParts.push(block.thinking);\n else if (block.type === 'tool_use') {\n buf.toolCalls.push({ id: block.id ?? '', name: block.name ?? '', input: block.input });\n }\n }\n}\n\n/**\n * Emit the buffered model turn as a SINGLE LLM span, then open TOOL spans for\n * its tool calls. No-op if no turn is buffered. This is what makes one LLM span\n * per real model turn (not per SDK assistant message).\n */\nfunction flushAssistantTurn(\n tracer: ReturnType<typeof trace.getTracer>,\n scope: AgentScope,\n state: QueryState,\n): void {\n const buf = scope.assistantBuffer;\n if (!buf) return;\n scope.assistantBuffer = null;\n\n const model = buf.model ?? state.model ?? '';\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': 'anthropic',\n 'neatlogs.llm.system': 'anthropic',\n };\n if (model) attrs['neatlogs.llm.model_name'] = String(model);\n\n // If this is the root scope's first turn and no user message was recorded yet\n // (streaming-input mode), seed input from the tapped prompt text.\n if (scope.inputMessages.length === 0 && state.promptRef.text) {\n scope.inputMessages.push({ role: 'user', content: state.promptRef.text });\n }\n\n // Input = the exact accumulated conversation up to this turn. Emitted BOTH as\n // structured indexed input_messages.* AND as the flat `input.value` blob —\n // per neatlogs/config/attribute-mapping.json, the main UI panel renders\n // `neatlogs.{span_kind}.input` (mapped from `input.value`); the indexed\n // messages alone do NOT populate it. Without input.value the LLM Input is blank.\n scope.inputMessages.forEach((m, i) => {\n attrs[`neatlogs.llm.input_messages.${i}.role`] = m.role;\n attrs[`neatlogs.llm.input_messages.${i}.content`] = m.content;\n });\n if (scope.inputMessages.length) {\n attrs['input.value'] = safeStringify({ messages: scope.inputMessages });\n }\n\n // Output = the turn's actual assistant content. Prefer the model's text; for a\n // tool-only turn (no text) the output IS the tool call(s), so render them as\n // the exact `name(arguments)` the model emitted (not a vague summary). The\n // structured tool_calls.* below still carry the same data for programmatic use.\n // `output.value` is the flat blob the UI maps to `neatlogs.{span_kind}.output`.\n const outText = buf.textParts.join('');\n const outValue =\n outText ||\n buf.toolCalls.map((tc) => `${tc.name}(${safeStringify(tc.input ?? {})})`).join('\\n');\n if (outValue) {\n attrs['neatlogs.llm.output_messages.0.role'] = 'assistant';\n attrs['neatlogs.llm.output_messages.0.content'] = outValue;\n attrs['output.value'] = outValue;\n }\n if (buf.thinkingParts.length) {\n attrs['neatlogs.llm.output_messages.0.thinking'] = buf.thinkingParts.join('');\n }\n buf.toolCalls.forEach((tc, j) => {\n attrs[`neatlogs.llm.tool_calls.${j}.id`] = tc.id;\n attrs[`neatlogs.llm.tool_calls.${j}.name`] = tc.name;\n attrs[`neatlogs.llm.tool_calls.${j}.arguments`] = safeStringify(tc.input ?? {});\n });\n if (buf.stopReason) attrs['neatlogs.llm.finish_reason'] = String(buf.stopReason);\n\n // The LLM span nests under THIS scope's AGENT span.\n const span = tracer.startSpan(`claude_agent.llm.${model || 'model'}`, { attributes: attrs }, scope.ctx);\n if (buf.usage) setUsage(span, buf.usage);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n\n // Track this scope's latest text as its output (the subagent/orchestrator\n // final answer is the last assistant text).\n if (outText) scope.finalText = outText;\n\n // Record this assistant turn so the NEXT turn's LLM span sees it as context.\n const turnParts: string[] = [];\n if (outText) turnParts.push(outText);\n for (const tc of buf.toolCalls) turnParts.push(`[tool_call ${tc.name} ${safeStringify(tc.input ?? {})}]`);\n if (turnParts.length) scope.inputMessages.push({ role: 'assistant', content: turnParts.join('\\n') });\n\n // Open TOOL spans for this turn's tool calls, nested under THIS scope's AGENT\n // span (closed by their tool_result). A Task tool's id becomes the key a\n // subagent's messages resolve to (see getScope).\n for (const tc of buf.toolCalls) {\n const toolSpan = tracer.startSpan(\n `claude_agent.tool.${tc.name || 'tool'}`,\n {\n attributes: {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': String(tc.name ?? ''),\n ...(tc.id ? { 'neatlogs.tool_call.id': String(tc.id) } : {}),\n 'input.value': safeStringify(tc.input ?? {}),\n },\n },\n scope.ctx,\n );\n if (tc.id) state.toolSpans.set(tc.id, toolSpan);\n }\n}\n\nfunction closeToolSpansFromUser(state: QueryState, scope: AgentScope, msg: any): void {\n const content = (msg.message ?? msg)?.content ?? [];\n for (const block of Array.isArray(content) ? content : []) {\n if (block?.type !== 'tool_result') continue;\n const id = block.tool_use_id ?? '';\n const out = block.content;\n const outText = (typeof out === 'string' ? out : safeStringify(out));\n // Feed the tool result into THIS scope's conversation so the next LLM span's\n // input reflects what the model actually saw.\n if (outText) scope.inputMessages.push({ role: 'tool', content: outText });\n const span = state.toolSpans.get(id);\n if (!span) continue;\n span.setAttribute('output.value', outText);\n if (block.is_error) {\n span.setStatus({ code: SpanStatusCode.ERROR });\n span.setAttribute('neatlogs.tool.is_error', true);\n } else {\n span.setStatus({ code: SpanStatusCode.OK });\n }\n span.end();\n state.toolSpans.delete(id);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Extract the human/text content of a `user` SDK message — the prompt, not\n * tool_result blocks (those are handled separately as tool outputs).\n */\nfunction userMessageText(msg: any): string {\n const content = (msg.message ?? msg)?.content;\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === 'string') parts.push(block);\n else if (block && typeof block === 'object' && block.type === 'text' && typeof block.text === 'string') {\n parts.push(block.text);\n }\n }\n return parts.join('\\n');\n}\n\nfunction setUsage(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.input_tokens != null && usage.output_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.total', usage.input_tokens + usage.output_tokens);\n }\n if (usage.cache_read_input_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.cache_read', usage.cache_read_input_tokens);\n }\n if (usage.cache_creation_input_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.cache_write', usage.cache_creation_input_tokens);\n }\n}\n\nfunction extractPromptText(prompt: any): string {\n if (typeof prompt === 'string') return prompt;\n // Streaming-input mode passes an async iterable of messages; we can't read it\n // synchronously without consuming it, so leave input.value unset in that case.\n return '';\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 span.end();\n}\n","/**\n * Neatlogs OpenRouter Agent integration.\n *\n * Wraps the `@openrouter/agent` SDK so each `client.callModel(...)` is traced.\n * The OpenRouter client returns a `ModelResult`; telemetry is finalized when the\n * result is consumed (via `getText()` / awaiting it / iterating it), matching the\n * SDK's lazy-evaluation model — a result that is never consumed ships no span.\n *\n * Usage:\n * import { init } from 'neatlogs';\n * import { wrapOpenRouterAgent } from 'neatlogs/openrouter-agent';\n * import { OpenRouter } from '@openrouter/agent';\n *\n * await init({ apiKey, workflowName });\n * const openrouter = wrapOpenRouterAgent(new OpenRouter({ apiKey: process.env.OPENROUTER_API_KEY }));\n * const result = openrouter.callModel({ model: 'openai/gpt-4o', messages: [...] });\n * const text = await result.getText();\n *\n * Also exports wrapCallModel() for the standalone callModel helper:\n * const trackedCallModel = wrapCallModel(callModel);\n * const result = trackedCallModel(openrouter, { model, messages });\n */\n\nimport { SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { getProviderTracer } from './core/auto-root.js';\nimport {\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from './core/provider.js';\n\nconst TRACER_NAME = 'neatlogs.openrouter_agent';\nconst PROVIDER = 'openrouter';\n\n/**\n * Wrap an OpenRouter client instance so `callModel` emits LLM spans. Returns a\n * Proxy over the client; all other methods pass through unchanged.\n */\nexport function wrapOpenRouterAgent<T extends object>(client: T): T {\n const c = client as any;\n if (!c || c._neatlogsWrapped) return client;\n\n return new Proxy(client, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver);\n if (prop === 'callModel' && typeof value === 'function') {\n return tracedCallModel(value.bind(obj));\n }\n return value;\n },\n }) as T;\n}\n\n/**\n * Wrap the standalone `callModel(client, opts)` helper. The wrapped function is\n * invoked with the client passed in: `trackedCallModel(openrouter, {...})`.\n */\nexport function wrapCallModel<F extends (...args: any[]) => any>(callModel: F): F {\n return function (this: any, clientArg: any, opts: any, ...rest: any[]): any {\n const span = startLlmSpan(opts);\n const result = withNeatlogsSpan(span, () => callModel.call(this, clientArg, opts, ...rest));\n return instrumentModelResult(result, span);\n } as unknown as F;\n}\n\n// ---------------------------------------------------------------------------\n// callModel wrapping\n// ---------------------------------------------------------------------------\n\nfunction tracedCallModel(original: (...args: any[]) => any) {\n return function (opts: any, ...rest: any[]): any {\n const span = startLlmSpan(opts);\n const result = withNeatlogsSpan(span, () => original(opts, ...rest));\n return instrumentModelResult(result, span);\n };\n}\n\nfunction startLlmSpan(opts: any): Span {\n const tracer = getProviderTracer(TRACER_NAME);\n const model = opts?.model ?? '';\n\n const span = tracer.startSpan('openrouter.call_model', {\n attributes: {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': PROVIDER,\n 'neatlogs.llm.system': PROVIDER,\n 'neatlogs.llm.model_name': model,\n },\n }, getNeatlogsParentContext());\n\n // The @openrouter/agent callModel input is `input` — either a string prompt or\n // a messages array (it also accepts `messages`/`instructions` in some shapes).\n // Capture whichever is present as indexed input messages + the flat input.value\n // blob (the canonical UI-rendered field, per attribute-mapping.json).\n const messages: any[] = Array.isArray(opts?.messages)\n ? opts.messages\n : Array.isArray(opts?.input)\n ? opts.input\n : [];\n if (messages.length) {\n messages.forEach((msg, i) => {\n span.setAttribute(`neatlogs.llm.input_messages.${i}.role`, msg?.role ?? 'user');\n const content = msg?.content;\n span.setAttribute(\n `neatlogs.llm.input_messages.${i}.content`,\n typeof content === 'string' ? content : safeStringify(content),\n );\n });\n span.setAttribute('input.value', safeStringify({ messages }));\n } else if (typeof opts?.input === 'string') {\n span.setAttribute('neatlogs.llm.input_messages.0.role', 'user');\n span.setAttribute('neatlogs.llm.input_messages.0.content', opts.input);\n span.setAttribute('input.value', opts.input);\n }\n if (typeof opts?.instructions === 'string' && opts.instructions) {\n span.setAttribute('neatlogs.llm.system_prompt', opts.instructions);\n }\n\n if (Array.isArray(opts?.tools)) {\n for (let i = 0; i < opts.tools.length; i++) {\n const t = opts.tools[i] ?? {};\n const name = t.name ?? t.function?.name;\n if (name) span.setAttribute(`neatlogs.llm.tools.${i}.name`, name);\n const desc = t.description ?? t.function?.description;\n if (desc) span.setAttribute(`neatlogs.llm.tools.${i}.description`, desc);\n }\n }\n\n // @openrouter/agent's callModel request uses camelCase sampling params\n // (topP, maxOutputTokens, frequencyPenalty, presencePenalty, topK) derived\n // from the OpenResponses ResponsesRequest. Accept both camelCase and the\n // snake_case OpenAI-style variants so params are captured regardless of how\n // the caller spelled them.\n const temperature = opts?.temperature;\n const topP = opts?.top_p ?? opts?.topP;\n const maxTokens = opts?.max_tokens ?? opts?.maxTokens ?? opts?.max_output_tokens ?? opts?.maxOutputTokens;\n const frequencyPenalty = opts?.frequency_penalty ?? opts?.frequencyPenalty;\n const presencePenalty = opts?.presence_penalty ?? opts?.presencePenalty;\n const topK = opts?.top_k ?? opts?.topK;\n\n if (temperature != null) span.setAttribute('neatlogs.llm.temperature', temperature);\n if (topP != null) span.setAttribute('neatlogs.llm.top_p', topP);\n if (maxTokens != null) span.setAttribute('neatlogs.llm.max_tokens', maxTokens);\n\n // The backend reads invocation params ONLY from this JSON-string blob (parsed\n // into metadata.model_settings, which the UI renders). Individual attrs above\n // are kept for other consumers but are NOT what the UI shows. Only include\n // keys that are actually present so we never emit nulls.\n const params: Record<string, unknown> = {};\n if (temperature != null) params.temperature = temperature;\n if (topP != null) params.top_p = topP;\n if (maxTokens != null) params.max_tokens = maxTokens;\n if (frequencyPenalty != null) params.frequency_penalty = frequencyPenalty;\n if (presencePenalty != null) params.presence_penalty = presencePenalty;\n if (topK != null) params.top_k = topK;\n if (Object.keys(params).length) {\n span.setAttribute('neatlogs.llm.invocation_parameters', JSON.stringify(params));\n }\n\n return span;\n}\n\n/**\n * Wrap a ModelResult so the span is finalized exactly once, when the caller\n * consumes the result. We patch the common consumption methods (getText,\n * getMessage, then) so finalization happens on first use; a result that is\n * never consumed never finalizes (matching SDK semantics).\n */\nfunction instrumentModelResult(result: any, span: Span): any {\n if (!result || (typeof result !== 'object' && typeof result !== 'function')) {\n // Synchronous/primitive return — nothing to defer; close immediately.\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n }\n\n let finalized = false;\n const finalizeFromResult = (resolved: any) => {\n if (finalized) return;\n finalized = true;\n try {\n finalizeLlm(span, resolved);\n } catch {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n }\n };\n const finalizeError = (err: unknown) => {\n if (finalized) return;\n finalized = true;\n recordError(span, err);\n };\n\n // The @openrouter/agent ModelResult is consumed via getText()/getResponse()/\n // getTextStream(). Wrap with a Proxy to intercept whichever the caller uses\n // first; finalize the span from that, and grab usage via getResponse().\n return new Proxy(result, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver);\n\n if (prop === 'getResponse' && typeof value === 'function') {\n return function (...args: any[]) {\n return Promise.resolve(value.apply(obj, args)).then(\n (resp: any) => {\n finalizeFromResult(resp); // full OpenResponsesResult (text + usage)\n return resp;\n },\n (err: any) => {\n finalizeError(err);\n throw err;\n },\n );\n };\n }\n\n if (prop === 'getText' && typeof value === 'function') {\n return function (...args: any[]) {\n return Promise.resolve(value.apply(obj, args)).then(\n async (textStr: any) => {\n // getText() resolves to a bare string (no usage). Usage lives on\n // getResponse(); fetch it FIRST (the SDK supports concurrent\n // consumption) so the span carries tokens — then finalize ONCE.\n // Finalizing ends the span, so late attributes would be dropped.\n let resp: any;\n if (typeof obj?.getResponse === 'function') {\n try {\n resp = await obj.getResponse();\n } catch {\n resp = undefined;\n }\n }\n finalizeFromResult(resp ? { ...resp, text: textStr } : { text: textStr });\n return textStr;\n },\n (err: any) => {\n finalizeError(err);\n throw err;\n },\n );\n };\n }\n\n if (prop === 'then' && typeof value === 'function') {\n // Result is awaitable directly: await result.\n return function (onFulfilled?: any, onRejected?: any) {\n return value.call(\n obj,\n (resolved: any) => {\n finalizeFromResult(typeof resolved === 'string' ? { text: resolved } : (resolved ?? obj));\n return onFulfilled ? onFulfilled(resolved) : resolved;\n },\n (err: any) => {\n finalizeError(err);\n return onRejected ? onRejected(err) : Promise.reject(err);\n },\n );\n };\n }\n\n return value;\n },\n });\n}\n\n/** Stamp usage from an @openrouter/agent OpenResponsesResult (inputTokens/outputTokens/...). */\nfunction setOpenResponsesUsage(span: Span, resp: any): void {\n const u = resp?.usage ?? resp;\n if (!u) return;\n const input = u.inputTokens ?? u.input_tokens ?? u.prompt_tokens;\n const output = u.outputTokens ?? u.output_tokens ?? u.completion_tokens;\n const total = u.totalTokens ?? u.total_tokens;\n const cached = u.cachedTokens ?? u.cached_tokens;\n if (input != null) span.setAttribute('neatlogs.llm.token_count.prompt', input);\n if (output != null) span.setAttribute('neatlogs.llm.token_count.completion', output);\n if (total != null) span.setAttribute('neatlogs.llm.token_count.total', total);\n else if (input != null && output != null) span.setAttribute('neatlogs.llm.token_count.total', input + output);\n if (cached != null) span.setAttribute('neatlogs.llm.token_count.cache_read', cached);\n}\n\nfunction finalizeLlm(span: Span, result: any): void {\n // Text output. getText() gives a bare string (wrapped here as {text}); the\n // OpenResponsesResult from getResponse() carries text under output[]/output_text.\n const text =\n result?.text ??\n result?.output_text ??\n result?.content ??\n extractOpenResponsesText(result) ??\n result?.choices?.[0]?.message?.content ??\n result?.message?.content;\n if (text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', String(text));\n span.setAttribute('output.value', String(text));\n }\n\n // Tool calls (OpenAI-compatible shape; OpenResponses uses output[] function_call items).\n const toolCalls =\n result?.toolCalls ??\n result?.tool_calls ??\n result?.choices?.[0]?.message?.tool_calls ??\n result?.message?.tool_calls;\n if (Array.isArray(toolCalls)) {\n toolCalls.forEach((tc: any, j: number) => {\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.id`, tc?.id ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.name`, tc?.function?.name ?? tc?.name ?? '');\n const args = tc?.function?.arguments ?? tc?.arguments;\n span.setAttribute(`neatlogs.llm.tool_calls.${j}.arguments`, typeof args === 'string' ? args : safeStringify(args ?? {}));\n });\n }\n\n const model = result?.model ?? result?.response?.model;\n if (model) span.setAttribute('neatlogs.llm.model_name', String(model));\n\n const responseId = result?.id ?? result?.response?.id;\n if (responseId) span.setAttribute('neatlogs.llm.response_id', String(responseId));\n\n const finishReason = result?.finishReason ?? result?.finish_reason ?? result?.choices?.[0]?.finish_reason;\n if (finishReason) span.setAttribute('neatlogs.llm.finish_reason', String(finishReason));\n\n // Usage — OpenResponsesResult uses inputTokens/outputTokens; also handle the\n // OpenAI-compatible prompt_tokens/completion_tokens shape.\n setOpenResponsesUsage(span, result);\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n}\n\n/** Pull assistant text out of an OpenResponses-style result (output[] of message items). */\nfunction extractOpenResponsesText(result: any): string | undefined {\n const output = result?.output;\n if (!Array.isArray(output)) return undefined;\n const parts: string[] = [];\n for (const item of output) {\n if (item?.type === 'message' && Array.isArray(item.content)) {\n for (const c of item.content) {\n if ((c?.type === 'output_text' || c?.type === 'text') && typeof c.text === 'string') parts.push(c.text);\n }\n }\n }\n return parts.length ? parts.join('') : undefined;\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 span.end();\n}\n","/**\n * Direct OTLP trace shipper for the opencode plugin.\n *\n * opencode loads the plugin in-process but `opencode run` is short-lived — it\n * tears down the moment a session goes idle. The OpenTelemetry BatchSpanProcessor\n * (async, scheduled-delay export + a `beforeExit` shutdown) races that teardown,\n * dropping spans or leaving aborted half-sent requests. This shipper mirrors the\n * proven `neatlogs-claude-code` design instead: spans are queued, then `flush()`\n * does a single AWAITED `fetch(POST /v1/traces)` round-trip that completes before\n * the host process can exit. No batch processor, no exit-time race.\n *\n * Self-contained (inlined OTLP protobuf schema) so it adds no runtime file I/O.\n */\n\nimport protobuf from 'protobufjs';\nimport { __version__ } from './version.js';\n\nconst PACKAGE_NAME = 'neatlogs.opencode';\n\nexport interface OtlpKeyValue {\n key: string;\n value: {\n stringValue?: string;\n intValue?: string;\n doubleValue?: number;\n boolValue?: boolean;\n };\n}\n\nexport interface OtlpSpan {\n traceId: Uint8Array;\n spanId: Uint8Array;\n parentSpanId?: Uint8Array;\n name: string;\n /** OTLP SpanKind enum (0=unspecified, 1=internal, …). Neatlogs kind rides in attributes. */\n kind: number;\n startTimeUnixNano: string;\n endTimeUnixNano: string;\n attributes: OtlpKeyValue[];\n status?: { code: number; message?: string };\n}\n\n// Inlined OTLP proto definition — avoids .proto file I/O at runtime.\nconst OTLP_PROTO_JSON: protobuf.INamespace = {\n nested: {\n opentelemetry: {\n nested: {\n proto: {\n nested: {\n common: {\n nested: {\n v1: {\n nested: {\n AnyValue: {\n oneofs: {\n value: {\n oneof: [\n 'stringValue',\n 'boolValue',\n 'intValue',\n 'doubleValue',\n 'arrayValue',\n 'kvlistValue',\n 'bytesValue',\n ],\n },\n },\n fields: {\n stringValue: { type: 'string', id: 1 },\n boolValue: { type: 'bool', id: 2 },\n intValue: { type: 'int64', id: 3 },\n doubleValue: { type: 'double', id: 4 },\n arrayValue: { type: 'ArrayValue', id: 5 },\n kvlistValue: { type: 'KeyValueList', id: 6 },\n bytesValue: { type: 'bytes', id: 7 },\n },\n },\n ArrayValue: { fields: { values: { rule: 'repeated', type: 'AnyValue', id: 1 } } },\n KeyValueList: { fields: { values: { rule: 'repeated', type: 'KeyValue', id: 1 } } },\n KeyValue: {\n fields: { key: { type: 'string', id: 1 }, value: { type: 'AnyValue', id: 2 } },\n },\n InstrumentationScope: {\n fields: { name: { type: 'string', id: 1 }, version: { type: 'string', id: 2 } },\n },\n },\n },\n },\n },\n resource: {\n nested: {\n v1: {\n nested: {\n Resource: {\n fields: {\n attributes: {\n rule: 'repeated',\n type: 'opentelemetry.proto.common.v1.KeyValue',\n id: 1,\n },\n },\n },\n },\n },\n },\n },\n trace: {\n nested: {\n v1: {\n nested: {\n ResourceSpans: {\n fields: {\n resource: { type: 'opentelemetry.proto.resource.v1.Resource', id: 1 },\n scopeSpans: { rule: 'repeated', type: 'ScopeSpans', id: 2 },\n },\n },\n ScopeSpans: {\n fields: {\n scope: { type: 'opentelemetry.proto.common.v1.InstrumentationScope', id: 1 },\n spans: { rule: 'repeated', type: 'Span', id: 2 },\n },\n },\n Span: {\n fields: {\n traceId: { type: 'bytes', id: 1 },\n spanId: { type: 'bytes', id: 2 },\n traceState: { type: 'string', id: 3 },\n parentSpanId: { type: 'bytes', id: 4 },\n name: { type: 'string', id: 5 },\n kind: { type: 'SpanKind', id: 6 },\n startTimeUnixNano: { type: 'fixed64', id: 7 },\n endTimeUnixNano: { type: 'fixed64', id: 8 },\n attributes: {\n rule: 'repeated',\n type: 'opentelemetry.proto.common.v1.KeyValue',\n id: 9,\n },\n droppedAttributesCount: { type: 'uint32', id: 10 },\n status: { type: 'Status', id: 15 },\n },\n },\n Status: {\n fields: { message: { type: 'string', id: 2 }, code: { type: 'StatusCode', id: 3 } },\n },\n StatusCode: {\n values: { STATUS_CODE_UNSET: 0, STATUS_CODE_OK: 1, STATUS_CODE_ERROR: 2 },\n },\n SpanKind: {\n values: {\n SPAN_KIND_UNSPECIFIED: 0,\n SPAN_KIND_INTERNAL: 1,\n SPAN_KIND_SERVER: 2,\n SPAN_KIND_CLIENT: 3,\n SPAN_KIND_PRODUCER: 4,\n SPAN_KIND_CONSUMER: 5,\n },\n },\n },\n },\n },\n },\n collector: {\n nested: {\n trace: {\n nested: {\n v1: {\n nested: {\n ExportTraceServiceRequest: {\n fields: {\n resourceSpans: {\n rule: 'repeated',\n type: 'opentelemetry.proto.trace.v1.ResourceSpans',\n id: 1,\n },\n },\n },\n },\n },\n },\n },\n },\n },\n },\n },\n },\n },\n },\n};\n\nconst protoRoot = protobuf.Root.fromJSON(OTLP_PROTO_JSON);\nconst ExportTraceServiceRequest = protoRoot.lookupType(\n 'opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest',\n);\n\nexport const SpanStatusCode = { UNSET: 0, OK: 1, ERROR: 2 } as const;\n\n// ---------------------------------------------------------------------------\n// ID + time + attribute helpers\n// ---------------------------------------------------------------------------\n\nfunction randomBytes(length: number): Uint8Array {\n const out = new Uint8Array(length);\n const crypto = globalThis.crypto;\n if (crypto && typeof crypto.getRandomValues === 'function') {\n crypto.getRandomValues(out);\n return out;\n }\n for (let i = 0; i < out.length; i++) out[i] = Math.floor(Math.random() * 256);\n return out;\n}\n\nexport function generateTraceId(): Uint8Array {\n return randomBytes(16);\n}\n\nexport function generateSpanId(): Uint8Array {\n return randomBytes(8);\n}\n\nexport function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nexport function nowNanoString(): string {\n return (BigInt(Date.now()) * 1_000_000n).toString();\n}\n\nexport function msToNanoString(ms: number): string {\n return (BigInt(Math.floor(ms)) * 1_000_000n).toString();\n}\n\nexport function attrStr(key: string, value: string | undefined): OtlpKeyValue | undefined {\n if (value === undefined || value === null) return undefined;\n return { key, value: { stringValue: String(value) } };\n}\n\nexport function attrInt(key: string, value: number | undefined): OtlpKeyValue | undefined {\n if (value === undefined || value === null || !Number.isFinite(value)) return undefined;\n return { key, value: { intValue: String(Math.trunc(value)) } };\n}\n\nexport function attrDouble(key: string, value: number | undefined): OtlpKeyValue | undefined {\n if (value === undefined || value === null || !Number.isFinite(value)) return undefined;\n return { key, value: { doubleValue: value } };\n}\n\nexport interface TraceShipperOptions {\n apiKey: string;\n endpoint: string;\n debug?: boolean;\n maxRetries?: number;\n workflowName?: string;\n}\n\nexport class TraceShipper {\n private apiKey: string;\n private endpoint: string;\n private debug: boolean;\n private maxRetries: number;\n workflowName: string;\n private queue: OtlpSpan[] = [];\n private prefix = '[neatlogs/opencode]';\n /** In-flight flush round-trips — awaited by `settle()` on dispose so a\n * short-lived host (`opencode run`) can force pending exports to complete. */\n private inflight = new Set<Promise<void>>();\n\n constructor(opts: TraceShipperOptions) {\n this.apiKey = opts.apiKey;\n this.endpoint = opts.endpoint.endsWith('/') ? opts.endpoint.slice(0, -1) : opts.endpoint;\n this.debug = !!opts.debug;\n this.maxRetries = opts.maxRetries ?? 3;\n this.workflowName = opts.workflowName || '';\n }\n\n enqueue(span: OtlpSpan): void {\n this.queue.push(span);\n }\n\n get pending(): number {\n return this.queue.length;\n }\n\n /**\n * Ship all queued spans in a single awaited POST. Resolves only once the HTTP\n * response is received (or all retries are exhausted) — so a short-lived host\n * can safely exit immediately after awaiting this.\n *\n * The returned promise is also tracked in `inflight` so `settle()` can await\n * it even when the caller (an un-awaited opencode `event` hook) drops it.\n */\n flush(): Promise<void> {\n const p = this._flush().finally(() => this.inflight.delete(p));\n this.inflight.add(p);\n return p;\n }\n\n /**\n * Await every flush started so far (including ones whose promise the caller\n * discarded). Called from the plugin's `dispose` hook, which opencode DOES\n * await on scope teardown — unlike the fire-and-forget `event` hook.\n */\n async settle(): Promise<void> {\n while (this.inflight.size > 0) {\n await Promise.allSettled(Array.from(this.inflight));\n }\n }\n\n private async _flush(): Promise<void> {\n if (this.queue.length === 0) return;\n if (!this.apiKey) {\n this.queue = [];\n return;\n }\n\n const spans = this.queue.splice(0);\n const payload = this.buildProtobuf(spans);\n const url = `${this.endpoint}/v1/traces`;\n\n if (this.debug) console.log(`${this.prefix} Shipping ${spans.length} spans to ${url}`);\n\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\n try {\n const resp = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-protobuf',\n 'x-api-key': this.apiKey,\n },\n body: payload as any,\n });\n\n if (resp.ok) {\n if (this.debug) console.log(`${this.prefix} Shipped ${spans.length} spans`);\n return;\n }\n if (resp.status === 401) {\n console.warn(`${this.prefix} Invalid API key (401) — dropping ${spans.length} spans`);\n return;\n }\n if (resp.status < 500 && resp.status !== 429) {\n if (this.debug) console.warn(`${this.prefix} HTTP ${resp.status} — dropping spans`);\n return;\n }\n // 429 / 5xx → retry\n } catch (err) {\n if (this.debug) {\n console.warn(\n `${this.prefix} Attempt ${attempt}/${this.maxRetries}: ${(err as Error).message}`,\n );\n }\n }\n if (attempt < this.maxRetries) {\n await new Promise((r) => setTimeout(r, 500 * 2 ** (attempt - 1)));\n }\n }\n console.warn(`${this.prefix} Failed to ship ${spans.length} spans after ${this.maxRetries} attempts`);\n }\n\n private buildProtobuf(spans: OtlpSpan[]): Uint8Array {\n const protoSpans = spans.map((span) => ({\n traceId: span.traceId,\n spanId: span.spanId,\n parentSpanId: span.parentSpanId || undefined,\n name: span.name,\n kind: span.kind,\n startTimeUnixNano: nanoToLong(span.startTimeUnixNano),\n endTimeUnixNano: nanoToLong(span.endTimeUnixNano),\n attributes: span.attributes.map((a) => ({\n key: a.key,\n value:\n a.value.intValue !== undefined\n ? { intValue: nanoToLong(a.value.intValue) }\n : a.value,\n })),\n status: span.status ? { code: span.status.code, message: span.status.message } : undefined,\n }));\n\n const resourceAttributes: Array<{ key: string; value: { stringValue: string } }> = [\n { key: 'service.name', value: { stringValue: 'neatlogs.opencode' } },\n { key: 'service.version', value: { stringValue: __version__ } },\n ];\n if (this.workflowName) {\n resourceAttributes.push({\n key: 'neatlogs.workflow_name',\n value: { stringValue: this.workflowName },\n });\n }\n\n const message = {\n resourceSpans: [\n {\n resource: { attributes: resourceAttributes },\n scopeSpans: [\n {\n scope: { name: PACKAGE_NAME, version: __version__ },\n spans: protoSpans,\n },\n ],\n },\n ],\n };\n\n const errMsg = ExportTraceServiceRequest.verify(message);\n if (errMsg && this.debug) console.warn(`${this.prefix} Proto verify: ${errMsg}`);\n\n return ExportTraceServiceRequest.encode(ExportTraceServiceRequest.fromObject(message)).finish();\n }\n}\n\n/** protobufjs encodes fixed64/int64 from a {low,high,unsigned} Long-like. */\nfunction nanoToLong(nanoStr: string): { low: number; high: number; unsigned: boolean } {\n const big = BigInt(nanoStr);\n const low = Number(big & 0xffffffffn);\n const high = Number((big >> 32n) & 0xffffffffn);\n return { low, high, unsigned: true };\n}\n","/**\n * Neatlogs opencode plugin.\n *\n * opencode loads plugins from its config (`opencode.json` → `\"plugin\": [...]`)\n * or from local `.opencode/plugin/*.ts` files. A plugin is an async factory that\n * receives an app context and returns lifecycle hooks. This plugin instruments\n * opencode automatically — no per-call wiring — turning each opencode TURN into\n * its own neatlogs trace (mirrors @neatlogs/claude-code):\n *\n * WORKFLOW opencode.turn (one TRACE per user turn; parents that turn's spans)\n * ↳ LLM assistant turn (per completed assistant message)\n * ↳ TOOL tool execution (tool.execute.before → tool.execute.after)\n *\n * A turn opens on `chat.message` and closes on `session.idle` (which fires after\n * the turn's full tool-loop settles) — NOT on each `message.completed`, so a\n * multi-round tool-using turn stays one trace. Every span carries\n * `neatlogs.conversation.id` = the opencode session ID and a per-turn trace id;\n * all of a session's turn-traces are grouped in the UI via `neatlogs.session.id`.\n *\n * Export model (mirrors @raindrop-ai/opencode-plugin and neatlogs-claude-code):\n * opencode loads the plugin in-process but `opencode run` is short-lived. Rather\n * than the OpenTelemetry BatchSpanProcessor (whose async, scheduled-delay export\n * + `beforeExit` shutdown races the teardown and drops spans), this plugin builds\n * spans directly and ships them via AWAITED `fetch(POST /v1/traces)` — and it\n * flushes after every completed assistant turn (incremental persistence) plus a\n * final flush on `session.idle`. A `neatlogs.trace.complete` marker is sent so\n * the backend enqueues the trace for finalization (simplification → UI).\n *\n * Setup — either:\n * • npm package, in opencode.json: `{ \"plugin\": [\"neatlogs/opencode\"] }`, OR\n * • local file `.opencode/plugin/neatlogs.ts`:\n * export { NeatlogsOpencodePlugin as default } from 'neatlogs/opencode';\n *\n * Env:\n * NEATLOGS_API_KEY required to export\n * NEATLOGS_ENDPOINT backend base URL (default https://ingest.neatlogs.com)\n * NEATLOGS_WORKFLOW_NAME logical grouping (default: \"opencode\")\n * NEATLOGS_CAPTURE_SYSTEM_PROMPT=true capture system prompt text (default off)\n */\n\nimport {\n TraceShipper,\n type OtlpSpan,\n type OtlpKeyValue,\n SpanStatusCode,\n generateTraceId,\n generateSpanId,\n nowNanoString,\n msToNanoString,\n attrStr,\n attrInt,\n attrDouble,\n} from './opencode-trace-shipper.js';\n\nconst DEFAULT_ENDPOINT = 'https://ingest.neatlogs.com';\n\n/** A span being built incrementally — ended (and shipped) later. */\ninterface OpenSpan {\n spanId: Uint8Array;\n parentSpanId?: Uint8Array;\n name: string;\n startNano: string;\n attributes: OtlpKeyValue[];\n}\n\ninterface SessionState {\n /** Per-TURN trace id — minted when the turn's root opens, so each turn is its\n * own trace. Undefined between turns. */\n traceId?: Uint8Array;\n /** The current turn's WORKFLOW root span (created on chat.message, ended on idle). */\n rootSpan?: OpenSpan;\n /** Open TOOL spans keyed by callID → start time. */\n toolStarts: Map<string, { spanId: Uint8Array; startNano: string; tool: string; args: any }>;\n /** Accumulated assistant text per messageID (from text parts). */\n outputParts: Map<string, string>;\n /** Tool calls per assistant messageID (so a tool-only turn still has output). */\n toolCalls: Map<string, Array<{ name: string; input: any; callID: string }>>;\n /** assistant messageIDs already emitted (completion can fire repeatedly). */\n processed: Set<string>;\n /** Current user prompt (this turn's input). */\n currentInput: string;\n /** Captured system prompt (if enabled). */\n systemPrompt?: string;\n /** Latest assistant text — the AGENT root's output on close. */\n lastAssistantText: string;\n}\n\nexport const NeatlogsOpencodePlugin = async (_ctx: any): Promise<Record<string, any>> => {\n const apiKey = (process.env.NEATLOGS_API_KEY ?? '').trim();\n const endpoint = (process.env.NEATLOGS_ENDPOINT ?? DEFAULT_ENDPOINT).trim();\n const workflowName = process.env.NEATLOGS_WORKFLOW_NAME || 'opencode';\n const captureSystemPrompt =\n String(process.env.NEATLOGS_CAPTURE_SYSTEM_PROMPT || '').toLowerCase() === 'true';\n const debug = String(process.env.NEATLOGS_DEBUG || '').toLowerCase() === 'true';\n\n const shipper = new TraceShipper({ apiKey, endpoint, workflowName, debug });\n const sessions = new Map<string, SessionState>();\n\n function stateFor(sessionID: string): SessionState {\n let s = sessions.get(sessionID);\n if (!s) {\n s = {\n toolStarts: new Map(),\n outputParts: new Map(),\n toolCalls: new Map(),\n processed: new Set(),\n currentInput: '',\n lastAssistantText: '',\n };\n sessions.set(sessionID, s);\n }\n return s;\n }\n\n /** Start the per-turn WORKFLOW root span, minting a fresh trace id for this\n * turn (idempotent within a turn). `neatlogs.session.id` groups the session's\n * turn-traces in the UI. */\n function startRoot(st: SessionState, sessionID: string): void {\n if (st.rootSpan) return;\n st.traceId = generateTraceId();\n st.rootSpan = {\n spanId: generateSpanId(),\n name: 'opencode.turn',\n startNano: nowNanoString(),\n attributes: [\n { key: 'neatlogs.span.kind', value: { stringValue: 'WORKFLOW' } },\n { key: 'neatlogs.agent.framework', value: { stringValue: 'opencode' } },\n { key: 'neatlogs.conversation.id', value: { stringValue: sessionID } },\n { key: 'neatlogs.session.id', value: { stringValue: sessionID } },\n ],\n };\n }\n\n /** End + enqueue the WORKFLOW turn root, send the completion marker, and flush.\n * Clears the turn's trace id + accumulators so the next turn is a fresh trace. */\n async function closeAndFlush(st: SessionState, sessionID: string): Promise<void> {\n if (st.rootSpan && st.traceId) {\n const attrs = st.rootSpan.attributes.slice();\n setIO(attrs, 'WORKFLOW', st.currentInput || undefined, st.lastAssistantText || undefined);\n shipper.enqueue({\n traceId: st.traceId,\n spanId: st.rootSpan.spanId,\n name: st.rootSpan.name,\n kind: 1,\n startTimeUnixNano: st.rootSpan.startNano,\n endTimeUnixNano: nowNanoString(),\n attributes: attrs,\n status: { code: SpanStatusCode.OK },\n });\n // Completion marker — the backend only finalizes (simplifies → UI) a trace\n // once it sees a `neatlogs.trace.complete` span. Parented to the root.\n const m = nowNanoString();\n shipper.enqueue({\n traceId: st.traceId,\n spanId: generateSpanId(),\n parentSpanId: st.rootSpan.spanId,\n name: 'neatlogs.trace.complete',\n kind: 1,\n startTimeUnixNano: m,\n endTimeUnixNano: m,\n attributes: [\n { key: 'neatlogs.trace.complete', value: { boolValue: true } },\n { key: 'neatlogs.internal', value: { boolValue: true } },\n { key: 'neatlogs.span.kind', value: { stringValue: 'Neatlogs.INTERNAL' } },\n ],\n });\n }\n // Reset per-turn state so the next chat.message opens a brand-new trace.\n st.rootSpan = undefined;\n st.traceId = undefined;\n st.currentInput = '';\n st.lastAssistantText = '';\n st.processed.clear();\n st.outputParts.clear();\n st.toolCalls.clear();\n await shipper.flush();\n void sessionID;\n }\n\n return {\n /**\n * Awaited by opencode on scope teardown (registered via an internal\n * `addFinalizer`), unlike the fire-and-forget `event` hook. On a short-lived\n * `opencode run`, `session.idle`'s `await shipper.flush()` is a dangling\n * promise the process kills before the POST resolves — so we close any turn\n * still open and `settle()` all in-flight flushes here, before exit.\n */\n dispose: async () => {\n try {\n for (const [sessionID, st] of sessions) {\n if (st.rootSpan) await closeAndFlush(st, sessionID);\n }\n await shipper.settle();\n } catch {\n /* never break opencode over tracing */\n }\n },\n\n /** Fired when the user submits a prompt — open the turn's AGENT root. */\n 'chat.message': async (_input: any, output: any) => {\n try {\n const sessionID = String(_input?.sessionID ?? output?.sessionID ?? '');\n if (!sessionID) return;\n const st = stateFor(sessionID);\n const parts = output?.parts ?? [];\n const text = Array.isArray(parts)\n ? parts\n .filter((p: any) => p?.type === 'text' && typeof p.text === 'string')\n .map((p: any) => p.text)\n .join('\\n')\n : '';\n if (text) st.currentInput = text;\n startRoot(st, sessionID);\n } catch {\n /* ignore */\n }\n },\n\n /** Capture the system prompt (opt-in). */\n 'experimental.chat.system.transform': async (_input: any, output: any) => {\n try {\n if (!captureSystemPrompt) return;\n const sessionID = String(_input?.sessionID ?? '');\n const parts = output?.system ?? output?.parts ?? output;\n const joined = Array.isArray(parts) ? parts.map((p: any) => (typeof p === 'string' ? p : p?.text ?? '')).join('\\n') : String(parts ?? '');\n if (sessionID && joined) stateFor(sessionID).systemPrompt = joined;\n } catch {\n /* ignore */\n }\n },\n\n /** Global event bus — message parts, assistant completions, session idle. */\n event: async ({ event }: { event: any }) => {\n try {\n await handleEvent(shipper, sessions, stateFor, startRoot, closeAndFlush, event);\n } catch {\n // never break opencode over tracing\n }\n },\n\n /** Tool start — record start time + args (span built atomically in `after`). */\n 'tool.execute.before': async (input: any, output: any) => {\n try {\n const sessionID = String(input?.sessionID ?? '');\n if (!sessionID) return;\n const st = stateFor(sessionID);\n startRoot(st, sessionID);\n const callID = String(input?.callID ?? input?.tool ?? '');\n st.toolStarts.set(callID, {\n spanId: generateSpanId(),\n startNano: nowNanoString(),\n tool: String(input?.tool ?? 'tool'),\n args: output?.args,\n });\n } catch {\n /* ignore */\n }\n },\n\n /** Tool end — enqueue the completed TOOL span (parented to the turn root). */\n 'tool.execute.after': async (input: any, result: any) => {\n try {\n const sessionID = String(input?.sessionID ?? '');\n if (!sessionID) return;\n const st = stateFor(sessionID);\n const callID = String(input?.callID ?? input?.tool ?? '');\n const start = st.toolStarts.get(callID);\n if (!start) return;\n st.toolStarts.delete(callID);\n if (!st.traceId) return;\n\n const attrs: OtlpKeyValue[] = [\n { key: 'neatlogs.span.kind', value: { stringValue: 'TOOL' } },\n { key: 'neatlogs.tool.name', value: { stringValue: start.tool } },\n { key: 'neatlogs.conversation.id', value: { stringValue: sessionID } },\n ];\n if (start.args !== undefined) {\n // The shipper bypasses the SDK attribute-processor, so emit the\n // already-namespaced keys the backend consumer reads directly\n // (neatlogs.tool.input / .output and the generic neatlogs.input.value),\n // not the raw input.value/output.value the processor would map.\n setIO(attrs, 'TOOL', safeStringify(start.args), undefined);\n push(attrs, attrStr('neatlogs.tool.input', safeStringify(start.args)));\n }\n if (result?.title) push(attrs, attrStr('neatlogs.tool.title', String(result.title)));\n const out = result?.output ?? result?.result;\n if (out !== undefined) {\n const o = typeof out === 'string' ? out : safeStringify(out);\n setIO(attrs, 'TOOL', undefined, o);\n push(attrs, attrStr('neatlogs.tool.output', o));\n }\n if (result?.metadata !== undefined) {\n push(attrs, attrStr('neatlogs.tool.metadata', safeStringify(result.metadata)));\n }\n\n shipper.enqueue({\n traceId: st.traceId,\n spanId: start.spanId,\n parentSpanId: st.rootSpan?.spanId,\n name: `opencode.tool.${start.tool}`,\n kind: 1,\n startTimeUnixNano: start.startNano,\n endTimeUnixNano: nowNanoString(),\n attributes: attrs,\n status: { code: SpanStatusCode.OK },\n });\n } catch {\n /* ignore */\n }\n },\n };\n};\n\n// Convenience aliases so users can import under any common name.\nexport const neatlogsOpencodePlugin = NeatlogsOpencodePlugin;\nexport default NeatlogsOpencodePlugin;\n\n// ---------------------------------------------------------------------------\n// Event handling\n// ---------------------------------------------------------------------------\n\nfunction handleEvent(\n shipper: TraceShipper,\n sessions: Map<string, SessionState>,\n stateFor: (sessionID: string) => SessionState,\n startRoot: (st: SessionState, sessionID: string) => void,\n closeAndFlush: (st: SessionState, sessionID: string) => Promise<void>,\n event: any,\n): Promise<unknown> | undefined {\n const type = event?.type;\n const props = event?.properties ?? {};\n\n // Accumulate text + tool-call parts on an assistant message.\n if (type === 'message.part.updated' || type === 'message.part.completed') {\n const part = props.part ?? props;\n const messageID = part?.messageID ?? part?.message_id;\n const sessionID = part?.sessionID ?? props.sessionID;\n if (!messageID || !sessionID) return undefined;\n const st = stateFor(String(sessionID));\n if (part?.type === 'text' && typeof part?.text === 'string') {\n st.outputParts.set(String(messageID), part.text);\n } else if (part?.type === 'tool' && part?.tool) {\n const list = st.toolCalls.get(String(messageID)) ?? [];\n const callID = String(part.callID ?? part.tool);\n const input = part?.state?.input ?? {};\n const existing = list.find((t) => t.callID === callID);\n if (existing) existing.input = input;\n else list.push({ name: String(part.tool), input, callID });\n st.toolCalls.set(String(messageID), list);\n }\n return undefined;\n }\n\n // Assistant message completed → emit the LLM span, then flush this turn.\n if (type === 'message.updated' || type === 'message.completed') {\n const info = props.info ?? props.message ?? props;\n const sessionID = info?.sessionID ?? info?.session_id;\n if (!sessionID) return undefined;\n if (info?.role !== 'assistant') return undefined;\n const completed = info?.time?.completed ?? info?.completed;\n const id = String(info?.id ?? '');\n if (!completed || !id) return undefined;\n const st = stateFor(String(sessionID));\n if (st.processed.has(id)) return undefined;\n st.processed.add(id);\n startRoot(st, String(sessionID));\n emitLlmSpan(shipper, st, info, String(sessionID));\n // Incremental persistence: ship this turn's spans now (don't wait for idle).\n return shipper.flush().catch(() => undefined);\n }\n\n // Session finished → end root, send completion marker, final flush.\n if (type === 'session.idle' || type === 'session.deleted') {\n const sessionID = props.sessionID ?? props.info?.id;\n if (!sessionID) return undefined;\n const st = sessions.get(String(sessionID));\n if (!st) return undefined;\n st.toolStarts.clear();\n const p = closeAndFlush(st, String(sessionID));\n if (type === 'session.deleted') sessions.delete(String(sessionID));\n return p;\n }\n\n return undefined;\n}\n\nfunction emitLlmSpan(shipper: TraceShipper, st: SessionState, info: any, sessionID: string): void {\n if (!st.traceId) return;\n const model = info?.modelID ?? info?.model ?? '';\n const provider = info?.providerID ?? info?.provider ?? '';\n\n const attrs: OtlpKeyValue[] = [\n { key: 'neatlogs.span.kind', value: { stringValue: 'LLM' } },\n { key: 'neatlogs.conversation.id', value: { stringValue: sessionID } },\n ];\n push(attrs, attrStr('neatlogs.llm.model_name', model ? String(model) : undefined));\n push(attrs, attrStr('neatlogs.llm.provider', provider ? String(provider) : undefined));\n\n let inIdx = 0;\n if (st.systemPrompt) {\n push(attrs, attrStr(`neatlogs.llm.input_messages.${inIdx}.role`, 'system'));\n push(attrs, attrStr(`neatlogs.llm.input_messages.${inIdx}.content`, st.systemPrompt));\n inIdx++;\n }\n if (st.currentInput) {\n push(attrs, attrStr(`neatlogs.llm.input_messages.${inIdx}.role`, 'user'));\n push(attrs, attrStr(`neatlogs.llm.input_messages.${inIdx}.content`, st.currentInput));\n setIO(attrs, 'LLM', st.currentInput, undefined);\n }\n\n const outText = st.outputParts.get(String(info?.id)) || messageText(info) || '';\n const toolCalls = st.toolCalls.get(String(info?.id)) ?? [];\n\n if (outText) {\n push(attrs, attrStr('neatlogs.llm.output_messages.0.role', 'assistant'));\n push(attrs, attrStr('neatlogs.llm.output_messages.0.content', outText));\n setIO(attrs, 'LLM', undefined, outText);\n st.lastAssistantText = outText;\n }\n // Tool-deciding turns often carry no text — render the tool call(s) as output.\n if (toolCalls.length) {\n toolCalls.forEach((tc, j) => {\n push(attrs, attrStr(`neatlogs.llm.tool_calls.${j}.name`, tc.name));\n push(attrs, attrStr(`neatlogs.llm.tool_calls.${j}.arguments`, safeStringify(tc.input ?? {})));\n });\n if (!outText) {\n const rendered = toolCalls.map((tc) => `→ ${tc.name}(${safeStringify(tc.input ?? {})})`).join('\\n');\n push(attrs, attrStr('neatlogs.llm.output_messages.0.role', 'assistant'));\n push(attrs, attrStr('neatlogs.llm.output_messages.0.content', rendered));\n setIO(attrs, 'LLM', undefined, rendered);\n }\n }\n\n // Tokens: opencode message tokens { input, output, reasoning, cache:{read,write} }\n const tokens = info?.tokens;\n if (tokens) {\n push(attrs, attrInt('neatlogs.llm.token_count.prompt', tokens.input));\n push(attrs, attrInt('neatlogs.llm.token_count.completion', tokens.output));\n if (tokens.input != null && tokens.output != null) {\n push(attrs, attrInt('neatlogs.llm.token_count.total', tokens.input + tokens.output));\n }\n push(attrs, attrInt('neatlogs.llm.token_count.reasoning', tokens.reasoning));\n push(attrs, attrInt('neatlogs.llm.token_count.cache_read', tokens.cache?.read));\n push(attrs, attrInt('neatlogs.llm.token_count.cache_write', tokens.cache?.write));\n }\n push(attrs, attrDouble('neatlogs.llm.cost_usd', info?.cost));\n push(attrs, attrStr('neatlogs.llm.finish_reason', info?.finish ? String(info.finish) : undefined));\n\n // Use opencode's real start time when available (else now).\n const createdMs = info?.time?.created;\n const startNano = typeof createdMs === 'number' ? msToNanoString(Math.floor(createdMs)) : nowNanoString();\n\n shipper.enqueue({\n traceId: st.traceId,\n spanId: generateSpanId(),\n parentSpanId: st.rootSpan?.spanId,\n name: `opencode.llm.${model || 'model'}`,\n kind: 1,\n startTimeUnixNano: startNano,\n endTimeUnixNano: nowNanoString(),\n attributes: attrs,\n status: { code: SpanStatusCode.OK },\n });\n\n // Reset accumulated parts for the next turn.\n if (info?.id) {\n st.outputParts.delete(String(info.id));\n st.toolCalls.delete(String(info.id));\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction push(arr: OtlpKeyValue[], kv: OtlpKeyValue | undefined): void {\n if (kv) arr.push(kv);\n}\n\n/**\n * Set generic input/output on a span using the ALREADY-NAMESPACED keys the\n * backend consumer reads. The OTel-SDK wrappers rely on the attribute-processor\n * to map raw `input.value` → `neatlogs.{kind}.input`; this plugin ships spans\n * directly (no processor), so it must emit the namespaced keys itself:\n * neatlogs.input.value / neatlogs.output.value (generic)\n * neatlogs.{kind}.input / neatlogs.{kind}.output (kind-specific)\n * We also keep the raw input.value/output.value for any consumer that maps it.\n */\nfunction setIO(arr: OtlpKeyValue[], kind: string, input?: string, output?: string): void {\n const k = kind.toLowerCase();\n if (input !== undefined) {\n push(arr, attrStr('input.value', input));\n push(arr, attrStr('neatlogs.input.value', input));\n push(arr, attrStr(`neatlogs.${k}.input`, input));\n }\n if (output !== undefined) {\n push(arr, attrStr('output.value', output));\n push(arr, attrStr('neatlogs.output.value', output));\n push(arr, attrStr(`neatlogs.${k}.output`, output));\n }\n}\n\n/** Flatten an opencode message's parts/content to readable text. */\nfunction messageText(info: any): string {\n if (!info) return '';\n if (typeof info.text === 'string') return info.text;\n const parts = info.parts ?? info.content;\n if (typeof parts === 'string') return parts;\n if (!Array.isArray(parts)) return '';\n const out: string[] = [];\n for (const p of parts) {\n if (typeof p === 'string') out.push(p);\n else if (p && typeof p === 'object' && typeof p.text === 'string') out.push(p.text);\n }\n return out.join('');\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 String(value);\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":["traceTool","path","import_api","logger","logger","logger","span","import_node_async_hooks","otelTrace","context","span","otelTrace","span","otelTrace","logger","span","import_node_async_hooks","import_api","import_api","logger","span","logger","span","logger","logger","result","logger","span","spanId","otelTrace","logger","logger","import_api","import_api","context","path","logger","_debugMode","_debugMode","logger","span","context","import_api","import_api","TRACER_NAME","safeStringify","span","stringified","import_api","import_api","otelTrace","context","TRACER_NAME","span","safeStringify","path","import_api","TRACER_NAME","wrapNamespace","traceTool","span","safeStringify","recordError","path","isNamespace","setInvocationParams","import_api","TRACER_NAME","wrapNamespace","traceTool","span","safeStringify","recordError","path","tracedChatCompletionsCreate","tracedResponsesCreate","isNamespace","setInvocationParams","wrapAsyncIterableStream","finalizeChatResponse","finalizeStreamChunks","import_api","TRACER_NAME","PROVIDER","SYSTEM","wrapNamespace","traceTool","span","safeStringify","recordError","path","isNamespace","finalizeStreamChunks","import_api","TRACER_NAME","PROVIDER","SYSTEM","wrapNamespace","traceTool","span","safeStringify","recordError","path","tracedGenerateContent","tracedEmbedContent","tracedCountTokens","isNamespace","tracedChatSend","wrapStream","finalizeResponse","setInputAttributes","finalizeStreamChunks","setUsage","import_api","TRACER_NAME","PROVIDER","traceTool","span","safeStringify","recordError","import_api","TRACER_NAME","safeStringify","span","import_api","TRACER_NAME","span","safeStringify","import_api","TRACER_NAME","TRACER_NAME","span","recordError","safeStringify","safeStringify","recordError","span","import_api","TRACER_NAME","PATCH_FLAG","markPatched","span","safeStringify","import_api","TRACER_NAME","recordError","span","setUsage","safeStringify","import_api","TRACER_NAME","PROVIDER","span","safeStringify","recordError","protobuf","SpanStatusCode","span","SpanStatusCode","handleEvent","safeStringify","handleEvent","emitLlmSpan","messageText","safeStringify","SpanStatusCode","logger"]}
|