neatlogs 1.1.7 → 1.1.8

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.
@@ -772,8 +772,20 @@ function recordUsage(span, usage) {
772
772
  const prompt = tokenValue(usage.promptTokens ?? usage.inputTokens ?? usage.input_tokens);
773
773
  const completion = tokenValue(usage.completionTokens ?? usage.outputTokens ?? usage.output_tokens);
774
774
  const total = tokenValue(usage.totalTokens);
775
+ const reasoning = tokenValue(
776
+ usage.reasoningTokens ?? usage.outputTokens?.reasoning ?? usage.output_tokens?.reasoning
777
+ );
778
+ const cacheRead = tokenValue(
779
+ usage.cachedInputTokens ?? usage.cacheReadInputTokens ?? usage.cache_read_input_tokens ?? usage.inputTokens?.cacheRead ?? usage.input_tokens?.cache_read
780
+ );
781
+ const cacheWrite = tokenValue(
782
+ usage.cacheCreationInputTokens ?? usage.cacheWriteInputTokens ?? usage.cache_creation_input_tokens ?? usage.inputTokens?.cacheWrite ?? usage.input_tokens?.cache_write
783
+ );
775
784
  if (prompt != null) span.setAttribute("neatlogs.llm.token_count.prompt", prompt);
776
785
  if (completion != null) span.setAttribute("neatlogs.llm.token_count.completion", completion);
786
+ if (reasoning != null) span.setAttribute("neatlogs.llm.token_count.reasoning", reasoning);
787
+ if (cacheRead != null) span.setAttribute("neatlogs.llm.token_count.cache_read", cacheRead);
788
+ if (cacheWrite != null) span.setAttribute("neatlogs.llm.token_count.cache_write", cacheWrite);
777
789
  if (total != null) span.setAttribute("neatlogs.llm.token_count.total", total);
778
790
  else if (prompt != null && completion != null) {
779
791
  span.setAttribute("neatlogs.llm.token_count.total", prompt + completion);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mastra-wrap.ts","../src/core/provider.ts"],"sourcesContent":["/**\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}, outputTokens: {total} }\n // - Mastra result: { inputTokens, outputTokens, totalTokens }\n // - AISDK v3: { promptTokens, completionTokens, totalTokens }\n const prompt = tokenValue(usage.promptTokens ?? usage.inputTokens ?? usage.input_tokens);\n const completion = tokenValue(usage.completionTokens ?? usage.outputTokens ?? usage.output_tokens);\n const total = tokenValue(usage.totalTokens);\n if (prompt != null) span.setAttribute('neatlogs.llm.token_count.prompt', prompt);\n if (completion != null) span.setAttribute('neatlogs.llm.token_count.completion', completion);\n if (total != null) span.setAttribute('neatlogs.llm.token_count.total', total);\n else if (prompt != null && completion != null) {\n span.setAttribute('neatlogs.llm.token_count.total', prompt + completion);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Span helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Open a span as the ACTIVE span for the duration of `fn`, so any spans created\n * inside `fn` (model calls, tool executions, workflow steps) nest under it.\n */\nfunction withActiveSpan<T>(name: string, attrs: Record<string, any>, fn: (span: Span) => Promise<T>): Promise<T> {\n const tracer = 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-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 trace as otelTrace,\n type Context,\n type Span,\n type SpanOptions,\n type Tracer,\n type TracerProvider,\n} from '@opentelemetry/api';\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 * 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 const ctx = otelTrace.setSpan(base, span);\n return privateContextStorage.run(ctx, fn);\n}\n"],"mappings":"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","names":["import_api","otelTrace","otelTrace"]}
1
+ {"version":3,"sources":["../src/mastra-wrap.ts","../src/core/provider.ts"],"sourcesContent":["/**\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-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 trace as otelTrace,\n type Context,\n type Span,\n type SpanOptions,\n type Tracer,\n type TracerProvider,\n} from '@opentelemetry/api';\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 * 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 const ctx = otelTrace.setSpan(base, span);\n return privateContextStorage.run(ctx, fn);\n}\n"],"mappings":"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","names":["import_api","otelTrace","otelTrace"]}
@@ -753,8 +753,20 @@ function recordUsage(span, usage) {
753
753
  const prompt = tokenValue(usage.promptTokens ?? usage.inputTokens ?? usage.input_tokens);
754
754
  const completion = tokenValue(usage.completionTokens ?? usage.outputTokens ?? usage.output_tokens);
755
755
  const total = tokenValue(usage.totalTokens);
756
+ const reasoning = tokenValue(
757
+ usage.reasoningTokens ?? usage.outputTokens?.reasoning ?? usage.output_tokens?.reasoning
758
+ );
759
+ const cacheRead = tokenValue(
760
+ usage.cachedInputTokens ?? usage.cacheReadInputTokens ?? usage.cache_read_input_tokens ?? usage.inputTokens?.cacheRead ?? usage.input_tokens?.cache_read
761
+ );
762
+ const cacheWrite = tokenValue(
763
+ usage.cacheCreationInputTokens ?? usage.cacheWriteInputTokens ?? usage.cache_creation_input_tokens ?? usage.inputTokens?.cacheWrite ?? usage.input_tokens?.cache_write
764
+ );
756
765
  if (prompt != null) span.setAttribute("neatlogs.llm.token_count.prompt", prompt);
757
766
  if (completion != null) span.setAttribute("neatlogs.llm.token_count.completion", completion);
767
+ if (reasoning != null) span.setAttribute("neatlogs.llm.token_count.reasoning", reasoning);
768
+ if (cacheRead != null) span.setAttribute("neatlogs.llm.token_count.cache_read", cacheRead);
769
+ if (cacheWrite != null) span.setAttribute("neatlogs.llm.token_count.cache_write", cacheWrite);
758
770
  if (total != null) span.setAttribute("neatlogs.llm.token_count.total", total);
759
771
  else if (prompt != null && completion != null) {
760
772
  span.setAttribute("neatlogs.llm.token_count.total", prompt + completion);