@farzanhossans/agentlens 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/registry.ts","../src/streaming/sse.ts","../src/interceptors/fetch.ts","../src/interceptors/https.ts","../src/parsers/anthropic.ts","../src/parsers/cohere.ts","../src/parsers/gemini.ts","../src/parsers/mistral.ts","../src/parsers/openai.ts","../src/parsers/index.ts","../src/pii/scrubber.ts","../src/transport.ts","../src/index.ts"],"names":["transport","lookupCost","extractInputText","extractOutputText","randomUUID","getCurrentTraceId"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { LLMEndpoint } from './types'\n\nexport const LLM_REGISTRY: Record<string, LLMEndpoint> = {\n 'api.openai.com': {\n provider: 'openai',\n parser: 'openai',\n paths: ['/v1/chat/completions', '/v1/completions', '/v1/embeddings'],\n },\n 'api.anthropic.com': {\n provider: 'anthropic',\n parser: 'anthropic',\n paths: ['/v1/messages'],\n },\n 'generativelanguage.googleapis.com': {\n provider: 'gemini',\n parser: 'gemini',\n paths: ['/v1beta/models', '/v1/models'],\n },\n 'api.cohere.com': {\n provider: 'cohere',\n parser: 'cohere',\n paths: ['/v1/chat', '/v1/generate', '/v2/chat'],\n },\n 'api.mistral.ai': {\n provider: 'mistral',\n parser: 'mistral',\n paths: ['/v1/chat/completions'],\n },\n}\n\nexport function matchLLM(url: string): LLMEndpoint | null {\n try {\n const parsed = new URL(url)\n const entry = LLM_REGISTRY[parsed.hostname]\n if (!entry) return null\n const pathMatch = entry.paths.some((p) => parsed.pathname.startsWith(p))\n return pathMatch ? entry : null\n } catch {\n return null\n }\n}\n\nexport function matchHostPath(host: string, path: string): LLMEndpoint | null {\n const entry = LLM_REGISTRY[host]\n if (!entry) return null\n const pathMatch = entry.paths.some((p) => path.startsWith(p))\n return pathMatch ? entry : null\n}\n","import type { LLMEndpoint, ParserName } from '../types'\nimport type { Transport } from '../transport'\n\n/**\n * Normalized stream parse result. Each per-provider parser extracts the\n * provider's native event shape into this common form so the synthesizer\n * can rebuild the right non-streaming response shape per provider.\n */\ninterface ParsedStream {\n outputText: string\n inputTokens: number\n outputTokens: number\n}\n\nexport async function captureSSEStream(\n stream: ReadableStream<Uint8Array>,\n ctx: {\n llm: LLMEndpoint\n requestBody: Record<string, unknown> | null\n latency: number\n transport: Transport\n }\n): Promise<void> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let raw = ''\n\n try {\n let done = false\n while (!done) {\n const chunk = await reader.read()\n done = chunk.done\n if (chunk.value) raw += decoder.decode(chunk.value, { stream: true })\n }\n raw += decoder.decode()\n } catch {\n return\n }\n\n const parsed = parseStream(raw, ctx.llm.parser)\n const response = synthesizeResponse(parsed, ctx.llm.parser, ctx.requestBody)\n\n ctx.transport.push({\n provider: ctx.llm.provider,\n parser: ctx.llm.parser,\n request: ctx.requestBody,\n response,\n latency: ctx.latency,\n status: 200,\n isStream: true,\n })\n}\n\nfunction parseStream(raw: string, parser: ParserName): ParsedStream {\n switch (parser) {\n case 'anthropic':\n return parseAnthropicSSE(raw)\n case 'gemini':\n return parseGeminiSSE(raw)\n case 'cohere':\n return parseCohereSSE(raw)\n case 'openai':\n case 'mistral':\n return parseOpenAISSE(raw)\n }\n}\n\nfunction parseOpenAISSE(raw: string): ParsedStream {\n let outputText = ''\n let inputTokens = 0\n let outputTokens = 0\n\n for (const line of raw.split('\\n')) {\n if (!line.startsWith('data: ')) continue\n const data = line.slice(6).trim()\n if (data === '' || data === '[DONE]') continue\n try {\n const evt = JSON.parse(data) as {\n choices?: Array<{ delta?: { content?: string }; text?: string }>\n usage?: { prompt_tokens?: number; completion_tokens?: number }\n }\n const choice = evt.choices?.[0]\n if (choice?.delta?.content) outputText += choice.delta.content\n else if (typeof choice?.text === 'string') outputText += choice.text\n if (evt.usage) {\n if (typeof evt.usage.prompt_tokens === 'number') inputTokens = evt.usage.prompt_tokens\n if (typeof evt.usage.completion_tokens === 'number') outputTokens = evt.usage.completion_tokens\n }\n } catch {\n continue\n }\n }\n\n return { outputText, inputTokens, outputTokens }\n}\n\nfunction parseAnthropicSSE(raw: string): ParsedStream {\n let outputText = ''\n let inputTokens = 0\n let outputTokens = 0\n\n for (const line of raw.split('\\n')) {\n if (!line.startsWith('data: ')) continue\n const data = line.slice(6).trim()\n if (data === '' || data === '[DONE]') continue\n try {\n const evt = JSON.parse(data) as {\n type?: string\n delta?: { type?: string; text?: string }\n message?: { usage?: { input_tokens?: number; output_tokens?: number } }\n usage?: { input_tokens?: number; output_tokens?: number }\n }\n if (evt.type === 'content_block_delta' && evt.delta?.type === 'text_delta' && evt.delta.text) {\n outputText += evt.delta.text\n }\n const u = evt.message?.usage ?? evt.usage\n if (u) {\n if (typeof u.input_tokens === 'number') inputTokens = u.input_tokens\n if (typeof u.output_tokens === 'number') outputTokens = u.output_tokens\n }\n } catch {\n continue\n }\n }\n\n return { outputText, inputTokens, outputTokens }\n}\n\n/**\n * Gemini streaming events are an SSE-ish format where each `data: ` line\n * carries a full Gemini response chunk with `candidates[].content.parts[].text`\n * and optional `usageMetadata.{promptTokenCount, candidatesTokenCount}`.\n *\n * Some Gemini endpoints (alt=sse) wrap chunks in `data: `; others emit a\n * JSON array. We handle both: split on newlines, strip `data: ` prefix if\n * present, parse each JSON object.\n */\nfunction parseGeminiSSE(raw: string): ParsedStream {\n let outputText = ''\n let inputTokens = 0\n let outputTokens = 0\n\n const candidates = extractGeminiJsonChunks(raw)\n for (const evt of candidates) {\n const evtCandidates = (evt as { candidates?: Array<{ content?: { parts?: Array<{ text?: unknown }> } }> }).candidates\n if (Array.isArray(evtCandidates)) {\n for (const c of evtCandidates) {\n const parts = c.content?.parts\n if (Array.isArray(parts)) {\n for (const p of parts) {\n if (typeof p.text === 'string') outputText += p.text\n }\n }\n }\n }\n const usage = (evt as { usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number } }).usageMetadata\n if (usage) {\n if (typeof usage.promptTokenCount === 'number') inputTokens = usage.promptTokenCount\n if (typeof usage.candidatesTokenCount === 'number') outputTokens = usage.candidatesTokenCount\n }\n }\n\n return { outputText, inputTokens, outputTokens }\n}\n\nfunction extractGeminiJsonChunks(raw: string): unknown[] {\n const out: unknown[] = []\n // Format 1: SSE `data: {...}` lines\n for (const line of raw.split('\\n')) {\n if (!line.startsWith('data: ')) continue\n const body = line.slice(6).trim()\n if (!body || body === '[DONE]') continue\n try {\n out.push(JSON.parse(body))\n } catch {\n continue\n }\n }\n if (out.length > 0) return out\n // Format 2: a single JSON array of chunks\n try {\n const parsed = JSON.parse(raw.trim()) as unknown\n if (Array.isArray(parsed)) return parsed\n if (parsed && typeof parsed === 'object') return [parsed]\n } catch {\n // fall through\n }\n return out\n}\n\n/**\n * Cohere streaming covers two shapes:\n * - v1 (`/v1/chat` with `stream: true`): newline-delimited JSON, each line\n * `{event_type: \"text-generation\", text: \"...\"}` plus a final\n * `{event_type: \"stream-end\", response: {meta: {billed_units: {...}}}}`.\n * - v2 (`/v2/chat`): SSE-style `event: content-delta` / `message-end` with\n * `data: {delta: {message: {content: {text}}}}` and final\n * `data: {delta: {usage: {tokens: {input_tokens, output_tokens}}}}`.\n */\nfunction parseCohereSSE(raw: string): ParsedStream {\n let outputText = ''\n let inputTokens = 0\n let outputTokens = 0\n\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed) continue\n const body = trimmed.startsWith('data: ') ? trimmed.slice(6).trim() : trimmed\n if (!body || body === '[DONE]' || body.startsWith('event:')) continue\n let evt: Record<string, unknown>\n try {\n evt = JSON.parse(body) as Record<string, unknown>\n } catch {\n continue\n }\n\n // v1 text-generation event\n if (evt.event_type === 'text-generation' && typeof evt.text === 'string') {\n outputText += evt.text\n }\n // v1 stream-end carries the final response with meta.billed_units\n if (evt.event_type === 'stream-end') {\n const resp = evt.response as\n | { meta?: { billed_units?: { input_tokens?: number; output_tokens?: number } } }\n | undefined\n const billed = resp?.meta?.billed_units\n if (billed) {\n if (typeof billed.input_tokens === 'number') inputTokens = billed.input_tokens\n if (typeof billed.output_tokens === 'number') outputTokens = billed.output_tokens\n }\n }\n\n // v2 content-delta\n const delta = evt.delta as\n | { message?: { content?: { text?: string } }; usage?: { tokens?: { input_tokens?: number; output_tokens?: number } } }\n | undefined\n const text = delta?.message?.content?.text\n if (typeof text === 'string') outputText += text\n const tokens = delta?.usage?.tokens\n if (tokens) {\n if (typeof tokens.input_tokens === 'number') inputTokens = tokens.input_tokens\n if (typeof tokens.output_tokens === 'number') outputTokens = tokens.output_tokens\n }\n }\n\n return { outputText, inputTokens, outputTokens }\n}\n\nfunction synthesizeResponse(\n parsed: ParsedStream,\n parser: ParserName,\n request: Record<string, unknown> | null\n): Record<string, unknown> {\n const model = (request?.model as string) ?? 'unknown'\n switch (parser) {\n case 'anthropic':\n return {\n model,\n content: [{ type: 'text', text: parsed.outputText }],\n usage: {\n input_tokens: parsed.inputTokens,\n output_tokens: parsed.outputTokens,\n },\n }\n case 'openai':\n case 'mistral':\n return {\n model,\n choices: [{ message: { content: parsed.outputText, role: 'assistant' } }],\n usage: {\n prompt_tokens: parsed.inputTokens,\n completion_tokens: parsed.outputTokens,\n total_tokens: parsed.inputTokens + parsed.outputTokens,\n },\n }\n case 'gemini':\n return {\n modelVersion: model,\n candidates: [{ content: { parts: [{ text: parsed.outputText }] } }],\n usageMetadata: {\n promptTokenCount: parsed.inputTokens,\n candidatesTokenCount: parsed.outputTokens,\n totalTokenCount: parsed.inputTokens + parsed.outputTokens,\n },\n }\n case 'cohere':\n // Use v1 meta.billed_units shape — the non-streaming Cohere parser\n // reads meta.billed_units first, then falls back to usage.tokens.\n return {\n text: parsed.outputText,\n meta: {\n billed_units: {\n input_tokens: parsed.inputTokens,\n output_tokens: parsed.outputTokens,\n },\n },\n }\n }\n}\n","import { matchLLM } from '../registry'\nimport { captureSSEStream } from '../streaming/sse'\nimport type { Transport } from '../transport'\n\ninterface PatchedFlag {\n __agentlens_patched?: boolean\n}\n\nexport function patchFetch(transport: Transport): void {\n const original = globalThis.fetch\n if (!original) return\n\n // Avoid double-patching\n if ((original as unknown as PatchedFlag).__agentlens_patched) return\n\n // Stash the original so the transport can use it without recursing through us\n ;(globalThis as { __agentlens_originalFetch?: typeof fetch }).__agentlens_originalFetch = original\n\n const patched: typeof fetch = async (input, init) => {\n const url =\n typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url\n\n const llm = matchLLM(url)\n if (!llm) return original(input, init)\n\n const start = Date.now()\n let requestBody: Record<string, unknown> | null = null\n\n const rawBody = init?.body ?? null\n if (typeof rawBody === 'string') {\n try {\n requestBody = JSON.parse(rawBody) as Record<string, unknown>\n } catch {\n requestBody = null\n }\n } else if (rawBody && rawBody instanceof ArrayBuffer) {\n try {\n const text = new TextDecoder().decode(rawBody)\n requestBody = JSON.parse(text) as Record<string, unknown>\n } catch {\n requestBody = null\n }\n }\n\n const isStream = requestBody?.stream === true\n\n try {\n const response = await original(input, init)\n const latency = Date.now() - start\n\n if (isStream && response.body) {\n const [userStream, ourStream] = response.body.tee()\n // fire-and-forget background read\n void captureSSEStream(ourStream, {\n llm,\n requestBody,\n latency,\n transport,\n })\n return new Response(userStream, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n })\n }\n\n const clone = response.clone()\n const responseBody = (await clone.json().catch(() => null)) as Record<string, unknown> | null\n if (responseBody) {\n transport.push({\n provider: llm.provider,\n parser: llm.parser,\n request: requestBody,\n response: responseBody,\n latency,\n status: response.status,\n isStream: false,\n })\n }\n return response\n } catch (err) {\n transport.pushError({\n provider: llm.provider,\n request: requestBody,\n error: err instanceof Error ? err.message : String(err),\n latency: Date.now() - start,\n })\n throw err\n }\n }\n\n ;(patched as unknown as PatchedFlag).__agentlens_patched = true\n globalThis.fetch = patched\n}\n","import { matchHostPath } from '../registry'\nimport type { Transport } from '../transport'\nimport type { LLMEndpoint } from '../types'\n\ntype RequestFn = (...args: unknown[]) => unknown\n\ninterface PatchableModule {\n request: RequestFn\n __agentlens_patched?: boolean\n}\n\ninterface RequestOptions {\n host?: string\n hostname?: string\n path?: string\n method?: string\n headers?: Record<string, string>\n}\n\nexport function patchHttps(transport: Transport): void {\n if (typeof process === 'undefined' || typeof require === 'undefined') {\n // Browser / non-Node — nothing to patch\n return\n }\n\n try {\n patchModule('https', transport)\n patchModule('http', transport)\n } catch {\n // require may be unavailable in some bundled environments — just skip\n }\n}\n\nfunction patchModule(name: 'http' | 'https', transport: Transport): void {\n let mod: PatchableModule\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n mod = require(name) as PatchableModule\n } catch {\n return\n }\n if (mod.__agentlens_patched) return\n\n const original: RequestFn = mod.request.bind(mod)\n mod.request = function patchedRequest(...args: unknown[]): unknown {\n const ctx = extractContext(args)\n if (!ctx) return original(...args)\n\n const start = Date.now()\n const requestChunks: Buffer[] = []\n const responseChunks: Buffer[] = []\n\n const req = original(...args) as NodeJS.WritableStream & {\n write: (chunk: unknown, ...rest: unknown[]) => boolean\n on: (event: string, listener: (...a: unknown[]) => void) => unknown\n }\n\n const originalWrite = req.write.bind(req)\n req.write = function (chunk: unknown, ...rest: unknown[]): boolean {\n try {\n if (chunk) requestChunks.push(toBuffer(chunk))\n } catch {\n // ignore\n }\n return originalWrite(chunk, ...(rest as []))\n }\n\n req.on('response', (...resArgs: unknown[]) => {\n const res = resArgs[0] as NodeJS.ReadableStream & {\n statusCode?: number\n on: (event: string, listener: (...a: unknown[]) => void) => unknown\n }\n res.on('data', (chunk: unknown) => {\n try {\n responseChunks.push(toBuffer(chunk))\n } catch {\n // ignore\n }\n })\n res.on('end', () => {\n const latency = Date.now() - start\n const requestText = Buffer.concat(requestChunks).toString('utf8')\n const responseText = Buffer.concat(responseChunks).toString('utf8')\n const requestBody = safeParse(requestText)\n const responseBody = safeParse(responseText)\n if (responseBody) {\n transport.push({\n provider: ctx.llm.provider,\n parser: ctx.llm.parser,\n request: requestBody,\n response: responseBody,\n latency,\n status: res.statusCode ?? 0,\n isStream: requestBody?.stream === true,\n })\n }\n })\n })\n\n req.on('error', (...errArgs: unknown[]) => {\n const err = errArgs[0] as Error | undefined\n const requestText = Buffer.concat(requestChunks).toString('utf8')\n transport.pushError({\n provider: ctx.llm.provider,\n request: safeParse(requestText),\n error: err?.message ?? String(err),\n latency: Date.now() - start,\n })\n })\n\n return req\n } as RequestFn\n mod.__agentlens_patched = true\n}\n\ninterface ExtractedCtx {\n llm: LLMEndpoint\n}\n\nfunction extractContext(args: unknown[]): ExtractedCtx | null {\n // Signatures supported:\n // request(url[, options][, callback])\n // request(options[, callback])\n let host: string | undefined\n let path: string | undefined\n\n const first = args[0]\n if (typeof first === 'string') {\n try {\n const u = new URL(first)\n host = u.hostname\n path = u.pathname + u.search\n } catch {\n return null\n }\n } else if (first instanceof URL) {\n host = first.hostname\n path = first.pathname + first.search\n } else if (first && typeof first === 'object') {\n const opts = first as RequestOptions\n host = opts.hostname ?? opts.host\n path = opts.path ?? '/'\n }\n\n if (args.length > 1 && typeof args[1] === 'object' && args[1] !== null && !(args[1] instanceof URL)) {\n const opts = args[1] as RequestOptions\n if (!host) host = opts.hostname ?? opts.host\n if (!path || path === '/') path = opts.path ?? path\n }\n\n if (!host || !path) return null\n // Strip query for path-prefix matching\n const pathOnly = path.split('?')[0]\n const llm = matchHostPath(host, pathOnly)\n if (!llm) return null\n return { llm }\n}\n\nfunction toBuffer(chunk: unknown): Buffer {\n if (Buffer.isBuffer(chunk)) return chunk\n if (typeof chunk === 'string') return Buffer.from(chunk)\n if (chunk instanceof Uint8Array) return Buffer.from(chunk)\n return Buffer.from(String(chunk))\n}\n\nfunction safeParse(text: string): Record<string, unknown> | null {\n if (!text) return null\n try {\n return JSON.parse(text) as Record<string, unknown>\n } catch {\n return null\n }\n}\n","import type { ParsedSpan } from '../types'\n\nconst ANTHROPIC_COSTS: Record<string, { input: number; output: number }> = {\n 'claude-opus-4-6': { input: 0.000015, output: 0.000075 },\n 'claude-sonnet-4-6': { input: 0.000003, output: 0.000015 },\n 'claude-haiku-4-5': { input: 0.00000025, output: 0.00000125 },\n 'claude-3-opus': { input: 0.000015, output: 0.000075 },\n 'claude-3-sonnet': { input: 0.000003, output: 0.000015 },\n 'claude-3-haiku': { input: 0.00000025, output: 0.00000125 },\n 'claude-3-5-sonnet': { input: 0.000003, output: 0.000015 },\n 'claude-3-5-haiku': { input: 0.000001, output: 0.000005 },\n}\n\nfunction lookupCost(model: string): { input: number; output: number } {\n if (ANTHROPIC_COSTS[model]) return ANTHROPIC_COSTS[model]\n for (const key of Object.keys(ANTHROPIC_COSTS)) {\n if (model.startsWith(key)) return ANTHROPIC_COSTS[key]\n }\n return { input: 0, output: 0 }\n}\n\nfunction extractInputText(request: Record<string, unknown> | null): string {\n if (!request) return ''\n const parts: string[] = []\n if (typeof request.system === 'string') parts.push(request.system)\n const messages = request.messages\n if (Array.isArray(messages)) {\n for (const m of messages) {\n const content = (m as { content?: unknown }).content\n if (typeof content === 'string') parts.push(content)\n else if (Array.isArray(content)) {\n for (const block of content) {\n const text = (block as { text?: unknown }).text\n if (typeof text === 'string') parts.push(text)\n }\n }\n }\n }\n return parts.join('\\n')\n}\n\nfunction extractOutputText(response: Record<string, unknown> | null): string {\n if (!response) return ''\n const content = response.content\n if (Array.isArray(content)) {\n return content\n .map((block) => {\n const b = block as { type?: string; text?: string }\n return b.type === 'text' && typeof b.text === 'string' ? b.text : ''\n })\n .join('')\n }\n return ''\n}\n\nexport function parseAnthropic(args: {\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n}): ParsedSpan {\n const { request, response, isStream } = args\n const model = (response?.model as string) ?? (request?.model as string) ?? 'unknown'\n const usage = (response?.usage ?? {}) as { input_tokens?: number; output_tokens?: number }\n\n const inputTokens = usage.input_tokens ?? 0\n const outputTokens = usage.output_tokens ?? 0\n const totalTokens = inputTokens + outputTokens\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'anthropic',\n inputTokens,\n outputTokens,\n totalTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText: extractOutputText(response),\n isStream,\n }\n}\n\nexport function parseAnthropicStream(args: {\n request: Record<string, unknown> | null\n outputText: string\n usage: { input_tokens?: number; output_tokens?: number }\n}): ParsedSpan {\n const { request, outputText, usage } = args\n const model = (request?.model as string) ?? 'unknown'\n const inputTokens = usage.input_tokens ?? 0\n const outputTokens = usage.output_tokens ?? 0\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'anthropic',\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText,\n isStream: true,\n }\n}\n","import type { ParsedSpan } from '../types'\n\nconst COHERE_COSTS: Record<string, { input: number; output: number }> = {\n 'command-r-plus': { input: 0.000003, output: 0.000015 },\n 'command-r': { input: 0.0000005, output: 0.0000015 },\n 'command': { input: 0.000001, output: 0.000002 },\n 'command-light': { input: 0.0000003, output: 0.0000006 },\n}\n\nfunction lookupCost(model: string): { input: number; output: number } {\n if (COHERE_COSTS[model]) return COHERE_COSTS[model]\n for (const key of Object.keys(COHERE_COSTS)) {\n if (model.startsWith(key)) return COHERE_COSTS[key]\n }\n return { input: 0, output: 0 }\n}\n\nfunction extractInputText(request: Record<string, unknown> | null): string {\n if (!request) return ''\n if (typeof request.message === 'string') return request.message\n if (typeof request.prompt === 'string') return request.prompt\n const messages = request.messages\n if (Array.isArray(messages)) {\n return messages\n .map((m) => {\n const content = (m as { content?: unknown }).content\n if (typeof content === 'string') return content\n return ''\n })\n .join('\\n')\n }\n return ''\n}\n\nfunction extractOutputText(response: Record<string, unknown> | null): string {\n if (!response) return ''\n if (typeof response.text === 'string') return response.text\n // v2 chat format: message.content[].text\n const message = response.message as { content?: Array<{ text?: string }> } | undefined\n if (message?.content && Array.isArray(message.content)) {\n return message.content.map((c) => (typeof c.text === 'string' ? c.text : '')).join('')\n }\n // generate format\n const generations = response.generations\n if (Array.isArray(generations) && generations.length > 0) {\n const first = generations[0] as { text?: string }\n if (typeof first.text === 'string') return first.text\n }\n return ''\n}\n\nexport function parseCohere(args: {\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n}): ParsedSpan {\n const { request, response, isStream } = args\n const model = (request?.model as string) ?? 'unknown'\n\n // Cohere v1 uses meta.billed_units {input_tokens, output_tokens}\n // Cohere v2 uses usage.tokens {input_tokens, output_tokens}\n const meta = (response?.meta ?? {}) as { billed_units?: { input_tokens?: number; output_tokens?: number } }\n const usage = (response?.usage ?? {}) as { tokens?: { input_tokens?: number; output_tokens?: number } }\n const tokens = meta.billed_units ?? usage.tokens ?? {}\n const inputTokens = tokens.input_tokens ?? 0\n const outputTokens = tokens.output_tokens ?? 0\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'cohere',\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText: extractOutputText(response),\n isStream,\n }\n}\n","import type { ParsedSpan } from '../types'\n\nconst GEMINI_COSTS: Record<string, { input: number; output: number }> = {\n 'gemini-1.5-pro': { input: 0.00000125, output: 0.000005 },\n 'gemini-1.5-flash': { input: 0.000000075, output: 0.0000003 },\n 'gemini-1.0-pro': { input: 0.0000005, output: 0.0000015 },\n 'gemini-pro': { input: 0.0000005, output: 0.0000015 },\n}\n\nfunction lookupCost(model: string): { input: number; output: number } {\n if (GEMINI_COSTS[model]) return GEMINI_COSTS[model]\n for (const key of Object.keys(GEMINI_COSTS)) {\n if (model.startsWith(key)) return GEMINI_COSTS[key]\n }\n return { input: 0, output: 0 }\n}\n\nfunction extractInputText(request: Record<string, unknown> | null): string {\n if (!request) return ''\n const contents = request.contents\n if (!Array.isArray(contents)) return ''\n const parts: string[] = []\n for (const c of contents) {\n const innerParts = (c as { parts?: unknown }).parts\n if (Array.isArray(innerParts)) {\n for (const p of innerParts) {\n const text = (p as { text?: unknown }).text\n if (typeof text === 'string') parts.push(text)\n }\n }\n }\n return parts.join('\\n')\n}\n\nfunction extractOutputText(response: Record<string, unknown> | null): string {\n if (!response) return ''\n const candidates = response.candidates\n if (!Array.isArray(candidates) || candidates.length === 0) return ''\n const first = candidates[0] as { content?: { parts?: Array<{ text?: string }> } }\n const parts = first.content?.parts\n if (!Array.isArray(parts)) return ''\n return parts.map((p) => (typeof p.text === 'string' ? p.text : '')).join('')\n}\n\nexport function parseGemini(args: {\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n modelHint?: string\n}): ParsedSpan {\n const { request, response, isStream, modelHint } = args\n const model =\n (response?.modelVersion as string) ??\n modelHint ??\n (request?.model as string) ??\n 'unknown'\n\n const usage = (response?.usageMetadata ?? {}) as {\n promptTokenCount?: number\n candidatesTokenCount?: number\n totalTokenCount?: number\n }\n\n const inputTokens = usage.promptTokenCount ?? 0\n const outputTokens = usage.candidatesTokenCount ?? 0\n const totalTokens = usage.totalTokenCount ?? inputTokens + outputTokens\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'gemini',\n inputTokens,\n outputTokens,\n totalTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText: extractOutputText(response),\n isStream,\n }\n}\n","import type { ParsedSpan } from '../types'\n\nconst MISTRAL_COSTS: Record<string, { input: number; output: number }> = {\n 'mistral-large': { input: 0.000002, output: 0.000006 },\n 'mistral-medium': { input: 0.0000027, output: 0.0000081 },\n 'mistral-small': { input: 0.0000002, output: 0.0000006 },\n 'open-mistral-7b': { input: 0.00000025, output: 0.00000025 },\n 'open-mixtral-8x7b': { input: 0.0000007, output: 0.0000007 },\n 'open-mixtral-8x22b': { input: 0.000002, output: 0.000006 },\n}\n\nfunction lookupCost(model: string): { input: number; output: number } {\n if (MISTRAL_COSTS[model]) return MISTRAL_COSTS[model]\n for (const key of Object.keys(MISTRAL_COSTS)) {\n if (model.startsWith(key)) return MISTRAL_COSTS[key]\n }\n return { input: 0, output: 0 }\n}\n\nfunction extractInputText(request: Record<string, unknown> | null): string {\n if (!request) return ''\n const messages = request.messages\n if (Array.isArray(messages)) {\n return messages\n .map((m) => {\n const content = (m as { content?: unknown }).content\n return typeof content === 'string' ? content : ''\n })\n .join('\\n')\n }\n return ''\n}\n\nfunction extractOutputText(response: Record<string, unknown> | null): string {\n if (!response) return ''\n const choices = response.choices\n if (Array.isArray(choices) && choices.length > 0) {\n const first = choices[0] as { message?: { content?: string } }\n if (first.message?.content) return first.message.content\n }\n return ''\n}\n\nexport function parseMistral(args: {\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n}): ParsedSpan {\n const { request, response, isStream } = args\n const model = (response?.model as string) ?? (request?.model as string) ?? 'unknown'\n\n const usage = (response?.usage ?? {}) as {\n prompt_tokens?: number\n completion_tokens?: number\n total_tokens?: number\n }\n const inputTokens = usage.prompt_tokens ?? 0\n const outputTokens = usage.completion_tokens ?? 0\n const totalTokens = usage.total_tokens ?? inputTokens + outputTokens\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'mistral',\n inputTokens,\n outputTokens,\n totalTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText: extractOutputText(response),\n isStream,\n }\n}\n","import type { ParsedSpan } from '../types'\n\nconst OPENAI_COSTS: Record<string, { input: number; output: number }> = {\n 'gpt-4o': { input: 0.0000025, output: 0.000010 },\n 'gpt-4o-mini': { input: 0.00000015, output: 0.0000006 },\n 'gpt-4-turbo': { input: 0.000010, output: 0.000030 },\n 'gpt-4': { input: 0.000030, output: 0.000060 },\n 'gpt-3.5-turbo': { input: 0.0000005, output: 0.0000015 },\n 'text-embedding-3-small': { input: 0.00000002, output: 0 },\n 'text-embedding-3-large': { input: 0.00000013, output: 0 },\n}\n\nfunction lookupCost(model: string): { input: number; output: number } {\n if (OPENAI_COSTS[model]) return OPENAI_COSTS[model]\n // Permit version-suffixed model names like \"gpt-4o-2024-08-06\"\n for (const key of Object.keys(OPENAI_COSTS)) {\n if (model.startsWith(key)) return OPENAI_COSTS[key]\n }\n return { input: 0, output: 0 }\n}\n\nfunction extractInputText(request: Record<string, unknown> | null): string {\n if (!request) return ''\n const messages = request.messages\n if (Array.isArray(messages)) {\n return messages\n .map((m) => {\n const content = (m as { content?: unknown }).content\n if (typeof content === 'string') return content\n if (Array.isArray(content)) {\n return content\n .map((part) => (typeof (part as { text?: unknown }).text === 'string' ? (part as { text: string }).text : ''))\n .join('')\n }\n return ''\n })\n .join('\\n')\n }\n if (typeof request.prompt === 'string') return request.prompt\n if (Array.isArray(request.input)) return (request.input as unknown[]).map((x) => String(x)).join('\\n')\n if (typeof request.input === 'string') return request.input\n return ''\n}\n\nfunction extractOutputText(response: Record<string, unknown> | null): string {\n if (!response) return ''\n const choices = response.choices\n if (Array.isArray(choices) && choices.length > 0) {\n const first = choices[0] as { message?: { content?: string }; text?: string }\n if (first.message?.content) return first.message.content\n if (typeof first.text === 'string') return first.text\n }\n // embeddings: no text output\n return ''\n}\n\nexport function parseOpenAI(args: {\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n}): ParsedSpan {\n const { request, response, isStream } = args\n\n const model = (response?.model as string) ?? (request?.model as string) ?? 'unknown'\n const usage = (response?.usage ?? {}) as {\n prompt_tokens?: number\n completion_tokens?: number\n total_tokens?: number\n }\n\n const inputTokens = usage.prompt_tokens ?? 0\n const outputTokens = usage.completion_tokens ?? 0\n const totalTokens = usage.total_tokens ?? inputTokens + outputTokens\n\n const cost = lookupCost(model)\n const costUsd = inputTokens * cost.input + outputTokens * cost.output\n\n return {\n model,\n provider: 'openai',\n inputTokens,\n outputTokens,\n totalTokens,\n costUsd,\n inputText: extractInputText(request),\n outputText: extractOutputText(response),\n isStream,\n }\n}\n\nexport function parseOpenAIStream(args: {\n request: Record<string, unknown> | null\n outputText: string\n usage: { prompt_tokens?: number; completion_tokens?: number; total_tokens?: number }\n}): ParsedSpan {\n const { request, outputText, usage } = args\n const model = (request?.model as string) ?? 'unknown'\n const inputTokens = usage.prompt_tokens ?? 0\n const outputTokens = usage.completion_tokens ?? 0\n const totalTokens = usage.total_tokens ?? inputTokens + outputTokens\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'openai',\n inputTokens,\n outputTokens,\n totalTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText,\n isStream: true,\n }\n}\n","import type { ParsedSpan, ParserName } from '../types'\nimport { parseAnthropic } from './anthropic'\nimport { parseCohere } from './cohere'\nimport { parseGemini } from './gemini'\nimport { parseMistral } from './mistral'\nimport { parseOpenAI } from './openai'\n\nexport { parseAnthropic, parseAnthropicStream } from './anthropic'\nexport { parseCohere } from './cohere'\nexport { parseGemini } from './gemini'\nexport { parseMistral } from './mistral'\nexport { parseOpenAI, parseOpenAIStream } from './openai'\n\nexport function parseSpan(args: {\n parser: ParserName\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n}): ParsedSpan {\n switch (args.parser) {\n case 'openai':\n return parseOpenAI(args)\n case 'anthropic':\n return parseAnthropic(args)\n case 'gemini':\n return parseGemini(args)\n case 'cohere':\n return parseCohere(args)\n case 'mistral':\n return parseMistral(args)\n }\n}\n","interface PIIPattern {\n name: string\n pattern: RegExp\n replacement: string\n}\n\n// Order matters: more specific / higher-stakes patterns run first.\n// SSN and credit cards must precede phone, because the phone regex is greedy\n// enough to eat 10 contiguous digits out of an unspaced 16-digit card number,\n// leaving fragments that no longer match the card pattern.\nconst PII_PATTERNS: PIIPattern[] = [\n { name: 'email', pattern: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g, replacement: '[EMAIL]' },\n { name: 'apikey', pattern: /\\b(sk|pk|key|token|secret|api[-_]?key)[-_]?[a-zA-Z0-9]{20,}/gi, replacement: '[API_KEY]' },\n { name: 'creditcard', pattern: /\\b\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}\\b/g, replacement: '[CARD]' },\n { name: 'ssn', pattern: /\\b\\d{3}-\\d{2}-\\d{4}\\b/g, replacement: '[SSN]' },\n { name: 'phone', pattern: /(\\+?\\d{1,3}[\\s-]?)?\\(?\\d{3}\\)?[\\s-]?\\d{3}[\\s-]?\\d{4}/g, replacement: '[PHONE]' },\n { name: 'ipv4', pattern: /\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b/g, replacement: '[IP]' },\n]\n\nexport function scrubPII(text: string): string {\n let result = text\n for (const { pattern, replacement } of PII_PATTERNS) {\n result = result.replace(pattern, replacement)\n }\n return result\n}\n\nexport function scrubObject(obj: unknown): unknown {\n if (typeof obj === 'string') return scrubPII(obj)\n if (Array.isArray(obj)) return obj.map(scrubObject)\n if (obj && typeof obj === 'object') {\n return Object.fromEntries(Object.entries(obj as Record<string, unknown>).map(([k, v]) => [k, scrubObject(v)]))\n }\n return obj\n}\n","import { randomUUID } from 'crypto'\nimport { getCurrentSpanId, getCurrentTraceId } from '@farzanhossans/agentlens-core'\nimport { parseSpan } from './parsers'\nimport { scrubPII } from './pii/scrubber'\nimport type {\n ErrorPayload,\n OutboundSpan,\n ParsedSpan,\n RawSpanPayload,\n TransportConfig,\n} from './types'\n\nconst DEFAULT_FLUSH_INTERVAL_MS = 500\nconst DEFAULT_MAX_BATCH_SIZE = 50\nconst MAX_RETRIES = 3\n\nexport class Transport {\n private readonly config: Required<TransportConfig>\n private queue: OutboundSpan[] = []\n private timer: ReturnType<typeof setInterval> | null = null\n private flushing = false\n private exitHandlerRegistered = false\n\n constructor(config: TransportConfig) {\n this.config = {\n apiKey: config.apiKey,\n endpoint: config.endpoint,\n flushIntervalMs: config.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS,\n maxBatchSize: config.maxBatchSize ?? DEFAULT_MAX_BATCH_SIZE,\n debug: config.debug ?? false,\n pii: config.pii ?? true,\n }\n this.startTimer()\n this.registerExitHandler()\n }\n\n push(payload: RawSpanPayload): void {\n let parsed: ParsedSpan\n try {\n parsed = parseSpan({\n parser: payload.parser,\n request: (payload.request ?? null) as Record<string, unknown> | null,\n response: (payload.response ?? null) as Record<string, unknown> | null,\n isStream: payload.isStream,\n })\n } catch (err) {\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.warn('[agentlens] parser failed', err)\n }\n return\n }\n\n const outbound = this.toOutbound(parsed, payload.latency, payload.status)\n this.enqueue(outbound)\n }\n\n pushError(payload: ErrorPayload): void {\n const ids = this.resolveIds()\n const span: OutboundSpan = {\n spanId: ids.spanId,\n traceId: ids.traceId,\n parentSpanId: ids.parentSpanId,\n model: 'unknown',\n provider: payload.provider,\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n costUsd: 0,\n inputText: this.scrub(this.stringifyRequest(payload.request)),\n outputText: '',\n isStream: false,\n error: payload.error,\n latency: payload.latency,\n status: 0,\n timestamp: new Date().toISOString(),\n }\n this.enqueue(span)\n }\n\n async flush(): Promise<void> {\n if (this.flushing) return\n if (this.queue.length === 0) return\n\n this.flushing = true\n const batch = this.queue.splice(0, this.queue.length)\n\n try {\n await this.send(batch)\n } catch {\n // silent — never crash\n } finally {\n this.flushing = false\n }\n }\n\n shutdown(): void {\n if (this.timer) {\n clearInterval(this.timer)\n this.timer = null\n }\n }\n\n private toOutbound(parsed: ParsedSpan, latency: number, status: number): OutboundSpan {\n const ids = this.resolveIds()\n return {\n ...parsed,\n spanId: ids.spanId,\n traceId: ids.traceId,\n parentSpanId: ids.parentSpanId,\n inputText: this.scrub(parsed.inputText),\n outputText: this.scrub(parsed.outputText),\n latency,\n status,\n timestamp: new Date().toISOString(),\n }\n }\n\n /**\n * Resolves the trace-context IDs to stamp on an outbound span.\n *\n * - `spanId` is always fresh per LLM call (the call IS the leaf span).\n * - `traceId` reuses the surrounding `trace()` block's traceId if any,\n * else a new one (the standalone LLM call is its own single-span trace).\n * - `parentSpanId` is the surrounding trace's currentSpanId, or undefined\n * when there is no enclosing `trace()`.\n *\n * AsyncLocalStorage propagates through the patched fetch's promise chain,\n * so this still resolves correctly for streamed spans emitted from the\n * background `captureSSEStream()` reader.\n */\n private resolveIds(): { spanId: string; traceId: string; parentSpanId?: string } {\n return {\n spanId: randomUUID(),\n traceId: getCurrentTraceId() ?? randomUUID(),\n parentSpanId: getCurrentSpanId(),\n }\n }\n\n private scrub(text: string): string {\n if (!this.config.pii) return text\n return scrubPII(text)\n }\n\n private stringifyRequest(request: unknown): string {\n if (request == null) return ''\n if (typeof request === 'string') return request\n try {\n return JSON.stringify(request)\n } catch {\n return ''\n }\n }\n\n private enqueue(span: OutboundSpan): void {\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.log('[agentlens] span', {\n model: span.model,\n provider: span.provider,\n inputTokens: span.inputTokens,\n outputTokens: span.outputTokens,\n costUsd: span.costUsd,\n latency: span.latency,\n isStream: span.isStream,\n })\n }\n this.queue.push(span)\n if (this.queue.length >= this.config.maxBatchSize) {\n void this.flush()\n }\n }\n\n private startTimer(): void {\n if (this.timer) return\n this.timer = setInterval(() => {\n void this.flush()\n }, this.config.flushIntervalMs)\n // Don't keep the Node event loop alive on this interval alone\n if (typeof (this.timer as { unref?: () => void }).unref === 'function') {\n ;(this.timer as { unref: () => void }).unref()\n }\n }\n\n private registerExitHandler(): void {\n if (this.exitHandlerRegistered) return\n if (typeof process === 'undefined' || typeof process.on !== 'function') return\n this.exitHandlerRegistered = true\n process.on('beforeExit', () => {\n void this.flush()\n })\n }\n\n private async send(batch: OutboundSpan[]): Promise<void> {\n const body = JSON.stringify({ spans: batch })\n let attempt = 0\n let delay = 100\n\n while (attempt < MAX_RETRIES) {\n try {\n const res = await this.doFetch(body)\n if (res.ok) return\n // 4xx — don't retry, drop\n if (res.status >= 400 && res.status < 500) {\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.warn('[agentlens] flush rejected', res.status)\n }\n return\n }\n } catch {\n // network error — retry\n }\n attempt++\n if (attempt < MAX_RETRIES) {\n await sleep(delay)\n delay *= 2\n }\n }\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.warn('[agentlens] flush gave up after', MAX_RETRIES, 'attempts')\n }\n }\n\n private async doFetch(body: string): Promise<{ ok: boolean; status: number }> {\n // Use the ORIGINAL fetch, not a patched one. The interceptor stores the\n // original on globalThis under a private key so we don't intercept ourselves.\n const f =\n (globalThis as { __agentlens_originalFetch?: typeof fetch }).__agentlens_originalFetch ??\n globalThis.fetch\n if (!f) {\n throw new Error('fetch unavailable')\n }\n const res = await f(this.config.endpoint, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${this.config.apiKey}`,\n },\n body,\n })\n return { ok: res.ok, status: res.status }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { randomUUID } from 'crypto'\nimport { getCurrentTraceId, runWithTrace } from '@farzanhossans/agentlens-core'\nimport { patchFetch } from './interceptors/fetch'\nimport { patchHttps } from './interceptors/https'\nimport { Transport } from './transport'\nimport type { AgentLensConfig } from './types'\n\nconst DEFAULT_ENDPOINT = 'https://ingest.agentlens.dev/v1/spans'\n\nlet initialized = false\nlet transport: Transport | null = null\n\nexport const AgentLens = {\n init(config: AgentLensConfig): void {\n if (initialized) return\n if (!config?.apiKey) {\n throw new Error('AgentLens.init requires an apiKey')\n }\n initialized = true\n\n transport = new Transport({\n apiKey: config.apiKey,\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\n debug: config.debug ?? false,\n pii: config.pii ?? true,\n flushIntervalMs: config.flushIntervalMs,\n maxBatchSize: config.maxBatchSize,\n })\n\n patchFetch(transport)\n patchHttps(transport)\n },\n\n async flush(): Promise<void> {\n if (!transport) return\n await transport.flush()\n },\n\n shutdown(): void {\n if (!transport) return\n transport.shutdown()\n transport = null\n initialized = false\n },\n\n /**\n * Wraps `fn` in a named trace context. Any LLM calls made inside `fn`\n * (including async ones) are auto-tagged with this trace's `traceId` and\n * get `parentSpanId` set to this trace's `spanId`. Nested `trace()` calls\n * become child spans automatically.\n *\n * Use this to group multiple LLM calls that belong to the same agent run.\n */\n trace<T>(_name: string, fn: () => Promise<T>): Promise<T> {\n const spanId = randomUUID()\n const traceId = getCurrentTraceId() ?? randomUUID()\n return runWithTrace({ traceId, currentSpanId: spanId }, fn)\n },\n}\n\nexport type { AgentLensConfig, ParsedSpan, OutboundSpan } from './types'\nexport { matchLLM, LLM_REGISTRY } from './registry'\nexport { scrubPII, scrubObject } from './pii/scrubber'\nexport {\n getCurrentTrace,\n getCurrentTraceId,\n getCurrentSpanId,\n runWithTrace,\n} from '@farzanhossans/agentlens-core'\n"]}
1
+ {"version":3,"sources":["../src/registry.ts","../src/streaming/sse.ts","../src/interceptors/fetch.ts","../src/interceptors/https.ts","../src/parsers/anthropic.ts","../src/parsers/cohere.ts","../src/parsers/gemini.ts","../src/parsers/mistral.ts","../src/parsers/openai.ts","../src/parsers/index.ts","../src/pii/scrubber.ts","../src/transport.ts","../src/index.ts"],"names":["transport","lookupCost","extractInputText","extractOutputText","randomUUID","getCurrentTraceId"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { LLMEndpoint } from './types'\n\nexport const LLM_REGISTRY: Record<string, LLMEndpoint> = {\n 'api.openai.com': {\n provider: 'openai',\n parser: 'openai',\n paths: ['/v1/chat/completions', '/v1/completions', '/v1/embeddings'],\n },\n 'api.anthropic.com': {\n provider: 'anthropic',\n parser: 'anthropic',\n paths: ['/v1/messages'],\n },\n 'generativelanguage.googleapis.com': {\n provider: 'gemini',\n parser: 'gemini',\n paths: ['/v1beta/models', '/v1/models'],\n },\n 'api.cohere.com': {\n provider: 'cohere',\n parser: 'cohere',\n paths: ['/v1/chat', '/v1/generate', '/v2/chat'],\n },\n 'api.mistral.ai': {\n provider: 'mistral',\n parser: 'mistral',\n paths: ['/v1/chat/completions'],\n },\n}\n\nexport function matchLLM(url: string): LLMEndpoint | null {\n try {\n const parsed = new URL(url)\n const entry = LLM_REGISTRY[parsed.hostname]\n if (!entry) return null\n const pathMatch = entry.paths.some((p) => parsed.pathname.startsWith(p))\n return pathMatch ? entry : null\n } catch {\n return null\n }\n}\n\nexport function matchHostPath(host: string, path: string): LLMEndpoint | null {\n const entry = LLM_REGISTRY[host]\n if (!entry) return null\n const pathMatch = entry.paths.some((p) => path.startsWith(p))\n return pathMatch ? entry : null\n}\n","import type { LLMEndpoint, ParserName } from '../types'\nimport type { Transport } from '../transport'\n\n/**\n * Normalized stream parse result. Each per-provider parser extracts the\n * provider's native event shape into this common form so the synthesizer\n * can rebuild the right non-streaming response shape per provider.\n */\ninterface ParsedStream {\n outputText: string\n inputTokens: number\n outputTokens: number\n}\n\nexport async function captureSSEStream(\n stream: ReadableStream<Uint8Array>,\n ctx: {\n llm: LLMEndpoint\n requestBody: Record<string, unknown> | null\n latency: number\n transport: Transport\n }\n): Promise<void> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let raw = ''\n\n try {\n let done = false\n while (!done) {\n const chunk = await reader.read()\n done = chunk.done\n if (chunk.value) raw += decoder.decode(chunk.value, { stream: true })\n }\n raw += decoder.decode()\n } catch {\n return\n }\n\n const parsed = parseStream(raw, ctx.llm.parser)\n const response = synthesizeResponse(parsed, ctx.llm.parser, ctx.requestBody)\n\n ctx.transport.push({\n provider: ctx.llm.provider,\n parser: ctx.llm.parser,\n request: ctx.requestBody,\n response,\n latency: ctx.latency,\n status: 200,\n isStream: true,\n })\n}\n\nfunction parseStream(raw: string, parser: ParserName): ParsedStream {\n switch (parser) {\n case 'anthropic':\n return parseAnthropicSSE(raw)\n case 'gemini':\n return parseGeminiSSE(raw)\n case 'cohere':\n return parseCohereSSE(raw)\n case 'openai':\n case 'mistral':\n return parseOpenAISSE(raw)\n }\n}\n\nfunction parseOpenAISSE(raw: string): ParsedStream {\n let outputText = ''\n let inputTokens = 0\n let outputTokens = 0\n\n for (const line of raw.split('\\n')) {\n if (!line.startsWith('data: ')) continue\n const data = line.slice(6).trim()\n if (data === '' || data === '[DONE]') continue\n try {\n const evt = JSON.parse(data) as {\n choices?: Array<{ delta?: { content?: string }; text?: string }>\n usage?: { prompt_tokens?: number; completion_tokens?: number }\n }\n const choice = evt.choices?.[0]\n if (choice?.delta?.content) outputText += choice.delta.content\n else if (typeof choice?.text === 'string') outputText += choice.text\n if (evt.usage) {\n if (typeof evt.usage.prompt_tokens === 'number') inputTokens = evt.usage.prompt_tokens\n if (typeof evt.usage.completion_tokens === 'number') outputTokens = evt.usage.completion_tokens\n }\n } catch {\n continue\n }\n }\n\n return { outputText, inputTokens, outputTokens }\n}\n\nfunction parseAnthropicSSE(raw: string): ParsedStream {\n let outputText = ''\n let inputTokens = 0\n let outputTokens = 0\n\n for (const line of raw.split('\\n')) {\n if (!line.startsWith('data: ')) continue\n const data = line.slice(6).trim()\n if (data === '' || data === '[DONE]') continue\n try {\n const evt = JSON.parse(data) as {\n type?: string\n delta?: { type?: string; text?: string }\n message?: { usage?: { input_tokens?: number; output_tokens?: number } }\n usage?: { input_tokens?: number; output_tokens?: number }\n }\n if (evt.type === 'content_block_delta' && evt.delta?.type === 'text_delta' && evt.delta.text) {\n outputText += evt.delta.text\n }\n const u = evt.message?.usage ?? evt.usage\n if (u) {\n if (typeof u.input_tokens === 'number') inputTokens = u.input_tokens\n if (typeof u.output_tokens === 'number') outputTokens = u.output_tokens\n }\n } catch {\n continue\n }\n }\n\n return { outputText, inputTokens, outputTokens }\n}\n\n/**\n * Gemini streaming events are an SSE-ish format where each `data: ` line\n * carries a full Gemini response chunk with `candidates[].content.parts[].text`\n * and optional `usageMetadata.{promptTokenCount, candidatesTokenCount}`.\n *\n * Some Gemini endpoints (alt=sse) wrap chunks in `data: `; others emit a\n * JSON array. We handle both: split on newlines, strip `data: ` prefix if\n * present, parse each JSON object.\n */\nfunction parseGeminiSSE(raw: string): ParsedStream {\n let outputText = ''\n let inputTokens = 0\n let outputTokens = 0\n\n const candidates = extractGeminiJsonChunks(raw)\n for (const evt of candidates) {\n const evtCandidates = (evt as { candidates?: Array<{ content?: { parts?: Array<{ text?: unknown }> } }> }).candidates\n if (Array.isArray(evtCandidates)) {\n for (const c of evtCandidates) {\n const parts = c.content?.parts\n if (Array.isArray(parts)) {\n for (const p of parts) {\n if (typeof p.text === 'string') outputText += p.text\n }\n }\n }\n }\n const usage = (evt as { usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number } }).usageMetadata\n if (usage) {\n if (typeof usage.promptTokenCount === 'number') inputTokens = usage.promptTokenCount\n if (typeof usage.candidatesTokenCount === 'number') outputTokens = usage.candidatesTokenCount\n }\n }\n\n return { outputText, inputTokens, outputTokens }\n}\n\nfunction extractGeminiJsonChunks(raw: string): unknown[] {\n const out: unknown[] = []\n // Format 1: SSE `data: {...}` lines\n for (const line of raw.split('\\n')) {\n if (!line.startsWith('data: ')) continue\n const body = line.slice(6).trim()\n if (!body || body === '[DONE]') continue\n try {\n out.push(JSON.parse(body))\n } catch {\n continue\n }\n }\n if (out.length > 0) return out\n // Format 2: a single JSON array of chunks\n try {\n const parsed = JSON.parse(raw.trim()) as unknown\n if (Array.isArray(parsed)) return parsed\n if (parsed && typeof parsed === 'object') return [parsed]\n } catch {\n // fall through\n }\n return out\n}\n\n/**\n * Cohere streaming covers two shapes:\n * - v1 (`/v1/chat` with `stream: true`): newline-delimited JSON, each line\n * `{event_type: \"text-generation\", text: \"...\"}` plus a final\n * `{event_type: \"stream-end\", response: {meta: {billed_units: {...}}}}`.\n * - v2 (`/v2/chat`): SSE-style `event: content-delta` / `message-end` with\n * `data: {delta: {message: {content: {text}}}}` and final\n * `data: {delta: {usage: {tokens: {input_tokens, output_tokens}}}}`.\n */\nfunction parseCohereSSE(raw: string): ParsedStream {\n let outputText = ''\n let inputTokens = 0\n let outputTokens = 0\n\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed) continue\n const body = trimmed.startsWith('data: ') ? trimmed.slice(6).trim() : trimmed\n if (!body || body === '[DONE]' || body.startsWith('event:')) continue\n let evt: Record<string, unknown>\n try {\n evt = JSON.parse(body) as Record<string, unknown>\n } catch {\n continue\n }\n\n // v1 text-generation event\n if (evt.event_type === 'text-generation' && typeof evt.text === 'string') {\n outputText += evt.text\n }\n // v1 stream-end carries the final response with meta.billed_units\n if (evt.event_type === 'stream-end') {\n const resp = evt.response as\n | { meta?: { billed_units?: { input_tokens?: number; output_tokens?: number } } }\n | undefined\n const billed = resp?.meta?.billed_units\n if (billed) {\n if (typeof billed.input_tokens === 'number') inputTokens = billed.input_tokens\n if (typeof billed.output_tokens === 'number') outputTokens = billed.output_tokens\n }\n }\n\n // v2 content-delta\n const delta = evt.delta as\n | { message?: { content?: { text?: string } }; usage?: { tokens?: { input_tokens?: number; output_tokens?: number } } }\n | undefined\n const text = delta?.message?.content?.text\n if (typeof text === 'string') outputText += text\n const tokens = delta?.usage?.tokens\n if (tokens) {\n if (typeof tokens.input_tokens === 'number') inputTokens = tokens.input_tokens\n if (typeof tokens.output_tokens === 'number') outputTokens = tokens.output_tokens\n }\n }\n\n return { outputText, inputTokens, outputTokens }\n}\n\nfunction synthesizeResponse(\n parsed: ParsedStream,\n parser: ParserName,\n request: Record<string, unknown> | null\n): Record<string, unknown> {\n const model = (request?.model as string) ?? 'unknown'\n switch (parser) {\n case 'anthropic':\n return {\n model,\n content: [{ type: 'text', text: parsed.outputText }],\n usage: {\n input_tokens: parsed.inputTokens,\n output_tokens: parsed.outputTokens,\n },\n }\n case 'openai':\n case 'mistral':\n return {\n model,\n choices: [{ message: { content: parsed.outputText, role: 'assistant' } }],\n usage: {\n prompt_tokens: parsed.inputTokens,\n completion_tokens: parsed.outputTokens,\n total_tokens: parsed.inputTokens + parsed.outputTokens,\n },\n }\n case 'gemini':\n return {\n modelVersion: model,\n candidates: [{ content: { parts: [{ text: parsed.outputText }] } }],\n usageMetadata: {\n promptTokenCount: parsed.inputTokens,\n candidatesTokenCount: parsed.outputTokens,\n totalTokenCount: parsed.inputTokens + parsed.outputTokens,\n },\n }\n case 'cohere':\n // Use v1 meta.billed_units shape — the non-streaming Cohere parser\n // reads meta.billed_units first, then falls back to usage.tokens.\n return {\n text: parsed.outputText,\n meta: {\n billed_units: {\n input_tokens: parsed.inputTokens,\n output_tokens: parsed.outputTokens,\n },\n },\n }\n }\n}\n","import { matchLLM } from '../registry'\nimport { captureSSEStream } from '../streaming/sse'\nimport type { Transport } from '../transport'\n\ninterface PatchedFlag {\n __agentlens_patched?: boolean\n}\n\nexport function patchFetch(transport: Transport): void {\n const original = globalThis.fetch\n if (!original) return\n\n // Avoid double-patching\n if ((original as unknown as PatchedFlag).__agentlens_patched) return\n\n // Stash the original so the transport can use it without recursing through us\n ;(globalThis as { __agentlens_originalFetch?: typeof fetch }).__agentlens_originalFetch = original\n\n const patched: typeof fetch = async (input, init) => {\n const url =\n typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url\n\n const llm = matchLLM(url)\n if (!llm) return original(input, init)\n\n const start = Date.now()\n let requestBody: Record<string, unknown> | null = null\n\n const rawBody = init?.body ?? null\n if (typeof rawBody === 'string') {\n try {\n requestBody = JSON.parse(rawBody) as Record<string, unknown>\n } catch {\n requestBody = null\n }\n } else if (rawBody && rawBody instanceof ArrayBuffer) {\n try {\n const text = new TextDecoder().decode(rawBody)\n requestBody = JSON.parse(text) as Record<string, unknown>\n } catch {\n requestBody = null\n }\n }\n\n const isStream = requestBody?.stream === true\n\n try {\n const response = await original(input, init)\n const latency = Date.now() - start\n\n if (isStream && response.body) {\n const [userStream, ourStream] = response.body.tee()\n // fire-and-forget background read\n void captureSSEStream(ourStream, {\n llm,\n requestBody,\n latency,\n transport,\n })\n return new Response(userStream, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n })\n }\n\n const clone = response.clone()\n const responseBody = (await clone.json().catch(() => null)) as Record<string, unknown> | null\n if (responseBody) {\n transport.push({\n provider: llm.provider,\n parser: llm.parser,\n request: requestBody,\n response: responseBody,\n latency,\n status: response.status,\n isStream: false,\n })\n }\n return response\n } catch (err) {\n transport.pushError({\n provider: llm.provider,\n request: requestBody,\n error: err instanceof Error ? err.message : String(err),\n latency: Date.now() - start,\n })\n throw err\n }\n }\n\n ;(patched as unknown as PatchedFlag).__agentlens_patched = true\n globalThis.fetch = patched\n}\n","import http from 'node:http'\nimport https from 'node:https'\nimport { matchHostPath } from '../registry'\nimport type { Transport } from '../transport'\nimport type { LLMEndpoint } from '../types'\n\n/**\n * Intercepts Node `http` and `https` outbound requests so axios, got,\n * node-fetch v2, etc. are auto-traced.\n *\n * Body capture strategy: we hook `http.IncomingMessage.prototype.push`,\n * which is what the HTTP parser calls to deliver decoded body bytes to the\n * stream. This is the AUTHORITATIVE source — calling `res.on('data', ...)`\n * from a second listener can race with the consumer (e.g. axios) and yield\n * partial/garbled bytes on Node 22+. Hooking `.push` gives us the same\n * bytes the parser produced, before any flowing-mode delivery starts.\n *\n * Works in both CJS and ESM bundles because we use static `import` for\n * `node:http`/`node:https` instead of `require()` (which tsup's ESM\n * polyfill turns into a throwing stub).\n */\n\ntype RequestFn = (...args: unknown[]) => unknown\n\ninterface PatchableModule {\n request: RequestFn\n __agentlens_patched?: boolean\n}\n\ninterface RequestOptions {\n host?: string\n hostname?: string\n path?: string\n method?: string\n headers?: Record<string, string>\n}\n\n// Maps a native IncomingMessage instance → list of body chunks captured\n// from the HTTP parser. WeakMap so we don't leak after the response is GC'd.\nconst responseChunkRegistry = new WeakMap<object, Buffer[]>()\nlet incomingMessagePatched = false\n\nexport function patchHttps(transport: Transport): void {\n patchIncomingMessage()\n patchModule(http as unknown as PatchableModule, 'http', transport)\n patchModule(https as unknown as PatchableModule, 'https', transport)\n}\n\nfunction patchIncomingMessage(): void {\n if (incomingMessagePatched) return\n // http.IncomingMessage and https.IncomingMessage share a prototype — patch once.\n const IncomingMessage = http.IncomingMessage\n if (!IncomingMessage?.prototype) return\n const proto = IncomingMessage.prototype\n // Do NOT bind — we need to invoke the original with the IncomingMessage\n // instance as `this` (so it can read its internal Symbol(kState)).\n // Disable lint because `this` is the runtime receiver, exactly what we want.\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalPush = proto.push\n proto.push = function patchedPush(\n chunk: Buffer | string | null,\n encoding?: BufferEncoding,\n ): boolean {\n if (chunk !== null) {\n const chunks = responseChunkRegistry.get(this as object)\n if (chunks) {\n try {\n if (Buffer.isBuffer(chunk)) {\n chunks.push(chunk)\n } else if (typeof chunk === 'string') {\n chunks.push(Buffer.from(chunk, encoding ?? 'utf8'))\n } else if (chunk && typeof chunk === 'object') {\n // Uint8Array, ArrayBuffer view — Buffer.from accepts these\n chunks.push(Buffer.from(chunk as unknown as Uint8Array))\n }\n } catch {\n // never let our instrumentation break the user's request\n }\n }\n }\n return originalPush.call(this, chunk as never, encoding as never)\n }\n incomingMessagePatched = true\n}\n\nfunction patchModule(\n mod: PatchableModule,\n name: 'http' | 'https',\n transport: Transport,\n): void {\n if (mod.__agentlens_patched) return\n\n const original: RequestFn = mod.request.bind(mod)\n mod.request = function patchedRequest(...args: unknown[]): unknown {\n const ctx = extractContext(args)\n if (!ctx) return original(...args)\n\n const start = Date.now()\n const requestChunks: Buffer[] = []\n\n const req = original(...args) as NodeJS.WritableStream & {\n write: (chunk: unknown, ...rest: unknown[]) => boolean\n on: (event: string, listener: (...a: unknown[]) => void) => unknown\n }\n\n const originalWrite = req.write.bind(req)\n req.write = function (chunk: unknown, ...rest: unknown[]): boolean {\n try {\n if (chunk) requestChunks.push(toBuffer(chunk))\n } catch {\n // ignore\n }\n return originalWrite(chunk, ...(rest as []))\n }\n\n req.on('response', (...resArgs: unknown[]) => {\n const res = resArgs[0] as NodeJS.ReadableStream & {\n statusCode?: number\n on: (event: string, listener: (...a: unknown[]) => void) => unknown\n }\n\n // Register this response for body capture via IncomingMessage.push hook.\n const chunks: Buffer[] = []\n responseChunkRegistry.set(res as unknown as object, chunks)\n\n res.on('end', () => {\n const latency = Date.now() - start\n const requestText = Buffer.concat(requestChunks).toString('utf8')\n const responseText = Buffer.concat(chunks).toString('utf8')\n const requestBody = safeParse(requestText)\n const responseBody = safeParse(responseText)\n if (responseBody) {\n transport.push({\n provider: ctx.llm.provider,\n parser: ctx.llm.parser,\n request: requestBody,\n response: responseBody,\n latency,\n status: res.statusCode ?? 0,\n isStream: requestBody?.stream === true,\n })\n }\n // Drop the registry entry — the WeakMap will clean it eventually\n // but explicit delete frees the chunk buffers sooner.\n responseChunkRegistry.delete(res as unknown as object)\n })\n })\n\n req.on('error', (...errArgs: unknown[]) => {\n const err = errArgs[0] as Error | undefined\n const requestText = Buffer.concat(requestChunks).toString('utf8')\n transport.pushError({\n provider: ctx.llm.provider,\n request: safeParse(requestText),\n error: err?.message ?? String(err),\n latency: Date.now() - start,\n })\n })\n\n return req\n } as RequestFn\n mod.__agentlens_patched = true\n // Suppress unused-name lint — we keep the param for clarity in stack traces.\n void name\n}\n\ninterface ExtractedCtx {\n llm: LLMEndpoint\n}\n\nfunction extractContext(args: unknown[]): ExtractedCtx | null {\n // Signatures supported:\n // request(url[, options][, callback])\n // request(options[, callback])\n let host: string | undefined\n let path: string | undefined\n\n const first = args[0]\n if (typeof first === 'string') {\n try {\n const u = new URL(first)\n host = u.hostname\n path = u.pathname + u.search\n } catch {\n return null\n }\n } else if (first instanceof URL) {\n host = first.hostname\n path = first.pathname + first.search\n } else if (first && typeof first === 'object') {\n const opts = first as RequestOptions\n host = opts.hostname ?? opts.host\n path = opts.path ?? '/'\n }\n\n if (\n args.length > 1 &&\n typeof args[1] === 'object' &&\n args[1] !== null &&\n !(args[1] instanceof URL)\n ) {\n const opts = args[1] as RequestOptions\n if (!host) host = opts.hostname ?? opts.host\n if (!path || path === '/') path = opts.path ?? path\n }\n\n if (!host || !path) return null\n const pathOnly = path.split('?')[0]\n const llm = matchHostPath(host, pathOnly)\n if (!llm) return null\n return { llm }\n}\n\nfunction toBuffer(chunk: unknown): Buffer {\n if (Buffer.isBuffer(chunk)) return chunk\n if (typeof chunk === 'string') return Buffer.from(chunk)\n if (chunk instanceof Uint8Array) return Buffer.from(chunk)\n return Buffer.from(String(chunk))\n}\n\nfunction safeParse(text: string): Record<string, unknown> | null {\n if (!text) return null\n try {\n return JSON.parse(text) as Record<string, unknown>\n } catch {\n return null\n }\n}\n","import type { ParsedSpan } from '../types'\n\nconst ANTHROPIC_COSTS: Record<string, { input: number; output: number }> = {\n 'claude-opus-4-6': { input: 0.000015, output: 0.000075 },\n 'claude-sonnet-4-6': { input: 0.000003, output: 0.000015 },\n 'claude-haiku-4-5': { input: 0.00000025, output: 0.00000125 },\n 'claude-3-opus': { input: 0.000015, output: 0.000075 },\n 'claude-3-sonnet': { input: 0.000003, output: 0.000015 },\n 'claude-3-haiku': { input: 0.00000025, output: 0.00000125 },\n 'claude-3-5-sonnet': { input: 0.000003, output: 0.000015 },\n 'claude-3-5-haiku': { input: 0.000001, output: 0.000005 },\n}\n\nfunction lookupCost(model: string): { input: number; output: number } {\n if (ANTHROPIC_COSTS[model]) return ANTHROPIC_COSTS[model]\n for (const key of Object.keys(ANTHROPIC_COSTS)) {\n if (model.startsWith(key)) return ANTHROPIC_COSTS[key]\n }\n return { input: 0, output: 0 }\n}\n\nfunction extractInputText(request: Record<string, unknown> | null): string {\n if (!request) return ''\n const parts: string[] = []\n if (typeof request.system === 'string') parts.push(request.system)\n const messages = request.messages\n if (Array.isArray(messages)) {\n for (const m of messages) {\n const content = (m as { content?: unknown }).content\n if (typeof content === 'string') parts.push(content)\n else if (Array.isArray(content)) {\n for (const block of content) {\n const text = (block as { text?: unknown }).text\n if (typeof text === 'string') parts.push(text)\n }\n }\n }\n }\n return parts.join('\\n')\n}\n\nfunction extractOutputText(response: Record<string, unknown> | null): string {\n if (!response) return ''\n const content = response.content\n if (Array.isArray(content)) {\n return content\n .map((block) => {\n const b = block as { type?: string; text?: string }\n return b.type === 'text' && typeof b.text === 'string' ? b.text : ''\n })\n .join('')\n }\n return ''\n}\n\nexport function parseAnthropic(args: {\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n}): ParsedSpan {\n const { request, response, isStream } = args\n const model = (response?.model as string) ?? (request?.model as string) ?? 'unknown'\n const usage = (response?.usage ?? {}) as { input_tokens?: number; output_tokens?: number }\n\n const inputTokens = usage.input_tokens ?? 0\n const outputTokens = usage.output_tokens ?? 0\n const totalTokens = inputTokens + outputTokens\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'anthropic',\n inputTokens,\n outputTokens,\n totalTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText: extractOutputText(response),\n isStream,\n }\n}\n\nexport function parseAnthropicStream(args: {\n request: Record<string, unknown> | null\n outputText: string\n usage: { input_tokens?: number; output_tokens?: number }\n}): ParsedSpan {\n const { request, outputText, usage } = args\n const model = (request?.model as string) ?? 'unknown'\n const inputTokens = usage.input_tokens ?? 0\n const outputTokens = usage.output_tokens ?? 0\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'anthropic',\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText,\n isStream: true,\n }\n}\n","import type { ParsedSpan } from '../types'\n\nconst COHERE_COSTS: Record<string, { input: number; output: number }> = {\n 'command-r-plus': { input: 0.000003, output: 0.000015 },\n 'command-r': { input: 0.0000005, output: 0.0000015 },\n 'command': { input: 0.000001, output: 0.000002 },\n 'command-light': { input: 0.0000003, output: 0.0000006 },\n}\n\nfunction lookupCost(model: string): { input: number; output: number } {\n if (COHERE_COSTS[model]) return COHERE_COSTS[model]\n for (const key of Object.keys(COHERE_COSTS)) {\n if (model.startsWith(key)) return COHERE_COSTS[key]\n }\n return { input: 0, output: 0 }\n}\n\nfunction extractInputText(request: Record<string, unknown> | null): string {\n if (!request) return ''\n if (typeof request.message === 'string') return request.message\n if (typeof request.prompt === 'string') return request.prompt\n const messages = request.messages\n if (Array.isArray(messages)) {\n return messages\n .map((m) => {\n const content = (m as { content?: unknown }).content\n if (typeof content === 'string') return content\n return ''\n })\n .join('\\n')\n }\n return ''\n}\n\nfunction extractOutputText(response: Record<string, unknown> | null): string {\n if (!response) return ''\n if (typeof response.text === 'string') return response.text\n // v2 chat format: message.content[].text\n const message = response.message as { content?: Array<{ text?: string }> } | undefined\n if (message?.content && Array.isArray(message.content)) {\n return message.content.map((c) => (typeof c.text === 'string' ? c.text : '')).join('')\n }\n // generate format\n const generations = response.generations\n if (Array.isArray(generations) && generations.length > 0) {\n const first = generations[0] as { text?: string }\n if (typeof first.text === 'string') return first.text\n }\n return ''\n}\n\nexport function parseCohere(args: {\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n}): ParsedSpan {\n const { request, response, isStream } = args\n const model = (request?.model as string) ?? 'unknown'\n\n // Cohere v1 uses meta.billed_units {input_tokens, output_tokens}\n // Cohere v2 uses usage.tokens {input_tokens, output_tokens}\n const meta = (response?.meta ?? {}) as { billed_units?: { input_tokens?: number; output_tokens?: number } }\n const usage = (response?.usage ?? {}) as { tokens?: { input_tokens?: number; output_tokens?: number } }\n const tokens = meta.billed_units ?? usage.tokens ?? {}\n const inputTokens = tokens.input_tokens ?? 0\n const outputTokens = tokens.output_tokens ?? 0\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'cohere',\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText: extractOutputText(response),\n isStream,\n }\n}\n","import type { ParsedSpan } from '../types'\n\nconst GEMINI_COSTS: Record<string, { input: number; output: number }> = {\n 'gemini-1.5-pro': { input: 0.00000125, output: 0.000005 },\n 'gemini-1.5-flash': { input: 0.000000075, output: 0.0000003 },\n 'gemini-1.0-pro': { input: 0.0000005, output: 0.0000015 },\n 'gemini-pro': { input: 0.0000005, output: 0.0000015 },\n}\n\nfunction lookupCost(model: string): { input: number; output: number } {\n if (GEMINI_COSTS[model]) return GEMINI_COSTS[model]\n for (const key of Object.keys(GEMINI_COSTS)) {\n if (model.startsWith(key)) return GEMINI_COSTS[key]\n }\n return { input: 0, output: 0 }\n}\n\nfunction extractInputText(request: Record<string, unknown> | null): string {\n if (!request) return ''\n const contents = request.contents\n if (!Array.isArray(contents)) return ''\n const parts: string[] = []\n for (const c of contents) {\n const innerParts = (c as { parts?: unknown }).parts\n if (Array.isArray(innerParts)) {\n for (const p of innerParts) {\n const text = (p as { text?: unknown }).text\n if (typeof text === 'string') parts.push(text)\n }\n }\n }\n return parts.join('\\n')\n}\n\nfunction extractOutputText(response: Record<string, unknown> | null): string {\n if (!response) return ''\n const candidates = response.candidates\n if (!Array.isArray(candidates) || candidates.length === 0) return ''\n const first = candidates[0] as { content?: { parts?: Array<{ text?: string }> } }\n const parts = first.content?.parts\n if (!Array.isArray(parts)) return ''\n return parts.map((p) => (typeof p.text === 'string' ? p.text : '')).join('')\n}\n\nexport function parseGemini(args: {\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n modelHint?: string\n}): ParsedSpan {\n const { request, response, isStream, modelHint } = args\n const model =\n (response?.modelVersion as string) ??\n modelHint ??\n (request?.model as string) ??\n 'unknown'\n\n const usage = (response?.usageMetadata ?? {}) as {\n promptTokenCount?: number\n candidatesTokenCount?: number\n totalTokenCount?: number\n }\n\n const inputTokens = usage.promptTokenCount ?? 0\n const outputTokens = usage.candidatesTokenCount ?? 0\n const totalTokens = usage.totalTokenCount ?? inputTokens + outputTokens\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'gemini',\n inputTokens,\n outputTokens,\n totalTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText: extractOutputText(response),\n isStream,\n }\n}\n","import type { ParsedSpan } from '../types'\n\nconst MISTRAL_COSTS: Record<string, { input: number; output: number }> = {\n 'mistral-large': { input: 0.000002, output: 0.000006 },\n 'mistral-medium': { input: 0.0000027, output: 0.0000081 },\n 'mistral-small': { input: 0.0000002, output: 0.0000006 },\n 'open-mistral-7b': { input: 0.00000025, output: 0.00000025 },\n 'open-mixtral-8x7b': { input: 0.0000007, output: 0.0000007 },\n 'open-mixtral-8x22b': { input: 0.000002, output: 0.000006 },\n}\n\nfunction lookupCost(model: string): { input: number; output: number } {\n if (MISTRAL_COSTS[model]) return MISTRAL_COSTS[model]\n for (const key of Object.keys(MISTRAL_COSTS)) {\n if (model.startsWith(key)) return MISTRAL_COSTS[key]\n }\n return { input: 0, output: 0 }\n}\n\nfunction extractInputText(request: Record<string, unknown> | null): string {\n if (!request) return ''\n const messages = request.messages\n if (Array.isArray(messages)) {\n return messages\n .map((m) => {\n const content = (m as { content?: unknown }).content\n return typeof content === 'string' ? content : ''\n })\n .join('\\n')\n }\n return ''\n}\n\nfunction extractOutputText(response: Record<string, unknown> | null): string {\n if (!response) return ''\n const choices = response.choices\n if (Array.isArray(choices) && choices.length > 0) {\n const first = choices[0] as { message?: { content?: string } }\n if (first.message?.content) return first.message.content\n }\n return ''\n}\n\nexport function parseMistral(args: {\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n}): ParsedSpan {\n const { request, response, isStream } = args\n const model = (response?.model as string) ?? (request?.model as string) ?? 'unknown'\n\n const usage = (response?.usage ?? {}) as {\n prompt_tokens?: number\n completion_tokens?: number\n total_tokens?: number\n }\n const inputTokens = usage.prompt_tokens ?? 0\n const outputTokens = usage.completion_tokens ?? 0\n const totalTokens = usage.total_tokens ?? inputTokens + outputTokens\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'mistral',\n inputTokens,\n outputTokens,\n totalTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText: extractOutputText(response),\n isStream,\n }\n}\n","import type { ParsedSpan } from '../types'\n\nconst OPENAI_COSTS: Record<string, { input: number; output: number }> = {\n 'gpt-4o': { input: 0.0000025, output: 0.000010 },\n 'gpt-4o-mini': { input: 0.00000015, output: 0.0000006 },\n 'gpt-4-turbo': { input: 0.000010, output: 0.000030 },\n 'gpt-4': { input: 0.000030, output: 0.000060 },\n 'gpt-3.5-turbo': { input: 0.0000005, output: 0.0000015 },\n 'text-embedding-3-small': { input: 0.00000002, output: 0 },\n 'text-embedding-3-large': { input: 0.00000013, output: 0 },\n}\n\nfunction lookupCost(model: string): { input: number; output: number } {\n if (OPENAI_COSTS[model]) return OPENAI_COSTS[model]\n // Permit version-suffixed model names like \"gpt-4o-2024-08-06\"\n for (const key of Object.keys(OPENAI_COSTS)) {\n if (model.startsWith(key)) return OPENAI_COSTS[key]\n }\n return { input: 0, output: 0 }\n}\n\nfunction extractInputText(request: Record<string, unknown> | null): string {\n if (!request) return ''\n const messages = request.messages\n if (Array.isArray(messages)) {\n return messages\n .map((m) => {\n const content = (m as { content?: unknown }).content\n if (typeof content === 'string') return content\n if (Array.isArray(content)) {\n return content\n .map((part) => (typeof (part as { text?: unknown }).text === 'string' ? (part as { text: string }).text : ''))\n .join('')\n }\n return ''\n })\n .join('\\n')\n }\n if (typeof request.prompt === 'string') return request.prompt\n if (Array.isArray(request.input)) return (request.input as unknown[]).map((x) => String(x)).join('\\n')\n if (typeof request.input === 'string') return request.input\n return ''\n}\n\nfunction extractOutputText(response: Record<string, unknown> | null): string {\n if (!response) return ''\n const choices = response.choices\n if (Array.isArray(choices) && choices.length > 0) {\n const first = choices[0] as { message?: { content?: string }; text?: string }\n if (first.message?.content) return first.message.content\n if (typeof first.text === 'string') return first.text\n }\n // embeddings: no text output\n return ''\n}\n\nexport function parseOpenAI(args: {\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n}): ParsedSpan {\n const { request, response, isStream } = args\n\n const model = (response?.model as string) ?? (request?.model as string) ?? 'unknown'\n const usage = (response?.usage ?? {}) as {\n prompt_tokens?: number\n completion_tokens?: number\n total_tokens?: number\n }\n\n const inputTokens = usage.prompt_tokens ?? 0\n const outputTokens = usage.completion_tokens ?? 0\n const totalTokens = usage.total_tokens ?? inputTokens + outputTokens\n\n const cost = lookupCost(model)\n const costUsd = inputTokens * cost.input + outputTokens * cost.output\n\n return {\n model,\n provider: 'openai',\n inputTokens,\n outputTokens,\n totalTokens,\n costUsd,\n inputText: extractInputText(request),\n outputText: extractOutputText(response),\n isStream,\n }\n}\n\nexport function parseOpenAIStream(args: {\n request: Record<string, unknown> | null\n outputText: string\n usage: { prompt_tokens?: number; completion_tokens?: number; total_tokens?: number }\n}): ParsedSpan {\n const { request, outputText, usage } = args\n const model = (request?.model as string) ?? 'unknown'\n const inputTokens = usage.prompt_tokens ?? 0\n const outputTokens = usage.completion_tokens ?? 0\n const totalTokens = usage.total_tokens ?? inputTokens + outputTokens\n const cost = lookupCost(model)\n\n return {\n model,\n provider: 'openai',\n inputTokens,\n outputTokens,\n totalTokens,\n costUsd: inputTokens * cost.input + outputTokens * cost.output,\n inputText: extractInputText(request),\n outputText,\n isStream: true,\n }\n}\n","import type { ParsedSpan, ParserName } from '../types'\nimport { parseAnthropic } from './anthropic'\nimport { parseCohere } from './cohere'\nimport { parseGemini } from './gemini'\nimport { parseMistral } from './mistral'\nimport { parseOpenAI } from './openai'\n\nexport { parseAnthropic, parseAnthropicStream } from './anthropic'\nexport { parseCohere } from './cohere'\nexport { parseGemini } from './gemini'\nexport { parseMistral } from './mistral'\nexport { parseOpenAI, parseOpenAIStream } from './openai'\n\nexport function parseSpan(args: {\n parser: ParserName\n request: Record<string, unknown> | null\n response: Record<string, unknown> | null\n isStream: boolean\n}): ParsedSpan {\n switch (args.parser) {\n case 'openai':\n return parseOpenAI(args)\n case 'anthropic':\n return parseAnthropic(args)\n case 'gemini':\n return parseGemini(args)\n case 'cohere':\n return parseCohere(args)\n case 'mistral':\n return parseMistral(args)\n }\n}\n","interface PIIPattern {\n name: string\n pattern: RegExp\n replacement: string\n}\n\n// Order matters: more specific / higher-stakes patterns run first.\n// SSN and credit cards must precede phone, because the phone regex is greedy\n// enough to eat 10 contiguous digits out of an unspaced 16-digit card number,\n// leaving fragments that no longer match the card pattern.\nconst PII_PATTERNS: PIIPattern[] = [\n { name: 'email', pattern: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g, replacement: '[EMAIL]' },\n { name: 'apikey', pattern: /\\b(sk|pk|key|token|secret|api[-_]?key)[-_]?[a-zA-Z0-9]{20,}/gi, replacement: '[API_KEY]' },\n { name: 'creditcard', pattern: /\\b\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}\\b/g, replacement: '[CARD]' },\n { name: 'ssn', pattern: /\\b\\d{3}-\\d{2}-\\d{4}\\b/g, replacement: '[SSN]' },\n { name: 'phone', pattern: /(\\+?\\d{1,3}[\\s-]?)?\\(?\\d{3}\\)?[\\s-]?\\d{3}[\\s-]?\\d{4}/g, replacement: '[PHONE]' },\n { name: 'ipv4', pattern: /\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b/g, replacement: '[IP]' },\n]\n\nexport function scrubPII(text: string): string {\n let result = text\n for (const { pattern, replacement } of PII_PATTERNS) {\n result = result.replace(pattern, replacement)\n }\n return result\n}\n\nexport function scrubObject(obj: unknown): unknown {\n if (typeof obj === 'string') return scrubPII(obj)\n if (Array.isArray(obj)) return obj.map(scrubObject)\n if (obj && typeof obj === 'object') {\n return Object.fromEntries(Object.entries(obj as Record<string, unknown>).map(([k, v]) => [k, scrubObject(v)]))\n }\n return obj\n}\n","import { randomUUID } from 'crypto'\nimport { getCurrentSpanId, getCurrentTraceId } from '@farzanhossans/agentlens-core'\nimport { parseSpan } from './parsers'\nimport { scrubPII } from './pii/scrubber'\nimport type {\n ErrorPayload,\n OutboundSpan,\n ParsedSpan,\n RawSpanPayload,\n SpanStatus,\n TransportConfig,\n} from './types'\n\nconst DEFAULT_FLUSH_INTERVAL_MS = 500\nconst DEFAULT_MAX_BATCH_SIZE = 50\nconst MAX_RETRIES = 3\n\nexport class Transport {\n private readonly config: Required<TransportConfig>\n private queue: OutboundSpan[] = []\n private timer: ReturnType<typeof setInterval> | null = null\n private flushing = false\n private exitHandlerRegistered = false\n\n constructor(config: TransportConfig) {\n this.config = {\n apiKey: config.apiKey,\n projectId: config.projectId,\n endpoint: config.endpoint,\n flushIntervalMs: config.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS,\n maxBatchSize: config.maxBatchSize ?? DEFAULT_MAX_BATCH_SIZE,\n debug: config.debug ?? false,\n pii: config.pii ?? true,\n }\n this.startTimer()\n this.registerExitHandler()\n }\n\n push(payload: RawSpanPayload): void {\n const startedAt = new Date(Date.now() - payload.latency).toISOString()\n const endedAt = new Date().toISOString()\n let parsed: ParsedSpan\n try {\n parsed = parseSpan({\n parser: payload.parser,\n request: (payload.request ?? null) as Record<string, unknown> | null,\n response: (payload.response ?? null) as Record<string, unknown> | null,\n isStream: payload.isStream,\n })\n } catch (err) {\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.warn('[agentlens] parser failed', err)\n }\n return\n }\n\n const outbound = this.toOutbound(parsed, payload, startedAt, endedAt)\n this.enqueue(outbound)\n }\n\n pushError(payload: ErrorPayload): void {\n const ids = this.resolveIds()\n const startedAt = new Date(Date.now() - payload.latency).toISOString()\n const endedAt = new Date().toISOString()\n const span: OutboundSpan = {\n spanId: ids.spanId,\n traceId: ids.traceId,\n parentSpanId: ids.parentSpanId,\n projectId: this.config.projectId,\n name: `${payload.provider}.error`,\n model: 'unknown',\n provider: payload.provider,\n input: this.scrub(this.stringifyRequest(payload.request)),\n output: '',\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n costUsd: 0,\n latencyMs: payload.latency,\n status: 'error',\n errorMessage: payload.error,\n metadata: { httpStatus: 0 },\n startedAt,\n endedAt,\n isStream: false,\n }\n this.enqueue(span)\n }\n\n async flush(): Promise<void> {\n if (this.flushing) return\n if (this.queue.length === 0) return\n\n this.flushing = true\n const batch = this.queue.splice(0, this.queue.length)\n\n try {\n await this.send(batch)\n } catch {\n // silent — never crash\n } finally {\n this.flushing = false\n }\n }\n\n shutdown(): void {\n if (this.timer) {\n clearInterval(this.timer)\n this.timer = null\n }\n }\n\n private toOutbound(\n parsed: ParsedSpan,\n payload: RawSpanPayload,\n startedAt: string,\n endedAt: string,\n ): OutboundSpan {\n const ids = this.resolveIds()\n const status: SpanStatus = payload.status >= 200 && payload.status < 400 ? 'success' : 'error'\n return {\n spanId: ids.spanId,\n traceId: ids.traceId,\n parentSpanId: ids.parentSpanId,\n projectId: this.config.projectId,\n name: spanNameFor(payload),\n model: parsed.model,\n provider: parsed.provider,\n input: this.scrub(parsed.inputText),\n output: this.scrub(parsed.outputText),\n inputTokens: parsed.inputTokens,\n outputTokens: parsed.outputTokens,\n totalTokens: parsed.totalTokens,\n costUsd: parsed.costUsd,\n latencyMs: payload.latency,\n status,\n errorMessage: parsed.error,\n metadata: { httpStatus: payload.status },\n startedAt,\n endedAt,\n isStream: parsed.isStream,\n }\n }\n\n /**\n * Resolves the trace-context IDs to stamp on an outbound span.\n *\n * - `spanId` is always fresh per LLM call (the call IS the leaf span).\n * - `traceId` reuses the surrounding `trace()` block's traceId if any,\n * else a new one (the standalone LLM call is its own single-span trace).\n * - `parentSpanId` is the surrounding trace's currentSpanId, or undefined\n * when there is no enclosing `trace()`.\n *\n * AsyncLocalStorage propagates through the patched fetch's promise chain,\n * so this still resolves correctly for streamed spans emitted from the\n * background `captureSSEStream()` reader.\n */\n private resolveIds(): { spanId: string; traceId: string; parentSpanId?: string } {\n return {\n spanId: randomUUID(),\n traceId: getCurrentTraceId() ?? randomUUID(),\n parentSpanId: getCurrentSpanId(),\n }\n }\n\n private scrub(text: string): string {\n if (!this.config.pii) return text\n return scrubPII(text)\n }\n\n private stringifyRequest(request: unknown): string {\n if (request == null) return ''\n if (typeof request === 'string') return request\n try {\n return JSON.stringify(request)\n } catch {\n return ''\n }\n }\n\n private enqueue(span: OutboundSpan): void {\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.log('[agentlens] span', {\n name: span.name,\n model: span.model,\n provider: span.provider,\n inputTokens: span.inputTokens,\n outputTokens: span.outputTokens,\n costUsd: span.costUsd,\n latencyMs: span.latencyMs,\n isStream: span.isStream,\n })\n }\n this.queue.push(span)\n if (this.queue.length >= this.config.maxBatchSize) {\n void this.flush()\n }\n }\n\n private startTimer(): void {\n if (this.timer) return\n this.timer = setInterval(() => {\n void this.flush()\n }, this.config.flushIntervalMs)\n if (typeof (this.timer as { unref?: () => void }).unref === 'function') {\n ;(this.timer as { unref: () => void }).unref()\n }\n }\n\n private registerExitHandler(): void {\n if (this.exitHandlerRegistered) return\n if (typeof process === 'undefined' || typeof process.on !== 'function') return\n this.exitHandlerRegistered = true\n process.on('beforeExit', () => {\n void this.flush()\n })\n }\n\n private async send(batch: OutboundSpan[]): Promise<void> {\n const body = JSON.stringify({ spans: batch })\n let attempt = 0\n let delay = 100\n\n while (attempt < MAX_RETRIES) {\n try {\n const res = await this.doFetch(body)\n if (res.ok) return\n if (res.status >= 400 && res.status < 500) {\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.warn('[agentlens] flush rejected', res.status)\n }\n return\n }\n } catch {\n // network error — retry\n }\n attempt++\n if (attempt < MAX_RETRIES) {\n await sleep(delay)\n delay *= 2\n }\n }\n if (this.config.debug) {\n // eslint-disable-next-line no-console\n console.warn('[agentlens] flush gave up after', MAX_RETRIES, 'attempts')\n }\n }\n\n private async doFetch(body: string): Promise<{ ok: boolean; status: number }> {\n const f =\n (globalThis as { __agentlens_originalFetch?: typeof fetch }).__agentlens_originalFetch ??\n globalThis.fetch\n if (!f) {\n throw new Error('fetch unavailable')\n }\n const res = await f(this.config.endpoint, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n // Hosted ingest expects X-API-Key. Send Authorization too for any\n // gateways that may sit in front (some Cloudflare workers want it).\n 'x-api-key': this.config.apiKey,\n authorization: `Bearer ${this.config.apiKey}`,\n },\n body,\n })\n return { ok: res.ok, status: res.status }\n }\n}\n\nfunction spanNameFor(payload: RawSpanPayload): string {\n const req = payload.request as Record<string, unknown> | null\n // Detect endpoint kind from the request shape, no URL parsing needed.\n if (req && Array.isArray(req.messages)) return `${payload.provider}.chat`\n if (req && (typeof req.prompt === 'string' || typeof req.input === 'string')) {\n return `${payload.provider}.completion`\n }\n if (req && (req.input !== undefined || req.contents !== undefined)) {\n return `${payload.provider}.embedding`\n }\n return `${payload.provider}.call`\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { randomUUID } from 'crypto'\nimport { getCurrentTraceId, runWithTrace } from '@farzanhossans/agentlens-core'\nimport { patchFetch } from './interceptors/fetch'\nimport { patchHttps } from './interceptors/https'\nimport { Transport } from './transport'\nimport type { AgentLensConfig } from './types'\n\nconst DEFAULT_ENDPOINT = 'https://ingest.agentlens.dev/v1/spans'\n\nlet initialized = false\nlet transport: Transport | null = null\n\nexport const AgentLens = {\n init(config: AgentLensConfig): void {\n if (initialized) return\n if (!config?.apiKey) {\n throw new Error('AgentLens.init requires an apiKey')\n }\n if (!config?.projectId) {\n throw new Error('AgentLens.init requires a projectId')\n }\n initialized = true\n\n transport = new Transport({\n apiKey: config.apiKey,\n projectId: config.projectId,\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\n debug: config.debug ?? false,\n pii: config.pii ?? true,\n flushIntervalMs: config.flushIntervalMs,\n maxBatchSize: config.maxBatchSize,\n })\n\n patchFetch(transport)\n patchHttps(transport)\n },\n\n async flush(): Promise<void> {\n if (!transport) return\n await transport.flush()\n },\n\n shutdown(): void {\n if (!transport) return\n transport.shutdown()\n transport = null\n initialized = false\n },\n\n /**\n * Wraps `fn` in a named trace context. Any LLM calls made inside `fn`\n * (including async ones) are auto-tagged with this trace's `traceId` and\n * get `parentSpanId` set to this trace's `spanId`. Nested `trace()` calls\n * become child spans automatically.\n *\n * Use this to group multiple LLM calls that belong to the same agent run.\n */\n trace<T>(_name: string, fn: () => Promise<T>): Promise<T> {\n const spanId = randomUUID()\n const traceId = getCurrentTraceId() ?? randomUUID()\n return runWithTrace({ traceId, currentSpanId: spanId }, fn)\n },\n}\n\nexport type { AgentLensConfig, ParsedSpan, OutboundSpan } from './types'\nexport { matchLLM, LLM_REGISTRY } from './registry'\nexport { scrubPII, scrubObject } from './pii/scrubber'\nexport {\n getCurrentTrace,\n getCurrentTraceId,\n getCurrentSpanId,\n runWithTrace,\n} from '@farzanhossans/agentlens-core'\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farzanhossans/agentlens",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Universal AI agent observability — 1 line to trace every LLM call (OpenAI, Anthropic, Gemini, Cohere, Mistral)",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",