neatlogs 1.1.20 → 1.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/doctor-cli.ts","../src/core/doctor-capture.ts","../src/core/logger.ts","../src/span-kinds/constants.ts","../src/span-kinds/mapping.ts","../src/config/attribute-mapping.json","../src/config/attribute-mapper.ts","../src/constants.ts","../src/core/context.ts","../src/prompt/template.ts","../src/core/mask.ts","../src/core/identity.ts","../src/core/provider.ts","../src/core/active-client.ts","../src/core/end-user.ts","../src/core/session.ts","../src/core/media.ts","../src/core/upload-authority.ts","../src/core/auto-root.ts","../src/errors.ts","../src/decorators/base.ts","../src/decorators/orchestration.ts","../src/doctor-v2.ts","../src/contracts/v2/neatlogs-telemetry.schema.json","../src/schema-v2.ts","../src/version.ts","../src/init.ts","../src/core/span-processor.ts","../src/core/instrumentation-scope-parser.ts","../src/config/model_defaults.json","../src/config/defaults-enricher.ts","../src/core/attribute-processor.ts","../src/core/crewai-task-registry.ts","../src/core/resource.ts","../src/core/http-span.ts","../src/core/filtering-exporter.ts","../src/core/byte-limited-exporter.ts","../src/core/masking-log-exporter.ts","../src/core/delivery-diagnostics.ts","../src/core/observable-batch-processors.ts","../src/core/log.ts","../src/prompt/client.ts","../src/mastra.ts","../src/core/deadline.ts","../src/cli.ts"],"sourcesContent":["import { SpanStatusCode } from '@opentelemetry/api';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport { getCapturedEnvelope, getDoctorCaptureStats } from './core/doctor-capture.js';\nimport { trace, setTraceOutput } from './core/context.js';\nimport { disableLogging, enableLogging } from './core/logger.js';\nimport { getActiveNeatlogsSpan, getRoutingNeatlogsTracer } from './core/provider.js';\nimport { span } from './decorators/orchestration.js';\nimport {\n doctorCapturedLocalV2,\n DOCTOR_V2_FORMAT_VERSION,\n type DoctorV2Result,\n} from './doctor-v2.js';\nimport { flush, init, shutdown } from './init.js';\nimport { TELEMETRY_SCHEMA_VERSION } from './schema-v2.js';\nimport { __version__ } from './version.js';\n\nconst DOCTOR_SERVICE = 'neatlogs.doctor.v2';\nconst DOCTOR_MARKER_VERSION = 'v1';\nconst PROBE_TIMEOUT_MS = 48_000;\nconst REQUEST_TIMEOUT_MS = 5_000;\nconst POLL_INTERVAL_MS = 1_000;\nconst MAX_READBACK_BYTES = 1 << 20;\nconst EXPECTED_TOKENS = [11, 7, 18] as const;\n\nconst EXPECTED_TYPES = new Map([\n ['doctor.probe.root', 'workflow'],\n ['doctor.probe.agent', 'agent_action'],\n ['doctor.probe.llm', 'llm'],\n ['doctor.probe.tool', 'tool_call'],\n]);\n\nconst EXPECTED_SPAN_TYPES = new Map([\n ['doctor.probe.root', 'WORKFLOW'],\n ['doctor.probe.agent', 'AGENT'],\n ['doctor.probe.llm', 'LLM'],\n ['doctor.probe.tool', 'TOOL'],\n]);\n\nconst EXPECTED_IO = new Map<string, Readonly<{ input: unknown; output: unknown }>>([\n ['doctor.probe.root', {\n input: { prompt: 'generated diagnostic input' },\n output: { result: { value: 2 } },\n }],\n ['doctor.probe.agent', {\n input: { prompt: 'generated diagnostic input' },\n output: { text: 'generated diagnostic output' },\n }],\n ['doctor.probe.llm', {\n input: { messages: [{ role: 'user', content: 'generated diagnostic input' }] },\n output: { text: 'generated diagnostic output' },\n }],\n ['doctor.probe.tool', { input: { value: 1 }, output: { value: 2 } }],\n]);\n\n// The v3 read path intentionally returns the UI-facing simplified view. It may\n// preserve normalized JSON or render the same deterministic semantic value for\n// display. Keep this allowlist identical across SDKs.\nconst EXPECTED_PERSISTED_IO = new Map<string, Readonly<{\n inputs: readonly unknown[];\n outputs: readonly unknown[];\n}>>([\n ['doctor.probe.root', {\n inputs: [{ prompt: 'generated diagnostic input' }, 'generated diagnostic input'],\n outputs: [{ result: { value: 2 } }, 'Value: 2'],\n }],\n ['doctor.probe.agent', {\n inputs: [{ prompt: 'generated diagnostic input' }, 'Prompt: generated diagnostic input'],\n outputs: [{ text: 'generated diagnostic output' }],\n }],\n ['doctor.probe.llm', {\n inputs: [\n { messages: [{ role: 'user', content: 'generated diagnostic input' }] },\n { prompt: 'generated diagnostic input' },\n ],\n outputs: [{ text: 'generated diagnostic output' }, 'Text: generated diagnostic output'],\n }],\n ['doctor.probe.tool', {\n inputs: [{ value: 1 }, 'Value: 1'],\n outputs: [{ value: 2 }, 'Value: 2'],\n }],\n]);\n\nexport type DoctorCliIO = Readonly<{\n stdout: (line: string) => void;\n stderr: (line: string) => void;\n fetch: typeof globalThis.fetch;\n env: NodeJS.ProcessEnv;\n sleep: (milliseconds: number) => Promise<void>;\n probeExporter?: SpanExporter;\n probeTimeoutMs: number;\n requestTimeoutMs: number;\n pollIntervalMs: number;\n}>;\n\nconst defaultIO: DoctorCliIO = {\n stdout: (line) => process.stdout.write(`${line}\\n`),\n stderr: (line) => process.stderr.write(`${line}\\n`),\n fetch: globalThis.fetch,\n env: process.env,\n sleep: (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)),\n probeTimeoutMs: PROBE_TIMEOUT_MS,\n requestTimeoutMs: REQUEST_TIMEOUT_MS,\n pollIntervalMs: POLL_INTERVAL_MS,\n};\n\ntype PersistedSpan = Readonly<{\n span_id?: unknown;\n parent_span_id?: unknown;\n node_name?: unknown;\n span_name?: unknown;\n node_type?: unknown;\n span_type?: unknown;\n data?: unknown;\n span_metadata?: unknown;\n}>;\n\ntype PersistedTrace = Readonly<{\n _id?: unknown;\n status?: unknown;\n finalizationStatus?: unknown;\n spanCount?: unknown;\n promptTokens?: unknown;\n completionTokens?: unknown;\n totalTokensUsed?: unknown;\n workflowName?: unknown;\n spans?: unknown;\n ingestionDiagnostics?: unknown;\n}>;\n\nconst INGESTION_STAGES = new Set([\n 'kafka_published', 'pii_dispatch', 'pii_redaction', 'storage_consumer',\n 'raw_durable', 'root_resolution', 'simplification', 'finalized',\n]);\nconst INGESTION_STATES = new Set(['processing', 'failed', 'succeeded']);\nconst SAFE_FAILURE_CODE = /^[A-Z0-9_]{1,64}$/;\ntype CheckDetails = Readonly<Record<string, string | number | boolean | null>>;\n\ntype ProbeCheck = Readonly<{\n name: string;\n status: 'pass' | 'fail';\n reason_code: string;\n remediation_code: string;\n message: string;\n details?: CheckDetails;\n}>;\n\ntype DoctorProbeFailureResult = Omit<DoctorV2Result, 'mode'> &\n Readonly<{ mode: 'probe' }>;\n\ntype DoctorFailureBase = Omit<\n DoctorV2Result,\n 'mode' | 'first_failure' | 'checks' | 'capture'\n>;\n\ntype ProbeFailureReason =\n | 'AUTH_FAILED'\n | 'BACKEND_PROBE_UNAVAILABLE'\n | 'TRACE_READBACK_TIMEOUT'\n | 'INGESTION_PIPELINE_FAILED'\n | 'BACKEND_HTTP_ERROR'\n | 'BACKEND_CONNECTION_FAILED'\n | 'TRACE_READBACK_INVALID';\n\nconst PROBE_FAILURE = {\n AUTH_FAILED: {\n remediationCode: 'CHECK_INGEST_CREDENTIAL',\n message: 'The project key was rejected by the existing trace API',\n },\n BACKEND_PROBE_UNAVAILABLE: {\n remediationCode: 'CHECK_TRACE_ENDPOINT',\n message: 'The existing trace ingestion or read path is unavailable',\n },\n TRACE_READBACK_TIMEOUT: {\n remediationCode: 'WAIT_FOR_TRACE',\n message: 'Timed out waiting for the exact Doctor trace',\n },\n INGESTION_PIPELINE_FAILED: {\n remediationCode: 'CONTACT_SUPPORT',\n message: 'Trace ingestion reported a terminal pipeline failure',\n },\n BACKEND_HTTP_ERROR: {\n remediationCode: 'CHECK_TRACE_ENDPOINT',\n message: 'The existing trace read path returned an unexpected HTTP status',\n },\n BACKEND_CONNECTION_FAILED: {\n remediationCode: 'CHECK_TRACE_ENDPOINT',\n message: 'Could not connect to the existing trace read path',\n },\n TRACE_READBACK_INVALID: {\n remediationCode: 'CONTACT_SUPPORT',\n message: 'Trace read-back returned an invalid response',\n },\n} as const satisfies Readonly<Record<\n ProbeFailureReason,\n Readonly<{ remediationCode: string; message: string }>\n>>;\n\nclass ProbeReadError extends Error {\n constructor(\n readonly reasonCode: ProbeFailureReason,\n message: string,\n readonly details?: CheckDetails,\n ) {\n super(message);\n }\n}\n\nfunction ingestionDiagnosticDetails(value: unknown): CheckDetails | undefined {\n const diagnostics = objectValue(objectValue(value).ingestionDiagnostics);\n if (diagnostics.protocolVersion !== 'v1' ||\n typeof diagnostics.currentStage !== 'string' ||\n !INGESTION_STAGES.has(diagnostics.currentStage) ||\n typeof diagnostics.state !== 'string' ||\n !INGESTION_STATES.has(diagnostics.state) ||\n typeof diagnostics.retryable !== 'boolean') {\n return undefined;\n }\n const validOptionalStage = (key: 'lastSuccessfulStage' | 'failedStage') => {\n const item = diagnostics[key];\n return item === undefined ||\n (typeof item === 'string' && INGESTION_STAGES.has(item));\n };\n if (!validOptionalStage('lastSuccessfulStage') ||\n !validOptionalStage('failedStage') ||\n (diagnostics.failureCode !== undefined &&\n (typeof diagnostics.failureCode !== 'string' ||\n !SAFE_FAILURE_CODE.test(diagnostics.failureCode)))) {\n return undefined;\n }\n return Object.freeze({\n ingestion_state: diagnostics.state,\n current_stage: diagnostics.currentStage,\n ...(typeof diagnostics.lastSuccessfulStage === 'string'\n ? { last_successful_stage: diagnostics.lastSuccessfulStage }\n : {}),\n ...(typeof diagnostics.failedStage === 'string'\n ? { failed_stage: diagnostics.failedStage }\n : {}),\n ...(typeof diagnostics.failureCode === 'string'\n ? { failure_code: diagnostics.failureCode }\n : {}),\n retryable: diagnostics.retryable,\n });\n}\n\nfunction markDoctorSpan(spanType: 'WORKFLOW' | 'AGENT' | 'LLM' | 'TOOL'): void {\n getActiveNeatlogsSpan()?.setAttributes({\n 'neatlogs.doctor': true,\n 'neatlogs.doctor.version': DOCTOR_MARKER_VERSION,\n 'service.name': DOCTOR_SERVICE,\n 'telemetry.sdk.language': 'typescript',\n 'telemetry.sdk.version': __version__,\n 'neatlogs.span.kind': spanType.toLowerCase(),\n });\n}\n\nfunction canonicalize(value: unknown): unknown {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n try { return canonicalize(JSON.parse(trimmed)); } catch { return value; }\n }\n return value;\n }\n if (Array.isArray(value)) return value.map(canonicalize);\n if (value && typeof value === 'object') {\n return Object.fromEntries(Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, item]) => [key, canonicalize(item)]));\n }\n return value;\n}\n\nfunction sameValue(left: unknown, right: unknown): boolean {\n return JSON.stringify(canonicalize(left)) === JSON.stringify(canonicalize(right));\n}\n\nfunction matchesMaterializedValue(value: unknown, expected: readonly unknown[]): boolean {\n return value !== null && value !== undefined &&\n expected.some((candidate) => sameValue(value, candidate));\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : {};\n}\n\nfunction check(\n name: string,\n passed: boolean,\n passCode: string,\n failureCode: string,\n remediationCode: string,\n message: string,\n details?: CheckDetails,\n): ProbeCheck {\n return {\n name,\n status: passed ? 'pass' : 'fail',\n reason_code: passed ? passCode : failureCode,\n remediation_code: passed ? 'NONE' : remediationCode,\n message,\n ...(details ? { details } : {}),\n };\n}\n\nfunction validateLocalFixture(traceId: string): readonly ProbeCheck[] {\n const envelope = getCapturedEnvelope(traceId);\n const stats = getDoctorCaptureStats(traceId);\n if (!envelope) {\n return [check(\n 'controlled_fixture', false, 'CONTROLLED_FIXTURE_VALID',\n 'CONTROLLED_FIXTURE_MISSING', 'ENABLE_INSTRUMENTOR',\n 'The controlled Doctor fixture was not captured',\n )];\n }\n\n const byName = new Map(envelope.spans.map((item) => [item.name, item]));\n const root = byName.get('doctor.probe.root');\n const agent = byName.get('doctor.probe.agent');\n const llm = byName.get('doctor.probe.llm');\n const tool = byName.get('doctor.probe.tool');\n const exactSet = envelope.spans.length === EXPECTED_SPAN_TYPES.size &&\n byName.size === EXPECTED_SPAN_TYPES.size &&\n [...EXPECTED_SPAN_TYPES].every(([name, kind]) => byName.get(name)?.kind === kind);\n const exactEdges = !!root && !!agent && !!llm && !!tool &&\n root.parent_span_id === null &&\n agent.parent_span_id === root.span_id &&\n llm.parent_span_id === agent.span_id &&\n tool.parent_span_id === root.span_id;\n const exactIo = [...EXPECTED_IO].every(([name, expected]) => {\n const item = byName.get(name);\n return !!item && sameValue(item.input, expected.input) && sameValue(item.output, expected.output);\n });\n const exactMetadata = [...EXPECTED_SPAN_TYPES].every(([name, spanType]) => {\n const attributes = byName.get(name)?.attributes ?? {};\n return attributes['neatlogs.doctor'] === true &&\n attributes['neatlogs.doctor.version'] === DOCTOR_MARKER_VERSION &&\n attributes['service.name'] === DOCTOR_SERVICE &&\n attributes['telemetry.sdk.language'] === 'typescript' &&\n attributes['telemetry.sdk.version'] === __version__ &&\n attributes['neatlogs.span.kind'] === spanType.toLowerCase();\n });\n const exactTokens = !!llm && [\n llm.attributes?.['neatlogs.llm.token_count.prompt'],\n llm.attributes?.['neatlogs.llm.token_count.completion'],\n llm.attributes?.['neatlogs.llm.token_count.total'],\n ].every((value, index) => typeof value === 'number' && value === EXPECTED_TOKENS[index]);\n\n return [\n check('controlled_fixture_spans', exactSet, 'CONTROLLED_SPANS_VALID', 'CONTROLLED_SPANS_INVALID', 'CHECK_SDK_INSTRUMENTATION', 'Doctor captured exactly the four expected semantic spans'),\n check('controlled_fixture_hierarchy', exactEdges, 'CONTROLLED_HIERARCHY_VALID', 'CONTROLLED_HIERARCHY_INVALID', 'CHECK_PARENT_CONTEXT', 'Doctor captured the exact root-agent-LLM and root-tool edges'),\n check('controlled_fixture_io', exactIo, 'CONTROLLED_IO_VALID', 'CONTROLLED_IO_INVALID', 'CHECK_PAYLOAD_MAPPING', 'Doctor captured the deterministic non-null input and output values'),\n check('controlled_fixture_metadata', exactMetadata, 'CONTROLLED_METADATA_VALID', 'CONTROLLED_METADATA_INVALID', 'CHECK_ATTRIBUTE_MAPPING', 'Doctor captured all versioned metadata on every semantic span'),\n check('controlled_fixture_tokens', exactTokens, 'CONTROLLED_TOKENS_VALID', 'CONTROLLED_TOKENS_INVALID', 'CHECK_TOKEN_MAPPING', 'Doctor captured the exact numeric token values'),\n check('controlled_fixture_bounds', stats.droppedSpans === 0, 'CONTROLLED_BOUNDS_VALID', 'CONTROLLED_CAPTURE_TRUNCATED', 'REDUCE_DIAGNOSTIC_CAPTURE', 'Doctor stayed inside the bounded capture budget'),\n ];\n}\n\nasync function withTimeout<T>(\n operation: () => Promise<T>,\n timeoutMs: number,\n onTimeout?: () => void,\n timeoutReason: ProbeFailureReason = 'BACKEND_PROBE_UNAVAILABLE',\n): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n Promise.resolve().then(operation),\n new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n onTimeout?.();\n reject(new ProbeReadError(timeoutReason, 'Doctor operation timed out'));\n }, Math.max(1, timeoutMs));\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\nasync function localResult(\n env: NodeJS.ProcessEnv,\n options: Readonly<{\n exportProbe?: boolean;\n probeExporter?: SpanExporter;\n flushTimeoutMs?: number;\n }> = {},\n) {\n const flushTimeoutMs = Math.max(1, options.flushTimeoutMs ?? 5_000);\n const started = Date.now();\n let traceId = '';\n disableLogging();\n try {\n await init({\n apiKey: env.NEATLOGS_API_KEY,\n workflowName: DOCTOR_SERVICE,\n endpoint: options.exportProbe ? env.NEATLOGS_ENDPOINT : undefined,\n disableExport: !options.exportProbe,\n diagnosticCapture: true,\n doctorProbe: options.exportProbe === true,\n doctorProbeExporter: options.probeExporter,\n doctorProbeTimeoutMillis: options.exportProbe ? flushTimeoutMs : undefined,\n registerShutdownHandlers: false,\n batchSize: 32,\n flushInterval: 60,\n });\n\n const diagnosticTool = span(\n { kind: 'TOOL', name: 'doctor.probe.tool' },\n async (input: { value: number }) => {\n markDoctorSpan('TOOL');\n return { value: input.value + 1 };\n },\n );\n const diagnosticAgent = span(\n { kind: 'AGENT', name: 'doctor.probe.agent', role: 'diagnostic-agent' },\n async (input: { prompt: string }) => {\n markDoctorSpan('AGENT');\n return getRoutingNeatlogsTracer('neatlogs.doctor').startActiveSpan(\n 'doctor.probe.llm',\n {\n attributes: {\n 'openinference.span.kind': 'LLM',\n 'input.value': JSON.stringify({\n messages: [{ role: 'user', content: input.prompt }],\n }),\n 'neatlogs.llm.token_count.prompt': EXPECTED_TOKENS[0],\n 'neatlogs.llm.token_count.completion': EXPECTED_TOKENS[1],\n 'neatlogs.llm.token_count.total': EXPECTED_TOKENS[2],\n },\n },\n (llm) => {\n markDoctorSpan('LLM');\n const output = { text: 'generated diagnostic output' };\n llm.setAttribute('output.value', JSON.stringify(output));\n llm.setStatus({ code: SpanStatusCode.OK });\n llm.end();\n return output;\n },\n );\n },\n );\n\n await trace({\n name: 'doctor.probe.root',\n kind: 'WORKFLOW',\n sessionId: 'neatlogs-doctor-probe',\n input: { prompt: 'generated diagnostic input' },\n }, async (root) => {\n markDoctorSpan('WORKFLOW');\n traceId = root.spanContext().traceId;\n await diagnosticAgent({ prompt: 'generated diagnostic input' });\n const output = await diagnosticTool({ value: 1 });\n const result = { result: output };\n setTraceOutput(result);\n root.setStatus({ code: SpanStatusCode.OK });\n return result;\n });\n\n let flushed = false;\n try {\n flushed = await withTimeout(flush, flushTimeoutMs);\n } catch {\n flushed = false;\n }\n const result = doctorCapturedLocalV2({\n traceId,\n flushOutcome: flushed ? 'success' : 'timeout',\n flushTimeoutMs,\n flushDurationMs: Date.now() - started,\n });\n if (!result) throw new Error('Diagnostic envelope was not captured');\n\n const fixtureChecks = validateLocalFixture(traceId);\n const fixtureFailure = fixtureChecks.find((item) => item.status === 'fail');\n return Object.freeze({\n ...result,\n status: fixtureFailure ? 'fail' : result.status,\n first_failure: fixtureFailure?.reason_code ?? result.first_failure,\n checks: Object.freeze([...result.checks, ...fixtureChecks]),\n });\n } finally {\n await shutdown('doctor-complete', flushTimeoutMs).catch(() => false);\n enableLogging();\n }\n}\n\nfunction persistedProbeResult(\n local: Awaited<ReturnType<typeof localResult>>,\n traceValue: PersistedTrace,\n diagnosticDetails?: CheckDetails,\n) {\n const spans = Array.isArray(traceValue.spans)\n ? traceValue.spans.filter((value): value is PersistedSpan =>\n !!value && typeof value === 'object')\n : [];\n const normalized = spans.map((item) => ({\n id: typeof item.span_id === 'string' ? item.span_id : '',\n parentId: typeof item.parent_span_id === 'string' ? item.parent_span_id : null,\n name: String(item.node_name ?? item.span_name ?? ''),\n type: String(item.node_type ?? item.span_type ?? '').toLowerCase(),\n data: objectValue(item.data),\n metadata: objectValue(item.span_metadata),\n }));\n const byName = new Map(normalized.map((item) => [item.name, item]));\n const root = byName.get('doctor.probe.root');\n const agent = byName.get('doctor.probe.agent');\n const llm = byName.get('doctor.probe.llm');\n const tool = byName.get('doctor.probe.tool');\n const ids = normalized.map((item) => item.id);\n const duplicateSpanCount = ids.length - new Set(ids).size;\n const meaningfulRootCount = normalized.filter((item) =>\n item.name !== 'neatlogs.trace.complete' && item.parentId === null).length;\n const readbackSpanCount = typeof traceValue.spanCount === 'number'\n ? traceValue.spanCount\n : spans.length;\n\n const readbackTraceId = typeof traceValue._id === 'string' ? traceValue._id : null;\n const visible = readbackTraceId === local.capture?.trace_id;\n const finalized = traceValue.status === 'success' &&\n (traceValue.finalizationStatus === undefined || traceValue.finalizationStatus === 'finalized');\n const exactSet = spans.length === EXPECTED_TYPES.size &&\n readbackSpanCount === EXPECTED_TYPES.size &&\n byName.size === EXPECTED_TYPES.size &&\n ids.every((id) => /^[0-9a-f]{16}$/.test(id)) &&\n duplicateSpanCount === 0 &&\n [...EXPECTED_TYPES].every(([name, type]) => byName.get(name)?.type === type);\n const exactEdges = !!root && !!agent && !!llm && !!tool &&\n root.parentId === null &&\n agent.parentId === root.id &&\n llm.parentId === agent.id &&\n tool.parentId === root.id;\n const exactIo = [...EXPECTED_PERSISTED_IO].every(([name, expected]) => {\n const data = byName.get(name)?.data ?? {};\n return matchesMaterializedValue(data.input_value, expected.inputs) &&\n matchesMaterializedValue(data.output_value, expected.outputs);\n });\n const exactMetadata = [...EXPECTED_SPAN_TYPES].every(([name, spanType]) => {\n const metadata = byName.get(name)?.metadata ?? {};\n return metadata['neatlogs.doctor'] === true &&\n metadata['neatlogs.doctor.version'] === DOCTOR_MARKER_VERSION &&\n metadata['service.name'] === DOCTOR_SERVICE &&\n metadata['telemetry.sdk.language'] === 'typescript' &&\n metadata['telemetry.sdk.version'] === __version__ &&\n metadata['neatlogs.span.kind'] === spanType.toLowerCase();\n });\n const exactTokens = [\n traceValue.promptTokens,\n traceValue.completionTokens,\n traceValue.totalTokensUsed,\n ].every((value, index) =>\n typeof value === 'number' && Number.isFinite(value) && value === EXPECTED_TOKENS[index]);\n\n const probeChecks = [\n check('probe_visibility', visible, 'TRACE_VISIBLE', 'TRACE_ID_MISMATCH', 'WAIT_FOR_TRACE', 'The read-back trace ID exactly matches the exported Doctor trace ID'),\n check('probe_finalization', finalized, 'TRACE_FINALIZED', 'TRACE_NOT_FINALIZED', 'WAIT_FOR_TRACE', 'The Doctor trace reached a successful finalized state', diagnosticDetails),\n check('probe_root_count', meaningfulRootCount === 1, 'ROOT_COUNT_VALID', 'ROOT_COUNT_INVALID', 'CHECK_TRACE_FINALIZER', 'The persisted Doctor trace has exactly one meaningful root'),\n check('probe_duplicates', duplicateSpanCount === 0, 'NO_DUPLICATE_SPANS', 'DUPLICATE_SPANS', 'CHECK_TRACE_FINALIZER', 'The persisted Doctor trace contains no duplicate span IDs'),\n check('probe_span_set', exactSet, 'SPAN_SET_VALID', 'TRACE_INCOMPLETE', 'WAIT_FOR_TRACE', 'The exact four-span Doctor trace is visible through the authenticated trace API'),\n check('probe_hierarchy', exactEdges, 'HIERARCHY_VALID', 'HIERARCHY_INVALID', 'CHECK_TRACE_FINALIZER', 'The persisted Doctor trace retains the exact semantic parent edges'),\n check('probe_attributes', exactSet, 'ATTRIBUTES_VALID', 'ATTRIBUTES_INVALID', 'CHECK_ATTRIBUTE_MAPPING', 'The persisted Doctor span names and semantic types are exact'),\n check('probe_input_output', exactIo, 'INPUT_OUTPUT_VALID', 'INPUT_OUTPUT_INVALID', 'CHECK_PAYLOAD_MAPPING', 'The persisted Doctor spans retain the exact non-null deterministic input and output'),\n check('probe_metadata', exactMetadata, 'METADATA_VALID', 'METADATA_INVALID', 'CHECK_METADATA_FINALIZATION', 'All versioned Doctor SDK metadata survived finalization'),\n check('probe_typed_tokens', exactTokens, 'TYPED_TOKENS_VALID', 'TYPED_TOKENS_INVALID', 'CHECK_TOKEN_MAPPING', 'Persisted token totals remain exact numeric values'),\n ];\n const firstFailure = probeChecks.find((item) => item.status === 'fail');\n\n return {\n ...local,\n mode: 'probe',\n status: firstFailure || local.status !== 'pass' ? 'fail' : 'pass',\n first_failure: firstFailure?.reason_code ??\n (local.status === 'fail' ? local.first_failure : null),\n probe: {\n ingest_route: '/v1/traces',\n marker_header: 'x-neatlogs-doctor',\n marker_version: DOCTOR_MARKER_VERSION,\n visible,\n readback_trace_id: readbackTraceId,\n finalized,\n meaningful_root_count: meaningfulRootCount,\n duplicate_span_count: duplicateSpanCount,\n readback_span_count: readbackSpanCount,\n hierarchy_valid: exactEdges,\n attributes_valid: exactSet,\n input_output_valid: exactIo,\n metadata_valid: exactMetadata,\n typed_tokens_valid: exactTokens,\n },\n checks: [...local.checks, ...probeChecks],\n } as const;\n}\n\nfunction failedProbeResult(\n local: Awaited<ReturnType<typeof localResult>>,\n reasonCode: ProbeFailureReason,\n details?: CheckDetails,\n) {\n const transportCheck = failedProbeTransportCheck(reasonCode, details);\n return {\n ...local,\n mode: 'probe',\n status: 'fail',\n first_failure: reasonCode,\n checks: [...local.checks, transportCheck],\n } as const;\n}\n\nfunction failedProbeTransportCheck(\n reasonCode: ProbeFailureReason,\n details?: CheckDetails,\n): ProbeCheck {\n const failure = PROBE_FAILURE[reasonCode];\n return {\n name: 'probe_transport',\n status: 'fail',\n reason_code: reasonCode,\n remediation_code: failure.remediationCode,\n message: failure.message,\n ...(details ? { details } : {}),\n };\n}\n\nfunction failedProbeWithoutCapture(\n reasonCode: ProbeFailureReason,\n flushTimeoutMs: number,\n details?: CheckDetails,\n): DoctorProbeFailureResult {\n return {\n ...failedDoctorBase(flushTimeoutMs),\n mode: 'probe',\n first_failure: reasonCode,\n checks: [failedProbeTransportCheck(reasonCode, details)],\n };\n}\n\nfunction failedLocalWithoutCapture(flushTimeoutMs: number): DoctorV2Result {\n const reasonCode = 'INSTRUMENTOR_INACTIVE';\n return {\n ...failedDoctorBase(flushTimeoutMs),\n mode: 'local',\n first_failure: reasonCode,\n checks: [{\n name: 'local_envelope',\n status: 'fail',\n reason_code: reasonCode,\n remediation_code: 'ENABLE_INSTRUMENTOR',\n message: 'Doctor could not capture a local diagnostic envelope',\n }],\n };\n}\n\nfunction failedDoctorBase(flushTimeoutMs: number): DoctorFailureBase {\n return {\n format_version: DOCTOR_V2_FORMAT_VERSION,\n status: 'fail',\n runtime: {\n language: 'typescript',\n sdk_version: __version__,\n schema_version: String(TELEMETRY_SCHEMA_VERSION),\n transport: 'otlp_http_protobuf',\n },\n sampling: {\n effective_sampler: 'unknown',\n root_sample_rate: 0,\n sampled: false,\n },\n ownership: {\n provider: 'ambiguous',\n instrumentor_count: 0,\n },\n queue: {\n mode: 'diagnostic_capture',\n pending_spans: 0,\n dropped_spans: 0,\n capacity: null,\n },\n retry: {\n attempts: 0,\n window_ms: 0,\n exhausted: false,\n },\n flush: {\n outcome: 'failed',\n timeout_ms: flushTimeoutMs,\n duration_ms: null,\n },\n };\n}\n\nfunction human(result: {\n status: string;\n first_failure?: unknown;\n checks?: readonly Readonly<{\n status: string;\n reason_code: string;\n message: string;\n details?: CheckDetails;\n }>[];\n note?: string;\n}): string {\n const lines = [`Neatlogs Doctor: ${result.status.toUpperCase()}`];\n for (const item of result.checks ?? []) {\n lines.push(`${item.status === 'pass' ? 'PASS' : item.status === 'fail' ? 'FAIL' : 'INFO'} ${item.reason_code}: ${item.message}`);\n }\n const diagnostics = result.checks?.find((item) => item.details?.current_stage)?.details;\n if (diagnostics) {\n const failed = diagnostics.failed_stage\n ? `; failed: ${String(diagnostics.failed_stage)}`\n : '';\n lines.push(`Ingestion: ${String(diagnostics.ingestion_state)} at ${String(diagnostics.current_stage)}${failed}`);\n }\n if (result.first_failure) lines.push(`First failure: ${String(result.first_failure)}`);\n if (result.note) lines.push(result.note);\n return lines.join('\\n');\n}\n\nfunction readbackTimeoutReason(\n remainingMs: number,\n requestTimeoutMs: number,\n): ProbeFailureReason {\n return remainingMs <= requestTimeoutMs\n ? 'TRACE_READBACK_TIMEOUT'\n : 'BACKEND_CONNECTION_FAILED';\n}\n\nfunction responseBodyFailureReason(\n status: number,\n remainingMs: number,\n requestTimeoutMs: number,\n): ProbeFailureReason {\n return status === 409 || (status >= 200 && status < 300 && status !== 202)\n ? 'TRACE_READBACK_INVALID'\n : readbackTimeoutReason(remainingMs, requestTimeoutMs);\n}\n\nasync function boundedFetch(\n io: DoctorCliIO,\n input: URL,\n initOptions: RequestInit,\n deadline: number,\n): Promise<Response> {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n throw new ProbeReadError('TRACE_READBACK_TIMEOUT', 'Doctor probe deadline expired');\n }\n const controller = new AbortController();\n return withTimeout(\n () => io.fetch(input, { ...initOptions, signal: controller.signal }),\n Math.min(io.requestTimeoutMs, remaining),\n () => controller.abort(),\n readbackTimeoutReason(remaining, io.requestTimeoutMs),\n );\n}\n\nasync function discardResponseBody(\n response: Response,\n reader?: ReadableStreamDefaultReader<Uint8Array>,\n): Promise<void> {\n if (reader) {\n try {\n await reader.cancel();\n } catch {\n // Response cleanup is best effort and must not replace the probe result.\n }\n return;\n }\n const body = response.body;\n if (!body || body.locked) return;\n try {\n await body.cancel();\n } catch {\n // Response cleanup is best effort and must not replace the probe result.\n }\n}\n\nasync function boundedJson(\n response: Response,\n io: DoctorCliIO,\n deadline: number,\n): Promise<unknown> {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n await discardResponseBody(response);\n throw new ProbeReadError('TRACE_READBACK_TIMEOUT', 'Doctor probe deadline expired');\n }\n const contentLength = Number(response.headers.get('content-length'));\n if (Number.isFinite(contentLength) && contentLength > MAX_READBACK_BYTES) {\n await discardResponseBody(response);\n return null;\n }\n const reader = response.body?.getReader();\n if (!reader) return null;\n return withTimeout(async () => {\n const chunks: Uint8Array[] = [];\n let size = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n size += value.byteLength;\n if (size > MAX_READBACK_BYTES) {\n await discardResponseBody(response, reader);\n return null;\n }\n chunks.push(value);\n }\n const body = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n try {\n return JSON.parse(new TextDecoder().decode(body));\n } catch {\n return null;\n }\n }, Math.min(io.requestTimeoutMs, remaining), () => {\n void discardResponseBody(response, reader);\n }, responseBodyFailureReason(\n response.status,\n remaining,\n io.requestTimeoutMs,\n )).catch(async (error: unknown) => {\n await discardResponseBody(response, reader);\n if (error instanceof ProbeReadError) throw error;\n throw new ProbeReadError(\n 'BACKEND_CONNECTION_FAILED',\n 'Trace read-back response could not be read',\n );\n });\n}\n\nfunction usage(): string {\n return 'Usage: neatlogs doctor (--local | --probe) [--json]';\n}\n\n/** Run the credential-safe Doctor CLI. Returns a stable process exit code. */\nexport async function runDoctorCli(\n argv: readonly string[],\n overrides: Partial<DoctorCliIO> = {},\n): Promise<number> {\n const io: DoctorCliIO = { ...defaultIO, ...overrides };\n const json = argv.includes('--json');\n const modes = ['--local', '--probe'].filter((flag) => argv.includes(flag));\n if (argv.includes('--help') || argv.includes('-h')) {\n io.stdout(usage());\n return 0;\n }\n if (argv[0] !== 'doctor' || modes.length !== 1 ||\n argv.some((arg) => !['doctor', '--local', '--probe', '--json'].includes(arg))) {\n io.stderr(usage());\n return 4;\n }\n\n if (modes[0] === '--local') {\n try {\n const result = await localResult(io.env);\n io.stdout(json ? JSON.stringify(result, null, 2) : human(result));\n return result.status === 'fail' ? 2 : result.status === 'warn' ? 1 : 0;\n } catch {\n const result = failedLocalWithoutCapture(io.requestTimeoutMs);\n io.stdout(json ? JSON.stringify(result, null, 2) : human(result));\n return 2;\n }\n }\n\n const apiKey = io.env.NEATLOGS_API_KEY?.trim();\n if (!apiKey) {\n try {\n const local = await localResult(io.env);\n const result = {\n ...local,\n mode: 'probe',\n status: 'fail',\n first_failure: 'CREDENTIAL_MISSING',\n checks: [...local.checks, {\n name: 'credentials', status: 'fail', reason_code: 'CREDENTIAL_MISSING',\n remediation_code: 'SET_CREDENTIAL',\n message: 'Configure an ingestion credential to run a backend probe',\n }],\n } as const;\n io.stdout(json ? JSON.stringify(result, null, 2) : human(result));\n } catch {\n io.stderr('Doctor could not capture its local preflight');\n }\n return 3;\n }\n\n let endpoint: URL;\n try {\n endpoint = new URL(io.env.NEATLOGS_ENDPOINT?.trim() || 'https://ingest.neatlogs.com');\n if (!['http:', 'https:'].includes(endpoint.protocol) || endpoint.username || endpoint.password) {\n throw new Error('Invalid endpoint');\n }\n } catch {\n const local = await localResult({ ...io.env, NEATLOGS_API_KEY: undefined });\n const result = {\n ...local,\n mode: 'probe',\n status: 'fail',\n first_failure: 'ENDPOINT_INVALID',\n checks: [...local.checks, {\n name: 'endpoint', status: 'fail', reason_code: 'ENDPOINT_INVALID',\n remediation_code: 'SET_ENDPOINT',\n message: 'Configure an absolute HTTP or HTTPS diagnostic endpoint',\n }],\n } as const;\n io.stdout(json ? JSON.stringify(result, null, 2) : human(result));\n return 3;\n }\n\n let local: Awaited<ReturnType<typeof localResult>> | null = null;\n try {\n local = await localResult(io.env, {\n exportProbe: true,\n probeExporter: io.probeExporter,\n flushTimeoutMs: io.requestTimeoutMs,\n });\n const onlyExportFailed = local.status === 'fail' &&\n local.first_failure === 'FLUSH_TIMEOUT';\n if (!local.capture || (local.status === 'fail' && !onlyExportFailed)) {\n throw new ProbeReadError('BACKEND_PROBE_UNAVAILABLE', 'Local Doctor fixture failed');\n }\n\n const readbackUrl = new URL(\n `/api/traces/v3/${encodeURIComponent(local.capture.trace_id)}`,\n endpoint.origin,\n );\n const deadline = Date.now() + Math.max(1, io.probeTimeoutMs);\n let persisted: PersistedTrace | null = null;\n let lastDiagnostics: CheckDetails | undefined;\n while (Date.now() < deadline) {\n let response: Response;\n try {\n response = await boundedFetch(io, readbackUrl, {\n method: 'GET',\n redirect: 'error',\n headers: {\n 'x-api-key': apiKey,\n 'x-neatlogs-doctor': DOCTOR_MARKER_VERSION,\n },\n }, deadline);\n } catch (error: unknown) {\n if (error instanceof ProbeReadError) throw error;\n throw new ProbeReadError(\n 'BACKEND_CONNECTION_FAILED',\n 'Could not connect to the existing trace read path',\n lastDiagnostics,\n );\n }\n if (response.ok && response.status !== 202) {\n const value = await boundedJson(response, io, deadline);\n if (!value || typeof value !== 'object') {\n throw new ProbeReadError(\n 'TRACE_READBACK_INVALID',\n 'Trace read-back returned an invalid response',\n );\n }\n persisted = value as PersistedTrace;\n lastDiagnostics = ingestionDiagnosticDetails(value);\n break;\n }\n if (response.status === 401 || response.status === 403) {\n await discardResponseBody(response);\n throw new ProbeReadError('AUTH_FAILED', 'Trace read-back rejected the project key');\n }\n if ([202, 404, 409].includes(response.status)) {\n const value = await boundedJson(response, io, deadline);\n const currentDiagnostics = ingestionDiagnosticDetails(value);\n if (currentDiagnostics) lastDiagnostics = currentDiagnostics;\n if (response.status === 409) {\n const terminalValue = objectValue(value);\n const isDlq = terminalValue.finalizationStatus === 'dlq';\n const hasDiagnostics = Object.hasOwn(terminalValue, 'ingestionDiagnostics');\n const validDlq = typeof terminalValue.error === 'string' &&\n (terminalValue.message === undefined || typeof terminalValue.message === 'string') &&\n (!hasDiagnostics || currentDiagnostics !== undefined);\n const validReceipt = currentDiagnostics?.ingestion_state === 'failed';\n if (isDlq ? !validDlq : !validReceipt) {\n throw new ProbeReadError(\n 'TRACE_READBACK_INVALID',\n 'Trace read-back returned an invalid terminal receipt',\n );\n }\n throw new ProbeReadError(\n 'INGESTION_PIPELINE_FAILED',\n 'Trace ingestion reported a terminal failure',\n currentDiagnostics,\n );\n }\n } else {\n await discardResponseBody(response);\n throw new ProbeReadError(\n 'BACKEND_HTTP_ERROR',\n `Trace read-back failed with HTTP ${response.status}`,\n response.status >= 500 ? lastDiagnostics : undefined,\n );\n }\n const delay = Math.min(io.pollIntervalMs, Math.max(0, deadline - Date.now()));\n if (delay > 0) await withTimeout(() => io.sleep(delay), delay + 100);\n }\n if (!persisted) {\n throw new ProbeReadError(\n 'TRACE_READBACK_TIMEOUT',\n 'Timed out waiting for the exact Doctor trace',\n lastDiagnostics,\n );\n }\n\n const result = persistedProbeResult(local, persisted, lastDiagnostics);\n io.stdout(json ? JSON.stringify(result, null, 2) : human(result));\n return result.status === 'pass' ? 0 : 3;\n } catch (error) {\n const reason = error instanceof ProbeReadError\n ? error.reasonCode\n : 'BACKEND_PROBE_UNAVAILABLE';\n const result = local\n ? failedProbeResult(\n local,\n reason,\n error instanceof ProbeReadError ? error.details : undefined,\n )\n : failedProbeWithoutCapture(\n reason,\n io.requestTimeoutMs,\n error instanceof ProbeReadError ? error.details : undefined,\n );\n io.stdout(json ? JSON.stringify(result, null, 2) : human(result));\n return 3;\n }\n}\n","import { SpanStatusCode, type AttributeValue } from '@opentelemetry/api';\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport { AttributeMapper } from '../config/attribute-mapper.js';\nimport { utf8ByteLength } from '../constants.js';\nimport type { DiagnosticEnvelope, DiagnosticSpan } from '../doctor-v2.js';\n\nconst MAX_TRACES = 16;\nconst MAX_SPANS_PER_TRACE = 64;\nconst MAX_BYTES_PER_TRACE = 256 * 1024;\nconst MAX_STREAM_EVENTS_PER_SPAN = 128;\nconst COMPLETION_MARKER = 'neatlogs.trace.complete';\nconst mapper = new AttributeMapper();\n\ntype CapturedTrace = {\n readonly spans: Map<string, DiagnosticSpan>;\n readonly spanBytes: Map<string, number>;\n bytes: number;\n droppedSpans: number;\n};\n\nconst traces = new Map<string, CapturedTrace>();\nlet latestTraceId: string | null = null;\n\nfunction jsonValue(value: AttributeValue | undefined): unknown {\n if (typeof value !== 'string') return value;\n const trimmed = value.trim();\n if (!trimmed || !['{', '['].includes(trimmed[0] ?? '')) return value;\n try { return JSON.parse(trimmed); } catch { return value; }\n}\n\nfunction first(\n attributes: Readonly<Record<string, AttributeValue | undefined>>,\n keys: readonly string[],\n): unknown {\n for (const key of keys) {\n if (attributes[key] !== undefined) return jsonValue(attributes[key]);\n }\n return undefined;\n}\n\nfunction arrayValue(value: unknown): readonly unknown[] | undefined {\n return Array.isArray(value) ? value : undefined;\n}\n\nfunction indexedMessages(\n attributes: Readonly<Record<string, AttributeValue | undefined>>,\n direction: 'input' | 'output',\n): readonly Readonly<Record<string, unknown>>[] | undefined {\n const messages = new Map<number, Record<string, unknown>>();\n const pattern = new RegExp(\n `^neatlogs\\\\.llm\\\\.${direction}_messages\\\\.(\\\\d+)\\\\.(role|content|tool_call_id|name)$`,\n );\n for (const [key, value] of Object.entries(attributes)) {\n const match = pattern.exec(key);\n if (!match || value === undefined) continue;\n const index = Number(match[1]);\n const message = messages.get(index) ?? {};\n message[match[2] as string] = jsonValue(value);\n messages.set(index, message);\n }\n const normalized = [...messages.entries()]\n .sort(([left], [right]) => left - right)\n .map(([, message]) => Object.freeze(message));\n return normalized.length ? Object.freeze(normalized) : undefined;\n}\n\nfunction payloadReferences(\n attributes: Readonly<Record<string, AttributeValue | undefined>>,\n): readonly Readonly<{ digest: string; size: number; mime_type: string }>[] | undefined {\n const references = new Map<string, { sha256?: string; byte_length?: number; mime_type?: string }>();\n const pattern = /^neatlogs\\.llm\\.(?:input|output)_messages\\.(\\d+)\\.media\\.(\\d+)\\.(sha256|byte_length|mime_type)$/;\n for (const [key, value] of Object.entries(attributes)) {\n const match = pattern.exec(key);\n if (!match) continue;\n const referenceKey = `${match[1]}:${match[2]}:${key.includes('.input_messages.') ? 'input' : 'output'}`;\n const reference = references.get(referenceKey) ?? {};\n if (match[3] === 'sha256' && typeof value === 'string') reference.sha256 = value;\n if (match[3] === 'byte_length' && typeof value === 'number') reference.byte_length = value;\n if (match[3] === 'mime_type' && typeof value === 'string') reference.mime_type = value;\n references.set(referenceKey, reference);\n }\n const normalized = [...references.values()].flatMap((reference) =>\n reference.sha256 && Number.isFinite(reference.byte_length) && (reference.byte_length ?? 0) > 0 && reference.mime_type\n ? [{\n digest: `sha256:${reference.sha256}`,\n size: reference.byte_length as number,\n mime_type: reference.mime_type,\n }]\n : []);\n return normalized.length ? Object.freeze(normalized.map((reference) => Object.freeze(reference))) : undefined;\n}\n\nfunction durationNs(span: ReadableSpan): number {\n return span.duration[0] * 1_000_000_000 + span.duration[1];\n}\n\nfunction attributeBytes(value: AttributeValue | undefined, limit: number): number {\n limit = Math.max(0, limit);\n if (value === undefined) return 0;\n if (typeof value === 'string') return utf8ByteLength(value, limit);\n if (Array.isArray(value)) {\n let bytes = 0;\n for (const item of value) {\n bytes += typeof item === 'string' ? utf8ByteLength(item, limit - bytes) : 16;\n if (bytes > limit) return limit + 1;\n }\n return bytes;\n }\n return 16;\n}\n\nfunction exceedsRawProjectionBudget(span: ReadableSpan, limit: number): boolean {\n // Reject a hostile diagnostic field before JSON parsing or projection can\n // duplicate it. The complete span still belongs to the normal exporter.\n let bytes = 512;\n if (limit <= bytes) return true;\n for (const [key, value] of Object.entries(span.attributes)) {\n if (!(\n key === 'input.value' || key === 'output.value' ||\n key === 'openinference.span.kind' || key === 'neatlogs.span.kind' ||\n key.startsWith('neatlogs.doctor') || key.startsWith('telemetry.sdk.') ||\n key === 'service.name' || key.startsWith('neatlogs.llm.input_messages.') ||\n key.startsWith('neatlogs.llm.output_messages.') ||\n key.startsWith('neatlogs.llm.tool_calls.') ||\n key.startsWith('neatlogs.llm.token_count.')\n )) continue;\n const remaining = Math.max(0, limit - bytes);\n bytes += utf8ByteLength(key, remaining) + attributeBytes(value, remaining);\n if (bytes > limit) return true;\n }\n let streamEvents = 0;\n for (const event of span.events) {\n if (event.name !== 'neatlogs.stream.chunk') continue;\n streamEvents += 1;\n if (streamEvents > MAX_STREAM_EVENTS_PER_SPAN) break;\n bytes += attributeBytes(\n event.attributes?.['neatlogs.stream.chunk.summary'],\n Math.max(0, limit - bytes),\n );\n if (bytes > limit) return true;\n }\n return false;\n}\n\nfunction startNs(span: ReadableSpan): number {\n return span.startTime[0] * 1_000_000_000 + span.startTime[1];\n}\n\nfunction normalizeKind(value: unknown): string {\n return typeof value === 'string'\n ? value.replace(/^Neatlogs\\./i, '').toUpperCase()\n : 'INTERNAL';\n}\n\nfunction indexedToolCalls(\n attributes: Readonly<Record<string, AttributeValue | undefined>>,\n): readonly Readonly<{\n id: string;\n name?: string;\n arguments?: unknown;\n choice_index?: number;\n tool_call_index?: number;\n}>[] | undefined {\n const calls = new Map<number, Record<string, unknown>>();\n for (const [key, value] of Object.entries(attributes)) {\n const match = /^neatlogs\\.llm\\.tool_calls\\.(\\d+)\\.(id|name|arguments|choice_index|tool_call_index)$/.exec(key);\n if (!match) continue;\n const index = Number(match[1]);\n const call = calls.get(index) ?? {};\n call[match[2] as string] = jsonValue(value);\n calls.set(index, call);\n }\n const normalized = [...calls.entries()]\n .sort(([left], [right]) => left - right)\n .flatMap(([, call]) => typeof call.id === 'string'\n ? [{\n id: call.id,\n ...(typeof call.name === 'string' ? { name: call.name } : {}),\n ...(call.arguments !== undefined ? { arguments: call.arguments } : {}),\n ...(typeof call.choice_index === 'number' ? { choice_index: call.choice_index } : {}),\n ...(typeof call.tool_call_index === 'number' ? { tool_call_index: call.tool_call_index } : {}),\n }]\n : []);\n return normalized.length ? normalized : undefined;\n}\n\nfunction normalizedChoices(\n value: unknown,\n attributes: Readonly<Record<string, AttributeValue | undefined>>,\n): readonly Readonly<Record<string, unknown>>[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const choices = value.map((raw, index) => {\n const record: Record<string, unknown> =\n raw && typeof raw === 'object' && !Array.isArray(raw)\n ? raw as Record<string, unknown>\n : { content: raw };\n const explicitIndex = typeof record.index === 'number' ? record.index : index;\n const message = record.message && typeof record.message === 'object' && !Array.isArray(record.message)\n ? record.message\n : Object.fromEntries(\n ['role', 'content', 'name', 'tool_call_id']\n .filter((key) => record[key] !== undefined)\n .map((key) => [key, record[key]]),\n );\n const finish = attributes[`neatlogs.llm.choices.${explicitIndex}.finish_reason`] ??\n record.finish_reason;\n return Object.freeze({\n index: explicitIndex,\n message: Object.freeze({ ...(message as Record<string, unknown>) }),\n ...(finish !== undefined ? { finish_reason: jsonValue(finish as AttributeValue) } : {}),\n });\n });\n return choices.length ? Object.freeze(choices) : undefined;\n}\n\nfunction streamFragments(span: ReadableSpan): readonly unknown[] | undefined {\n const fragments = span.events\n .filter((event) => event.name === 'neatlogs.stream.chunk')\n .slice(0, MAX_STREAM_EVENTS_PER_SPAN)\n .map((event) => jsonValue(event.attributes?.['neatlogs.stream.chunk.summary']));\n return fragments.length ? fragments : undefined;\n}\n\nfunction diagnosticAttributes(\n attributes: Readonly<Record<string, AttributeValue | undefined>>,\n): Readonly<Record<string, unknown>> {\n const allowed = [\n 'neatlogs.doctor',\n 'neatlogs.doctor.version',\n 'service.name',\n 'telemetry.sdk.language',\n 'telemetry.sdk.version',\n 'neatlogs.span.kind',\n 'neatlogs.llm.token_count.prompt',\n 'neatlogs.llm.token_count.completion',\n 'neatlogs.llm.token_count.total',\n 'gen_ai.operation.name',\n 'http.response.status_code',\n 'error.type',\n 'retry-after',\n 'retry_after',\n 'neatlogs.llm.rate_limit_remaining',\n ] as const;\n return Object.freeze(Object.fromEntries(\n allowed.flatMap((key) => attributes[key] === undefined\n ? []\n : [[key, jsonValue(attributes[key])]]),\n ));\n}\n\nfunction toDiagnosticSpan(span: ReadableSpan): DiagnosticSpan {\n const context = span.spanContext();\n const attributes = mapper.mapAttributes({ ...span.attributes });\n const kind = normalizeKind(attributes['neatlogs.span.kind']);\n const kindKey = kind.toLowerCase();\n const choicesValue = jsonValue(attributes['neatlogs.llm.generation_choices']);\n const inputMessages = kind === 'LLM' ? indexedMessages(attributes, 'input') : undefined;\n const outputMessages = kind === 'LLM' ? indexedMessages(attributes, 'output') : undefined;\n const choices = normalizedChoices(arrayValue(choicesValue) ?? outputMessages, attributes);\n const expectedChoiceCount = typeof choicesValue === 'number' && Number.isInteger(choicesValue)\n ? choicesValue\n : choices?.length;\n const toolCalls = indexedToolCalls(attributes);\n const fragments = streamFragments(span);\n const references = payloadReferences(attributes);\n const oversized = attributes['neatlogs.capture.truncated'] === true;\n const toolCallId = first(attributes, ['neatlogs.tool_call.id']);\n const streaming = attributes['neatlogs.llm.is_streaming'] === true ||\n attributes['neatlogs.tool.is_streaming'] === true ||\n fragments !== undefined;\n\n return Object.freeze({\n span_id: context.spanId,\n parent_span_id: span.parentSpanId ?? null,\n name: span.name,\n kind,\n status: span.status.code === SpanStatusCode.ERROR\n ? 'ERROR'\n : span.status.code === SpanStatusCode.OK\n ? 'OK'\n : 'UNSET',\n input: first(attributes, [`neatlogs.${kindKey}.input`]) ?? inputMessages,\n output: first(attributes, [`neatlogs.${kindKey}.output`]) ?? outputMessages,\n ...(choices ? { choices } : {}),\n ...(expectedChoiceCount !== undefined ? { expected_choice_count: expectedChoiceCount } : {}),\n ...(toolCalls ? { tool_calls: toolCalls } : {}),\n ...(kind === 'TOOL' && typeof toolCallId === 'string'\n ? {\n tool_call: {\n id: toolCallId,\n ...(typeof attributes['neatlogs.tool.name'] === 'string'\n ? { name: attributes['neatlogs.tool.name'] }\n : {}),\n },\n }\n : {}),\n ...(streaming ? {\n streaming: true,\n ...(fragments ? { stream_fragments: fragments } : {}),\n } : {}),\n ...(references ? { payload_references: references } : {}),\n ...(oversized ? { oversized: true } : {}),\n sampled: (context.traceFlags & 1) === 1,\n ended: true,\n start_time_ns: startNs(span),\n duration_ns: durationNs(span),\n attributes: diagnosticAttributes(attributes),\n });\n}\n\nfunction encodedBytes(value: DiagnosticSpan): number {\n return new TextEncoder().encode(JSON.stringify(value)).byteLength;\n}\n\n/** Capture a Doctor-only, bounded projection at the final masked export boundary. */\nexport function capturePreparedSpans(spans: readonly ReadableSpan[]): void {\n for (const span of spans) {\n // The backend folds this transport control record out of the materialized trace.\n if (span.name === COMPLETION_MARKER) continue;\n\n const traceId = span.spanContext().traceId;\n const current = traces.get(traceId) ?? {\n spans: new Map<string, DiagnosticSpan>(),\n spanBytes: new Map<string, number>(),\n bytes: 0,\n droppedSpans: 0,\n };\n const spanId = span.spanContext().spanId;\n const previousBytes = current.spanBytes.get(spanId) ?? 0;\n const isNewSpan = !current.spans.has(spanId);\n const remainingBytes = MAX_BYTES_PER_TRACE - current.bytes + previousBytes;\n if ((isNewSpan && current.spans.size >= MAX_SPANS_PER_TRACE) ||\n exceedsRawProjectionBudget(span, remainingBytes)) {\n current.droppedSpans += 1;\n traces.delete(traceId);\n traces.set(traceId, current);\n latestTraceId = traceId;\n while (traces.size > MAX_TRACES) {\n traces.delete(traces.keys().next().value as string);\n }\n continue;\n }\n const projected = toDiagnosticSpan(span);\n const bytes = encodedBytes(projected);\n const nextBytes = current.bytes - previousBytes + bytes;\n\n if (nextBytes > MAX_BYTES_PER_TRACE) {\n current.droppedSpans += 1;\n } else {\n current.spans.set(spanId, projected);\n current.spanBytes.set(spanId, bytes);\n current.bytes = nextBytes;\n }\n\n traces.delete(traceId);\n traces.set(traceId, current);\n latestTraceId = traceId;\n while (traces.size > MAX_TRACES) {\n traces.delete(traces.keys().next().value as string);\n }\n }\n}\n\nexport function getCapturedEnvelope(traceId = latestTraceId ?? ''): DiagnosticEnvelope | null {\n const trace = traces.get(traceId);\n if (!trace?.spans.size) return null;\n const values = [...trace.spans.values()];\n const root = values.find((span) => span.parent_span_id === null);\n if (!root) return null;\n return Object.freeze({\n trace_id: traceId,\n root_span_id: root.span_id,\n spans: Object.freeze(values),\n });\n}\n\n/** @internal Credential-free capture accounting for tests and Doctor output. */\nexport function getDoctorCaptureStats(traceId = latestTraceId ?? ''): Readonly<{\n traceCount: number;\n spanCount: number;\n bytes: number;\n droppedSpans: number;\n maxTraces: number;\n maxSpansPerTrace: number;\n maxBytesPerTrace: number;\n}> {\n const trace = traces.get(traceId);\n return Object.freeze({\n traceCount: traces.size,\n spanCount: trace?.spans.size ?? 0,\n bytes: trace?.bytes ?? 0,\n droppedSpans: trace?.droppedSpans ?? 0,\n maxTraces: MAX_TRACES,\n maxSpansPerTrace: MAX_SPANS_PER_TRACE,\n maxBytesPerTrace: MAX_BYTES_PER_TRACE,\n });\n}\n\n/** @internal Test/lifecycle reset. */\nexport function clearDoctorCapture(): void {\n traces.clear();\n latestTraceId = null;\n}\n","/**\n * Centralized logging configuration for Neatlogs SDK.\n * Provides structured logging with configurable levels.\n */\n\ntype LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'NONE';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n DEBUG: 0,\n INFO: 1,\n WARN: 2,\n ERROR: 3,\n NONE: 4,\n};\n\nlet _logLevel: LogLevel = 'INFO';\nlet _disabled = false;\n\nfunction _getConfiguredLevel(): LogLevel {\n const envLevel = process.env.NEATLOGS_LOG_LEVEL?.toUpperCase();\n if (envLevel && envLevel in LOG_LEVELS) {\n return envLevel as LogLevel;\n }\n return 'INFO';\n}\n\n// Initialize from env on first import\n_logLevel = _getConfiguredLevel();\n\nexport function getLogger() {\n return {\n debug(message: string, ...args: any[]) {\n if (!_disabled && LOG_LEVELS[_logLevel] <= LOG_LEVELS.DEBUG) {\n console.debug(`[neatlogs] ${message}`, ...args);\n }\n },\n info(message: string, ...args: any[]) {\n if (!_disabled && LOG_LEVELS[_logLevel] <= LOG_LEVELS.INFO) {\n console.info(`[neatlogs] ${message}`, ...args);\n }\n },\n warn(message: string, ...args: any[]) {\n if (!_disabled && LOG_LEVELS[_logLevel] <= LOG_LEVELS.WARN) {\n console.warn(`[neatlogs] ${message}`, ...args);\n }\n },\n error(message: string, ...args: any[]) {\n if (!_disabled && LOG_LEVELS[_logLevel] <= LOG_LEVELS.ERROR) {\n console.error(`[neatlogs] ${message}`, ...args);\n }\n },\n };\n}\n\nexport function setLogLevel(level: LogLevel): void {\n _logLevel = level;\n}\n\nexport function enableDebugLogging(): void {\n _logLevel = 'DEBUG';\n}\n\nexport function disableLogging(): void {\n _disabled = true;\n}\n\nexport function enableLogging(): void {\n _disabled = false;\n}\n","/**\n * Shared constants for vector DB systems and retrieval operations.\n *\n * Used by both attribute-processor.ts and mapping.ts to avoid\n * divergent keyword lists.\n */\n\n/** Known vector database system identifiers. */\nexport const VECTOR_DB_SYSTEMS = new Set([\n 'chroma',\n 'chromadb',\n 'pinecone',\n 'qdrant',\n 'milvus',\n 'marqo',\n 'weaviate',\n 'lancedb',\n 'pgvector',\n 'elasticsearch',\n]);\n\n/** Operations that indicate a retrieval / read from a vector DB. */\nexport const RETRIEVAL_OPS = [\n 'query',\n 'search',\n 'get',\n 'fetch',\n 'find',\n 'retrieve',\n 'scroll',\n 'peek',\n 'discover',\n 'recommend',\n 'aggregate',\n 'hybrid_search',\n 'select',\n];\n\n/** Operations that indicate a write to a vector DB. */\nexport const WRITE_OPS = [\n 'upsert',\n 'insert',\n 'add',\n 'update',\n 'delete',\n 'create',\n 'drop',\n 'put',\n 'set',\n 'upload',\n 'index',\n];\n\n/** Vector DB names used for span-name-based inference. */\nexport const VECTOR_DB_NAMES = [\n 'chroma',\n 'pinecone',\n 'weaviate',\n 'qdrant',\n 'milvus',\n 'lancedb',\n 'marqo',\n];\n","/**\n * Span kind constants and inference from span names.\n * Mirrors Python span_kinds/mapping.py.\n */\n\nimport type { SpanKind } from '../types.js';\nimport { VECTOR_DB_NAMES, RETRIEVAL_OPS } from './constants.js';\n\n/** All valid span kinds for the span() decorator. */\nexport const VALID_SPAN_KINDS = new Set<SpanKind>([\n 'WORKFLOW',\n 'AGENT',\n 'CHAIN',\n 'TOOL',\n 'RETRIEVER',\n 'EMBEDDING',\n 'MCP_TOOL',\n 'GUARDRAIL',\n 'EVALUATOR',\n]);\n\n/** Extended span kinds that can appear in processed spans (from OpenInference). */\nexport const ALL_SPAN_KINDS = new Set<string>([\n ...VALID_SPAN_KINDS,\n 'LLM',\n 'RERANKER',\n 'VECTOR_STORE',\n]);\n\n/** Resolve explicit kinds using the canonical Neatlogs attribute first. */\nexport function resolveExplicitSpanKind(attributes: Record<string, any>): string {\n for (const key of [\n 'neatlogs.span.kind',\n 'openinference.span.kind',\n 'traceloop.span.kind',\n ]) {\n const value = String(attributes[key] ?? '').trim();\n if (value) return value;\n }\n return '';\n}\n\n/**\n * Infer OpenInference span kind from span name.\n * Distinguishes RETRIEVER (read ops) vs VECTOR_STORE (write ops) for vector DBs.\n */\nexport function inferSpanKindFromName(spanName: string): string {\n const nameLower = spanName.toLowerCase();\n\n // LLM operations\n if (\n ['openai', 'anthropic', 'cohere', 'bedrock', 'chat', 'completion', 'llm', 'gemini', 'google_genai'].some(\n (kw) => nameLower.includes(kw),\n )\n ) {\n return 'LLM';\n }\n\n // Embedding operations\n if (nameLower.includes('embed')) {\n return 'EMBEDDING';\n }\n\n // Vector DB: Distinguish RETRIEVER (read) vs VECTOR_STORE (write)\n if (VECTOR_DB_NAMES.some((db) => nameLower.includes(db))) {\n if (RETRIEVAL_OPS.some((kw) => nameLower.includes(kw))) {\n return 'RETRIEVER';\n }\n return 'VECTOR_STORE';\n }\n\n // Generic retrieval\n if (['retriev', 'search', 'query'].some((kw) => nameLower.includes(kw))) {\n return 'RETRIEVER';\n }\n\n // Reranker\n if (nameLower.includes('rerank')) {\n return 'RERANKER';\n }\n\n // Agent\n if (nameLower.includes('agent')) {\n return 'AGENT';\n }\n\n // Tool/function\n if (['tool', 'function'].some((kw) => nameLower.includes(kw))) {\n return 'TOOL';\n }\n\n // Guardrail\n if (['guardrail', 'validate', 'moderate', 'safety'].some((kw) => nameLower.includes(kw))) {\n return 'GUARDRAIL';\n }\n\n // Evaluator\n if (['evaluat', 'score', 'metric'].some((kw) => nameLower.includes(kw))) {\n return 'EVALUATOR';\n }\n\n // Default\n return 'CHAIN';\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"title\": \"Neatlogs Semantic Conventions - Attribute Mapping Configuration\",\n \"description\": \"Maps vendor-specific attributes (OpenInference, OpenLLMetry) to unified neatlogs.* namespace\",\n \"version\": \"1.0.0\",\n \"mappings\": {\n \"span_kind\": {\n \"description\": \"Span classification/type\",\n \"sources\": [\n \"openinference.span.kind\",\n \"traceloop.span.kind\"\n ],\n \"target\": \"neatlogs.span.kind\",\n \"values\": {\n \"LLM\": \"llm\",\n \"TOOL\": \"tool\",\n \"AGENT\": \"agent\",\n \"CHAIN\": \"chain\",\n \"WORKFLOW\": \"workflow\",\n \"TASK\": \"task\",\n \"RETRIEVER\": \"retriever\",\n \"EMBEDDING\": \"embedding\",\n \"VECTOR_STORE\": \"vector_store\",\n \"RERANKER\": \"reranker\",\n \"GUARDRAIL\": \"guardrail\",\n \"EVALUATOR\": \"evaluator\",\n \"MCP_TOOL\": \"mcp_tool\",\n \"HTTP\": \"http\"\n },\n \"priority\": \"openinference\"\n },\n \"llm\": {\n \"description\": \"LLM-specific attributes\",\n \"mappings\": {\n \"model_name\": {\n \"sources\": [\n \"llm.model_name\",\n \"gen_ai.response.model\",\n \"gen_ai.request.model\",\n \"traceloop.association.properties.ls_model_name\"\n ],\n \"target\": \"neatlogs.llm.model_name\"\n },\n \"provider\": {\n \"sources\": [\n \"llm.provider\",\n \"traceloop.association.properties.ls_provider\"\n ],\n \"target\": \"neatlogs.llm.provider\"\n },\n \"system\": {\n \"sources\": [\n \"llm.system\",\n \"gen_ai.system\"\n ],\n \"target\": \"neatlogs.llm.system\"\n },\n \"request_type\": {\n \"sources\": [\n \"llm.request.type\",\n \"neatlogs.llm.operation.name\",\n \"neatlogs.llm.operation.type\"\n ],\n \"target\": \"neatlogs.llm.request_type\"\n },\n \"choices\": {\n \"sources\": [\n \"gen_ai.client.generation.choices\",\n \"llm.request.n\"\n ],\n \"target\": \"neatlogs.llm.generation_choices\"\n },\n \"token_count\": {\n \"mappings\": {\n \"total\": {\n \"sources\": [\n \"llm.token_count.total\",\n \"llm.usage.total_tokens\",\n \"ai.usage.totalTokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.total\"\n },\n \"prompt\": {\n \"sources\": [\n \"llm.token_count.prompt\",\n \"gen_ai.usage.input_tokens\",\n \"ai.usage.promptTokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.prompt\"\n },\n \"completion\": {\n \"sources\": [\n \"llm.token_count.completion\",\n \"gen_ai.usage.output_tokens\",\n \"ai.usage.completionTokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.completion\"\n },\n \"reasoning\": {\n \"sources\": [\n \"llm.token_count.completion_details.reasoning\",\n \"llm.usage.reasoning_tokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.reasoning\"\n },\n \"cached\": {\n \"sources\": [\n \"neatlogs.llm.token_count.cached_read\",\n \"llm.token_count.prompt_details.cache_read\",\n \"llm.token_count.prompt.cache_read\",\n \"gen_ai.usage.cache_read_input_tokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.cache_read\"\n },\n \"cache_write\": {\n \"sources\": [\n \"neatlogs.llm.token_count.cached_write\",\n \"llm.token_count.prompt_details.cache_write\",\n \"gen_ai.usage.cache_creation_input_tokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.cache_write\"\n },\n \"prompt_audio\": {\n \"sources\": [\n \"llm.token_count.prompt_details.audio\"\n ],\n \"target\": \"neatlogs.llm.token_count.prompt_audio\"\n },\n \"completion_audio\": {\n \"sources\": [\n \"neatlogs.llm.token_count.audio\",\n \"llm.token_count.completion_details.audio\"\n ],\n \"target\": \"neatlogs.llm.token_count.completion_audio\"\n }\n }\n },\n \"tool_calls\": {\n \"description\": \"Tool/function calls extracted from provider responses\",\n \"sources\": {\n \"id\": [\n \"llm.tool_calls.{i}.id\"\n ],\n \"name\": [\n \"llm.tool_calls.{i}.name\"\n ],\n \"arguments\": [\n \"llm.tool_calls.{i}.arguments\"\n ]\n },\n \"target\": \"neatlogs.llm.tool_calls.{i}\",\n \"indexed\": true\n },\n \"invalid_tool_calls\": {\n \"description\": \"Invalid or malformed tool calls\",\n \"sources\": [\n \"llm.invalid_tool_calls\"\n ],\n \"target\": \"neatlogs.llm.invalid_tool_calls\"\n },\n \"tools\": {\n \"description\": \"Tool definitions passed to the model\",\n \"sources\": {\n \"name\": [\n \"llm.tools.{i}.name\"\n ],\n \"description\": [\n \"llm.tools.{i}.description\"\n ],\n \"input_schema\": [\n \"llm.tools.{i}.input_schema\"\n ]\n },\n \"target\": \"neatlogs.llm.tools.{i}\",\n \"indexed\": true\n },\n \"messages\": {\n \"mappings\": {\n \"input_role\": {\n \"sources\": [\n \"llm.input_messages.{i}.message.role\",\n \"gen_ai.prompt.{i}.role\"\n ],\n \"target\": \"neatlogs.llm.input_messages.{i}.role\",\n \"indexed\": true\n },\n \"input_content\": {\n \"sources\": [\n \"llm.input_messages.{i}.message.content\",\n \"gen_ai.prompt.{i}.content\"\n ],\n \"target\": \"neatlogs.llm.input_messages.{i}.content\",\n \"indexed\": true\n },\n \"input_tool_call_id\": {\n \"sources\": [\n \"llm.input_messages.{i}.tool_call_id\",\n \"llm.input_messages.{i}.message.tool_call_id\"\n ],\n \"target\": \"neatlogs.llm.input_messages.{i}.tool_call_id\",\n \"indexed\": true\n },\n \"input_name\": {\n \"sources\": [\n \"llm.input_messages.{i}.name\",\n \"llm.input_messages.{i}.message.name\"\n ],\n \"target\": \"neatlogs.llm.input_messages.{i}.name\",\n \"indexed\": true\n },\n \"output_role\": {\n \"sources\": [\n \"llm.output_messages.{i}.message.role\",\n \"gen_ai.completion.{i}.role\"\n ],\n \"target\": \"neatlogs.llm.output_messages.{i}.role\",\n \"indexed\": true\n },\n \"output_content\": {\n \"sources\": [\n \"llm.output_messages.{i}.message.content\",\n \"gen_ai.completion.{i}.content\"\n ],\n \"target\": \"neatlogs.llm.output_messages.{i}.content\",\n \"indexed\": true\n },\n \"system_prompt\": {\n \"sources\": [\n \"gen_ai.system_instructions\"\n ],\n \"target\": \"neatlogs.llm.system_prompt\"\n }\n },\n \"invocation_parameters\": {\n \"sources\": [\n \"llm.invocation_parameters\"\n ],\n \"target\": \"neatlogs.llm.invocation_parameters\"\n },\n \"temperature\": {\n \"sources\": [\n \"gen_ai.request.temperature\",\n \"traceloop.association.properties.ls_temperature\"\n ],\n \"target\": \"neatlogs.llm.temperature\"\n },\n \"intermediate_steps\": {\n \"description\": \"Derived ReAct-style steps extracted by the SDK (JSON array string).\",\n \"sources\": [\n \"llm.intermediate_steps\"\n ],\n \"target\": \"neatlogs.llm.intermediate_steps\"\n },\n \"top_p\": {\n \"sources\": [\n \"gen_ai.request.top_p\"\n ],\n \"target\": \"neatlogs.llm.top_p\"\n },\n \"top_k\": {\n \"sources\": [\n \"gen_ai.request.top_k\",\n \"llm.top_k\"\n ],\n \"target\": \"neatlogs.llm.top_k\"\n },\n \"max_tokens\": {\n \"sources\": [\n \"gen_ai.request.max_tokens\"\n ],\n \"target\": \"neatlogs.llm.max_tokens\"\n },\n \"frequency_penalty\": {\n \"sources\": [\n \"gen_ai.request.frequency_penalty\",\n \"llm.frequency_penalty\"\n ],\n \"target\": \"neatlogs.llm.frequency_penalty\"\n },\n \"presence_penalty\": {\n \"sources\": [\n \"gen_ai.request.presence_penalty\",\n \"llm.presence_penalty\"\n ],\n \"target\": \"neatlogs.llm.presence_penalty\"\n },\n \"stop_sequences\": {\n \"sources\": [\n \"gen_ai.request.stop_sequences\",\n \"llm.chat.stop_sequences\"\n ],\n \"target\": \"neatlogs.llm.stop_sequences\"\n },\n \"is_streaming\": {\n \"sources\": [\n \"llm.is_streaming\"\n ],\n \"target\": \"neatlogs.llm.is_streaming\"\n },\n \"headers\": {\n \"sources\": [\n \"llm.headers\"\n ],\n \"target\": \"neatlogs.llm.headers\"\n },\n \"finish_reason\": {\n \"sources\": [\n \"llm.response.finish_reason\",\n \"llm.finish_reason\",\n \"gen_ai.response.finish_reasons\",\n \"gen_ai.completion.0.finish_reason\"\n ],\n \"target\": \"neatlogs.llm.finish_reason\"\n },\n \"stop_reason\": {\n \"sources\": [\n \"llm.response.stop_reason\",\n \"gen_ai.response.stop_reason\"\n ],\n \"target\": \"neatlogs.llm.stop_reason\"\n },\n \"response_id\": {\n \"sources\": [\n \"gen_ai.response.id\"\n ],\n \"target\": \"neatlogs.llm.response_id\"\n },\n \"prompt_template\": {\n \"template\": {\n \"sources\": [\n \"neatlogs.prompt.template\",\n \"llm.prompt_template.template\",\n \"llm.prompt_template\",\n \"traceloop.prompt.template\"\n ],\n \"target\": \"neatlogs.llm.prompt_template\"\n },\n \"variables\": {\n \"sources\": [\n \"neatlogs.prompt.template_variables\",\n \"llm.prompt_template.variables\",\n \"llm.prompt_template_variables\",\n \"traceloop.prompt.template_variables\"\n ],\n \"target\": \"neatlogs.llm.prompt_template_variables\"\n },\n \"user_template\": {\n \"sources\": [\n \"llm.user_prompt_template\",\n \"neatlogs.user_prompt.template\"\n ],\n \"target\": \"neatlogs.llm.user_prompt_template\"\n },\n \"user_variables\": {\n \"sources\": [\n \"llm.user_prompt_template_variables\",\n \"neatlogs.user_prompt.template_variables\"\n ],\n \"target\": \"neatlogs.llm.user_prompt_template_variables\"\n },\n \"version\": {\n \"sources\": [\n \"neatlogs.prompt.version\",\n \"llm.prompt_template.version\",\n \"traceloop.prompt.version\"\n ],\n \"target\": \"neatlogs.llm.prompt_template.version\"\n },\n \"key\": {\n \"sources\": [\n \"traceloop.prompt.key\"\n ],\n \"target\": \"neatlogs.llm.prompt_key\"\n },\n \"vendor\": {\n \"sources\": [\n \"prompt.vendor\"\n ],\n \"target\": \"neatlogs.llm.prompt_vendor\"\n },\n \"id\": {\n \"sources\": [\n \"prompt.id\"\n ],\n \"target\": \"neatlogs.llm.prompt_id\"\n },\n \"url\": {\n \"sources\": [\n \"prompt.url\"\n ],\n \"target\": \"neatlogs.llm.prompt_url\"\n }\n }\n }\n },\n \"generic_io\": {\n \"description\": \"Generic input/output for any span type\",\n \"input\": {\n \"sources\": [\n \"input.value\",\n \"traceloop.entity.input\"\n ],\n \"target\": \"neatlogs.{span_kind}.input\"\n },\n \"output\": {\n \"sources\": [\n \"output.value\",\n \"traceloop.entity.output\"\n ],\n \"target\": \"neatlogs.{span_kind}.output\"\n },\n \"input_mime_type\": {\n \"sources\": [\n \"input.mime_type\"\n ],\n \"target\": \"neatlogs.{span_kind}.input_mime_type\"\n },\n \"output_mime_type\": {\n \"sources\": [\n \"output.mime_type\"\n ],\n \"target\": \"neatlogs.{span_kind}.output_mime_type\"\n }\n },\n \"span\": {\n \"description\": \"Span metadata\",\n \"name\": {\n \"sources\": [\n \"traceloop.entity.name\"\n ],\n \"target\": \"neatlogs.span.name\"\n },\n \"path\": {\n \"sources\": [\n \"traceloop.entity.path\"\n ],\n \"target\": \"neatlogs.span.path\"\n }\n },\n \"tool\": {\n \"name\": {\n \"sources\": [\n \"tool.name\",\n \"gen_ai.tool.name\"\n ],\n \"target\": \"neatlogs.tool.name\"\n },\n \"description\": {\n \"sources\": [\n \"tool.description\",\n \"gen_ai.tool.description\"\n ],\n \"target\": \"neatlogs.tool.description\"\n },\n \"parameters\": {\n \"sources\": [\n \"tool.parameters\"\n ],\n \"target\": \"neatlogs.tool.parameters\"\n },\n \"json_schema\": {\n \"sources\": [\n \"tool.json_schema\"\n ],\n \"target\": \"neatlogs.tool.json_schema\"\n },\n \"id\": {\n \"sources\": [\n \"tool.id\",\n \"gen_ai.tool.call.id\"\n ],\n \"target\": \"neatlogs.tool.id\"\n },\n \"call_id\": {\n \"sources\": [\n \"tool.call_id\",\n \"tool_call_id\"\n ],\n \"target\": \"neatlogs.tool_call.id\"\n }\n },\n \"agent\": {\n \"description\": \"Agent attributes\",\n \"name\": {\n \"sources\": [\n \"agent.name\"\n ],\n \"target\": \"neatlogs.agent.name\"\n },\n \"role\": {\n \"sources\": [\n \"agent_role\"\n ],\n \"target\": \"neatlogs.agent.role\"\n }\n },\n \"crewai\": {\n \"description\": \"CrewAI framework attributes (from OpenInference instrumentation)\",\n \"crew_id\": {\n \"sources\": [\"crew_id\"],\n \"target\": \"neatlogs.crewai.crew_id\"\n },\n \"crew_key\": {\n \"sources\": [\"crew_key\"],\n \"target\": \"neatlogs.crewai.crew_key\"\n },\n \"crew_number_of_agents\": {\n \"sources\": [\"crew_number_of_agents\"],\n \"target\": \"neatlogs.crewai.crew_number_of_agents\"\n },\n \"crew_number_of_tasks\": {\n \"sources\": [\"crew_number_of_tasks\"],\n \"target\": \"neatlogs.crewai.crew_number_of_tasks\"\n },\n \"version\": {\n \"sources\": [\"crewai_version\"],\n \"target\": \"neatlogs.crewai.version\"\n },\n \"task_id\": {\n \"sources\": [\"task_id\"],\n \"target\": \"neatlogs.task.id\"\n },\n \"task_key\": {\n \"sources\": [\"task_key\"],\n \"target\": \"neatlogs.task.key\"\n }\n },\n \"retriever\": {\n \"description\": \"Retrieval/Vector DB attributes\",\n \"documents\": {\n \"sources\": {\n \"id\": [\n \"retrieval.documents.{i}.document.id\",\n \"db.query.result.id\"\n ],\n \"content\": [\n \"retrieval.documents.{i}.document.content\",\n \"db.query.result.document\"\n ],\n \"score\": [\n \"retrieval.documents.{i}.document.score\",\n \"document.score\",\n \"db.query.result.score\",\n \"db.query.result.distance\"\n ],\n \"metadata\": [\n \"retrieval.documents.{i}.document.metadata\",\n \"db.query.result.metadata\"\n ]\n },\n \"target\": \"neatlogs.retriever.documents.{i}\",\n \"indexed\": true\n },\n \"query\": {\n \"sources\": [\n \"retrieval.query\",\n \"db.query.text\"\n ],\n \"target\": \"neatlogs.retriever.query\"\n },\n \"top_k\": {\n \"sources\": [\n \"retrieval.top_k\",\n \"db.vector.query.top_k\"\n ],\n \"target\": \"neatlogs.retriever.top_k\"\n }\n },\n \"db\": {\n \"description\": \"Database operations (vector DBs, etc.)\",\n \"system\": {\n \"sources\": [\n \"db.system\"\n ],\n \"target\": \"neatlogs.db.system\"\n },\n \"collection_name\": {\n \"sources\": [\n \"db.collection.name\"\n ],\n \"target\": \"neatlogs.db.collection_name\"\n },\n \"operation\": {\n \"sources\": [\n \"db.operation\"\n ],\n \"target\": \"neatlogs.db.operation\"\n },\n \"documents_count\": {\n \"sources\": [\n \"db.chroma.add.documents_count\",\n \"db.pinecone.add.documents_count\"\n ],\n \"target\": \"neatlogs.db.documents_count\"\n },\n \"ids_count\": {\n \"sources\": [\n \"db.chroma.add.ids_count\",\n \"db.pinecone.add.ids_count\"\n ],\n \"target\": \"neatlogs.db.ids_count\"\n },\n \"metadatas_count\": {\n \"sources\": [\n \"db.chroma.add.metadatas_count\",\n \"db.pinecone.add.metadatas_count\"\n ],\n \"target\": \"neatlogs.db.metadatas_count\"\n }\n },\n \"vectordb\": {\n \"description\": \"Vector Database specific attributes (Marqo, Qdrant, Milvus, etc.)\",\n \"index_name\": {\n \"sources\": [\n \"vector_db_index_name\",\n \"marqo.index_name\",\n \"qdrant.upsert.collection_name\",\n \"qdrant.search.collection_name\",\n \"db.milvus.create_collection.collection_name\",\n \"db.milvus.search.collection_name\",\n \"db.milvus.insert.collection_name\",\n \"db.chroma.collection.name\"\n ],\n \"target\": \"neatlogs.vectordb.index_name\"\n },\n \"embedding_model\": {\n \"sources\": [\n \"embedding_model\",\n \"marqo.model\",\n \"embedding.model_name\"\n ],\n \"target\": \"neatlogs.vectordb.embedding_model\"\n },\n \"retrieval_query\": {\n \"sources\": [\n \"retrieval_query\",\n \"db.marqo.search.query\"\n ],\n \"target\": \"neatlogs.vectordb.retrieval_query\"\n },\n \"retrieval_time_taken\": {\n \"sources\": [\n \"retrieval_time_taken\",\n \"db.marqo.search.processing_time\"\n ],\n \"target\": \"neatlogs.vectordb.retrieval_time_taken\"\n },\n \"vector_dimension\": {\n \"sources\": [\n \"vector_dimension\",\n \"db.milvus.create_collection.dimension\",\n \"db.milvus.search.query_vector_dimension\"\n ],\n \"target\": \"neatlogs.vectordb.vector_dimension\"\n },\n \"similarity_algorithm\": {\n \"sources\": [\n \"vector_similarity_algorithm\",\n \"db.milvus.create_collection.metric_type\"\n ],\n \"target\": \"neatlogs.vectordb.similarity_algorithm\"\n },\n \"document_attributes\": {\n \"sources\": [\n \"document_attributes\"\n ],\n \"target\": \"neatlogs.vectordb.document_attributes\",\n \"description\": \"Computed JSON field from SDK\"\n },\n \"retrieval_input_params\": {\n \"sources\": [\n \"retrieval_input_params\"\n ],\n \"target\": \"neatlogs.vectordb.retrieval_input_params\",\n \"description\": \"Computed JSON field from SDK (Marqo limit, hits_count, filter)\"\n },\n \"retrieval_documents\": {\n \"sources\": [\n \"retrieval_documents\"\n ],\n \"target\": \"neatlogs.vectordb.retrieval_documents\",\n \"description\": \"Computed JSON array from SDK events\"\n }\n },\n \"reranker\": {\n \"description\": \"Reranker model attributes\",\n \"applies_to\": [\"reranker\"],\n \"model_name\": {\n \"sources\": [\n \"reranker.model_name\",\n \"ai.model.id\"\n ],\n \"target\": \"neatlogs.reranker.model_name\"\n },\n \"provider\": {\n \"sources\": [\n \"ai.model.provider\"\n ],\n \"target\": \"neatlogs.reranker.provider\",\n \"description\": \"Vercel AI SDK reranker provider (e.g. gateway, cohere)\"\n },\n \"query\": {\n \"sources\": [\n \"reranker.query\",\n \"ai.rerank.query\"\n ],\n \"target\": \"neatlogs.reranker.query\"\n },\n \"documents\": {\n \"sources\": [\n \"ai.documents\"\n ],\n \"target\": \"neatlogs.reranker.input_documents\",\n \"description\": \"Vercel AI SDK rerank input documents array\"\n },\n \"ranking\": {\n \"sources\": [\n \"ai.ranking\"\n ],\n \"target\": \"neatlogs.reranker.output_documents\",\n \"description\": \"Vercel AI SDK rerank output ranking array\"\n },\n \"ranking_type\": {\n \"sources\": [\n \"ai.ranking.type\"\n ],\n \"target\": \"neatlogs.reranker.ranking_type\",\n \"description\": \"Vercel AI SDK rerank type (e.g. text)\"\n },\n \"top_k\": {\n \"sources\": [\n \"reranker.top_k\"\n ],\n \"target\": \"neatlogs.reranker.top_k\"\n },\n \"max_retries\": {\n \"sources\": [\n \"ai.settings.maxRetries\"\n ],\n \"target\": \"neatlogs.reranker.max_retries\",\n \"description\": \"Vercel AI SDK max retries setting\"\n },\n \"input_documents\": {\n \"sources\": {\n \"id\": [\n \"reranker.input_documents.{i}.document.id\"\n ],\n \"content\": [\n \"reranker.input_documents.{i}.document.content\"\n ],\n \"metadata\": [\n \"reranker.input_documents.{i}.document.metadata\"\n ]\n },\n \"target\": \"neatlogs.reranker.input_documents.{i}\",\n \"indexed\": true\n },\n \"output_documents\": {\n \"sources\": {\n \"id\": [\n \"reranker.output_documents.{i}.document.id\"\n ],\n \"content\": [\n \"reranker.output_documents.{i}.document.content\"\n ],\n \"score\": [\n \"reranker.output_documents.{i}.document.score\",\n \"reranker.output_documents.{i}.relevance_score\"\n ],\n \"metadata\": [\n \"reranker.output_documents.{i}.document.metadata\"\n ]\n },\n \"target\": \"neatlogs.reranker.output_documents.{i}\",\n \"indexed\": true\n }\n },\n \"embedding\": {\n \"description\": \"Embedding model attributes\",\n \"applies_to\": [\"embedding\"],\n \"input\": {\n \"sources\": [\n \"ai.value\",\n \"ai.values\"\n ],\n \"target\": \"neatlogs.embedding.input\",\n \"description\": \"Vercel AI SDK embed/embedMany input value(s)\"\n },\n \"model_name\": {\n \"sources\": [\n \"embedding.model_name\",\n \"ai.model.id\"\n ],\n \"target\": \"neatlogs.embedding.model_name\"\n },\n \"text\": {\n \"sources\": [\n \"embedding.text\"\n ],\n \"target\": \"neatlogs.embedding.text\"\n },\n \"vector\": {\n \"sources\": [\n \"embedding.vector\"\n ],\n \"target\": \"neatlogs.embedding.vector\"\n },\n \"token_count\": {\n \"sources\": [\n \"embedding.token_count\",\n \"ai.usage.tokens\"\n ],\n \"target\": \"neatlogs.embedding.token_count\"\n },\n \"invocation_parameters\": {\n \"sources\": [\n \"embedding.invocation_parameters\"\n ],\n \"target\": \"neatlogs.embedding.invocation_parameters\"\n },\n \"embeddings_data\": {\n \"sources\": [\n \"embeddings_data\"\n ],\n \"target\": \"neatlogs.embedding.embeddings_data\",\n \"description\": \"Computed JSON array from SDK (embedding.embeddings.*.embedding.text)\"\n }\n },\n \"session\": {\n \"description\": \"Session tracking\",\n \"id\": {\n \"sources\": [\n \"session.id\"\n ],\n \"target\": \"neatlogs.session.id\"\n }\n },\n \"user\": {\n \"description\": \"User tracking\",\n \"id\": {\n \"sources\": [\n \"user.id\"\n ],\n \"target\": \"neatlogs.user.id\"\n }\n },\n \"workflow\": {\n \"description\": \"Workflow/Chain metadata\",\n \"name\": {\n \"sources\": [\n \"traceloop.workflow.name\"\n ],\n \"target\": \"neatlogs.workflow.name\"\n }\n },\n \"entity\": {\n \"description\": \"LangChain entity metadata (from OpenLLMetry/Traceloop)\",\n \"name\": {\n \"sources\": [\n \"traceloop.entity.name\"\n ],\n \"target\": \"neatlogs.entity.name\"\n },\n \"path\": {\n \"sources\": [\n \"traceloop.entity.path\"\n ],\n \"target\": \"neatlogs.entity.path\"\n }\n },\n \"langgraph\": {\n \"description\": \"LangGraph execution metadata (from OpenLLMetry/Traceloop association properties)\",\n \"step\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_step\"\n ],\n \"target\": \"neatlogs.langgraph.step\"\n },\n \"node\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_node\"\n ],\n \"target\": \"neatlogs.langgraph.node\"\n },\n \"triggers\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_triggers\"\n ],\n \"target\": \"neatlogs.langgraph.triggers\"\n },\n \"path\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_path\"\n ],\n \"target\": \"neatlogs.langgraph.path\"\n },\n \"checkpoint_ns\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_checkpoint_ns\",\n \"traceloop.association.properties.checkpoint_ns\"\n ],\n \"target\": \"neatlogs.langgraph.checkpoint_ns\"\n },\n \"task_id\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_task_id\"\n ],\n \"target\": \"neatlogs.langgraph.task_id\"\n },\n \"thread_id\": {\n \"sources\": [\n \"traceloop.association.properties.thread_id\"\n ],\n \"target\": \"neatlogs.langgraph.thread_id\"\n }\n },\n \"mcp\": {\n \"description\": \"Model Context Protocol (MCP) attributes\",\n \"method\": {\n \"sources\": [\n \"mcp.method.name\",\n \"mcp.method\"\n ],\n \"target\": \"neatlogs.mcp.method\"\n },\n \"request_id\": {\n \"sources\": [\n \"mcp.request.id\"\n ],\n \"target\": \"neatlogs.mcp.request_id\"\n },\n \"request_argument\": {\n \"sources\": [\n \"mcp.request.argument\"\n ],\n \"target\": \"neatlogs.mcp.request_argument\"\n },\n \"response_value\": {\n \"sources\": [\n \"mcp.response.value\"\n ],\n \"target\": \"neatlogs.mcp.response_value\"\n },\n \"session_init_options\": {\n \"sources\": [\n \"mcp.session.init_options\"\n ],\n \"target\": \"neatlogs.mcp.session_init_options\"\n },\n \"protocol_version\": {\n \"sources\": [\n \"mcp.protocol_version\"\n ],\n \"target\": \"neatlogs.mcp.protocol_version\"\n },\n \"server\": {\n \"name\": {\n \"sources\": [\n \"mcp.server.name\"\n ],\n \"target\": \"neatlogs.mcp.server.name\"\n },\n \"version\": {\n \"sources\": [\n \"mcp.server.version\"\n ],\n \"target\": \"neatlogs.mcp.server.version\"\n },\n \"capabilities\": {\n \"sources\": [\n \"mcp.server.capabilities\"\n ],\n \"target\": \"neatlogs.mcp.server.capabilities\"\n }\n },\n \"tool\": {\n \"name\": {\n \"sources\": [\n \"mcp.tool.name\"\n ],\n \"target\": \"neatlogs.mcp.tool.name\"\n },\n \"arguments\": {\n \"sources\": [\n \"mcp.tool.arguments\"\n ],\n \"target\": \"neatlogs.mcp.tool.arguments\"\n }\n },\n \"tools\": {\n \"count\": {\n \"sources\": [\n \"mcp.tools.count\"\n ],\n \"target\": \"neatlogs.mcp.tools.count\"\n },\n \"names\": {\n \"sources\": [\n \"mcp.tools.names\"\n ],\n \"target\": \"neatlogs.mcp.tools.names\"\n }\n }\n },\n \"framework\": {\n \"description\": \"Framework-specific attributes\",\n \"langsmith\": {\n \"model_name\": {\n \"sources\": [\n \"traceloop.association.properties.ls_model_name\"\n ],\n \"target\": \"neatlogs.framework.langsmith.model_name\"\n },\n \"model_type\": {\n \"sources\": [\n \"traceloop.association.properties.ls_model_type\"\n ],\n \"target\": \"neatlogs.framework.langsmith.model_type\"\n },\n \"provider\": {\n \"sources\": [\n \"traceloop.association.properties.ls_provider\"\n ],\n \"target\": \"neatlogs.framework.langsmith.provider\"\n },\n \"temperature\": {\n \"sources\": [\n \"traceloop.association.properties.ls_temperature\"\n ],\n \"target\": \"neatlogs.framework.langsmith.temperature\"\n }\n }\n },\n \"graph\": {\n \"description\": \"Execution Graph / Chain attributes\",\n \"node\": {\n \"name\": {\n \"sources\": [\n \"graph.node.name\",\n \"traceloop.association.properties.langgraph_node\"\n ],\n \"target\": \"neatlogs.graph.node.name\"\n },\n \"id\": {\n \"sources\": [\n \"graph.node.id\"\n ],\n \"target\": \"neatlogs.graph.node.id\"\n },\n \"parent_id\": {\n \"sources\": [\n \"graph.node.parent_id\"\n ],\n \"target\": \"neatlogs.graph.node.parent_id\"\n }\n }\n },\n \"metadata\": {\n \"description\": \"Custom metadata\",\n \"sources\": [\n \"metadata\"\n ],\n \"target\": \"neatlogs.metadata\"\n },\n \"tags\": {\n \"description\": \"Tags array\",\n \"sources\": [\n \"tag.tags\"\n ],\n \"target\": \"neatlogs.tags\"\n },\n \"metrics\": {\n \"description\": \"Performance metrics from OpenLLMetry/OpenLit\",\n \"llm\": {\n \"time_to_first_token\": {\n \"sources\": [\n \"neatlogs.llm.metrics.time_to_first_token\",\n \"gen_ai.server.time_to_first_token\",\n \"llm.time_to_first_token\"\n ],\n \"target\": \"neatlogs.llm.metrics.time_to_first_token\"\n },\n \"streaming_time_to_generate\": {\n \"sources\": [\n \"neatlogs.llm.metrics.streaming_time_to_generate\",\n \"llm.chat_completions.streaming_time_to_generate\"\n ],\n \"target\": \"neatlogs.llm.metrics.streaming_time_to_generate\"\n },\n \"time_per_output_token\": {\n \"sources\": [\n \"neatlogs.llm.metrics.time_per_output_token\",\n \"gen_ai.server.time_per_output_token\"\n ],\n \"target\": \"neatlogs.llm.metrics.time_per_output_token\"\n }\n }\n }\n },\n \"keep_as_is\": {\n \"description\": \"OpenTelemetry standard attributes to keep unchanged\",\n \"attributes\": [\n \"neatlogs.internal\",\n \"http.method\",\n \"http.request.method\",\n \"http.url\",\n \"url.full\",\n \"url.path\",\n \"http.status_code\",\n \"http.response.status_code\",\n \"http.request.body.size\",\n \"http.response.body.size\",\n \"service.name\",\n \"service.version\",\n \"telemetry.sdk.name\",\n \"telemetry.sdk.version\",\n \"telemetry.sdk.language\"\n ]\n },\n \"ignore\": {\n \"description\": \"Attributes to ignore/drop during ingestion\",\n \"patterns\": [\n \"telemetry.distro.*\",\n \"code.*\",\n \"exception.*\"\n ]\n }\n }\n}\n","/**\n * Neatlogs Semantic Conventions - Attribute Mapper\n *\n * Maps vendor-specific attributes to the unified neatlogs.* namespace\n * using configuration from attribute-mapping.json.\n */\n\nimport { getLogger } from '../core/logger.js';\nimport { resolveExplicitSpanKind } from '../span-kinds/mapping.js';\nimport attributeMappingConfig from './attribute-mapping.json';\n\nconst logger = getLogger();\n\ninterface MappingConfig {\n sources: string[] | Record<string, string[]>;\n target?: string;\n indexed?: boolean;\n target_content?: string;\n description?: string;\n priority?: string;\n values?: Record<string, string>;\n mappings?: Record<string, any>;\n [key: string]: any;\n}\n\n/** Flatten sources into a single array of source patterns, regardless of shape. */\nfunction flattenSources(sources: string[] | Record<string, string[]> | undefined): string[] {\n if (!sources) return [];\n if (Array.isArray(sources)) return sources;\n // Object form: { id: [...], name: [...], ... } — flatten all arrays\n const result: string[] = [];\n for (const arr of Object.values(sources)) {\n if (Array.isArray(arr)) {\n result.push(...arr);\n }\n }\n return result;\n}\n\nexport class AttributeMapper {\n private config: Record<string, any>;\n private mappings: Record<string, any>;\n private keepAsIs: Set<string>;\n private ignorePatterns: string[];\n private compiledIgnorePatterns: RegExp[];\n private _regexCache: Map<string, RegExp> = new Map();\n\n constructor(config?: Record<string, any>) {\n this.config = config ?? (attributeMappingConfig as Record<string, any>);\n\n this.mappings = this.config.mappings ?? {};\n // keep_as_is / ignore may live at top-level or inside mappings\n const keepAsIsAttrs =\n this.config.keep_as_is?.attributes ??\n this.mappings.keep_as_is?.attributes ??\n [];\n this.keepAsIs = new Set<string>(keepAsIsAttrs);\n this.ignorePatterns =\n this.config.ignore?.patterns ??\n this.mappings.ignore?.patterns ??\n [];\n // Pre-compile ignore patterns for performance (avoid per-call regex creation)\n this.compiledIgnorePatterns = this.ignorePatterns.map(\n (pattern) => new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$'),\n );\n }\n\n /** Check if an attribute should be ignored. */\n shouldIgnore(attrName: string): boolean {\n for (const regex of this.compiledIgnorePatterns) {\n if (regex.test(attrName)) {\n return true;\n }\n }\n return false;\n }\n\n /** Check if an attribute should be kept unchanged (OTel standard). */\n shouldKeepAsIs(attrName: string): boolean {\n return this.keepAsIs.has(attrName);\n }\n\n /** Extract and normalize span kind from multiple possible sources. */\n mapSpanKind(attributes: Record<string, any>): string {\n const spanKindConfig = this.mappings.span_kind ?? {};\n const valuesMap: Record<string, string> = spanKindConfig.values ?? {};\n const spanKindValue = resolveExplicitSpanKind(attributes);\n\n if (spanKindValue) {\n const mapped = valuesMap[spanKindValue] ?? valuesMap[spanKindValue.toUpperCase()];\n if (mapped) return mapped;\n }\n // A pre-set neatlogs kind may already be the normalized lowercase form.\n if (spanKindValue && Object.values(valuesMap).includes(spanKindValue)) {\n return spanKindValue;\n }\n\n // Infer LLM span from attributes\n const isLlmSpan = [\n 'llm.model_name',\n 'gen_ai.request.model',\n 'llm.token_count.prompt',\n 'llm.token_count.completion',\n 'gen_ai.usage.prompt_tokens',\n 'gen_ai.usage.completion_tokens',\n 'neatlogs.llm.model_name',\n 'neatlogs.llm.token_count.prompt',\n 'neatlogs.llm.token_count.completion',\n ].some((key) => key in attributes);\n\n if (isLlmSpan) {\n return 'llm';\n }\n\n return 'unknown';\n }\n\n /** Map a simple attribute from multiple sources to target. */\n mapSimpleAttribute(\n mappingConfig: MappingConfig,\n attributes: Record<string, any>,\n ): any | undefined {\n const sources = flattenSources(mappingConfig.sources);\n for (const source of sources) {\n if (source in attributes) {\n return attributes[source];\n }\n }\n return undefined;\n }\n\n /** Get or create a cached RegExp for a source pattern. */\n private _getPatternRegex(sourcePattern: string): RegExp {\n let cached = this._regexCache.get(sourcePattern);\n if (!cached) {\n let regexPattern = sourcePattern.replace(/\\{i\\}/g, '(\\\\d+)');\n regexPattern = regexPattern.replace(/\\./g, '\\\\.');\n cached = new RegExp('^' + regexPattern + '$');\n this._regexCache.set(sourcePattern, cached);\n }\n return cached;\n }\n\n /** Map indexed attributes like messages (llm.input_messages.0.role). */\n mapIndexedAttributes(\n mappingConfig: MappingConfig,\n attributes: Record<string, any>,\n targetBase: string,\n ): Record<string, any> {\n const mapped: Record<string, any> = {};\n const rawSources = mappingConfig.sources;\n\n if (Array.isArray(rawSources)) {\n // Simple array of source patterns\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n for (const sourcePattern of rawSources) {\n const match = attrName.match(this._getPatternRegex(sourcePattern));\n\n if (match) {\n const index = match[1];\n const target = targetBase.replace(/\\{i\\}/g, index);\n mapped[target] = attrValue;\n }\n }\n }\n } else if (rawSources && typeof rawSources === 'object') {\n // Object form: { field: [sourcePatterns...] }\n // e.g. { id: [\"llm.tool_calls.{i}.id\"], name: [\"llm.tool_calls.{i}.name\"] }\n for (const [field, sourcePatterns] of Object.entries(rawSources)) {\n if (!Array.isArray(sourcePatterns)) continue;\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n for (const sourcePattern of sourcePatterns) {\n const match = attrName.match(this._getPatternRegex(sourcePattern));\n\n if (match) {\n const index = match[1];\n const target = targetBase.replace(/\\{i\\}/g, index) + '.' + field;\n mapped[target] = attrValue;\n }\n }\n }\n }\n }\n\n return mapped;\n }\n\n /** Recursively map nested configuration. */\n mapNestedConfig(\n config: Record<string, any>,\n attributes: Record<string, any>,\n spanKind?: string,\n ): Record<string, any> {\n const mapped: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(config)) {\n if (['description', 'sources', 'target', 'indexed', 'priority', 'values', 'applies_to'].includes(key)) {\n continue;\n }\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n if (Array.isArray(value.applies_to) && spanKind && !value.applies_to.includes(spanKind)) {\n continue;\n }\n if ('sources' in value) {\n if (value.indexed) {\n const target = value.target ?? '';\n const indexedMapped = this.mapIndexedAttributes(value, attributes, target);\n Object.assign(mapped, indexedMapped);\n\n if ('target_content' in value) {\n const contentTarget = value.target_content;\n const contentMapped = this.mapIndexedAttributes(value, attributes, contentTarget);\n Object.assign(mapped, contentMapped);\n }\n } else {\n let target = value.target ?? '';\n if (spanKind && target.includes('{span_kind}')) {\n target = target.replace(/\\{span_kind\\}/g, spanKind);\n }\n\n const result = this.mapSimpleAttribute(value, attributes);\n if (result !== undefined) {\n mapped[target] = result;\n }\n }\n } else {\n const nestedMapped = this.mapNestedConfig(value, attributes, spanKind);\n Object.assign(mapped, nestedMapped);\n }\n }\n }\n\n return mapped;\n }\n\n /** Map all attributes from vendor-specific to neatlogs namespace. */\n mapAttributes(\n attributes: Record<string, any>,\n spanKind?: string,\n ): Record<string, any> {\n const mapped: Record<string, any> = {};\n\n if (!spanKind) {\n spanKind = this.mapSpanKind(attributes);\n }\n mapped['neatlogs.span.kind'] = spanKind;\n\n for (const [sectionName, sectionConfig] of Object.entries(this.mappings)) {\n if (sectionName === 'span_kind' || sectionName === 'keep_as_is' || sectionName === 'ignore') continue;\n\n if (typeof sectionConfig === 'object' && sectionConfig !== null) {\n // Skip sections that don't apply to this span kind\n if (Array.isArray(sectionConfig.applies_to) && spanKind && !sectionConfig.applies_to.includes(spanKind)) {\n continue;\n }\n if ('mappings' in sectionConfig) {\n // Process the explicit 'mappings' sub-key\n const nestedMapped = this.mapNestedConfig(\n sectionConfig.mappings,\n attributes,\n spanKind,\n );\n Object.assign(mapped, nestedMapped);\n // Also process sibling sub-sections (e.g. generic_io, span, tool, etc.)\n for (const [subKey, subVal] of Object.entries(sectionConfig)) {\n if (subKey === 'mappings' || subKey === 'description' || subKey === 'applies_to') continue;\n if (typeof subVal === 'object' && subVal !== null && !Array.isArray(subVal)) {\n if (Array.isArray((subVal as any).applies_to) && spanKind && !(subVal as any).applies_to.includes(spanKind)) {\n continue;\n }\n if ('sources' in subVal) {\n if ((subVal as any).indexed) {\n const target = (subVal as any).target ?? '';\n const indexedMapped = this.mapIndexedAttributes(subVal as MappingConfig, attributes, target);\n Object.assign(mapped, indexedMapped);\n } else if (Array.isArray((subVal as any).sources)) {\n let target = (subVal as any).target ?? '';\n if (spanKind && target.includes('{span_kind}')) {\n target = target.replace(/\\{span_kind\\}/g, spanKind);\n }\n const result = this.mapSimpleAttribute(subVal as MappingConfig, attributes);\n if (result !== undefined) {\n mapped[target] = result;\n }\n }\n } else {\n const subMapped = this.mapNestedConfig(subVal as Record<string, any>, attributes, spanKind);\n Object.assign(mapped, subMapped);\n }\n }\n }\n } else if ('sources' in sectionConfig) {\n let target = sectionConfig.target ?? '';\n if (target.includes('{span_kind}')) {\n target = target.replace(/\\{span_kind\\}/g, spanKind);\n }\n const result = this.mapSimpleAttribute(sectionConfig, attributes);\n if (result !== undefined) {\n mapped[target] = result;\n }\n } else {\n const nestedMapped = this.mapNestedConfig(sectionConfig, attributes, spanKind);\n Object.assign(mapped, nestedMapped);\n }\n }\n }\n\n // Keep OTel standard attributes\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n if (this.shouldKeepAsIs(attrName) && !(attrName in mapped)) {\n mapped[attrName] = attrValue;\n }\n }\n\n // Collect all mapped sources\n const mappedSources = new Set<string>();\n for (const sectionConfig of Object.values(this.mappings)) {\n if (typeof sectionConfig === 'object' && sectionConfig !== null) {\n if ('sources' in sectionConfig) {\n for (const s of flattenSources((sectionConfig as any).sources)) {\n mappedSources.add(s);\n }\n }\n if ('mappings' in sectionConfig) {\n this._collectMappedSources((sectionConfig as any).mappings, mappedSources);\n }\n // Also collect from sibling sub-sections\n for (const [subKey, subVal] of Object.entries(sectionConfig)) {\n if (subKey === 'mappings' || subKey === 'description' || subKey === 'sources') continue;\n if (typeof subVal === 'object' && subVal !== null && !Array.isArray(subVal)) {\n this._collectMappedSources(subVal as Record<string, any>, mappedSources);\n }\n }\n }\n }\n\n // Pass through unmapped, non-ignored attributes\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n if (!mappedSources.has(attrName) && !(attrName in mapped) && !this.shouldIgnore(attrName)) {\n mapped[attrName] = attrValue;\n }\n }\n\n // Remove ignored attributes from final result\n const result: Record<string, any> = {};\n for (const [k, v] of Object.entries(mapped)) {\n if (!this.shouldIgnore(k)) {\n result[k] = v;\n }\n }\n\n return result;\n }\n\n /** Recursively collect all source attribute names from nested config. */\n private _collectMappedSources(config: Record<string, any>, collected: Set<string>): void {\n for (const value of Object.values(config)) {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n if ('sources' in value) {\n for (const s of flattenSources((value as any).sources)) {\n collected.add(s);\n }\n } else {\n this._collectMappedSources(value as Record<string, any>, collected);\n }\n }\n }\n }\n\n /** Get the span kind value mapping. */\n getSpanKindValueMapping(): Record<string, string> {\n return this.mappings.span_kind?.values ?? {};\n }\n\n /** Get the target neatlogs attribute name for a source attribute. */\n getTargetAttributeName(sourceAttr: string, spanKind?: string): string | undefined {\n const searchConfig = (config: Record<string, any>, targetSpanKind?: string): string | undefined => {\n for (const value of Object.values(config)) {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n if ('sources' in value) {\n const sources = flattenSources((value as any).sources);\n if (sources.includes(sourceAttr)) {\n let target = (value as any).target ?? '';\n if (targetSpanKind && target.includes('{span_kind}')) {\n target = target.replace(/\\{span_kind\\}/g, targetSpanKind);\n }\n return target;\n }\n }\n const result = searchConfig(value as Record<string, any>, targetSpanKind);\n if (result) return result;\n }\n }\n return undefined;\n };\n\n return searchConfig(this.mappings, spanKind);\n }\n}\n\n// Singleton instance\nlet _mapperInstance: AttributeMapper | null = null;\n\n/** Get the global AttributeMapper instance. */\nexport function getMapper(): AttributeMapper {\n if (!_mapperInstance) {\n _mapperInstance = new AttributeMapper();\n }\n return _mapperInstance;\n}\n\n/** Convenience function to map attributes using the global mapper. */\nexport function mapAttributes(\n attributes: Record<string, any>,\n spanKind?: string,\n): Record<string, any> {\n return getMapper().mapAttributes(attributes, spanKind);\n}\n","/** Stable SDK-wide defaults shared by every NeatLogs entry point. */\nexport const DEFAULT_INGEST_ENDPOINT = 'https://ingest.neatlogs.com' as const;\nexport const DEFAULT_MAX_QUEUE_ITEMS = 2048;\nexport const DEFAULT_MAX_SEMANTIC_STREAM_EVENTS = 128;\nexport const DEFAULT_MAX_STREAM_CAPTURE_BYTES = 1024 * 1024;\nexport const DEFAULT_MAX_STREAM_CAPTURE_ITEMS = 1024;\n\n/** UTF-8 byte length without allocating a second buffer for hostile stream chunks. */\nexport function utf8ByteLength(\n value: string,\n limit = Number.MAX_SAFE_INTEGER,\n): number {\n let bytes = 0;\n for (let i = 0; i < value.length; i++) {\n const code = value.charCodeAt(i);\n if (code < 0x80) bytes += 1;\n else if (code < 0x800) bytes += 2;\n else if (code >= 0xd800 && code <= 0xdbff && i + 1 < value.length) {\n const next = value.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n bytes += 4;\n i += 1;\n } else bytes += 3;\n } else bytes += 3;\n if (bytes > limit) return limit + 1;\n }\n return bytes;\n}\n\nexport function exportQueueCapacity(batchSize: number): number {\n return Math.max(DEFAULT_MAX_QUEUE_ITEMS, batchSize * 4);\n}\n","/**\n * Context wrapper for manual span creation.\n *\n * Provides the `trace()` function — the TypeScript equivalent of the Python\n * `trace()` context manager. Creates an OTel span, sets prompt template/variable\n * context, and executes the user callback within the span.\n *\n * @example\n * ```typescript\n * await trace({ name: 'my-trace' }, async (span) => {\n * // user code runs here with the span active\n * });\n * ```\n */\n\nimport {\n trace as otelTrace,\n context as otelContext,\n createContextKey,\n ROOT_CONTEXT,\n SpanStatusCode,\n type Span,\n} from '@opentelemetry/api';\nimport { PromptContext, UserPromptContext, PromptTemplate, UserPromptTemplate } from '../prompt/template.js';\nimport { registerMask } from './mask.js';\nimport { applyEndUserAttributes } from './end-user.js';\nimport { applySessionAttributes } from './session.js';\nimport { currentSessionId } from './identity.js';\nimport { captureMedia } from './media.js';\nimport { bindSpanToAutoRoot, maybeOpenAutoRoot } from './auto-root.js';\nimport { NeatlogsConfigurationError } from '../errors.js';\n\nimport { getLogger } from './logger.js';\nimport { safeJsonDumps, serializeObj } from '../decorators/base.js';\nimport type { TraceOptions, MaskFunction } from '../types.js';\nimport {\n getActiveNeatlogsSpan,\n getNeatlogsActiveContext,\n getNeatlogsParentContext,\n getNeatlogsRootSpan,\n getNeatlogsTracer,\n withNeatlogsSpan,\n} from './provider.js';\n\nconst logger = getLogger();\n\n// ---------------------------------------------------------------------------\n// Module-level session config (set by init.ts via _setSessionConfig)\n// ---------------------------------------------------------------------------\n\nlet _sessionConfig: Record<string, any> = {};\n\n/**\n * Set the session configuration. Called by init() during SDK setup.\n * @internal\n */\nexport function _setSessionConfig(config: Record<string, any>): void {\n _sessionConfig = config;\n}\n\n/**\n * Get a copy of the current session configuration.\n */\nexport function getSessionConfig(): Record<string, any> {\n return { ..._sessionConfig };\n}\n\n// ---------------------------------------------------------------------------\n// OTel context keys for prompt data propagation\n// ---------------------------------------------------------------------------\n\nexport const PROMPT_VARIABLES_KEY = createContextKey('neatlogs.prompt_variables');\nexport const PROMPT_TEMPLATE_KEY = createContextKey('neatlogs.prompt_template');\nexport const PROMPT_VERSION_KEY = createContextKey('neatlogs.prompt_version');\nexport const USER_PROMPT_TEMPLATE_KEY = createContextKey('neatlogs.user_prompt_template');\nexport const USER_PROMPT_VARIABLES_KEY = createContextKey('neatlogs.user_prompt_variables');\n\n// ---------------------------------------------------------------------------\n// Known TraceOptions keys (not forwarded as extra span attributes)\n// ---------------------------------------------------------------------------\n\nconst KNOWN_OPTION_KEYS = new Set([\n 'name',\n 'kind',\n 'input',\n 'promptTemplate',\n 'promptVariables',\n 'userPromptTemplate',\n 'userPromptVariables',\n 'version',\n 'mask',\n 'attributes',\n 'sessionId',\n 'parentSessionId',\n 'sessionFeatureName',\n 'sessionEntryPoint',\n 'endUserId',\n 'endUserMetadata',\n]);\n\nfunction assertNoHttpSpanKind(\n kind: unknown,\n attributes: Record<string, any> | undefined,\n): void {\n const candidates = [\n kind,\n attributes?.['neatlogs.span.kind'],\n attributes?.['openinference.span.kind'],\n ];\n if (candidates.some((value) => String(value ?? '').trim().toUpperCase() === 'HTTP')) {\n throw new NeatlogsConfigurationError(\n 'UNSUPPORTED_SPAN_KIND',\n 'kind',\n 'HTTP spans are not supported. Trace the semantic LLM, TOOL, RETRIEVER, or other AI operation instead.',\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Set standard and extra attributes on a span.\n * @internal\n */\nexport function _setSpanAttributes(\n span: Span,\n kind: string | undefined,\n attributes: Record<string, any>,\n): void {\n // trace() is also the public API for user-visible WORKFLOW, AGENT, TOOL,\n // EMBEDDING, and other spans. Marking every trace() span as internal causes\n // those spans (and an all-internal trace) to be filtered by ingestion. Only\n // the synthetic LLM wrapper span is internal by default; callers can still\n // opt any other span into internal handling through explicit attributes.\n if (kind?.toUpperCase() === 'LLM') {\n span.setAttribute('neatlogs.internal', true);\n }\n span.setAttribute('openinference.span.kind', kind ?? 'CHAIN');\n\n for (const [key, value] of Object.entries(attributes)) {\n span.setAttribute(key, value);\n }\n}\n\n/**\n * After the user callback completes, capture prompt variables that were\n * set by PromptTemplate.compile() / UserPromptTemplate.compile() and\n * record them as span attributes.\n * @internal\n */\nexport function _finalizePromptCapture(\n span: Span,\n isPromptTemplateObj: boolean,\n isUserPromptTemplateObj: boolean,\n): void {\n if (isPromptTemplateObj) {\n const capturedVars = PromptContext.getVariables();\n if (capturedVars) {\n span.setAttribute(\n 'llm.prompt_template_variables',\n JSON.stringify(capturedVars),\n );\n logger.debug(\n `[trace] Auto-captured variables from PromptContext: ${Object.keys(capturedVars).join(', ')}`,\n );\n }\n }\n\n if (isUserPromptTemplateObj) {\n const capturedUserVars = UserPromptContext.getVariables();\n if (capturedUserVars) {\n span.setAttribute(\n 'llm.user_prompt_template_variables',\n JSON.stringify(capturedUserVars),\n );\n logger.debug(\n `[trace] Auto-captured variables from UserPromptContext: ${Object.keys(capturedUserVars).join(', ')}`,\n );\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Explicit trace-level output\n// ---------------------------------------------------------------------------\n\n/**\n * Explicitly set the trace-level \"final output\" shown for the current trace.\n *\n * By default the trace's displayed output is derived from the root span's\n * captured output. Call this to declare it instead — useful when the turn's\n * meaningful result lives in a tool call or is a status object you don't want\n * shown (e.g. an agent that suspends awaiting user input). The value is stamped\n * as `neatlogs.trace.output` on the trace ROOT span, which the backend prefers\n * over the derived output.\n *\n * No-op when called outside an active trace. Never throws.\n *\n * @param value - The value to show as the trace's final output.\n *\n * @example\n * ```typescript\n * await trace({ name: 'turn', sessionId }, async () => {\n * const plan = await proposePlan();\n * setTraceOutput(plan.title); // show the plan, not the raw status object\n * });\n * ```\n */\nexport function setTraceOutput(value: unknown): void {\n try {\n const span = getNeatlogsRootSpan() ?? getActiveNeatlogsSpan();\n if (!span) return;\n const captured = captureMedia(\n span,\n 'neatlogs.trace.output',\n serializeObj(value),\n 'output',\n );\n span.setAttribute('neatlogs.trace.output', safeJsonDumps(captured));\n } catch (err) {\n logger.warn(`[setTraceOutput] failed to set trace output: ${err}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main trace() function\n// ---------------------------------------------------------------------------\n\n/**\n * Async callback wrapper for manual span creation with prompt tracking.\n *\n * Creates an OTel span, optionally sets prompt template/variable context,\n * and executes the provided callback within the span.\n *\n * **Session-Aware Trace Creation:**\n * - If a session id is resolved (per-call `sessionId` or the request-scoped\n * `identify()` context) AND no active parent span exists, this creates a NEW\n * root trace (for multi-turn conversations).\n * - Otherwise, creates a normal child span within the existing trace.\n *\n * @param options - Trace configuration options\n * @param fn - Callback that receives the active span\n * @returns The return value of the callback\n *\n * @example\n * ```typescript\n * // Basic usage\n * await trace({ name: 'my-pipeline' }, async (span) => {\n * await step1();\n * await step2();\n * });\n *\n * // With prompt template\n * const template = new PromptTemplate('Hello {{name}}');\n * await trace({ name: 'prompt', promptTemplate: template }, async (span) => {\n * const rendered = template.compile({ name: 'world' });\n * // ...\n * });\n * ```\n */\nexport async function trace<T>(\n options: TraceOptions,\n fn: (span: Span) => T | Promise<T>,\n): Promise<T> {\n const {\n name,\n kind,\n input,\n promptTemplate,\n promptVariables,\n userPromptTemplate,\n userPromptVariables,\n version,\n mask,\n sessionId: sessionIdOption,\n parentSessionId,\n sessionFeatureName,\n sessionEntryPoint,\n endUserId,\n endUserMetadata,\n attributes: explicitAttributes,\n ...extraOptions\n } = options;\n\n assertNoHttpSpanKind(kind, explicitAttributes);\n\n // Per-call sessionId wins, else the request-scoped identify() context.\n // Session identity is NOT process-global — init() never sets it.\n const sessionId = sessionIdOption ?? currentSessionId();\n\n // Determine whether we are inside an existing trace. Delayed work can retain\n // an already-ended intermediate span in AsyncLocalStorage. Prefer a live root\n // when one is available; if the root reference is unavailable, preserve the\n // ended parent context so the delayed span keeps the original trace id instead\n // of incorrectly opening a new standalone trace.\n const currentSpan = getActiveNeatlogsSpan();\n const rootSpan = getNeatlogsRootSpan();\n const currentSpanIsRecording = currentSpan?.isRecording() === true;\n const rootSpanIsRecording = rootSpan?.isRecording() === true;\n const shouldFallbackToRoot = !currentSpanIsRecording && rootSpanIsRecording;\n const hasInheritedTraceContext =\n currentSpan !== undefined || rootSpan !== undefined;\n const shouldCreateRootTrace =\n !!sessionId && !hasInheritedTraceContext && !rootSpanIsRecording;\n\n // ---------------------------------------------------------------------------\n // Process prompt templates\n // ---------------------------------------------------------------------------\n\n let templateString: string | undefined;\n let isPromptTemplateObj = false;\n\n if (promptTemplate !== undefined) {\n if (promptTemplate instanceof PromptTemplate) {\n isPromptTemplateObj = true;\n const t = promptTemplate.template;\n templateString = typeof t === 'string' ? t : JSON.stringify(t);\n logger.debug(\n `[trace] Using PromptTemplate object with variables: ${promptTemplate.variables.join(', ')}`,\n );\n } else if (typeof promptTemplate === 'string') {\n templateString = promptTemplate;\n } else {\n const t = promptTemplate.template;\n templateString = typeof t === 'string' ? t : JSON.stringify(t);\n }\n }\n\n let userTemplateString: string | undefined;\n let isUserPromptTemplateObj = false;\n\n if (userPromptTemplate !== undefined) {\n if (userPromptTemplate instanceof UserPromptTemplate) {\n isUserPromptTemplateObj = true;\n const t = userPromptTemplate.template;\n userTemplateString = typeof t === 'string' ? t : JSON.stringify(t);\n logger.debug(\n `[trace] Using UserPromptTemplate object with variables: ${userPromptTemplate.variables.join(', ')}`,\n );\n } else if (typeof userPromptTemplate === 'string') {\n userTemplateString = userPromptTemplate;\n } else {\n const t = userPromptTemplate.template;\n userTemplateString = typeof t === 'string' ? t : JSON.stringify(t);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Build OTel context with prompt values\n // ---------------------------------------------------------------------------\n\n // Start from the Neatlogs active context (private store in isolated mode), NOT\n // otelContext.active() — the latter is the foreign co-tenant's context, whose\n // active span must never become our parent. Prompt values threaded here then\n // propagate to descendant LLM spans through the private store.\n let ctx = getNeatlogsActiveContext();\n if (shouldFallbackToRoot) {\n ctx = otelTrace.setSpan(ctx, rootSpan!);\n }\n\n const variablesJson = promptVariables ? JSON.stringify(promptVariables) : undefined;\n const userVariablesJson = userPromptVariables ? JSON.stringify(userPromptVariables) : undefined;\n\n if (variablesJson) {\n ctx = ctx.setValue(PROMPT_VARIABLES_KEY, variablesJson);\n logger.debug(`[trace] Set neatlogs.prompt_variables in context: ${variablesJson}`);\n }\n if (templateString) {\n ctx = ctx.setValue(PROMPT_TEMPLATE_KEY, templateString);\n logger.debug(`[trace] Set neatlogs.prompt_template in context: ${templateString}`);\n }\n if (userVariablesJson) {\n ctx = ctx.setValue(USER_PROMPT_VARIABLES_KEY, userVariablesJson);\n logger.debug(`[trace] Set neatlogs.user_prompt_variables in context: ${userVariablesJson}`);\n }\n if (userTemplateString) {\n ctx = ctx.setValue(USER_PROMPT_TEMPLATE_KEY, userTemplateString);\n logger.debug(`[trace] Set neatlogs.user_prompt_template in context: ${userTemplateString}`);\n }\n if (version) {\n ctx = ctx.setValue(PROMPT_VERSION_KEY, version);\n logger.debug(`[trace] Set neatlogs.prompt_version in context: ${version}`);\n }\n\n // ---------------------------------------------------------------------------\n // Collect extra attributes (non-standard option keys)\n // ---------------------------------------------------------------------------\n\n const extraAttributes: Record<string, any> = { ...(explicitAttributes ?? {}) };\n for (const [key, value] of Object.entries(extraOptions)) {\n if (!KNOWN_OPTION_KEYS.has(key)) {\n extraAttributes[key] = value;\n }\n }\n\n // End-user belongs to the trace root only. This trace() call is a root when it\n // creates a new root trace, or when it isn't nested in an already-active trace.\n const isRootTrace = shouldCreateRootTrace || !hasInheritedTraceContext;\n\n // ---------------------------------------------------------------------------\n // Create span and execute callback\n // ---------------------------------------------------------------------------\n\n const tracer = getNeatlogsTracer('neatlogs.trace');\n\n const spanCallback = async (span: Span): Promise<T> => {\n _setSpanAttributes(span, kind, extraAttributes);\n\n // Session/end-user belong to the trace root only; skipped on a non-root span.\n const spanIsRoot = isRootTrace && !autoRoot.root;\n applySessionAttributes(span, sessionId, spanIsRoot, {\n parentSessionId,\n sessionFeatureName,\n sessionEntryPoint,\n });\n applyEndUserAttributes(span, endUserId, endUserMetadata, spanIsRoot);\n\n if (input !== undefined && input !== null) {\n const capturedInput = captureMedia(\n span,\n `neatlogs.${String(kind ?? 'workflow').toLowerCase()}.input`,\n serializeObj(input),\n 'input',\n );\n span.setAttribute('input.value', safeJsonDumps(capturedInput));\n }\n\n if (mask) {\n const maskId = registerMask(mask);\n span.setAttribute('neatlogs.mask_id', maskId);\n }\n\n try {\n const result: T = await fn(span);\n\n _finalizePromptCapture(span, isPromptTemplateObj, isUserPromptTemplateObj);\n\n if (result !== undefined && result !== null) {\n const spanAttrs = (span as any).attributes ?? (span as any)._attributes;\n const hasOutput = spanAttrs && (\n 'output.value' in spanAttrs || 'neatlogs.output.value' in spanAttrs\n );\n if (!hasOutput) {\n const capturedOutput = captureMedia(\n span,\n `neatlogs.${String(kind ?? 'workflow').toLowerCase()}.output`,\n serializeObj(result),\n 'output',\n );\n span.setAttribute('output.value', safeJsonDumps(capturedOutput));\n }\n }\n\n return result;\n } catch (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n } finally {\n if (isPromptTemplateObj) {\n PromptContext.clear();\n }\n if (isUserPromptTemplateObj) {\n UserPromptContext.clear();\n }\n span.end();\n }\n };\n\n const parentContext = shouldCreateRootTrace\n ? ROOT_CONTEXT\n : getNeatlogsParentContext(ctx);\n // Seed the span kind at CREATION, not just in the callback: the span processor\n // classifies LLM spans in onStart() (which fires from startSpan, before the\n // callback runs). Without this, a trace({ kind: 'LLM', promptTemplate }) span\n // isn't recognized as LLM in time and its prompt-template attributes are dropped.\n const startAttributes = kind ? { 'openinference.span.kind': kind } : undefined;\n const autoRoot = isRootTrace\n ? maybeOpenAutoRoot(tracer, String(kind ?? 'CHAIN'), parentContext)\n : { root: undefined, ctx: parentContext };\n if (autoRoot.root) {\n applySessionAttributes(autoRoot.root, sessionId, true, {\n parentSessionId,\n sessionFeatureName,\n sessionEntryPoint,\n });\n applyEndUserAttributes(autoRoot.root, endUserId, endUserMetadata, true);\n }\n const span = bindSpanToAutoRoot(\n tracer.startSpan(\n name,\n startAttributes ? { attributes: startAttributes } : {},\n autoRoot.ctx,\n ),\n autoRoot.root,\n );\n\n if (shouldCreateRootTrace) {\n logger.debug(`[trace] Creating NEW root trace '${name}' (sessionId=${sessionId})`);\n } else {\n logger.debug(`[trace] Creating child span '${name}'`);\n }\n\n return withNeatlogsSpan(\n span,\n () => spanCallback(span),\n autoRoot.ctx,\n autoRoot.root,\n );\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport type { PromptMessage } from '../types.js';\n\n// ---------------------------------------------------------------------------\n// Async-local context for system prompts\n// ---------------------------------------------------------------------------\n\ninterface PromptContextData {\n template: string;\n variables: Record<string, any>;\n}\n\nconst _promptStorage = new AsyncLocalStorage<PromptContextData>();\n\n/**\n * Manages system prompt metadata in async-local context for automatic tracing.\n */\nexport class PromptContext {\n /**\n * Store system prompt template and variables in context.\n */\n static set(template: string, variables: Record<string, any>): void {\n // enterWith mutates the current async context in-place\n _promptStorage.enterWith({ template, variables });\n }\n\n /**\n * Retrieve system prompt template from context.\n */\n static getTemplate(): string | undefined {\n return _promptStorage.getStore()?.template;\n }\n\n /**\n * Retrieve system prompt variables from context.\n */\n static getVariables(): Record<string, any> | undefined {\n return _promptStorage.getStore()?.variables;\n }\n\n /**\n * Clear system prompt context.\n */\n static clear(): void {\n _promptStorage.enterWith(undefined as unknown as PromptContextData);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Async-local context for user prompts\n// ---------------------------------------------------------------------------\n\nconst _userPromptStorage = new AsyncLocalStorage<PromptContextData>();\n\n/**\n * Manages user/human prompt metadata in async-local context for automatic tracing.\n */\nexport class UserPromptContext {\n /**\n * Store user prompt template and variables in context.\n */\n static set(template: string, variables: Record<string, any>): void {\n _userPromptStorage.enterWith({ template, variables });\n }\n\n /**\n * Retrieve user prompt template from context.\n */\n static getTemplate(): string | undefined {\n return _userPromptStorage.getStore()?.template;\n }\n\n /**\n * Retrieve user prompt variables from context.\n */\n static getVariables(): Record<string, any> | undefined {\n return _userPromptStorage.getStore()?.variables;\n }\n\n /**\n * Clear user prompt context.\n */\n static clear(): void {\n _userPromptStorage.enterWith(undefined as unknown as PromptContextData);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shared context setter type for the base template class\n// ---------------------------------------------------------------------------\n\ninterface ContextSetter {\n set(template: string, variables: Record<string, any>): void;\n}\n\n// ---------------------------------------------------------------------------\n// BasePromptTemplate — shared logic for system and user prompts\n// ---------------------------------------------------------------------------\n\nconst VARIABLE_PATTERN = /\\{\\{(\\w+)\\}\\}/g;\n\n/**\n * Base class for prompt templates with `{{variable}}` placeholders.\n *\n * Extracts variables, compiles templates, and renders strings.\n * Subclasses only need to specify the context class and display name.\n */\nabstract class BasePromptTemplate {\n protected readonly _template: string | PromptMessage[];\n protected readonly _variables: string[];\n\n /**\n * @param template - Either a string with `{{variable}}` placeholders or\n * an array of `PromptMessage` objects whose `content` fields contain placeholders.\n */\n constructor(template: string | PromptMessage[]) {\n this._template = template;\n this._variables = this._extractVariables();\n }\n\n /** List of unique variable names found in this template. */\n get variables(): string[] {\n return this._variables;\n }\n\n /** The raw template (string or message array). */\n get template(): string | PromptMessage[] {\n return this._template;\n }\n\n /** The context class to store template/variables for automatic tracing. */\n protected abstract get _contextSetter(): ContextSetter;\n\n /** Display name for toString(). */\n protected abstract get _displayName(): string;\n\n /**\n * Compile the prompt template with the given variables.\n *\n * @param variables - Key/value pairs to substitute for `{{key}}` placeholders.\n * @returns The rendered string or rendered message array.\n * @throws {Error} If any required variables are missing.\n */\n compile(variables?: Record<string, any>): string | PromptMessage[] {\n const vars = variables ?? {};\n\n const missing = this._variables.filter((v) => !(v in vars));\n if (missing.length > 0) {\n throw new Error(\n `Missing required variables: ${missing.join(', ')}. Template requires: ${this._variables.join(', ')}`,\n );\n }\n\n this._contextSetter.set(\n typeof this._template === 'string'\n ? this._template\n : this._template.map((msg) => `${msg.role}: ${msg.content}`).join('\\n'),\n vars,\n );\n\n if (typeof this._template === 'string') {\n return this._renderString(this._template, vars);\n }\n\n return this._template.map((msg) => ({\n role: msg.role,\n content: this._renderString(msg.content, vars),\n }));\n }\n\n /**\n * Replace `{{key}}` placeholders in a string with the corresponding values.\n */\n _renderString(text: string, variables: Record<string, any>): string {\n let result = text;\n for (const [key, value] of Object.entries(variables)) {\n result = result.replaceAll(`{{${key}}}`, String(value));\n }\n return result;\n }\n\n toString(): string {\n if (typeof this._template === 'string') {\n return this._template.length > 50\n ? `${this._displayName}('${this._template.slice(0, 50)}...')`\n : `${this._displayName}('${this._template}')`;\n }\n return `${this._displayName}(${this._template.length} messages, variables=${JSON.stringify(this._variables)})`;\n }\n\n // ---- private ----\n\n private _extractVariables(): string[] {\n if (typeof this._template === 'string') {\n return [...new Set(Array.from(this._template.matchAll(VARIABLE_PATTERN), (m) => m[1]))];\n }\n\n const found: string[] = [];\n for (const msg of this._template) {\n if (msg.content) {\n for (const match of msg.content.matchAll(VARIABLE_PATTERN)) {\n found.push(match[1]);\n }\n }\n }\n return [...new Set(found)];\n }\n}\n\n// ---------------------------------------------------------------------------\n// PromptTemplate — system/AI instruction prompt\n// ---------------------------------------------------------------------------\n\n/**\n * Template for the system/AI instruction prompt with `{{variable}}` placeholders.\n */\nexport class PromptTemplate extends BasePromptTemplate {\n protected get _contextSetter(): ContextSetter {\n return PromptContext;\n }\n\n protected get _displayName(): string {\n return 'PromptTemplate';\n }\n}\n\n// ---------------------------------------------------------------------------\n// UserPromptTemplate — user/human turn prompt\n// ---------------------------------------------------------------------------\n\n/**\n * Template for the user/human turn prompt with `{{variable}}` placeholders.\n *\n * Identical to {@link PromptTemplate} but stores context in {@link UserPromptContext}.\n */\nexport class UserPromptTemplate extends BasePromptTemplate {\n protected get _contextSetter(): ContextSetter {\n return UserPromptContext;\n }\n\n protected get _displayName(): string {\n return 'UserPromptTemplate';\n }\n}\n","/**\n * PII masking support for Neatlogs spans.\n *\n * Users supply a callable that receives the full span dict and returns\n * the (possibly modified) span dict. Return null to drop the span entirely.\n */\n\nimport type { MaskFunction } from '../types.js';\nimport { getLogger } from './logger.js';\n\nconst logger = getLogger();\nexport const DEFAULT_MASK_TIMEOUT_MS = 5_000;\n\nexport interface ApplyMaskOptions {\n signalType?: 'span' | 'log';\n timeoutMs?: number;\n}\n\n/** Module-level registry: key -> mask function */\nconst _MASK_REGISTRY = new Map<string, MaskFunction>();\nconst _MASK_RESULTS = new WeakMap<object, Promise<Record<string, any> | null>>();\n\nlet _nextId = 0;\n\n/**\n * Register a mask function and return its lookup key.\n */\nexport function registerMask(fn: MaskFunction): string {\n const key = String(++_nextId);\n _MASK_REGISTRY.set(key, fn);\n return key;\n}\n\n/**\n * Apply the effective mask function to span data.\n *\n * Per-span mask (stored in attributes[\"neatlogs.mask_id\"]) takes\n * precedence over the global mask. Returns the (possibly modified) dict.\n */\nfunction effectiveMask(\n spanData: Record<string, any>,\n globalMask: MaskFunction | null | undefined,\n): MaskFunction | null {\n const maskId = spanData?.attributes?.['neatlogs.mask_id'];\n let maskFn: MaskFunction | undefined | null = null;\n\n if (maskId) {\n maskFn = _MASK_REGISTRY.get(String(maskId)) ?? null;\n }\n\n if (!maskFn) {\n maskFn = globalMask ?? null;\n }\n\n return maskFn;\n}\n\nexport async function applyMask(\n spanData: Record<string, any>,\n globalMask: MaskFunction | null | undefined,\n options: ApplyMaskOptions = {},\n): Promise<Record<string, any> | null> {\n const maskFn = effectiveMask(spanData, globalMask);\n if (!maskFn) return spanData;\n\n const signalType = options.signalType ?? 'span';\n const timeoutMs = options.timeoutMs ?? DEFAULT_MASK_TIMEOUT_MS;\n const controller = new AbortController();\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n try {\n // Run user masking outside SpanProcessor.onEnd() so a slow callback does\n // not block application request completion.\n const maskPromise = Promise.resolve().then(() =>\n maskFn(spanData, { signal: controller.signal, signalType, timeoutMs }),\n );\n const timeoutPromise = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error(`mask callback exceeded ${timeoutMs}ms`));\n }, timeoutMs);\n timer.unref?.();\n });\n const result = await Promise.race([maskPromise, timeoutPromise]);\n // null means \"drop this span entirely\"; undefined means \"keep original\"\n if (result === null) return null;\n return result !== undefined ? result : spanData;\n } catch (exc) {\n const signalName = spanData?.name ?? spanData?.signal_type ?? signalType;\n logger.error(\n `mask callable failed for ${signalType} '${signalName}': ${exc} — dropping it to prevent unmasked export.`,\n );\n return null;\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n controller.abort();\n }\n}\n\n/** Schedule and retain one masking result for the exporter that receives span. */\nexport function scheduleMask(\n span: object,\n spanData: Record<string, any>,\n globalMask: MaskFunction | null | undefined,\n): Promise<Record<string, any> | null> {\n const result = applyMask(spanData, globalMask, { signalType: 'span' });\n _MASK_RESULTS.set(span, result);\n return result;\n}\n\n/** Return the result scheduled by NeatlogsSpanProcessor for this snapshot. */\nexport function getScheduledMask(span: object): Promise<Record<string, any> | null> | undefined {\n return _MASK_RESULTS.get(span);\n}\n\n/**\n * Clear all registered masks. Used for testing.\n * @internal\n */\nexport function _clearMaskRegistry(): void {\n _MASK_REGISTRY.clear();\n _nextId = 0;\n}\n","/**\n * Request-scoped session & end-user identity.\n *\n * Session and end-user identity are PER-REQUEST, not process-global, so they are\n * never set on `init()`. The primary way to set them is at the trace root\n * (`trace({ sessionId })` / `span({ sessionId })`). For code that only uses\n * `wrap()` — where the trace root is created internally by the wrapper and the\n * caller has no root to put arguments on — use the `identify()` context:\n *\n * await neatlogs.identify(\n * { sessionId: 'chat_123', endUserId: 'user_456', endUserMetadata: { plan: 'pro' } },\n * async () => {\n * await wrappedClient.chat.completions.create(...); // auto-root reads this\n * },\n * );\n *\n * Resolution at the trace root (per field): explicit per-call argument wins, then\n * the `identify()` context, then nothing. Identity is stamped on the ROOT span\n * only; the backend rolls it up to the trace and its session.\n *\n * Backed by `AsyncLocalStorage` so it propagates across `await` boundaries (and\n * nested async tasks), exactly like OpenTelemetry's own context propagation.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\nexport interface IdentityStore {\n sessionId?: string;\n parentSessionId?: string;\n sessionFeatureName?: string;\n sessionEntryPoint?: string;\n endUserId?: string;\n endUserMetadata?: Record<string, any>;\n}\n\nexport interface IdentifyOptions {\n sessionId?: string;\n /** Optional immediate parent session. */\n parentSessionId?: string;\n /** Product feature that initiated this request. */\n sessionFeatureName?: string;\n /** Application entry point that initiated this request. */\n sessionEntryPoint?: string;\n endUserId?: string;\n endUserMetadata?: Record<string, any>;\n}\n\n// tsup bundles each entry point (index, openai, azure-openai, ...) separately,\n// so a plain module-level `new AsyncLocalStorage()` would be DUPLICATED per\n// bundle — identify() (in index) would write to a different store than a\n// provider wrapper's auto-root (in e.g. azure-openai) reads, silently losing\n// identity on the wrapper-only path. Pin a single instance on globalThis so all\n// bundled copies (ESM + CJS) resolve to the same store.\nconst _GLOBAL_KEY = Symbol.for('neatlogs.identity.storage');\ntype _GlobalWithStore = typeof globalThis & {\n [_GLOBAL_KEY]?: AsyncLocalStorage<IdentityStore>;\n};\nconst _g = globalThis as _GlobalWithStore;\nconst _storage: AsyncLocalStorage<IdentityStore> =\n _g[_GLOBAL_KEY] ?? (_g[_GLOBAL_KEY] = new AsyncLocalStorage<IdentityStore>());\n\nexport function currentSessionId(): string | undefined {\n return _storage.getStore()?.sessionId;\n}\n\nexport function currentParentSessionId(): string | undefined {\n return _storage.getStore()?.parentSessionId;\n}\n\nexport function currentSessionFeatureName(): string | undefined {\n return _storage.getStore()?.sessionFeatureName;\n}\n\nexport function currentSessionEntryPoint(): string | undefined {\n return _storage.getStore()?.sessionEntryPoint;\n}\n\nexport function currentEndUserId(): string | undefined {\n return _storage.getStore()?.endUserId;\n}\n\nexport function currentEndUserMetadata(): Record<string, any> | undefined {\n return _storage.getStore()?.endUserMetadata;\n}\n\n/**\n * Bind session / end-user identity for the duration of `fn`.\n *\n * Only defined fields are set, so a nested `identify()` overrides one field\n * without clearing the others (it merges onto the enclosing store). The previous\n * store is automatically restored when `fn` returns / rejects. Returns whatever\n * `fn` returns (sync value or Promise).\n *\n * @example\n * ```typescript\n * await neatlogs.identify({ sessionId: 'chat_123' }, async () => {\n * await wrappedClient.chat.completions.create(...);\n * });\n * ```\n */\nexport function identify<T>(opts: IdentifyOptions, fn: () => T): T {\n const prev = _storage.getStore();\n const next: IdentityStore = { ...(prev ?? {}) };\n if (opts.sessionId !== undefined) next.sessionId = opts.sessionId;\n if (opts.parentSessionId !== undefined) next.parentSessionId = opts.parentSessionId;\n if (opts.sessionFeatureName !== undefined) next.sessionFeatureName = opts.sessionFeatureName;\n if (opts.sessionEntryPoint !== undefined) next.sessionEntryPoint = opts.sessionEntryPoint;\n if (opts.endUserId !== undefined) next.endUserId = opts.endUserId;\n if (opts.endUserMetadata !== undefined) next.endUserMetadata = opts.endUserMetadata;\n return _storage.run(next, fn);\n}\n","/**\n * Neatlogs-owned tracing state.\n *\n * Spans are created by the private Neatlogs provider and their parent is carried\n * in a private context key. The process-global OpenTelemetry span is\n * deliberately left untouched so other observability SDKs cannot export or\n * become parents of Neatlogs spans.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n ROOT_CONTEXT,\n INVALID_SPAN_CONTEXT,\n createContextKey,\n trace as otelTrace,\n type Context,\n type Span,\n type SpanOptions,\n type Tracer,\n type TracerProvider,\n} from '@opentelemetry/api';\nimport { getActiveClient } from './active-client.js';\n\n// Carries the trace-ROOT span down the private context so descendants can target\n// it (e.g. setTraceOutput). getActiveNeatlogsSpan() returns the innermost span,\n// which is not the root once nested; this key preserves the root reference.\nconst NEATLOGS_ROOT_SPAN_KEY = createContextKey('neatlogs.root_span');\n\n// Entry points are bundled independently (`neatlogs`, `neatlogs/openai`,\n// `neatlogs/ai`, `neatlogs/mastra`, … each in both CJS and ESM), so every piece\n// of shared tracing state — the private span store AND the resolved provider /\n// provider — must live on `globalThis` behind a `Symbol.for` key.\n// Otherwise `init()` (run from the `neatlogs` bundle) sets `_provider` in ITS\n// module copy while a wrapper imported from `neatlogs/openai` reads a different,\n// still-null copy and silently falls back to the foreign global provider.\nconst PRIVATE_SPAN_STORAGE_KEY = Symbol.for(\n 'neatlogs.private_span_async_local_storage',\n);\nconst PRIVATE_PROVIDER_STATE_KEY = Symbol.for(\n 'neatlogs.private_provider_state',\n);\ninterface PrivateProviderState {\n provider: TracerProvider | null;\n}\ntype NeatlogsGlobal = typeof globalThis & {\n [PRIVATE_SPAN_STORAGE_KEY]?: AsyncLocalStorage<Context>;\n [PRIVATE_PROVIDER_STATE_KEY]?: PrivateProviderState;\n};\nconst neatlogsGlobal = globalThis as NeatlogsGlobal;\n// Stores the full Neatlogs Context (parent span PLUS any threaded values such as\n// trace()'s prompt-template keys), not just the span. We never\n// activate the OTel global context, so this private store is the ONLY channel\n// through which those values propagate down to descendant spans.\nconst privateContextStorage =\n neatlogsGlobal[PRIVATE_SPAN_STORAGE_KEY] ??\n (neatlogsGlobal[PRIVATE_SPAN_STORAGE_KEY] = new AsyncLocalStorage<Context>());\nconst providerState: PrivateProviderState =\n neatlogsGlobal[PRIVATE_PROVIDER_STATE_KEY] ??\n (neatlogsGlobal[PRIVATE_PROVIDER_STATE_KEY] = {\n provider: null,\n });\n// Wrappers may be constructed or accidentally invoked before init(). They must\n// never fall back to a foreign process-global provider, so pre-init calls use a\n// local no-op tracer and safely emit no exported spans.\nconst preInitTracer: Tracer = {\n startSpan(): Span {\n return otelTrace.wrapSpanContext(INVALID_SPAN_CONTEXT);\n },\n startActiveSpan<F extends (span: Span) => unknown>(\n _name: string,\n arg2?: SpanOptions | Context | F,\n arg3?: Context | F,\n arg4?: F,\n ): ReturnType<F> {\n const fn =\n typeof arg2 === 'function'\n ? arg2\n : typeof arg3 === 'function'\n ? arg3\n : arg4;\n return fn!(otelTrace.wrapSpanContext(INVALID_SPAN_CONTEXT)) as ReturnType<F>;\n },\n};\n\n/** @internal Configure the provider used by Neatlogs-created spans. */\nexport function _setNeatlogsProvider(provider: TracerProvider | null): void {\n providerState.provider = provider;\n}\n\n/** Resolve a tracer from the private provider when one is configured. */\nexport function getNeatlogsTracer(name: string): Tracer {\n const client = getActiveClient();\n if (client) return client.getTracer(name);\n return providerState.provider?.getTracer(name) ?? preInitTracer;\n}\n\n/** A reusable tracer facade that resolves the active Client on every call. */\nexport function getRoutingNeatlogsTracer(name: string): Tracer {\n return {\n startSpan(spanName: string, options?: SpanOptions, context?: Context): Span {\n return isolateTracer(getNeatlogsTracer(name)).startSpan(\n spanName,\n options,\n context,\n );\n },\n startActiveSpan: ((...args: any[]) =>\n (isolateTracer(getNeatlogsTracer(name)).startActiveSpan as (...inner: any[]) => any)(\n ...args,\n )) as Tracer['startActiveSpan'],\n };\n}\n\n/**\n * @internal The private Neatlogs provider, or null before\n * init(). Used by integrations that must repoint a self-instrumenting library's\n * captured provider onto ours.\n */\nexport function getNeatlogsProvider(): TracerProvider | null {\n const client = getActiveClient();\n if (client) return client.tracerProvider;\n return providerState.provider;\n}\n\n/** Run a Client callback without inheriting another pipeline's private span. */\nexport function runWithFreshNeatlogsContext<T>(fn: () => T): T {\n return privateContextStorage.run(ROOT_CONTEXT, fn);\n}\n\n/**\n * Wrap a tracer so that spans it creates parent from — and, for\n * `startActiveSpan`, activate on — the PRIVATE Neatlogs context instead of the\n * global one.\n *\n * We hand this to libraries that create their own spans off a tracer we give\n * them (the Vercel AI SDK's `experimental_telemetry.tracer`, which calls\n * `tracer.startActiveSpan()` internally). Without the facade the AI SDK's native\n * spans would parent from `context.active()` — the foreign co-tenant's context —\n * and `startActiveSpan` would push them onto the GLOBAL context, so a foreign\n * tracer's next span reads our native span as its parent. Both directions leak.\n *\n */\nexport function isolateTracer(tracer: Tracer): Tracer {\n const facade: Tracer = {\n startSpan(name: string, options?: SpanOptions, context?: Context): Span {\n const parent = context ?? getNeatlogsActiveContext();\n return tracer.startSpan(name, options, parent);\n },\n startActiveSpan<F extends (span: Span) => unknown>(\n name: string,\n arg2?: SpanOptions | Context | F,\n arg3?: Context | F,\n arg4?: F,\n ): ReturnType<F> {\n // Normalize the 2/3/4-arg overloads of startActiveSpan.\n let options: SpanOptions | undefined;\n let context: Context | undefined;\n let fn: F;\n if (typeof arg2 === 'function') {\n fn = arg2 as F;\n } else if (typeof arg3 === 'function') {\n options = arg2 as SpanOptions;\n fn = arg3 as F;\n } else {\n options = arg2 as SpanOptions;\n context = arg3 as Context;\n fn = arg4 as F;\n }\n const parent = context ?? getNeatlogsActiveContext();\n const span = tracer.startSpan(name, options, parent);\n return withNeatlogsSpan(span, () => fn(span), parent) as ReturnType<F>;\n },\n };\n return facade;\n}\n\n/**\n * The base context to build new Neatlogs spans and values on. NEVER contains a\n * foreign provider's span: it reads our private store, or ROOT_CONTEXT when\n * nothing is active.\n */\nexport function getNeatlogsActiveContext(): Context {\n return privateContextStorage.getStore() ?? ROOT_CONTEXT;\n}\n\n/** Return only the active Neatlogs span (never a foreign provider's span). */\nexport function getActiveNeatlogsSpan(): Span | undefined {\n return otelTrace.getSpan(getNeatlogsActiveContext());\n}\n\n/**\n * Return the trace-ROOT Neatlogs span, or undefined when no trace is active.\n *\n * Unlike {@link getActiveNeatlogsSpan} (innermost), this is the outermost span\n * of the current trace — the one the backend derives trace-level output from\n * (`parent_span_id=''`). It is stashed on the private context the first time a\n * span becomes active, so nested calls still resolve to the root.\n */\nexport function getNeatlogsRootSpan(): Span | undefined {\n return getNeatlogsActiveContext().getValue(NEATLOGS_ROOT_SPAN_KEY) as\n | Span\n | undefined;\n}\n\n/**\n * Build a parent context that cannot contain a foreign provider's span.\n *\n * The active Neatlogs context already carries the parent span AND any values\n * the caller threaded in upstream (e.g. `trace()`'s prompt-template values), so\n * those values reach the span processor via `onStart(parentContext)`. An\n * explicit `baseContext` (a caller's own value-carrying context) is honored as-is.\n */\nexport function getNeatlogsParentContext(baseContext?: Context): Context {\n return baseContext ?? getNeatlogsActiveContext();\n}\n\n/**\n * A base context for callers that thread parent linkage themselves\n * (callback/event handlers that keep their own run-id → span map: LangChain,\n * OpenAI-Agents, Claude Agent SDK).\n *\n * This is the ACTIVE Neatlogs context — the private store's\n * context if a Neatlogs `trace()`/`span()` encloses this call, else\n * ROOT_CONTEXT. So a handler's own root/entry span nests under an enclosing\n * Neatlogs trace (preserving its session + end-user id) when one exists, and\n * auto-roots cleanly when one doesn't. A foreign provider's active span can\n * never leak in as an ancestor because the global context is never read.\n */\nexport function getNeatlogsBaseContext(baseContext?: Context): Context {\n return baseContext ?? getNeatlogsActiveContext();\n}\n\n/**\n * Build an execution context for a Neatlogs span while preserving the active\n * foreign context. The span rides our private context store.\n */\nexport function getNeatlogsExecutionContext(\n span: Span,\n baseContext: Context = ROOT_CONTEXT,\n): Context {\n return otelTrace.setSpan(baseContext, span);\n}\n\n/**\n * Run a callback with a Neatlogs span active under the appropriate policy.\n *\n * The stored context is `setSpan(base, span)` — carrying the span PLUS whatever\n * values `base` holds — so threaded values (prompt templates)\n * propagate to descendant spans through our private store instead of the global\n * OTel context we deliberately never touch.\n */\nexport function withNeatlogsSpan<T>(\n span: Span,\n fn: () => T,\n baseContext?: Context,\n rootSpan?: Span,\n): T {\n const base = baseContext ?? getNeatlogsActiveContext();\n let ctx = otelTrace.setSpan(base, span);\n // The first span activated in a context with no root recorded IS the root of\n // this trace; remember it so descendants (setTraceOutput) can target it.\n if (base.getValue(NEATLOGS_ROOT_SPAN_KEY) === undefined) {\n ctx = ctx.setValue(NEATLOGS_ROOT_SPAN_KEY, rootSpan ?? span);\n }\n return privateContextStorage.run(ctx, fn);\n}\n\n/**\n * @internal Run with a private Neatlogs parent without treating that parent as\n * a locally-recording trace root. This is used for an extracted remote parent:\n * the first local recording span should remain the target for local trace-level\n * output, while still inheriting the remote trace/span IDs.\n */\nexport function withNeatlogsRemoteParent<T>(span: Span, fn: () => T): T {\n return privateContextStorage.run(otelTrace.setSpan(ROOT_CONTEXT, span), fn);\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport type { Tracer, TracerProvider } from '@opentelemetry/api';\n\nexport interface ActiveNeatlogsClient {\n readonly workflowName: string;\n readonly tracerProvider: TracerProvider;\n getTracer(scope: string): Tracer;\n getLogger(): any | null;\n}\n\nconst ACTIVE_CLIENT_STORAGE_KEY = Symbol.for(\n 'neatlogs.active_client_async_local_storage',\n);\ntype NeatlogsGlobal = typeof globalThis & {\n [ACTIVE_CLIENT_STORAGE_KEY]?: AsyncLocalStorage<ActiveNeatlogsClient>;\n};\nconst neatlogsGlobal = globalThis as NeatlogsGlobal;\nconst storage =\n neatlogsGlobal[ACTIVE_CLIENT_STORAGE_KEY] ??\n (neatlogsGlobal[ACTIVE_CLIENT_STORAGE_KEY] =\n new AsyncLocalStorage<ActiveNeatlogsClient>());\n\nexport function getActiveClient(): ActiveNeatlogsClient | undefined {\n return storage.getStore();\n}\n\nexport function runWithClient<T>(\n client: ActiveNeatlogsClient,\n fn: () => T,\n): T {\n return storage.run(client, fn);\n}\n","/**\n * End-user identity.\n *\n * The *end user* is the user of OUR CUSTOMER'S application — the person\n * interacting with the AI product our customer built. This is deliberately\n * distinct from the operator-level `userId` set in {@link init}, which identifies\n * whoever is running the SDK (a developer, a service account, a CI job).\n *\n * Model: **one end-user per trace.** Identity is declared once at a trace\n * boundary — `init()` (process-global default), `trace()` (per-request), or\n * `span()` (per root) — via new options on those existing constructs. There is\n * no separate `identify()` call and no nested per-span override: a trace belongs\n * to a single end-user.\n *\n * End-user identity belongs to the trace as a whole, so the SDK only stamps it\n * on the trace's ROOT span (any span kind, created via `trace()` / `span()`). A\n * non-root child span never carries it. The backend reads end-user from the root\n * span and rolls the value up to the trace (and its session) so\n * filtering/analytics are trace- and session-level, not per-span.\n *\n * Canonical span attributes:\n * `neatlogs.end_user.id` — the end-user identifier (string)\n * `neatlogs.end_user.metadata` — JSON object of arbitrary end-user fields\n */\n\nimport { type Span } from '@opentelemetry/api';\nimport { getLogger } from './logger.js';\nimport { currentEndUserId, currentEndUserMetadata } from './identity.js';\nimport { getActiveNeatlogsSpan } from './provider.js';\n\nconst logger = getLogger();\n\nexport const END_USER_ID_KEY = 'neatlogs.end_user.id';\nexport const END_USER_METADATA_KEY = 'neatlogs.end_user.metadata';\n\n/** Coerce end-user metadata to a JSON string. Returns undefined when empty. */\nexport function normalizeEndUserMetadata(\n metadata: string | Record<string, any> | undefined | null,\n): string | undefined {\n if (metadata === undefined || metadata === null) return undefined;\n if (typeof metadata === 'string') return metadata || undefined;\n try {\n return JSON.stringify(metadata);\n } catch {\n return JSON.stringify(String(metadata));\n }\n}\n\n/**\n * True when no recording span is currently active — i.e. a span created now\n * would be the trace root.\n */\nexport function isRootSpan(): boolean {\n // Resolve from the private span store in isolated mode (a foreign provider's\n // active span must not count as our parent), else the active OTel span.\n const current = getActiveNeatlogsSpan();\n return !(current && current.isRecording());\n}\n\n/**\n * Stamp end-user id/metadata onto a ROOT span (best-effort). When `isRoot` is\n * false the span is a child and the value is ignored — the backend reads\n * end-user from the root span and rolls it up to the trace and session.\n */\nexport function applyEndUserAttributes(\n span: Span,\n endUserId?: string,\n endUserMetadata?: string | Record<string, any> | null,\n isRoot = true,\n): void {\n // Resolution at the root (per field): explicit per-call arg wins, else the\n // identify() context (request-scoped). Non-root spans never carry identity.\n const resolvedId = isRoot ? (endUserId ?? currentEndUserId()) : endUserId;\n const resolvedMeta = isRoot\n ? (endUserMetadata ?? currentEndUserMetadata())\n : endUserMetadata;\n if (!resolvedId && !resolvedMeta) return;\n if (!isRoot) {\n logger.debug(\n '[end_user] Ignoring endUserId/endUserMetadata on a non-root span — ' +\n 'declare it on the trace root (top-level trace()/span()) or identify().',\n );\n return;\n }\n if (resolvedId) {\n span.setAttribute(END_USER_ID_KEY, String(resolvedId));\n }\n const metaJson = normalizeEndUserMetadata(resolvedMeta);\n if (metaJson) {\n span.setAttribute(END_USER_METADATA_KEY, metaJson);\n }\n}\n","/**\n * Session identity.\n *\n * A *session* is one conversation / thread / journey — it groups the multiple\n * traces of a multi-turn interaction (one turn = one trace). Identity is\n * declared once at a trace boundary — `init()` (process-global default),\n * `trace()` (per-turn), or `span()` (per root) — via the `sessionId` option on\n * those existing constructs. The SDK stamps only the trace's ROOT span; the\n * backend rolls the value up to group the traces of a session together.\n *\n * For single-turn workflows a session maps 1:1 to a trace: when no session is\n * declared the backend backfills `session_id = trace_id`.\n *\n * Canonical span attribute:\n * `neatlogs.session.id` — the session identifier (string)\n */\n\nimport { type Span } from '@opentelemetry/api';\nimport { getLogger } from './logger.js';\nimport {\n currentParentSessionId,\n currentSessionEntryPoint,\n currentSessionFeatureName,\n currentSessionId,\n} from './identity.js';\n\nconst logger = getLogger();\n\nexport const SESSION_ID_KEY = 'neatlogs.session.id';\nexport const PARENT_SESSION_ID_KEY = 'neatlogs.session.parent_id';\nexport const SESSION_FEATURE_NAME_KEY = 'neatlogs.session.feature.name';\nexport const SESSION_ENTRY_POINT_KEY = 'neatlogs.session.entry_point';\n\nexport interface SessionAttributeOptions {\n parentSessionId?: string;\n sessionFeatureName?: string;\n sessionEntryPoint?: string;\n}\n\nfunction cleanOptionalString(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const cleaned = value.trim();\n return cleaned || undefined;\n}\n\nfunction setAttributeFailOpen(span: Span, key: string, value: string): void {\n try {\n span.setAttribute(key, value);\n } catch (error) {\n logger.debug(`[session] Failed to set ${key}: ${error}`);\n }\n}\n\n/**\n * Stamp the session id onto a ROOT span (best-effort). When `isRoot` is false\n * the span is a child and the value is ignored — the backend reads session from\n * the root span and groups traces by it.\n */\nexport function applySessionAttributes(\n span: Span,\n sessionId?: string,\n isRoot = true,\n options: SessionAttributeOptions = {},\n): void {\n // Resolution at the root: explicit per-call arg wins, else the identify()\n // context (request-scoped). Non-root spans never carry session identity.\n if (!isRoot) {\n if (\n sessionId ||\n options.parentSessionId ||\n options.sessionFeatureName ||\n options.sessionEntryPoint\n ) {\n logger.debug(\n '[session] Ignoring session attributes on a non-root span — declare them on the ' +\n 'trace root (top-level trace()/span()) or identify().',\n );\n }\n return;\n }\n\n const resolvedSessionId = sessionId ?? currentSessionId();\n if (resolvedSessionId) {\n try {\n span.setAttribute(SESSION_ID_KEY, String(resolvedSessionId));\n } catch (error) {\n logger.debug(`[session] Failed to set ${SESSION_ID_KEY}: ${error}`);\n }\n }\n\n const parentSessionId = cleanOptionalString(\n options.parentSessionId ?? currentParentSessionId(),\n );\n const comparableSessionId = cleanOptionalString(resolvedSessionId);\n if (parentSessionId && parentSessionId !== comparableSessionId) {\n setAttributeFailOpen(span, PARENT_SESSION_ID_KEY, parentSessionId);\n }\n\n const sessionFeatureName = cleanOptionalString(\n options.sessionFeatureName ?? currentSessionFeatureName(),\n );\n if (sessionFeatureName) {\n setAttributeFailOpen(span, SESSION_FEATURE_NAME_KEY, sessionFeatureName);\n }\n\n const sessionEntryPoint = cleanOptionalString(\n options.sessionEntryPoint ?? currentSessionEntryPoint(),\n );\n if (sessionEntryPoint) {\n setAttributeFailOpen(span, SESSION_ENTRY_POINT_KEY, sessionEntryPoint);\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { getActiveClient } from \"./active-client.js\";\nimport type { DeliveryDiagnostics } from \"./delivery-diagnostics.js\";\nimport {\n assertReadyUploadReceipt,\n DEFAULT_MAX_TYPED_MEDIA_BYTES,\n isSupportedTypedMediaMimeType,\n TelemetryUploadError,\n type UploadAuthority,\n type UploadPayload,\n} from \"./upload-authority.js\";\n\nexport type MediaRecord = Record<string, string | number>;\n\nexport const DEFAULT_INLINE_MEDIA_BYTES = 100_000;\nexport const DEFAULT_MAX_PENDING_MEDIA_ITEMS = 32;\nexport const DEFAULT_MEDIA_EXPORT_DEADLINE_MS = 15_000;\nconst MAX_MEDIA_TRAVERSAL_DEPTH = 32;\nconst MAX_MEDIA_TRAVERSAL_NODES = 4_096;\nconst MAX_MEDIA_REPLACEMENT_KEY_CHARS = 1024 * 1024;\nconst MAX_MEDIA_REFERENCE_CHARS = 8_192;\nconst MAX_CAPTURED_MEDIA_REFERENCES = 64;\nconst MAX_ENCODED_MEDIA_CHARS = Math.ceil((DEFAULT_MAX_TYPED_MEDIA_BYTES * 4) / 3) + 8;\nconst REDACTED_MEDIA_STRUCTURE = \"[REDACTED_MEDIA_STRUCTURE]\";\nconst MEDIA_PAYLOAD_SIGNAL =\n /(?:data\\s*:|\"(?:image_url|input_audio|inline_data|inlineData|file_data|fileData|file_url|file_uri|fileUri|b64_json|mime_type|mimeType|media_type|mediaType)\"\\s*:|\"type\"\\s*:\\s*\"(?:image|audio|video|document|file|input_file|image_generation_call)\")/i;\n\ninterface DiscoveredMedia {\n record: MediaRecord;\n original?: string;\n binaryOriginal?: Uint8Array;\n bytes?: Uint8Array;\n}\n\ninterface MediaDiscoveryResult {\n items: DiscoveredMedia[];\n truncated: boolean;\n}\n\ninterface PendingMedia {\n bytes: Uint8Array;\n prefixes: string[];\n record: MediaRecord;\n token: string;\n sha256: string;\n byteLength: number;\n mimeType: string;\n}\n\ninterface PendingMediaAccount {\n bytes: number;\n items: number;\n released: boolean;\n owner: PendingMediaOwnerState;\n span: WeakRef<object>;\n}\n\ninterface PendingMediaBucket {\n items: PendingMedia[];\n account: PendingMediaAccount;\n unregisterToken: object;\n}\ninterface PendingMediaOwnerState {\n bytes: number;\n items: number;\n accounts: Set<PendingMediaAccount>;\n}\n\ninterface MediaRuntimeState {\n pendingBySpan: WeakMap<object, PendingMediaBucket>;\n pendingMediaOwners: WeakMap<object, PendingMediaOwnerState>;\n mediaCaptureAvailability: WeakMap<object, { available: boolean; reason: string }>;\n mediaCaptureOwners: WeakMap<object, object>;\n spanAliases: WeakMap<object, object>;\n defaultPendingMediaOwner: object;\n}\n\nconst MEDIA_RUNTIME_KEY = Symbol.for(\"neatlogs.media-runtime.v1\");\nconst runtimeGlobal = globalThis as typeof globalThis & Record<symbol, unknown>;\nconst mediaRuntime =\n (runtimeGlobal[MEDIA_RUNTIME_KEY] as MediaRuntimeState | undefined) ??\n ({\n pendingBySpan: new WeakMap(),\n pendingMediaOwners: new WeakMap(),\n mediaCaptureAvailability: new WeakMap(),\n mediaCaptureOwners: new WeakMap(),\n spanAliases: new WeakMap(),\n defaultPendingMediaOwner: {},\n } satisfies MediaRuntimeState);\nruntimeGlobal[MEDIA_RUNTIME_KEY] = mediaRuntime;\n\nconst {\n pendingBySpan,\n pendingMediaOwners,\n mediaCaptureAvailability,\n mediaCaptureOwners,\n spanAliases,\n defaultPendingMediaOwner,\n} = mediaRuntime;\n\nfunction canonicalSpan(span: object): object {\n return spanAliases.get(span) ?? span;\n}\n\n/** Make a transparent span facade share media state with its SDK span. */\nexport function aliasMediaCaptureSpan(alias: object, target: object): void {\n spanAliases.set(alias, canonicalSpan(target));\n}\n\n/** Bind a recording SDK span to the upload gate selected by its pipeline. */\nexport function setMediaCaptureAvailability(\n span: object,\n available: boolean,\n reason = \"telemetry_uploads_disabled\",\n owner?: object,\n): void {\n const target = canonicalSpan(span);\n mediaCaptureAvailability.set(target, {\n available,\n reason: safeUnavailableReason(reason),\n });\n if (owner) mediaCaptureOwners.set(target, owner);\n}\n\nfunction pendingOwnerState(owner: object): PendingMediaOwnerState {\n const prior = pendingMediaOwners.get(owner);\n if (prior) return prior;\n const state = {\n bytes: 0,\n items: 0,\n accounts: new Set<PendingMediaAccount>(),\n };\n pendingMediaOwners.set(owner, state);\n return state;\n}\n\nfunction releasePendingAccount(account: PendingMediaAccount): void {\n if (account.released) return;\n account.released = true;\n account.owner.bytes = Math.max(0, account.owner.bytes - account.bytes);\n account.owner.items = Math.max(0, account.owner.items - account.items);\n account.owner.accounts.delete(account);\n}\n\nconst pendingFinalizer =\n typeof FinalizationRegistry === \"undefined\"\n ? undefined\n : new FinalizationRegistry<PendingMediaAccount>(releasePendingAccount);\n\nfunction pendingBucket(span: object): PendingMediaBucket {\n span = canonicalSpan(span);\n const prior = pendingBySpan.get(span);\n if (prior) return prior;\n const owner = pendingOwnerState(\n mediaCaptureOwners.get(span) ?? getActiveClient() ?? defaultPendingMediaOwner,\n );\n const account: PendingMediaAccount = {\n bytes: 0,\n items: 0,\n released: false,\n owner,\n span: new WeakRef(span),\n };\n const unregisterToken = {};\n const bucket = { items: [], account, unregisterToken };\n owner.accounts.add(account);\n pendingBySpan.set(span, bucket);\n pendingFinalizer?.register(span, account, unregisterToken);\n return bucket;\n}\n\nfunction detachPendingBucket(span: object): PendingMediaBucket | undefined {\n const alias = span;\n span = canonicalSpan(alias);\n spanAliases.delete(alias);\n const bucket = pendingBySpan.get(span);\n if (!bucket) return undefined;\n pendingBySpan.delete(span);\n mediaCaptureAvailability.delete(span);\n mediaCaptureOwners.delete(span);\n pendingFinalizer?.unregister(bucket.unregisterToken);\n return bucket;\n}\n\nfunction uploadToken(record: MediaRecord): string {\n const material = `${record.sha256}:${record.mime_type}:${record.purpose}`;\n return `nl_pending_media_${createHash(\"sha256\").update(material).digest(\"hex\").slice(0, 24)}`;\n}\n\nfunction mediaKind(mimeType: string, declared = \"\"): string {\n const value = declared\n .toLowerCase()\n .replace(/^(?:input|output)_/, \"\")\n .replace(/_url$/, \"\");\n if (value === \"image_generation_call\") return \"image\";\n if (value === \"file\") return \"document\";\n if ([\"image\", \"audio\", \"video\", \"document\"].includes(value)) return value;\n if (mimeType.startsWith(\"image/\")) return \"image\";\n if (mimeType.startsWith(\"audio/\")) return \"audio\";\n if (mimeType.startsWith(\"video/\")) return \"video\";\n if (mimeType === \"application/pdf\" || mimeType.startsWith(\"text/\")) {\n return \"document\";\n }\n return \"media\";\n}\n\nfunction declaredMediaKind(value: string): string {\n const normalized = mediaKind(\"\", value);\n return normalized === \"media\" ? \"\" : normalized;\n}\n\nfunction canonicalMimeType(value: string): string {\n const mimeType = value.trim().split(\";\", 1)[0]?.toLowerCase() ?? \"\";\n return mimeType === \"image/jpg\"\n ? \"image/jpeg\"\n : mimeType === \"audio/mp3\"\n ? \"audio/mpeg\"\n : mimeType;\n}\n\ninterface DecodedBase64 {\n bytes?: Uint8Array;\n byteLength: number;\n sha256: string;\n}\n\nfunction rejectedMediaRecord(\n original: string,\n mimeType: string,\n declared: string,\n purpose: string,\n reason: string,\n source: \"inline\" | \"url\",\n): DiscoveredMedia {\n const fingerprint = createHash(\"sha256\")\n .update(original.slice(0, 4096))\n .update(String(original.length))\n .digest(\"hex\");\n return {\n original,\n record: {\n id: `nl_media_rejected_${fingerprint.slice(0, 24)}`,\n type: mediaKind(mimeType, declared),\n source,\n mime_type: mimeType || \"application/octet-stream\",\n purpose,\n state: \"failed\",\n safe_preview: `upload failed: validate/${reason}`,\n },\n };\n}\n\nfunction decodeBase64(value: string, retainBytes = true): DecodedBase64 | null {\n const normalized = value.replace(/\\s+/g, \"\");\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(normalized) || normalized.length % 4 === 1) {\n return null;\n }\n try {\n const padding = normalized.endsWith(\"==\") ? 2 : normalized.endsWith(\"=\") ? 1 : 0;\n const estimatedBytes = Math.floor((normalized.length * 3) / 4) - padding;\n if (retainBytes && estimatedBytes <= DEFAULT_MAX_TYPED_MEDIA_BYTES) {\n const bytes = Buffer.from(normalized, \"base64\");\n if (bytes.toString(\"base64\").replace(/=+$/, \"\") !== normalized.replace(/=+$/, \"\")) {\n return null;\n }\n return {\n bytes,\n byteLength: bytes.byteLength,\n sha256: createHash(\"sha256\").update(bytes).digest(\"hex\"),\n };\n }\n const digest = createHash(\"sha256\");\n let byteLength = 0;\n const chunkCharacters = 64 * 1024;\n for (let offset = 0; offset < normalized.length; offset += chunkCharacters) {\n const chunk = Buffer.from(normalized.slice(offset, offset + chunkCharacters), \"base64\");\n digest.update(chunk);\n byteLength += chunk.byteLength;\n }\n if (byteLength !== estimatedBytes) return null;\n return { byteLength, sha256: digest.digest(\"hex\") };\n } catch {\n return null;\n }\n}\n\nfunction inlineRecord(\n input: string | Uint8Array,\n mimeType: string,\n declared: string,\n purpose: string,\n retainBytes = true,\n): DiscoveredMedia | null {\n mimeType = canonicalMimeType(mimeType);\n let original: string | undefined;\n let binaryOriginal: Uint8Array | undefined;\n let bytes: Uint8Array | undefined;\n let byteLength: number;\n let sha256: string;\n if (typeof input === \"string\") {\n original = input;\n let encoded = input.trim();\n if (/^data:/i.test(encoded)) {\n const comma = encoded.indexOf(\",\");\n if (comma < 0) return null;\n const header = encoded.slice(5, comma);\n if (!header.toLowerCase().split(\";\").includes(\"base64\")) return null;\n mimeType = canonicalMimeType(header.split(\";\", 1)[0] || mimeType);\n encoded = encoded.slice(comma + 1);\n }\n if (encoded.length > MAX_ENCODED_MEDIA_CHARS) {\n return rejectedMediaRecord(\n original,\n mimeType,\n declared,\n purpose,\n \"payload_too_large\",\n \"inline\",\n );\n }\n const decoded = decodeBase64(encoded, retainBytes);\n if (!decoded) {\n return rejectedMediaRecord(\n original,\n mimeType,\n declared,\n purpose,\n \"invalid_inline_media\",\n \"inline\",\n );\n }\n bytes = decoded.bytes;\n byteLength = decoded.byteLength;\n sha256 = decoded.sha256;\n } else {\n binaryOriginal = input;\n byteLength = input.byteLength;\n sha256 = createHash(\"sha256\").update(input).digest(\"hex\");\n if (retainBytes && byteLength <= DEFAULT_MAX_TYPED_MEDIA_BYTES) {\n bytes = Uint8Array.from(input);\n }\n }\n const eligible =\n byteLength > DEFAULT_INLINE_MEDIA_BYTES && byteLength <= DEFAULT_MAX_TYPED_MEDIA_BYTES;\n const tooLarge = byteLength > DEFAULT_MAX_TYPED_MEDIA_BYTES;\n return {\n original,\n binaryOriginal,\n bytes,\n record: {\n id: `nl_media_${sha256.slice(0, 24)}`,\n type: mediaKind(mimeType, declared),\n source: \"inline\",\n mime_type: mimeType || \"application/octet-stream\",\n byte_length: byteLength,\n sha256,\n purpose,\n state: tooLarge ? \"failed\" : eligible ? \"pending-upload\" : \"inline\",\n ...(tooLarge\n ? { safe_preview: \"upload failed: validate/payload_too_large\" }\n : eligible\n ? { safe_preview: \"awaiting authenticated upload\" }\n : {}),\n },\n };\n}\n\nfunction referenceRecord(\n reference: string,\n mimeType: string,\n declared: string,\n purpose: string,\n): DiscoveredMedia | null {\n mimeType = canonicalMimeType(mimeType);\n if (reference.length > MAX_MEDIA_REFERENCE_CHARS) {\n return rejectedMediaRecord(\n reference,\n mimeType,\n declared,\n purpose,\n \"media_reference_too_large\",\n \"url\",\n );\n }\n let safeReference = reference;\n let isURLReference = false;\n const normalizedReference = reference.trim();\n const protocolRelative = normalizedReference.startsWith(\"//\");\n const relativeReference =\n !protocolRelative &&\n !/^[a-z][a-z\\d+.-]*:/i.test(normalizedReference) &&\n (normalizedReference.includes(\"/\") ||\n normalizedReference.includes(\"?\") ||\n normalizedReference.includes(\"#\"));\n try {\n const parsed = protocolRelative || relativeReference\n ? new URL(normalizedReference, \"https://neatlogs.invalid\")\n : new URL(normalizedReference);\n if (parsed.protocol.toLowerCase() === \"data:\") {\n return rejectedMediaRecord(\n reference,\n mimeType,\n declared,\n purpose,\n \"invalid_inline_media\",\n \"inline\",\n );\n }\n const hierarchical =\n protocolRelative ||\n relativeReference ||\n parsed.protocol === \"http:\" ||\n parsed.protocol === \"https:\" ||\n /^[a-z][a-z\\d+.-]*:\\/\\//i.test(normalizedReference) ||\n parsed.pathname.startsWith(\"/\");\n if (hierarchical) {\n isURLReference = true;\n parsed.username = \"\";\n parsed.password = \"\";\n parsed.search = \"\";\n parsed.hash = \"\";\n safeReference = protocolRelative\n ? `//${parsed.host}${parsed.pathname}`\n : relativeReference\n ? parsed.pathname\n : parsed.toString();\n } else if (parsed.protocol) {\n isURLReference = true;\n safeReference = parsed.protocol;\n }\n } catch {\n if (/^(?:\\/\\/|[a-z][a-z\\d+.-]*:)/i.test(normalizedReference)) {\n return rejectedMediaRecord(\n reference,\n mimeType,\n declared,\n purpose,\n \"invalid_media_reference\",\n \"url\",\n );\n }\n }\n const digest = createHash(\"sha256\").update(reference).digest(\"hex\");\n return {\n original: reference,\n record: {\n id: `nl_media_${digest.slice(0, 24)}`,\n type: mediaKind(mimeType, declared),\n source: isURLReference ? \"url\" : \"provider\",\n mime_type: mimeType || \"application/octet-stream\",\n reference: safeReference,\n purpose,\n state: \"available\",\n },\n };\n}\n\nfunction discoverMedia(\n value: unknown,\n purpose: string,\n retainBytes = true,\n): MediaDiscoveryResult {\n const found: DiscoveredMedia[] = [];\n const discoveredKeys = new Set<string>();\n let retainedBytes = 0;\n let truncated = false;\n const append = (item: DiscoveredMedia | null): void => {\n if (!item) return;\n if (found.length >= MAX_CAPTURED_MEDIA_REFERENCES) {\n truncated = true;\n return;\n }\n const key = `${item.record.id}:${item.record.mime_type}:${item.record.reference ?? \"\"}:${item.record.type}`;\n if (discoveredKeys.has(key)) return;\n discoveredKeys.add(key);\n if (item.bytes && item.record.state === \"pending-upload\") {\n if (retainedBytes + item.bytes.byteLength > DEFAULT_MAX_TYPED_MEDIA_BYTES) {\n item.bytes = undefined;\n item.record.state = \"failed\";\n item.record.safe_preview = \"upload failed: validate/pending_media_memory_limit\";\n } else {\n retainedBytes += item.bytes.byteLength;\n }\n }\n found.push(item);\n };\n const visited = new WeakSet<object>();\n let visitedNodes = 0;\n const visit = (node: any, inheritedDeclared = \"\", inheritedMimeType = \"\", depth = 0): void => {\n if (typeof node === \"string\" && /^\\s*data:/i.test(node)) {\n append(inlineRecord(node, inheritedMimeType, inheritedDeclared, purpose, retainBytes));\n return;\n }\n if (!node || typeof node !== \"object\") return;\n if (found.length >= MAX_CAPTURED_MEDIA_REFERENCES) {\n truncated = true;\n return;\n }\n if (depth > MAX_MEDIA_TRAVERSAL_DEPTH || visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n return;\n }\n if (visited.has(node)) return;\n visited.add(node);\n visitedNodes += 1;\n try {\n if (node instanceof Uint8Array) return;\n if (Array.isArray(node)) {\n for (const item of node) {\n if (visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) break;\n if (inheritedDeclared && (typeof item === \"string\" || item instanceof Uint8Array)) {\n const record =\n typeof item === \"string\" && /^(?:https?:|s3:|gs:|\\/\\/)/i.test(item)\n ? referenceRecord(item, inheritedMimeType, inheritedDeclared, purpose)\n : inlineRecord(item, inheritedMimeType, inheritedDeclared, purpose, retainBytes);\n append(record);\n } else {\n visit(item, inheritedDeclared, inheritedMimeType, depth + 1);\n }\n }\n return;\n }\n const entries: [string, unknown][] = Object.entries(node);\n const read = (key: string): unknown => entries.find(([name]) => name === key)?.[1];\n const declared = String(read(\"type\") ?? inheritedDeclared);\n const normalizedDeclared = declaredMediaKind(declared);\n const mediaDeclared = normalizedDeclared || declaredMediaKind(inheritedDeclared);\n let mimeType = canonicalMimeType(\n String(\n read(\"mime_type\") ??\n read(\"mimeType\") ??\n read(\"media_type\") ??\n read(\"mediaType\") ??\n inheritedMimeType,\n ),\n );\n const declaredFormat = read(\"format\") ?? read(\"output_format\") ?? read(\"outputFormat\");\n if (!mimeType && mediaDeclared && typeof declaredFormat === \"string\") {\n const format = declaredFormat.toLowerCase();\n mimeType = canonicalMimeType(\n mediaDeclared === \"document\" && format === \"pdf\"\n ? \"application/pdf\"\n : `${mediaDeclared}/${format}`,\n );\n }\n const imageUrl = read(\"image_url\");\n let image = imageUrl;\n if (imageUrl && typeof imageUrl === \"object\") {\n try {\n image = (imageUrl as Record<string, unknown>).url;\n } catch {\n image = undefined;\n }\n }\n if (typeof image === \"string\") {\n const record = /^\\s*data:/i.test(image)\n ? inlineRecord(image, mimeType, \"image\", purpose, retainBytes)\n : referenceRecord(image, mimeType, \"image\", purpose);\n append(record);\n }\n const audio = read(\"input_audio\") ?? read(\"inputAudio\");\n if (audio && typeof audio === \"object\" && typeof (audio as any).data === \"string\") {\n const format = String((audio as any).format ?? \"unknown\");\n const record = inlineRecord(\n (audio as any).data,\n mimeType || `audio/${format}`,\n \"audio\",\n purpose,\n retainBytes,\n );\n append(record);\n }\n const inline = read(\"inline_data\") ?? read(\"inlineData\");\n if (inline && typeof inline === \"object\" && typeof (inline as any).data === \"string\") {\n const record = inlineRecord(\n (inline as any).data,\n String((inline as any).mime_type ?? (inline as any).mimeType ?? mimeType),\n mediaDeclared,\n purpose,\n retainBytes,\n );\n append(record);\n }\n const fileData = read(\"file_data\") ?? read(\"fileData\");\n if (typeof fileData === \"string\") {\n const record = inlineRecord(\n fileData,\n mimeType,\n mediaDeclared || \"document\",\n purpose,\n retainBytes,\n );\n append(record);\n }\n const raw =\n read(\"data\") ??\n read(\"bytes\") ??\n read(\"b64_json\") ??\n (normalizedDeclared === \"image\" ? read(\"result\") : undefined);\n if ((typeof raw === \"string\" || raw instanceof Uint8Array) && (mediaDeclared || mimeType)) {\n const record = inlineRecord(raw, mimeType, mediaDeclared, purpose, retainBytes);\n append(record);\n }\n const reference =\n read(\"file_id\") ?? read(\"file_url\") ?? read(\"file_uri\") ?? read(\"fileUri\") ?? read(\"url\");\n if (\n typeof reference === \"string\" &&\n ([\"file\", \"url\"].includes(normalizedDeclared) || !!mediaDeclared || !!mimeType)\n ) {\n const record = /^\\s*data:/i.test(reference)\n ? inlineRecord(reference, mimeType, mediaDeclared || \"document\", purpose, retainBytes)\n : referenceRecord(reference, mimeType, mediaDeclared || \"document\", purpose);\n append(record);\n }\n for (const [key, item] of entries) {\n if (visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) break;\n const keyed = key\n .toLowerCase()\n .replace(/^input_/, \"\")\n .replace(/s$/, \"\");\n const childDeclared = declaredMediaKind(keyed) || mediaDeclared;\n let childMimeType = mimeType;\n if (!childMimeType && childDeclared && typeof declaredFormat === \"string\") {\n const format = declaredFormat.toLowerCase();\n childMimeType = canonicalMimeType(\n childDeclared === \"document\" && format === \"pdf\"\n ? \"application/pdf\"\n : `${childDeclared}/${format}`,\n );\n }\n visit(item, childDeclared, childMimeType, depth + 1);\n }\n } catch {\n return;\n }\n };\n visit(value);\n return { items: found, truncated };\n}\n\nfunction placeholder(record: MediaRecord): Record<string, unknown> {\n return {\n neatlogs_media: Object.fromEntries(\n Object.entries(record).filter(([key]) =>\n [\n \"id\",\n \"type\",\n \"source\",\n \"mime_type\",\n \"byte_length\",\n \"sha256\",\n \"purpose\",\n \"state\",\n \"reference\",\n \"content_encoding\",\n \"safe_preview\",\n \"upload_token\",\n ].includes(key),\n ),\n ),\n };\n}\n\nfunction sanitizedCopy(value: unknown, discovered: DiscoveredMedia[]): unknown {\n const replacements = new Map<string, unknown>();\n const largeReplacements: Array<[string, unknown]> = [];\n for (const item of discovered) {\n if (!item.original) continue;\n if (item.record.state === \"pending-upload\" || item.record.state === \"failed\") {\n const replacement = placeholder(item.record);\n if (item.original.length > MAX_MEDIA_REPLACEMENT_KEY_CHARS) {\n largeReplacements.push([item.original, replacement]);\n } else {\n replacements.set(item.original, replacement);\n }\n } else if (typeof item.record.reference === \"string\") {\n if (item.original.length > MAX_MEDIA_REPLACEMENT_KEY_CHARS) {\n largeReplacements.push([item.original, item.record.reference]);\n } else {\n replacements.set(item.original, item.record.reference);\n }\n }\n }\n const visited = new WeakMap<object, unknown>();\n let visitedNodes = 0;\n const clone = (node: any, depth = 0): any => {\n if (typeof node === \"string\") {\n const direct =\n node.length <= MAX_MEDIA_REPLACEMENT_KEY_CHARS ? replacements.get(node) : undefined;\n if (direct !== undefined) return direct;\n return largeReplacements.find(([original]) => original === node)?.[1] ?? node;\n }\n if (node instanceof Uint8Array) {\n const match = discovered.find(\n (item) =>\n item.binaryOriginal === node ||\n (item.bytes?.buffer === node.buffer && item.bytes.byteOffset === node.byteOffset),\n );\n return match && [\"pending-upload\", \"failed\"].includes(String(match.record.state))\n ? placeholder(match.record)\n : node;\n }\n if (!node || typeof node !== \"object\") return node;\n if (depth > MAX_MEDIA_TRAVERSAL_DEPTH || visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n return REDACTED_MEDIA_STRUCTURE;\n }\n const prior = visited.get(node);\n if (prior) return \"[CIRCULAR]\";\n visitedNodes += 1;\n if (Array.isArray(node)) {\n const result: unknown[] = [];\n visited.set(node, result);\n for (const item of node) {\n if (visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n result.push(REDACTED_MEDIA_STRUCTURE);\n break;\n }\n result.push(clone(item, depth + 1));\n }\n return result;\n }\n const result: Record<string, unknown> = {};\n visited.set(node, result);\n try {\n for (const [key, item] of Object.entries(node)) {\n if (visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n result.neatlogs_truncated = REDACTED_MEDIA_STRUCTURE;\n break;\n }\n result[key] = clone(item, depth + 1);\n }\n } catch {\n return REDACTED_MEDIA_STRUCTURE;\n }\n return result;\n };\n return clone(value);\n}\n\nexport function mediaReferences(value: unknown, purpose: string): MediaRecord[] {\n return discoverMedia(value, purpose, false).items.map(({ record }) =>\n record.state === \"pending-upload\"\n ? {\n ...record,\n state: \"failed\",\n safe_preview: \"upload unavailable: telemetry_uploads_disabled\",\n }\n : { ...record },\n );\n}\n\n/** Remove large inline bytes and URL credentials from a captured value. */\nexport function sanitizeMediaPayload(value: unknown, purpose = \"capture\"): unknown {\n try {\n const discovered = discoverMedia(value, purpose, false);\n return discovered.truncated\n ? REDACTED_MEDIA_STRUCTURE\n : sanitizedCopy(value, discovered.items);\n } catch {\n return REDACTED_MEDIA_STRUCTURE;\n }\n}\n\nexport interface CapturedMediaValue {\n value: unknown;\n count: number;\n}\n\n/** Capture typed media metadata from a stable index and return a telemetry-safe clone. */\nexport function captureMediaWithIndex(\n span: {\n setAttribute(name: string, value: string | number): unknown;\n isRecording?(): boolean;\n },\n prefix: string,\n value: unknown,\n purpose: string,\n mediaIndexOffset = 0,\n): CapturedMediaValue {\n let recording = false;\n try {\n recording = typeof span.isRecording !== \"function\" || span.isRecording();\n } catch {\n span.setAttribute(`${prefix}.media.capture_error`, \"media_capture_failed\");\n return { value: REDACTED_MEDIA_STRUCTURE, count: 0 };\n }\n const spanKey = canonicalSpan(span as object);\n const gate = mediaCaptureAvailability.get(spanKey);\n const uploadsAvailable = gate?.available ?? true;\n let discovery: MediaDiscoveryResult;\n try {\n discovery = discoverMedia(value, purpose, recording && uploadsAvailable);\n } catch {\n span.setAttribute(`${prefix}.media.capture_error`, \"media_capture_failed\");\n return { value: REDACTED_MEDIA_STRUCTURE, count: 0 };\n }\n discovery.items.forEach((item, index) => {\n const recordPrefix = `${prefix}.media.${mediaIndexOffset + index}`;\n if (item.record.state === \"pending-upload\") {\n if (!recording) {\n item.bytes = undefined;\n item.record.state = \"failed\";\n item.record.safe_preview = \"upload unavailable: span_not_recording\";\n } else if (!uploadsAvailable) {\n item.bytes = undefined;\n item.record.state = \"failed\";\n item.record.safe_preview = `upload unavailable: ${gate?.reason ?? \"telemetry_uploads_disabled\"}`;\n } else if (!item.bytes) {\n item.record.state = \"failed\";\n item.record.safe_preview = \"upload failed: validate/staged_payload_missing\";\n } else {\n const token = uploadToken(item.record);\n item.record.upload_token = token;\n const bucket = pendingBucket(spanKey);\n const duplicate = bucket.items.find(\n (candidate) =>\n candidate.sha256 === item.record.sha256 && candidate.mimeType === item.record.mime_type,\n );\n if (duplicate) {\n if (!duplicate.prefixes.includes(recordPrefix)) {\n duplicate.prefixes.push(recordPrefix);\n }\n } else if (bucket.account.owner.items >= DEFAULT_MAX_PENDING_MEDIA_ITEMS) {\n item.bytes = undefined;\n delete item.record.upload_token;\n item.record.state = \"failed\";\n item.record.safe_preview = \"upload failed: validate/pending_media_item_limit\";\n } else if (\n bucket.account.owner.bytes + item.bytes.byteLength >\n DEFAULT_MAX_TYPED_MEDIA_BYTES\n ) {\n item.bytes = undefined;\n delete item.record.upload_token;\n item.record.state = \"failed\";\n item.record.safe_preview = \"upload failed: validate/pending_media_memory_limit\";\n } else {\n bucket.account.owner.bytes += item.bytes.byteLength;\n bucket.account.owner.items += 1;\n bucket.account.bytes += item.bytes.byteLength;\n bucket.account.items += 1;\n bucket.items.push({\n bytes: item.bytes,\n prefixes: [recordPrefix],\n record: { ...item.record },\n token,\n sha256: String(item.record.sha256),\n byteLength: Number(item.record.byte_length),\n mimeType: String(item.record.mime_type),\n });\n }\n if (bucket.items.length === 0) {\n pendingBySpan.delete(span as object);\n pendingFinalizer?.unregister(bucket.unregisterToken);\n releasePendingAccount(bucket.account);\n }\n }\n }\n Object.entries(item.record).forEach(([key, field]) =>\n span.setAttribute(`${recordPrefix}.${key}`, field),\n );\n });\n return {\n value: discovery.truncated\n ? REDACTED_MEDIA_STRUCTURE\n : sanitizedCopy(value, discovery.items),\n count: discovery.items.length,\n };\n}\n\n/** Capture typed media metadata and return a telemetry-safe clone of the value. */\nexport function captureMedia(\n span: {\n setAttribute(name: string, value: string | number): unknown;\n isRecording?(): boolean;\n },\n prefix: string,\n value: unknown,\n purpose: string,\n): unknown {\n return captureMediaWithIndex(span, prefix, value, purpose).value;\n}\n\nexport function setMediaAttributes(\n span: { setAttribute(name: string, value: string | number): unknown },\n prefix: string,\n value: unknown,\n purpose: string,\n): void {\n captureMedia(span, prefix, value, purpose);\n}\n\n/** Sanitize media that reached a completed span through a generic integration. */\nexport function captureMediaInSnapshot(\n span: object,\n snapshot: Record<string, any>,\n uploadsAvailable: boolean,\n unavailableReason = \"telemetry_uploads_disabled\",\n): void {\n setMediaCaptureAvailability(span, uploadsAvailable, unavailableReason);\n const spanAttributes =\n snapshot.attributes && typeof snapshot.attributes === \"object\"\n ? snapshot.attributes\n : (snapshot.attributes = {});\n const setter = {\n isRecording: () => true,\n setAttribute(name: string, value: string | number) {\n spanAttributes[name] = value;\n },\n };\n aliasMediaCaptureSpan(setter, span);\n let mediaIndex = 0;\n\n const sanitizeAttributes = (attributes: unknown): void => {\n if (!attributes || typeof attributes !== \"object\" || Array.isArray(attributes)) return;\n for (const [key, original] of Object.entries(attributes)) {\n let value: unknown = original;\n let parsedJson = false;\n if (typeof original === \"string\") {\n if (!MEDIA_PAYLOAD_SIGNAL.test(original)) continue;\n const trimmed = original.trimStart();\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n try {\n value = JSON.parse(original);\n parsedJson = true;\n } catch {\n if (/data\\s*:\\s*(?:image|audio|video|application\\/pdf)/i.test(original)) {\n (attributes as Record<string, unknown>)[key] = REDACTED_MEDIA_STRUCTURE;\n }\n continue;\n }\n }\n }\n\n const purpose = key.includes(\"output\") ? \"output\" : \"input\";\n let safeValue: unknown;\n let count = 0;\n const sanitizeOnly = mediaIndex >= MAX_CAPTURED_MEDIA_REFERENCES;\n if (sanitizeOnly) {\n safeValue = sanitizeMediaPayload(value, purpose);\n } else {\n const captured = captureMediaWithIndex(\n setter,\n \"neatlogs.content\",\n value,\n purpose,\n mediaIndex,\n );\n safeValue = captured.value;\n count = captured.count;\n }\n mediaIndex += count;\n if (count === 0 && !sanitizeOnly) continue;\n const replacement =\n typeof original === \"string\" && (parsedJson || typeof safeValue !== \"string\")\n ? JSON.stringify(safeValue)\n : safeValue;\n if (replacement === original) continue;\n (attributes as Record<string, unknown>)[key] = replacement;\n }\n };\n\n sanitizeAttributes(spanAttributes);\n sanitizeAttributes(snapshot.resource?.attributes ?? snapshot.resource);\n if (Array.isArray(snapshot.events)) {\n for (const event of snapshot.events) sanitizeAttributes(event?.attributes);\n }\n if (Array.isArray(snapshot.links)) {\n for (const link of snapshot.links) sanitizeAttributes(link?.attributes);\n }\n}\n\nfunction safeFailure(error: unknown): { stage: string; reason: string } {\n if (!(error instanceof TelemetryUploadError)) {\n return { stage: \"upload\", reason: \"unexpected_error\" };\n }\n return {\n stage: error.stage,\n reason: /^[a-zA-Z0-9_.-]{1,64}$/.test(error.reasonCode)\n ? error.reasonCode\n : \"unsafe_reason_code\",\n };\n}\n\nfunction safeUnavailableReason(value: string): string {\n return /^[a-zA-Z0-9_.-]{1,64}$/.test(value) ? value : \"upload_authority_unavailable\";\n}\n\nfunction rewritePendingPlaceholder(\n attributes: Record<string, any>,\n item: PendingMedia,\n update: MediaRecord,\n): void {\n const matches = (value: Record<string, any>): boolean =>\n value.upload_token === item.token ||\n (value.id === item.record.id && value.sha256 === item.sha256);\n const applyUpdate = (value: Record<string, any>): Record<string, any> => {\n const after = { ...value, ...update };\n delete after.upload_token;\n if (after.state === \"available\") delete after.safe_preview;\n return after;\n };\n const seen = new WeakSet<object>();\n let visitedNodes = 0;\n const rewrite = (value: any, depth = 0): any => {\n if (typeof value === \"string\") {\n if (!value.includes(item.token) && !value.includes(String(item.record.id))) {\n return value;\n }\n if (value.length > MAX_MEDIA_REPLACEMENT_KEY_CHARS) {\n return REDACTED_MEDIA_STRUCTURE;\n }\n const trimmed = value.trimStart();\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) return value;\n try {\n const parsed = JSON.parse(value);\n const rewritten = rewrite(parsed);\n return rewritten === parsed ? value : JSON.stringify(rewritten);\n } catch {\n return value;\n }\n }\n if (!value || typeof value !== \"object\") return value;\n if (depth > MAX_MEDIA_TRAVERSAL_DEPTH || visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n return REDACTED_MEDIA_STRUCTURE;\n }\n if (seen.has(value)) return \"[CIRCULAR]\";\n seen.add(value);\n visitedNodes += 1;\n if (!Array.isArray(value) && matches(value)) return applyUpdate(value);\n let changed = false;\n const output = Array.isArray(value) ? [...value] : { ...value };\n for (const [key, child] of Object.entries(value)) {\n if (visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n return REDACTED_MEDIA_STRUCTURE;\n }\n const rewritten = rewrite(child, depth + 1);\n if (rewritten !== child) {\n (output as Record<string, any>)[key] = rewritten;\n changed = true;\n }\n }\n if (!Array.isArray(value)) {\n for (const prefix of item.prefixes) {\n const tokenKey = `${prefix}.upload_token`;\n const matchesFlat =\n value[tokenKey] === item.token ||\n (value[`${prefix}.id`] === item.record.id && value[`${prefix}.sha256`] === item.sha256);\n if (!matchesFlat) continue;\n delete (output as Record<string, any>)[tokenKey];\n for (const [field, fieldValue] of Object.entries(update)) {\n (output as Record<string, any>)[`${prefix}.${field}`] = fieldValue;\n }\n if (update.state === \"available\") {\n delete (output as Record<string, any>)[`${prefix}.safe_preview`];\n }\n changed = true;\n }\n }\n return changed ? output : value;\n };\n\n for (const [key, value] of Object.entries(attributes)) {\n attributes[key] = rewrite(value);\n }\n for (const prefix of item.prefixes) {\n const tokenKey = `${prefix}.upload_token`;\n const matchesFlat =\n attributes[tokenKey] === item.token ||\n (attributes[`${prefix}.id`] === item.record.id &&\n attributes[`${prefix}.sha256`] === item.sha256);\n if (!matchesFlat) continue;\n delete attributes[tokenKey];\n for (const [field, fieldValue] of Object.entries(update)) {\n attributes[`${prefix}.${field}`] = fieldValue;\n }\n if (update.state === \"available\") delete attributes[`${prefix}.safe_preview`];\n }\n}\n\nfunction mediaUploadTokens(value: unknown, requirePendingState: boolean): Set<string> {\n const tokens = new Set<string>();\n const seen = new WeakSet<object>();\n let visitedNodes = 0;\n const visit = (node: any, depth = 0): void => {\n if (typeof node === \"string\") {\n if (!node.includes(\"nl_pending_media_\")) return;\n if (!requirePendingState && /^nl_pending_media_[0-9a-f]{24}$/.test(node)) {\n tokens.add(node);\n }\n const trimmed = node.trimStart();\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) return;\n try {\n visit(JSON.parse(node), depth + 1);\n } catch {\n // Invalid JSON cannot authorize an out-of-band upload.\n }\n return;\n }\n if (!node || typeof node !== \"object\" || seen.has(node)) return;\n if (depth > MAX_MEDIA_TRAVERSAL_DEPTH || visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n return;\n }\n seen.add(node);\n visitedNodes += 1;\n if (\n !Array.isArray(node) &&\n (!requirePendingState || node.state === \"pending-upload\") &&\n typeof node.upload_token === \"string\"\n ) {\n tokens.add(node.upload_token);\n }\n if (!Array.isArray(node)) {\n for (const [key, token] of Object.entries(node)) {\n if (!key.endsWith(\".upload_token\") || typeof token !== \"string\") continue;\n const prefix = key.slice(0, -\".upload_token\".length);\n if (!requirePendingState || node[`${prefix}.state`] === \"pending-upload\") {\n tokens.add(token);\n }\n }\n }\n try {\n for (const child of Object.values(node)) {\n if (visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) break;\n visit(child, depth + 1);\n }\n } catch {\n return;\n }\n };\n visit(value);\n return tokens;\n}\n\nfunction scrubUploadTokens(value: unknown): unknown {\n const seen = new WeakMap<object, unknown>();\n let visitedNodes = 0;\n const rewrite = (node: any, depth = 0): any => {\n if (typeof node === \"string\") {\n if (!node.includes(\"nl_pending_media_\")) return node;\n const trimmed = node.trimStart();\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n try {\n if (node.length > MAX_MEDIA_REPLACEMENT_KEY_CHARS) {\n return REDACTED_MEDIA_STRUCTURE;\n }\n return JSON.stringify(rewrite(JSON.parse(node), depth + 1));\n } catch {\n // Fall through to remove any opaque token embedded in plain text.\n }\n }\n return node.replace(/nl_pending_media_[0-9a-f]{24}/g, \"[REDACTED_UPLOAD_TOKEN]\");\n }\n if (!node || typeof node !== \"object\") return node;\n if (depth > MAX_MEDIA_TRAVERSAL_DEPTH || visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n return REDACTED_MEDIA_STRUCTURE;\n }\n const prior = seen.get(node);\n if (prior) return \"[CIRCULAR]\";\n visitedNodes += 1;\n const output: any = Array.isArray(node) ? [] : {};\n seen.set(node, output);\n try {\n for (const [key, child] of Object.entries(node)) {\n if (visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n return REDACTED_MEDIA_STRUCTURE;\n }\n if (key === \"upload_token\" || key.endsWith(\".upload_token\")) continue;\n output[key] = rewrite(child, depth + 1);\n }\n } catch {\n return REDACTED_MEDIA_STRUCTURE;\n }\n return output;\n };\n return rewrite(value);\n}\n\nasync function uploadWithinDeadline(\n authority: UploadAuthority,\n payload: UploadPayload,\n deadlineUnixMs: number,\n) {\n const remaining = deadlineUnixMs - Date.now();\n if (remaining <= 0) {\n throw new TelemetryUploadError(\"prepare\", \"media_export_deadline_exceeded\", true);\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n authority.upload(payload, { deadlineUnixMs }),\n new Promise<never>((_resolve, reject) => {\n timer = setTimeout(\n () => reject(new TelemetryUploadError(\"prepare\", \"media_export_deadline_exceeded\", true)),\n remaining,\n );\n timer.unref?.();\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\n/** Upload only media references retained by the accepted masked snapshot. */\nexport async function resolvePendingMediaUploads(\n span: object,\n attributes: Record<string, any>,\n authority: UploadAuthority,\n diagnostics?: DeliveryDiagnostics,\n): Promise<boolean> {\n const bucket = detachPendingBucket(span);\n const pending = bucket?.items ?? [];\n const deadlineUnixMs = Date.now() + DEFAULT_MEDIA_EXPORT_DEADLINE_MS;\n let failed = false;\n try {\n const retainedTokens = mediaUploadTokens(attributes, true);\n const presentTokens = mediaUploadTokens(attributes, false);\n for (const item of pending) {\n const retained = item.prefixes.filter(\n (prefix) =>\n attributes[`${prefix}.upload_token`] === item.token &&\n attributes[`${prefix}.state`] === \"pending-upload\",\n );\n const retainedCount = Math.max(retained.length, retainedTokens.has(item.token) ? 1 : 0);\n if (!retainedTokens.has(item.token)) {\n const tokenWasRetainedInInvalidState = presentTokens.has(item.token);\n if (tokenWasRetainedInInvalidState) {\n failed = true;\n diagnostics?.recordTypedMedia(\"failures\", Math.max(retainedCount, 1));\n diagnostics?.recordUploadFailure(\"validate\", \"masked_pending_state\");\n }\n rewritePendingPlaceholder(attributes, item, {\n state: \"failed\",\n safe_preview: tokenWasRetainedInInvalidState\n ? \"upload failed: validate/masked_pending_state\"\n : \"upload skipped: media reference removed by mask\",\n });\n continue;\n }\n if (!authority.available) {\n const unavailableReason = safeUnavailableReason(authority.unavailableReason);\n failed = true;\n diagnostics?.recordTypedMedia(\"unavailable\", retainedCount);\n diagnostics?.recordTypedMedia(\"failures\", retainedCount);\n diagnostics?.recordUploadFailure(\"prepare\", unavailableReason);\n const safePreview = `upload unavailable: ${unavailableReason}`;\n rewritePendingPlaceholder(attributes, item, {\n state: \"failed\",\n safe_preview: safePreview,\n });\n continue;\n }\n if (item.byteLength > Math.min(authority.maxPayloadBytes, DEFAULT_MAX_TYPED_MEDIA_BYTES)) {\n failed = true;\n diagnostics?.recordTypedMedia(\"failures\", retainedCount);\n diagnostics?.recordUploadFailure(\"validate\", \"payload_too_large\");\n const safePreview = \"upload failed: validate/payload_too_large\";\n rewritePendingPlaceholder(attributes, item, {\n state: \"failed\",\n safe_preview: safePreview,\n });\n continue;\n }\n if (!isSupportedTypedMediaMimeType(item.mimeType)) {\n failed = true;\n diagnostics?.recordTypedMedia(\"failures\", retainedCount);\n diagnostics?.recordUploadFailure(\"validate\", \"unsupported_mime_type\");\n const safePreview = \"upload failed: validate/unsupported_mime_type\";\n rewritePendingPlaceholder(attributes, item, {\n state: \"failed\",\n safe_preview: safePreview,\n });\n continue;\n }\n const payload: UploadPayload = {\n content: item.bytes,\n purpose: \"typed_media\",\n sha256: item.sha256,\n byteLength: item.byteLength,\n mimeType: item.mimeType,\n contentEncoding: \"identity\",\n idempotencyKey: `nl-ts-v1:typed_media:${item.sha256}:${item.mimeType}`,\n payloadSchema: \"neatlogs.media.v1\",\n };\n try {\n const receipt = assertReadyUploadReceipt(\n await uploadWithinDeadline(authority, payload, deadlineUnixMs),\n payload,\n );\n diagnostics?.recordTypedMedia(\"uploads\", retainedCount);\n rewritePendingPlaceholder(attributes, item, {\n id: receipt.reference.id,\n reference: receipt.reference.id,\n source: \"uploaded\",\n sha256: receipt.reference.sha256,\n byte_length: receipt.reference.byteLength,\n mime_type: receipt.reference.mimeType,\n purpose: receipt.reference.purpose,\n state: \"available\",\n content_encoding: receipt.reference.contentEncoding,\n });\n } catch (error) {\n failed = true;\n const failure = safeFailure(error);\n diagnostics?.recordTypedMedia(\"failures\", retainedCount);\n diagnostics?.recordUploadFailure(failure.stage, failure.reason);\n const safePreview = `upload failed: ${failure.stage}/${failure.reason}`;\n rewritePendingPlaceholder(attributes, item, {\n state: \"failed\",\n safe_preview: safePreview,\n });\n }\n }\n } finally {\n if (bucket) releasePendingAccount(bucket.account);\n const scrubbed = scrubUploadTokens(attributes);\n for (const key of Object.keys(attributes)) delete attributes[key];\n if (scrubbed && typeof scrubbed === \"object\" && !Array.isArray(scrubbed)) {\n Object.assign(attributes, scrubbed);\n }\n }\n return !failed;\n}\n\n/** Drop out-of-band bytes when a span is filtered or never exported. */\nexport function discardPendingMedia(span: object): void {\n const bucket = detachPendingBucket(span);\n if (bucket) releasePendingAccount(bucket.account);\n}\n\n/** Release all staged bytes owned by one SDK pipeline during shutdown. */\nexport function discardPendingMediaOwner(owner?: object): void {\n const state = pendingMediaOwners.get(owner ?? defaultPendingMediaOwner);\n if (!state) return;\n for (const account of [...state.accounts]) {\n const span = account.span.deref();\n if (span) {\n const bucket = pendingBySpan.get(span);\n if (bucket?.account === account) {\n pendingBySpan.delete(span);\n pendingFinalizer?.unregister(bucket.unregisterToken);\n }\n }\n releasePendingAccount(account);\n }\n pendingMediaOwners.delete(owner ?? defaultPendingMediaOwner);\n}\n","import { createHash } from \"node:crypto\";\n\nexport type UploadPurpose = \"typed_media\" | \"otlp_overflow\";\nexport type UploadContentEncoding = \"identity\" | \"gzip\";\nexport type UploadPayloadSchema = \"otlp.traces.v1\" | \"neatlogs.media.v1\";\n\nexport interface UploadPayload {\n content: Uint8Array;\n purpose: UploadPurpose;\n sha256: string;\n byteLength: number;\n mimeType: string;\n contentEncoding: UploadContentEncoding;\n idempotencyKey: string;\n payloadSchema?: UploadPayloadSchema;\n}\n\nexport interface UploadReference {\n id: string;\n purpose: UploadPurpose;\n sha256: string;\n byteLength: number;\n mimeType: string;\n contentEncoding: UploadContentEncoding;\n state: \"ready\";\n}\n\nexport interface UploadReceipt {\n uploadId: string;\n state: \"ready\";\n reference: UploadReference;\n}\n\nexport interface UploadRequestOptions {\n /** Absolute wall-clock deadline shared by the caller's enclosing export. */\n deadlineUnixMs?: number;\n}\n\nexport interface UploadAuthority {\n readonly available: boolean;\n readonly unavailableReason: string;\n readonly maxPayloadBytes: number;\n upload(payload: UploadPayload, options?: UploadRequestOptions): Promise<UploadReceipt>;\n}\n\nexport type UploadAuthorityOption = boolean | UploadAuthority;\n\nexport const DEFAULT_MAX_OTLP_OVERFLOW_BYTES = 20 * 1024 * 1024;\nexport const DEFAULT_MAX_TYPED_MEDIA_BYTES = 25 * 1024 * 1024;\nexport const DEFAULT_MAX_UPLOAD_BYTES = DEFAULT_MAX_TYPED_MEDIA_BYTES;\nexport const UPLOADS_DISABLED_REASON = \"telemetry_uploads_disabled\";\n\nexport class TelemetryUploadError extends Error {\n constructor(\n readonly stage: \"prepare\" | \"put\" | \"complete\" | \"validate\",\n readonly reasonCode: string,\n readonly retryable: boolean,\n ) {\n super(`telemetry upload ${stage} failed: ${reasonCode}`);\n this.name = \"TelemetryUploadError\";\n }\n}\n\nexport class DisabledUploadAuthority implements UploadAuthority {\n readonly available = false;\n readonly unavailableReason: string;\n readonly maxPayloadBytes: number;\n\n constructor(reason = UPLOADS_DISABLED_REASON, maxPayloadBytes = DEFAULT_MAX_UPLOAD_BYTES) {\n this.unavailableReason = reason;\n this.maxPayloadBytes = maxPayloadBytes;\n }\n\n async upload(_payload: UploadPayload): Promise<UploadReceipt> {\n throw new TelemetryUploadError(\"prepare\", this.unavailableReason, false);\n }\n}\n\ninterface PrepareRequest {\n version: 1;\n purpose: UploadPurpose;\n sha256: string;\n byte_length: number;\n mime_type: string;\n content_encoding: UploadContentEncoding;\n idempotency_key: string;\n payload_schema?: UploadPayloadSchema;\n}\n\ninterface WireReference {\n id: string;\n purpose: UploadPurpose;\n sha256: string;\n byte_length: number;\n mime_type: string;\n content_encoding: UploadContentEncoding;\n state: string;\n}\n\ninterface PreparedUpload {\n uploadId: string;\n state: \"prepared\";\n uploadUrl: string;\n uploadHeaders: Record<string, string>;\n reference: WireReference;\n}\n\ninterface ResumableUpload {\n uploadId: string;\n state: \"uploaded\" | \"validating\";\n reference: WireReference;\n}\n\ntype PrepareResult = PreparedUpload | ResumableUpload | UploadReceipt;\n\ninterface WireDiagnostic {\n stage: string;\n reasonCode: string;\n retryable: boolean;\n}\n\nexport interface HttpUploadAuthorityOptions {\n baseUrl: string;\n apiKey: string;\n fetch?: typeof globalThis.fetch;\n maxPayloadBytes?: number;\n deadlineMs?: number;\n attemptTimeoutMs?: number;\n maxAttempts?: number;\n}\n\nconst SHA256_PATTERN = /^[0-9a-f]{64}$/;\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst MIME_TYPE_PATTERN = /^[a-z0-9][a-z0-9!#$&^_.+-]*\\/[a-z0-9][a-z0-9!#$&^_.+-]*$/;\nconst TYPED_MEDIA_MIME_TYPES = new Set([\n \"application/pdf\",\n \"audio/flac\",\n \"audio/mpeg\",\n \"audio/ogg\",\n \"audio/wav\",\n \"image/gif\",\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n]);\nconst SAFE_REASON_PATTERN = /^[a-zA-Z0-9_.-]{1,64}$/;\nconst MAX_RESPONSE_BYTES = 64 * 1024;\nconst SENSITIVE_UPLOAD_HEADERS = new Set([\n \"authorization\",\n \"cookie\",\n \"proxy-authorization\",\n \"x-api-key\",\n]);\nconst HEADER_NAME_PATTERN = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;\n\nexport function isSupportedTypedMediaMimeType(value: string): boolean {\n return TYPED_MEDIA_MIME_TYPES.has(value);\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction requiredString(\n value: unknown,\n field: string,\n stage: TelemetryUploadError[\"stage\"],\n): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new TelemetryUploadError(stage, `invalid_${field}`, false);\n }\n return value;\n}\n\nfunction validateReference(\n value: unknown,\n payload: UploadPayload,\n expectedUploadId: string,\n expectedState: string,\n stage: TelemetryUploadError[\"stage\"],\n): WireReference {\n if (!isObject(value)) {\n throw new TelemetryUploadError(stage, \"invalid_reference\", false);\n }\n const reference: WireReference = {\n id: requiredString(value.id, \"reference_id\", stage),\n purpose: value.purpose as UploadPurpose,\n sha256: requiredString(value.sha256, \"reference_sha256\", stage),\n byte_length: value.byte_length as number,\n mime_type: requiredString(value.mime_type, \"reference_mime_type\", stage),\n content_encoding: value.content_encoding as UploadContentEncoding,\n state: requiredString(value.state, \"reference_state\", stage),\n };\n if (!UUID_PATTERN.test(reference.id)) {\n throw new TelemetryUploadError(stage, \"invalid_reference_id\", false);\n }\n if (\n reference.id !== expectedUploadId ||\n reference.purpose !== payload.purpose ||\n reference.sha256 !== payload.sha256 ||\n reference.byte_length !== payload.byteLength ||\n reference.mime_type !== payload.mimeType ||\n reference.content_encoding !== payload.contentEncoding ||\n reference.state !== expectedState\n ) {\n throw new TelemetryUploadError(stage, \"reference_mismatch\", false);\n }\n return reference;\n}\n\n/** Validate untrusted/injected authority output and return a credential-free clone. */\nexport function assertReadyUploadReceipt(value: unknown, payload: UploadPayload): UploadReceipt {\n if (!isObject(value)) {\n throw new TelemetryUploadError(\"complete\", \"invalid_receipt\", false);\n }\n const uploadId = requiredString(value.uploadId, \"upload_id\", \"complete\");\n if (!UUID_PATTERN.test(uploadId) || value.state !== \"ready\" || !isObject(value.reference)) {\n throw new TelemetryUploadError(\"complete\", \"invalid_receipt\", false);\n }\n const reference = value.reference;\n if (\n typeof reference.id !== \"string\" ||\n !UUID_PATTERN.test(reference.id) ||\n reference.id !== uploadId ||\n reference.state !== \"ready\" ||\n reference.purpose !== payload.purpose ||\n reference.sha256 !== payload.sha256 ||\n reference.byteLength !== payload.byteLength ||\n reference.mimeType !== payload.mimeType ||\n reference.contentEncoding !== payload.contentEncoding\n ) {\n throw new TelemetryUploadError(\"complete\", \"receipt_mismatch\", false);\n }\n return {\n uploadId,\n state: \"ready\",\n reference: {\n id: reference.id,\n purpose: reference.purpose as UploadPurpose,\n sha256: reference.sha256,\n byteLength: reference.byteLength,\n mimeType: reference.mimeType,\n contentEncoding: reference.contentEncoding as UploadContentEncoding,\n state: \"ready\",\n },\n };\n}\n\nfunction validatePayload(payload: UploadPayload, maxPayloadBytes: number): void {\n if (!(payload.content instanceof Uint8Array)) {\n throw new TelemetryUploadError(\"validate\", \"invalid_content\", false);\n }\n if (!SHA256_PATTERN.test(payload.sha256)) {\n throw new TelemetryUploadError(\"validate\", \"invalid_sha256\", false);\n }\n if (createHash(\"sha256\").update(payload.content).digest(\"hex\") !== payload.sha256) {\n throw new TelemetryUploadError(\"validate\", \"invalid_sha256\", false);\n }\n if (\n !Number.isSafeInteger(payload.byteLength) ||\n payload.byteLength <= 0 ||\n payload.byteLength !== payload.content.byteLength\n ) {\n throw new TelemetryUploadError(\"validate\", \"invalid_byte_length\", false);\n }\n if (!([\"typed_media\", \"otlp_overflow\"] as const).includes(payload.purpose)) {\n throw new TelemetryUploadError(\"validate\", \"invalid_purpose\", false);\n }\n const backendLimit =\n payload.purpose === \"otlp_overflow\"\n ? DEFAULT_MAX_OTLP_OVERFLOW_BYTES\n : DEFAULT_MAX_TYPED_MEDIA_BYTES;\n if (payload.byteLength > Math.min(maxPayloadBytes, backendLimit)) {\n throw new TelemetryUploadError(\"validate\", \"payload_too_large\", false);\n }\n if (!MIME_TYPE_PATTERN.test(payload.mimeType) || payload.mimeType.length > 160) {\n throw new TelemetryUploadError(\"validate\", \"invalid_mime_type\", false);\n }\n if (!([\"identity\", \"gzip\"] as const).includes(payload.contentEncoding)) {\n throw new TelemetryUploadError(\"validate\", \"invalid_content_encoding\", false);\n }\n if (!payload.idempotencyKey || payload.idempotencyKey.length > 128) {\n throw new TelemetryUploadError(\"validate\", \"invalid_idempotency_key\", false);\n }\n if (payload.purpose === \"typed_media\") {\n if (!TYPED_MEDIA_MIME_TYPES.has(payload.mimeType)) {\n throw new TelemetryUploadError(\"validate\", \"unsupported_mime_type\", false);\n }\n if (payload.contentEncoding !== \"identity\") {\n throw new TelemetryUploadError(\"validate\", \"unsupported_content_encoding\", false);\n }\n if (payload.payloadSchema && payload.payloadSchema !== \"neatlogs.media.v1\") {\n throw new TelemetryUploadError(\"validate\", \"invalid_payload_schema\", false);\n }\n } else if (\n payload.mimeType !== \"application/x-protobuf\" ||\n payload.payloadSchema !== \"otlp.traces.v1\"\n ) {\n throw new TelemetryUploadError(\"validate\", \"invalid_overflow_contract\", false);\n }\n}\n\nfunction retryableStatus(status: number): boolean {\n return status === 408 || status === 425 || status === 429 || status >= 500;\n}\n\nasync function withinDeadline<T>(\n promise: Promise<T>,\n deadline: number,\n stage: TelemetryUploadError[\"stage\"],\n cancel?: () => Promise<void>,\n): Promise<T> {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n void cancel?.().catch(() => undefined);\n throw new TelemetryUploadError(stage, \"deadline_exceeded\", true);\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_resolve, reject) => {\n timer = setTimeout(async () => {\n void cancel?.().catch(() => undefined);\n reject(new TelemetryUploadError(stage, \"deadline_exceeded\", true));\n }, remaining);\n timer.unref?.();\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\nasync function boundedJson(\n response: Response,\n deadline: number,\n stage: TelemetryUploadError[\"stage\"],\n): Promise<unknown> {\n const declared = Number(response.headers.get(\"content-length\") ?? 0);\n if (Number.isFinite(declared) && declared > MAX_RESPONSE_BYTES) {\n await response.body?.cancel().catch(() => undefined);\n throw new TelemetryUploadError(stage, \"response_too_large\", false);\n }\n const reader = response.body?.getReader();\n if (!reader) {\n const text = await withinDeadline(response.text(), deadline, stage);\n if (new TextEncoder().encode(text).byteLength > MAX_RESPONSE_BYTES) {\n throw new TelemetryUploadError(stage, \"response_too_large\", false);\n }\n try {\n return JSON.parse(text);\n } catch {\n throw new TelemetryUploadError(stage, \"invalid_json\", false);\n }\n }\n\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n while (true) {\n const { done, value } = await withinDeadline(reader.read(), deadline, stage, () =>\n reader.cancel(),\n );\n if (done) break;\n total += value.byteLength;\n if (total > MAX_RESPONSE_BYTES) {\n await reader.cancel();\n throw new TelemetryUploadError(stage, \"response_too_large\", false);\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n const bytes = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n try {\n return JSON.parse(new TextDecoder().decode(bytes));\n } catch {\n throw new TelemetryUploadError(stage, \"invalid_json\", false);\n }\n}\n\nfunction responseReason(value: unknown): string | undefined {\n return isObject(value) &&\n typeof value.reason_code === \"string\" &&\n SAFE_REASON_PATTERN.test(value.reason_code)\n ? value.reason_code\n : undefined;\n}\n\nfunction optionalDiagnostic(\n value: unknown,\n stage: TelemetryUploadError[\"stage\"],\n): WireDiagnostic | undefined {\n if (value === undefined) return undefined;\n if (\n !isObject(value) ||\n typeof value.stage !== \"string\" ||\n value.stage.length === 0 ||\n typeof value.reason_code !== \"string\" ||\n !SAFE_REASON_PATTERN.test(value.reason_code) ||\n typeof value.retryable !== \"boolean\"\n ) {\n throw new TelemetryUploadError(stage, \"invalid_diagnostic\", false);\n }\n return {\n stage: value.stage,\n reasonCode: value.reason_code,\n retryable: value.retryable,\n };\n}\n\n/** Authenticated implementation of the Phase 8 telemetry upload draft. */\nexport class HttpUploadAuthority implements UploadAuthority {\n readonly available = true;\n readonly unavailableReason = \"\";\n readonly maxPayloadBytes: number;\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly fetchImpl: typeof globalThis.fetch;\n private readonly deadlineMs: number;\n private readonly attemptTimeoutMs: number;\n private readonly maxAttempts: number;\n\n constructor(options: HttpUploadAuthorityOptions) {\n this.baseUrl = new URL(options.baseUrl).origin;\n this.apiKey = options.apiKey.trim();\n if (!this.apiKey) throw new TypeError(\"apiKey is required for upload authority\");\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== \"function\") {\n throw new TypeError(\"fetch is required for upload authority\");\n }\n this.fetchImpl = fetchImpl;\n this.maxPayloadBytes = options.maxPayloadBytes ?? DEFAULT_MAX_UPLOAD_BYTES;\n this.deadlineMs = options.deadlineMs ?? 15_000;\n this.attemptTimeoutMs = options.attemptTimeoutMs ?? 5_000;\n this.maxAttempts = options.maxAttempts ?? 2;\n if (!Number.isSafeInteger(this.maxPayloadBytes) || this.maxPayloadBytes <= 0) {\n throw new RangeError(\"maxPayloadBytes must be a positive safe integer\");\n }\n if (!Number.isFinite(this.deadlineMs) || this.deadlineMs <= 0) {\n throw new RangeError(\"deadlineMs must be positive\");\n }\n if (!Number.isFinite(this.attemptTimeoutMs) || this.attemptTimeoutMs <= 0) {\n throw new RangeError(\"attemptTimeoutMs must be positive\");\n }\n if (!Number.isSafeInteger(this.maxAttempts) || this.maxAttempts <= 0 || this.maxAttempts > 4) {\n throw new RangeError(\"maxAttempts must be an integer between 1 and 4\");\n }\n }\n\n async upload(payload: UploadPayload, options: UploadRequestOptions = {}): Promise<UploadReceipt> {\n validatePayload(payload, this.maxPayloadBytes);\n const deadline = Math.min(\n Date.now() + this.deadlineMs,\n options.deadlineUnixMs ?? Number.POSITIVE_INFINITY,\n );\n if (deadline <= Date.now()) {\n throw new TelemetryUploadError(\"prepare\", \"deadline_exceeded\", true);\n }\n const prepared = await this.prepare(payload, deadline);\n if (prepared.state === \"ready\") return prepared;\n if (prepared.state === \"prepared\") {\n await this.put(prepared, payload, deadline);\n }\n return this.complete(prepared, payload, deadline);\n }\n\n private async prepare(payload: UploadPayload, deadline: number): Promise<PrepareResult> {\n let lastError: TelemetryUploadError | undefined;\n for (let attempt = 0; attempt < this.maxAttempts; attempt += 1) {\n try {\n return await this.prepareAttempt(payload, deadline);\n } catch (error) {\n if (!(error instanceof TelemetryUploadError) || !error.retryable) throw error;\n lastError = error;\n }\n if (attempt + 1 < this.maxAttempts) {\n const delay = Math.min(100 * 2 ** attempt, Math.max(0, deadline - Date.now()));\n if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n throw lastError ?? new TelemetryUploadError(\"prepare\", \"request_failed\", true);\n }\n\n private async prepareAttempt(payload: UploadPayload, deadline: number): Promise<PrepareResult> {\n const body: PrepareRequest = {\n version: 1,\n purpose: payload.purpose,\n sha256: payload.sha256,\n byte_length: payload.byteLength,\n mime_type: payload.mimeType,\n content_encoding: payload.contentEncoding,\n idempotency_key: payload.idempotencyKey,\n ...(payload.payloadSchema ? { payload_schema: payload.payloadSchema } : {}),\n };\n const response = await this.request(\n \"prepare\",\n `${this.baseUrl}/v1/telemetry/uploads`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n body: JSON.stringify(body),\n credentials: \"omit\",\n redirect: \"error\",\n },\n deadline,\n new Set([200, 201, 202]),\n 1,\n );\n const data = await boundedJson(response, deadline, \"prepare\");\n if (!isObject(data)) {\n throw new TelemetryUploadError(\"prepare\", \"invalid_response\", false);\n }\n const diagnostic = optionalDiagnostic(data.diagnostic, \"prepare\");\n const uploadId = requiredString(data.upload_id, \"upload_id\", \"prepare\");\n if (!UUID_PATTERN.test(uploadId)) {\n throw new TelemetryUploadError(\"prepare\", \"invalid_upload_id\", false);\n }\n if (response.status === 200 && data.state === \"ready\") {\n const reference = validateReference(data.reference, payload, uploadId, \"ready\", \"prepare\");\n return {\n uploadId,\n state: \"ready\",\n reference: {\n id: reference.id,\n purpose: reference.purpose,\n sha256: reference.sha256,\n byteLength: reference.byte_length,\n mimeType: reference.mime_type,\n contentEncoding: reference.content_encoding,\n state: \"ready\",\n },\n };\n }\n if (data.state === \"uploaded\" || data.state === \"validating\") {\n if (response.status !== 200 && response.status !== 202) {\n throw new TelemetryUploadError(\"prepare\", \"invalid_response\", false);\n }\n const reference = validateReference(\n data.reference,\n payload,\n uploadId,\n String(data.state),\n \"prepare\",\n );\n return { uploadId, state: data.state, reference };\n }\n if (data.state === \"rejected\") {\n validateReference(data.reference, payload, uploadId, \"rejected\", \"prepare\");\n throw new TelemetryUploadError(\"prepare\", diagnostic?.reasonCode ?? \"upload_rejected\", false);\n }\n if (response.status !== 201 || data.state !== \"prepared\" || !isObject(data.upload)) {\n throw new TelemetryUploadError(\n \"prepare\",\n diagnostic?.reasonCode ?? \"invalid_response\",\n diagnostic?.retryable ?? false,\n );\n }\n const expiresAt = requiredString(data.expires_at, \"expires_at\", \"prepare\");\n const expires = Date.parse(expiresAt);\n if (!Number.isFinite(expires) || expires <= Date.now()) {\n throw new TelemetryUploadError(\"prepare\", \"invalid_expiry\", false);\n }\n if (data.upload.method !== \"PUT\") {\n throw new TelemetryUploadError(\"prepare\", \"invalid_upload_method\", false);\n }\n const uploadUrl = requiredString(data.upload.url, \"upload_url\", \"prepare\");\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(uploadUrl);\n } catch {\n throw new TelemetryUploadError(\"prepare\", \"invalid_upload_url\", false);\n }\n if (parsedUrl.protocol !== \"https:\" || parsedUrl.username || parsedUrl.password) {\n throw new TelemetryUploadError(\"prepare\", \"invalid_upload_url\", false);\n }\n if (!isObject(data.upload.headers)) {\n throw new TelemetryUploadError(\"prepare\", \"invalid_upload_headers\", false);\n }\n const uploadHeaders: Record<string, string> = Object.create(null);\n for (const [key, value] of Object.entries(data.upload.headers)) {\n if (\n typeof value !== \"string\" ||\n !HEADER_NAME_PATTERN.test(key) ||\n /[\\r\\n]/.test(value) ||\n SENSITIVE_UPLOAD_HEADERS.has(key.toLowerCase())\n ) {\n throw new TelemetryUploadError(\"prepare\", \"invalid_upload_headers\", false);\n }\n uploadHeaders[key] = value;\n }\n const reference = validateReference(data.reference, payload, uploadId, \"prepared\", \"prepare\");\n return { uploadId, state: \"prepared\", uploadUrl, uploadHeaders, reference };\n }\n\n private async put(\n prepared: PreparedUpload,\n payload: UploadPayload,\n deadline: number,\n ): Promise<void> {\n const response = await this.request(\n \"put\",\n prepared.uploadUrl,\n {\n method: \"PUT\",\n headers: prepared.uploadHeaders,\n body: payload.content,\n credentials: \"omit\",\n redirect: \"error\",\n },\n deadline,\n );\n try {\n void response.body?.cancel().catch(() => undefined);\n } catch {\n // A successful object PUT is authoritative; cleanup must not trigger a retry.\n }\n }\n\n private async complete(\n prepared: PreparedUpload | ResumableUpload,\n payload: UploadPayload,\n deadline: number,\n ): Promise<UploadReceipt> {\n let lastError: TelemetryUploadError | undefined;\n for (let attempt = 0; attempt < this.maxAttempts; attempt += 1) {\n try {\n return await this.completeAttempt(prepared, payload, deadline);\n } catch (error) {\n if (!(error instanceof TelemetryUploadError) || !error.retryable) throw error;\n lastError = error;\n }\n if (attempt + 1 < this.maxAttempts) {\n const delay = Math.min(100 * 2 ** attempt, Math.max(0, deadline - Date.now()));\n if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n throw lastError ?? new TelemetryUploadError(\"complete\", \"request_failed\", true);\n }\n\n private async completeAttempt(\n prepared: PreparedUpload | ResumableUpload,\n payload: UploadPayload,\n deadline: number,\n ): Promise<UploadReceipt> {\n const response = await this.request(\n \"complete\",\n `${this.baseUrl}/v1/telemetry/uploads/${encodeURIComponent(prepared.uploadId)}/complete`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n body: JSON.stringify({\n sha256: payload.sha256,\n byte_length: payload.byteLength,\n }),\n credentials: \"omit\",\n redirect: \"error\",\n },\n deadline,\n new Set([200, 202]),\n 1,\n );\n const data = await boundedJson(response, deadline, \"complete\");\n if (!isObject(data)) {\n throw new TelemetryUploadError(\"complete\", \"invalid_response\", false);\n }\n const diagnostic = optionalDiagnostic(data.diagnostic, \"complete\");\n if (data.upload_id !== prepared.uploadId) {\n throw new TelemetryUploadError(\"complete\", \"upload_id_mismatch\", false);\n }\n if (![\"ready\", \"uploaded\", \"validating\", \"rejected\"].includes(String(data.state))) {\n throw new TelemetryUploadError(\"complete\", \"invalid_state\", false);\n }\n const reference = validateReference(\n data.reference,\n payload,\n prepared.uploadId,\n String(data.state),\n \"complete\",\n );\n if (data.state !== \"ready\") {\n const reason =\n diagnostic?.reasonCode ??\n (data.state === \"uploaded\" || data.state === \"validating\"\n ? \"validation_pending\"\n : \"upload_rejected\");\n throw new TelemetryUploadError(\n \"complete\",\n reason,\n diagnostic?.retryable ?? (data.state === \"uploaded\" || data.state === \"validating\"),\n );\n }\n return {\n uploadId: prepared.uploadId,\n state: \"ready\",\n reference: {\n id: reference.id,\n purpose: reference.purpose,\n sha256: reference.sha256,\n byteLength: reference.byte_length,\n mimeType: reference.mime_type,\n contentEncoding: reference.content_encoding,\n state: \"ready\",\n },\n };\n }\n\n private async request(\n stage: \"prepare\" | \"put\" | \"complete\",\n url: string,\n init: RequestInit,\n deadline: number,\n expectedStatuses?: ReadonlySet<number>,\n attemptLimit = this.maxAttempts,\n parseErrorBody = stage !== \"put\",\n ): Promise<Response> {\n let lastError: TelemetryUploadError | undefined;\n for (let attempt = 0; attempt < attemptLimit; attempt += 1) {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n throw new TelemetryUploadError(stage, \"deadline_exceeded\", true);\n }\n const controller = new AbortController();\n const timer = setTimeout(\n () => controller.abort(),\n Math.min(remaining, this.attemptTimeoutMs),\n );\n timer.unref?.();\n try {\n const response = await this.fetchImpl(url, {\n ...init,\n signal: controller.signal,\n });\n const accepted = expectedStatuses\n ? expectedStatuses.has(response.status)\n : response.status >= 200 && response.status < 300;\n if (accepted) return response;\n let retryable = retryableStatus(response.status);\n let reason = `http_${response.status}`;\n if (parseErrorBody) {\n try {\n const errorBody = await boundedJson(response, deadline, stage);\n reason = responseReason(errorBody) ?? reason;\n if (isObject(errorBody) && typeof errorBody.retryable === \"boolean\") {\n retryable = errorBody.retryable;\n }\n } catch {\n // HTTP status remains authoritative when an error body is malformed.\n }\n } else {\n await response.body?.cancel().catch(() => undefined);\n }\n lastError = new TelemetryUploadError(stage, reason, retryable);\n if (!retryable) throw lastError;\n } catch (error) {\n if (error instanceof TelemetryUploadError && !error.retryable) throw error;\n lastError =\n error instanceof TelemetryUploadError\n ? error\n : new TelemetryUploadError(\n stage,\n controller.signal.aborted ? \"timeout\" : \"network_error\",\n true,\n );\n } finally {\n clearTimeout(timer);\n }\n if (attempt + 1 < attemptLimit) {\n const delay = Math.min(100 * 2 ** attempt, Math.max(0, deadline - Date.now()));\n if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n throw lastError ?? new TelemetryUploadError(stage, \"request_failed\", true);\n }\n}\n\nexport function isUploadAuthority(value: unknown): value is UploadAuthority {\n return (\n isObject(value) &&\n typeof value.available === \"boolean\" &&\n typeof value.unavailableReason === \"string\" &&\n Number.isSafeInteger(value.maxPayloadBytes) &&\n (value.maxPayloadBytes as number) > 0 &&\n typeof value.upload === \"function\"\n );\n}\n\nexport function uploadsEnabledFromEnv(value: string | undefined): boolean {\n return [\"true\", \"1\", \"yes\"].includes((value ?? \"\").trim().toLowerCase());\n}\n\nexport function resolveUploadAuthority(\n option: UploadAuthorityOption | undefined,\n envValue: string | undefined,\n baseUrl: string,\n apiKey: string,\n): UploadAuthority {\n if (isUploadAuthority(option)) return option;\n const enabled = typeof option === \"boolean\" ? option : uploadsEnabledFromEnv(envValue);\n return enabled ? new HttpUploadAuthority({ baseUrl, apiKey }) : new DisabledUploadAuthority();\n}\n","/**\n * Auto-root for direct-provider wrappers.\n *\n * The backend only renders a trace once it contains a *parentless* span of a\n * root-eligible kind (WORKFLOW / CHAIN / AGENT / MCP_TOOL / LLM). Direct-provider\n * wrappers may emit either a root-eligible LLM span or a non-root span\n * (EMBEDDING / TOOL). A bare non-root call still needs a workflow parent so the\n * trace can finalize.\n *\n * `getProviderTracer(name)` returns a Tracer facade used *only* by those\n * direct-provider wrappers: when `startSpan` would otherwise produce a\n * parentless, non-root span, it transparently opens a WORKFLOW root (named\n * after the configured `workflowName`) and ends it when the provider span\n * ends. Every wrapper path — non-streaming, streaming finalize, error —\n * funnels through `span.end()`, so wrapping `end()` covers them all with no\n * changes to the wrappers' streaming code.\n *\n * Framework wrappers (langchain, mastra, openai-agents, ai-sdk, ...) keep\n * using `trace.getTracer(...)` directly — they already emit their own root and\n * thread context explicitly, so auto-root must never fire for them.\n */\n\nimport {\n trace as otelTrace,\n type Tracer,\n type Span,\n type Context,\n type SpanOptions,\n} from '@opentelemetry/api';\n\nimport { getSessionConfig } from './context.js';\nimport { applySessionAttributes } from './session.js';\nimport { applyEndUserAttributes } from './end-user.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n getActiveNeatlogsSpan,\n withNeatlogsSpan,\n} from './provider.js';\nimport { getActiveClient } from './active-client.js';\nimport { aliasMediaCaptureSpan } from './media.js';\n\nconst boundAutoRoots = new WeakMap<object, Span>();\n\n// A parentless span of one of these kinds already satisfies the backend's\n// root requirement, so it must NOT be wrapped in another root.\nconst ROOT_KINDS = new Set(['workflow', 'chain', 'agent', 'mcp_tool', 'llm']);\n\nfunction autoRootEnabled(): boolean {\n const val = (process.env.NEATLOGS_AUTO_ROOT ?? '').trim().toLowerCase();\n return !['false', '0', 'no', 'off'].includes(val);\n}\n\nfunction resolveRootWorkflowName(): string {\n const clientName = getActiveClient()?.workflowName;\n if (typeof clientName === 'string' && clientName.trim()) return clientName;\n try {\n const name = getSessionConfig()?.workflowName;\n if (typeof name === 'string' && name.trim()) return name;\n } catch {\n /* ignore */\n }\n return 'workflow';\n}\n\n/**\n * Stamp request-scoped identify() identity onto a freshly-created auto-root.\n * The auto-root IS the trace root, and wrapper-only code has no user-controlled\n * root to put trace()/span() args on, so identity comes purely from the\n * identify() context (passed undefined per-call values fall back to it).\n */\nfunction stampRootIdentity(root: Span): void {\n applySessionAttributes(root, undefined, true);\n applyEndUserAttributes(root, undefined, undefined, true);\n}\n\n/**\n * Wrap a provider span so that ending it also ends the auto-created WORKFLOW\n * root. A Proxy keeps this transparent across OTel versions: every property /\n * method except `end` passes straight through to the child span.\n */\nexport function bindSpanToAutoRoot(child: Span, root: Span | undefined): Span {\n if (!root) return child;\n let ended = false;\n const proxy = new Proxy(child, {\n get(target, prop, _receiver) {\n if (prop === 'end') {\n return (...args: any[]): void => {\n if (ended) return;\n ended = true;\n try {\n (target.end as (...a: any[]) => void)(...args);\n } finally {\n try {\n root.end();\n } catch {\n /* ignore */\n }\n }\n };\n }\n const value = Reflect.get(target, prop, target);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n boundAutoRoots.set(proxy, root);\n aliasMediaCaptureSpan(proxy, child);\n return proxy;\n}\n\n/**\n * Self-root helper for callback/event-driven handlers (LangChain, etc.).\n *\n * A callback handler builds its own parent context per run-id rather than going\n * through {@link AutoRootTracer}. When a run BEGINS with a non-root kind (a bare\n * `llm.invoke()` fires the LLM callback with no chain above it; a standalone\n * tool/retriever similarly), the span it creates is parentless and non-root, so\n * the backend can't anchor the trace and it never renders. Call this when there\n * is no LangChain parent: if the kind is non-root and nothing is actively\n * recording in `baseCtx`, it opens a WORKFLOW root and returns it plus the\n * child context to create the span in. The caller MUST end the returned\n * `root` after the child span ends (see {@link endAutoRoot}).\n *\n * Returns `{ root, ctx }` when a root was opened, or `{ root: undefined, ctx: baseCtx }`\n * when no auto-root is needed (root-eligible kind, already-recording parent, or\n * disabled).\n */\nexport function maybeOpenAutoRoot(\n tracer: Tracer,\n kind: string,\n baseCtx: Context,\n): { root: Span | undefined; ctx: Context } {\n const k = String(kind ?? '').toLowerCase();\n // A foreign provider's span must never count as our parent.\n const existing = getActiveNeatlogsSpan();\n if (\n !autoRootEnabled() ||\n ROOT_KINDS.has(k) ||\n (existing !== undefined && existing.isRecording())\n ) {\n return { root: undefined, ctx: baseCtx };\n }\n const root = tracer.startSpan(\n resolveRootWorkflowName(),\n { attributes: { 'neatlogs.span.kind': 'workflow', 'neatlogs.auto_root': true } },\n baseCtx,\n );\n stampRootIdentity(root);\n return { root, ctx: otelTrace.setSpan(baseCtx, root) };\n}\n\n/** End an auto-root opened by {@link maybeOpenAutoRoot}. Safe on undefined. */\nexport function endAutoRoot(root: Span | undefined): void {\n if (!root) return;\n try {\n root.end();\n } catch {\n /* ignore */\n }\n}\n\nclass AutoRootTracer implements Tracer {\n constructor(private readonly _tracer: Tracer) {}\n\n startSpan(name: string, options?: SpanOptions, context?: Context): Span {\n const kind = String(\n (options?.attributes as Record<string, unknown> | undefined)?.[\n 'neatlogs.span.kind'\n ] ?? '',\n ).toLowerCase();\n\n // Parent from our private context, never the foreign global.\n const hasExplicitContext = context !== undefined;\n const ctx = context ?? getNeatlogsParentContext();\n const parent = getActiveNeatlogsSpan();\n const isParentless =\n !hasExplicitContext && !(parent !== undefined && parent.isRecording());\n const needsRoot =\n autoRootEnabled() &&\n !ROOT_KINDS.has(kind) &&\n isParentless;\n\n if (!needsRoot) {\n const span = this._tracer.startSpan(name, options, ctx);\n if (isParentless && ROOT_KINDS.has(kind)) stampRootIdentity(span);\n return span;\n }\n\n const root = this._tracer.startSpan(\n resolveRootWorkflowName(),\n { attributes: { 'neatlogs.span.kind': 'workflow', 'neatlogs.auto_root': true } },\n ctx,\n );\n stampRootIdentity(root);\n const childCtx = otelTrace.setSpan(ctx, root);\n const child = this._tracer.startSpan(name, options, childCtx);\n return bindSpanToAutoRoot(child, root);\n }\n\n startActiveSpan = ((name: string, ...args: any[]) => {\n const callback = args.at(-1);\n if (typeof callback !== 'function') {\n throw new TypeError('startActiveSpan requires a callback');\n }\n const options = args.length >= 2 ? args[0] : undefined;\n const parentContext =\n args.length >= 3 ? args[1] : getNeatlogsParentContext();\n const span = args.length >= 3\n ? this.startSpan(name, options, parentContext)\n : this.startSpan(name, options);\n return withNeatlogsSpan(\n span,\n () => callback(span),\n parentContext,\n boundAutoRoots.get(span as object),\n );\n }) as Tracer['startActiveSpan'];\n}\n\n/**\n * Tracer for direct-provider wrappers (wrapOpenAI, wrapAnthropic, ...).\n * Identical to `trace.getTracer(name)` but adds transparent auto-root so a\n * bare `wrapOpenAI(new OpenAI())` renders a trace without a manual `span()` /\n * `trace()` wrapper. Do NOT use for framework wrappers.\n */\nexport function getProviderTracer(name: string): Tracer {\n // Resolve from the private provider.\n return new AutoRootTracer(getNeatlogsTracer(name));\n}\n","export type NeatlogsConfigurationErrorCode =\n | 'UNKNOWN_INIT_OPTION'\n | 'UNSUPPORTED_INSTRUMENTATIONS'\n | 'UNSUPPORTED_SPAN_KIND'\n | 'CONFLICTING_INIT';\n\n/** A caller-actionable SDK configuration failure. */\nexport class NeatlogsConfigurationError extends TypeError {\n readonly code: NeatlogsConfigurationErrorCode;\n readonly option: string;\n\n constructor(\n code: NeatlogsConfigurationErrorCode,\n option: string,\n message: string,\n ) {\n super(message);\n this.name = 'NeatlogsConfigurationError';\n this.code = code;\n this.option = option;\n }\n}\n","/**\n * Core span decoration utilities.\n * Provides the low-level wrapping logic used by span() and Span().\n */\n\nimport {\n ROOT_CONTEXT,\n SpanStatusCode,\n type Span as OtelSpan,\n} from \"@opentelemetry/api\";\nimport { getLogger } from \"../core/logger.js\";\nimport { registerMask } from \"../core/mask.js\";\nimport { applyEndUserAttributes, isRootSpan } from \"../core/end-user.js\";\nimport { applySessionAttributes } from \"../core/session.js\";\nimport {\n captureMedia,\n captureMediaWithIndex,\n sanitizeMediaPayload,\n} from \"../core/media.js\";\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from \"../core/provider.js\";\nimport {\n bindSpanToAutoRoot,\n maybeOpenAutoRoot,\n} from \"../core/auto-root.js\";\nimport type { SpanOptions, MaskFunction } from \"../types.js\";\nimport {\n DEFAULT_MAX_SEMANTIC_STREAM_EVENTS,\n DEFAULT_MAX_STREAM_CAPTURE_BYTES,\n utf8ByteLength,\n} from \"../constants.js\";\n\nconst logger = getLogger();\nconst TRACER_NAME = \"neatlogs\";\nconst STREAM_CAPTURE_TRUNCATED = \"[TRUNCATED_STREAM_OUTPUT]\";\n\n/** Safely serialize any value to JSON string. */\nexport function safeJsonDumps(value: any): string {\n try {\n return JSON.stringify(value, (_key, val) => {\n if (typeof val === \"bigint\") return val.toString();\n if (val instanceof Error)\n return { message: val.message, name: val.name, stack: val.stack };\n if (typeof val === \"function\")\n return `[Function: ${val.name || \"anonymous\"}]`;\n return val;\n });\n } catch {\n return String(value);\n }\n}\n\n/** Serialize an object for span attributes. Handles toJSON(), plain objects, primitives. */\nexport function serializeObj(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n // Preserve binary views until media capture can classify and sanitize them.\n // JSON.stringify retains the previous numeric-object representation for\n // ordinary, non-media Uint8Array values.\n if (obj instanceof Uint8Array) return obj;\n if (\n typeof obj === \"string\" ||\n typeof obj === \"number\" ||\n typeof obj === \"boolean\"\n )\n return obj;\n if (typeof obj.toJSON === \"function\") return obj.toJSON();\n if (Array.isArray(obj)) return obj.map(serializeObj);\n if (typeof obj === \"object\") {\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = serializeObj(value);\n }\n return result;\n }\n return String(obj);\n}\n\n/** Set common span attributes from options. */\nexport function setCommonSpanAttrs(span: OtelSpan, opts: SpanOptions): void {\n if (opts.kind) {\n span.setAttribute(\"openinference.span.kind\", opts.kind);\n }\n if (opts.internal) {\n span.setAttribute(\"neatlogs.internal\", true);\n }\n if (opts.description) {\n span.setAttribute(\"neatlogs.description\", opts.description);\n }\n if (opts.mask) {\n const maskId = registerMask(opts.mask);\n span.setAttribute(\"neatlogs.mask_id\", maskId);\n }\n}\n\nexport interface DecorateSpanOptions extends SpanOptions {\n /** Override the span name (defaults to function name). */\n spanName?: string;\n /** Post-process callback after the function returns. */\n postprocessResult?: (\n span: OtelSpan,\n result: any,\n boundInputs: Record<string, any>,\n ) => void;\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n typeof (value as { then?: unknown }).then === \"function\"\n );\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n typeof (value as { [Symbol.asyncIterator]?: unknown })[\n Symbol.asyncIterator\n ] === \"function\"\n );\n}\n\nfunction isSyncIterator(\n value: unknown,\n): value is Iterator<unknown> & Iterable<unknown> {\n return (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n typeof (value as { next?: unknown }).next === \"function\" &&\n typeof (value as { [Symbol.iterator]?: unknown })[Symbol.iterator] ===\n \"function\"\n );\n}\n\nfunction isReadableStreamLike(value: unknown): value is {\n getReader: (...args: any[]) => any;\n cancel: (...args: any[]) => Promise<unknown>;\n} {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as { getReader?: unknown }).getReader === \"function\" &&\n typeof (value as { cancel?: unknown }).cancel === \"function\"\n );\n}\n\n/**\n * Core wrapper factory that creates an instrumented version of a function.\n * This is the low-level building block used by span() and Span().\n */\nexport function decorateSpan<TArgs extends any[], TReturn>(\n opts: DecorateSpanOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n const spanName = opts.spanName ?? opts.name ?? (fn.name || \"anonymous\");\n const captureInput = opts.captureInput !== false;\n const captureOutput = opts.captureOutput !== false;\n const mediaPrefix = (direction: \"input\" | \"output\"): string => {\n const kind = String(opts.kind ?? \"span\").trim().toLowerCase() || \"span\";\n return `neatlogs.${kind}.${direction}`;\n };\n\n const wrapped = (...args: TArgs): any => {\n // Resolve the tracer at CALL time, not definition time: a decorator applied\n // before init() would otherwise capture the no-op global provider forever\n // and emit zero spans once the private provider is configured.\n const tracer = getNeatlogsTracer(TRACER_NAME);\n // End-user belongs to the trace root only. Capture root status BEFORE the\n // span is created (once it's active, it would be the \"current\" span).\n const isRoot = isRootSpan();\n // Parent from our private span store; a root decorated function anchors a\n // fresh trace under ROOT_CONTEXT.\n const parentContext = isRoot ? ROOT_CONTEXT : getNeatlogsParentContext();\n const autoRoot = maybeOpenAutoRoot(\n tracer,\n String(opts.kind ?? \"\"),\n parentContext,\n );\n if (autoRoot.root) {\n applySessionAttributes(autoRoot.root, opts.sessionId, true, {\n parentSessionId: opts.parentSessionId,\n sessionFeatureName: opts.sessionFeatureName,\n sessionEntryPoint: opts.sessionEntryPoint,\n });\n applyEndUserAttributes(\n autoRoot.root,\n opts.endUserId,\n opts.endUserMetadata,\n true,\n );\n }\n const span = bindSpanToAutoRoot(\n tracer.startSpan(spanName, {}, autoRoot.ctx),\n autoRoot.root,\n );\n return withNeatlogsSpan(span, () => {\n let finished = false;\n let streamInterrupted = false;\n const streamChunks: any[] = [];\n let totalStreamChunks = 0;\n let retainedStreamBytes = 0;\n let droppedStreamChunks = 0;\n let streamMediaCount = 0;\n\n const captureResult = (result: any): void => {\n if (captureOutput) {\n try {\n const serialized = serializeObj(result);\n const captured = captureMedia(\n span,\n mediaPrefix(\"output\"),\n serialized,\n \"output\",\n );\n span.setAttribute(\n \"output.value\",\n safeJsonDumps(captured),\n );\n } catch (err) {\n logger.debug(`Failed to capture output: ${err}`);\n }\n }\n\n if (opts.postprocessResult) {\n try {\n const boundInputs = _extractBoundInputs(fn, args);\n opts.postprocessResult(span, result, boundInputs);\n } catch (err) {\n logger.debug(`Postprocess failed: ${err}`);\n }\n }\n };\n\n const finishSuccess = (result: any): void => {\n if (finished) return;\n finished = true;\n captureResult(result);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n };\n\n const setStreamCounts = (): void => {\n span.setAttribute(\"neatlogs.stream.chunk_count\", totalStreamChunks);\n if (totalStreamChunks > DEFAULT_MAX_SEMANTIC_STREAM_EVENTS) {\n span.setAttribute(\n \"neatlogs.stream.events_dropped\",\n totalStreamChunks - DEFAULT_MAX_SEMANTIC_STREAM_EVENTS,\n );\n }\n if (droppedStreamChunks > 0) {\n span.setAttribute(\"neatlogs.stream.output_truncated\", true);\n span.setAttribute(\n \"neatlogs.stream.chunks_not_captured\",\n droppedStreamChunks,\n );\n span.setAttribute(\n \"neatlogs.stream.retained_bytes\",\n retainedStreamBytes,\n );\n }\n };\n\n const streamCaptureValue = (): any[] =>\n droppedStreamChunks > 0\n ? [\n ...streamChunks,\n {\n neatlogs_stream_capture: STREAM_CAPTURE_TRUNCATED,\n chunks_not_captured: droppedStreamChunks,\n },\n ]\n : streamChunks;\n\n const finishError = (error: any): void => {\n if (finished) return;\n finished = true;\n if (error?.name === \"AbortError\") {\n span.setAttribute(\"neatlogs.stream.cancelled\", true);\n if (totalStreamChunks > 0) {\n setStreamCounts();\n captureResult(streamCaptureValue());\n }\n span.setStatus({ code: SpanStatusCode.UNSET });\n span.end();\n return;\n }\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error?.message ?? String(error),\n });\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n span.end();\n };\n\n const recordChunk = (chunk: any): void => {\n const index = totalStreamChunks++;\n if (index >= DEFAULT_MAX_SEMANTIC_STREAM_EVENTS) {\n droppedStreamChunks += 1;\n return;\n }\n\n let serializedValue: unknown;\n let serialized: string;\n try {\n serializedValue = serializeObj(chunk);\n serialized = safeJsonDumps(\n sanitizeMediaPayload(serializedValue, \"output\"),\n );\n } catch {\n droppedStreamChunks += 1;\n return;\n }\n const encodedBytes = utf8ByteLength(\n serialized,\n DEFAULT_MAX_STREAM_CAPTURE_BYTES - retainedStreamBytes,\n );\n if (\n retainedStreamBytes + encodedBytes >\n DEFAULT_MAX_STREAM_CAPTURE_BYTES\n ) {\n droppedStreamChunks += 1;\n return;\n }\n\n const captured = captureMediaWithIndex(\n span,\n mediaPrefix(\"output\"),\n serializedValue,\n \"output\",\n streamMediaCount,\n );\n streamMediaCount += captured.count;\n streamChunks.push(captured.value);\n retainedStreamBytes += encodedBytes;\n const summary: Record<string, unknown> = {\n value_type: Array.isArray(chunk) ? \"array\" : typeof chunk,\n encoded_bytes: encodedBytes,\n };\n if (Array.isArray(chunk)) summary.items = chunk.length;\n else if (chunk && typeof chunk === \"object\")\n summary.keys = Object.keys(chunk).sort();\n span.addEvent(\"neatlogs.stream.chunk\", {\n \"neatlogs.stream.chunk.index\": index,\n \"neatlogs.stream.chunk.summary\": safeJsonDumps(summary),\n });\n };\n\n const finishStream = (cancelled = false): void => {\n setStreamCounts();\n if (!cancelled) {\n finishSuccess(streamCaptureValue());\n return;\n }\n if (finished) return;\n finished = true;\n span.setAttribute(\"neatlogs.stream.cancelled\", true);\n captureResult(streamCaptureValue());\n span.setStatus({ code: SpanStatusCode.UNSET });\n span.end();\n };\n\n const wrapAsyncIterator = (iterator: any): any => {\n let proxy: any;\n proxy = new Proxy(iterator, {\n get(target, property) {\n if (property === Symbol.asyncIterator) return () => proxy;\n if (property === \"next\") {\n return async (...nextArgs: any[]) => {\n try {\n const item = await withNeatlogsSpan(span, () =>\n target.next(...nextArgs),\n );\n if (item.done) finishStream(streamInterrupted);\n else recordChunk(item.value);\n return item;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n if (property === \"return\") {\n return async (...returnArgs: any[]) => {\n try {\n streamInterrupted = true;\n const item = target.return\n ? await withNeatlogsSpan(span, () =>\n target.return(...returnArgs),\n )\n : { done: true, value: returnArgs[0] };\n if (item.done) finishStream(true);\n return item;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n if (property === \"throw\") {\n return async (...throwArgs: any[]) => {\n try {\n const item = target.throw\n ? await withNeatlogsSpan(span, () =>\n target.throw(...throwArgs),\n )\n : Promise.reject(throwArgs[0]);\n if (item.done) finishStream();\n else recordChunk(item.value);\n return item;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n const value = Reflect.get(target, property, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n return proxy;\n };\n\n const wrapAsyncIterable = (source: AsyncIterable<unknown>): any => {\n if (typeof (source as any).next === \"function\") {\n return wrapAsyncIterator(source);\n }\n return new Proxy(source as any, {\n get(target, property) {\n if (property === Symbol.asyncIterator) {\n return () => wrapAsyncIterator(target[Symbol.asyncIterator]());\n }\n const value = Reflect.get(target, property, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n };\n\n const wrapSyncIterator = (\n iterator: Iterator<unknown> & Iterable<unknown>,\n ): any => {\n let proxy: any;\n proxy = new Proxy(iterator, {\n get(target, property) {\n if (property === Symbol.iterator) return () => proxy;\n if (property === \"next\") {\n return (...nextArgs: any[]) => {\n try {\n const item = withNeatlogsSpan(span, () =>\n (\n target.next as (\n ...args: any[]\n ) => IteratorResult<unknown>\n )(...nextArgs),\n );\n if (item.done) finishStream(streamInterrupted);\n else recordChunk(item.value);\n return item;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n if (property === \"return\") {\n return (...returnArgs: any[]) => {\n try {\n streamInterrupted = true;\n const item = target.return\n ? withNeatlogsSpan(span, () =>\n (\n target.return as (\n ...args: any[]\n ) => IteratorResult<unknown>\n )(...returnArgs),\n )\n : { done: true, value: returnArgs[0] };\n if (item.done) finishStream(true);\n return item;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n if (property === \"throw\") {\n return (...throwArgs: any[]) => {\n try {\n if (!target.throw) throw throwArgs[0];\n const item = withNeatlogsSpan(span, () =>\n (\n target.throw as (\n ...args: any[]\n ) => IteratorResult<unknown>\n )(...throwArgs),\n );\n if (item.done) finishStream(streamInterrupted);\n else recordChunk(item.value);\n return item;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n const value = Reflect.get(target, property, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n return proxy;\n };\n\n const wrapReader = (reader: any): any =>\n new Proxy(reader, {\n get(target, property) {\n if (property === \"read\") {\n return async (...readArgs: any[]) => {\n try {\n const item = await withNeatlogsSpan(span, () =>\n target.read(...readArgs),\n );\n if (item.done) finishStream();\n else recordChunk(item.value);\n return item;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n if (property === \"cancel\") {\n return async (...cancelArgs: any[]) => {\n try {\n const result = await target.cancel(...cancelArgs);\n finishStream(true);\n return result;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n if (property === \"releaseLock\") {\n return (...releaseArgs: any[]) => {\n try {\n return target.releaseLock(...releaseArgs);\n } finally {\n finishStream(true);\n }\n };\n }\n const value = Reflect.get(target, property, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n\n const wrapReadableStream = (stream: any): any =>\n new Proxy(stream, {\n get(target, property) {\n if (property === \"getReader\") {\n return (...readerArgs: any[]) =>\n wrapReader(target.getReader(...readerArgs));\n }\n if (property === Symbol.asyncIterator) {\n const iteratorFactory = target[Symbol.asyncIterator];\n if (typeof iteratorFactory === \"function\") {\n return () => wrapAsyncIterator(iteratorFactory.call(target));\n }\n }\n if (property === \"cancel\") {\n return async (...cancelArgs: any[]) => {\n try {\n const result = await target.cancel(...cancelArgs);\n finishStream(true);\n return result;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n if (property === \"pipeTo\") {\n return async (...pipeArgs: any[]) => {\n try {\n const result = await target.pipeTo(...pipeArgs);\n finishStream();\n return result;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n const value = Reflect.get(target, property, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n\n try {\n // Set common attributes\n setCommonSpanAttrs(span, opts);\n\n // Session/end-user identity (root span only; skipped on a non-root child).\n const spanIsRoot = isRoot && !autoRoot.root;\n applySessionAttributes(span, opts.sessionId, spanIsRoot, {\n parentSessionId: opts.parentSessionId,\n sessionFeatureName: opts.sessionFeatureName,\n sessionEntryPoint: opts.sessionEntryPoint,\n });\n applyEndUserAttributes(\n span,\n opts.endUserId,\n opts.endUserMetadata,\n spanIsRoot,\n );\n\n // Capture input\n if (captureInput && args.length > 0) {\n try {\n const inputValue =\n args.length === 1\n ? serializeObj(args[0])\n : args.map(serializeObj);\n span.setAttribute(\n \"input.value\",\n safeJsonDumps(\n captureMedia(\n span,\n mediaPrefix(\"input\"),\n inputValue,\n \"input\",\n ),\n ),\n );\n } catch (err) {\n logger.debug(`Failed to capture input: ${err}`);\n }\n }\n\n // Execute the function\n const result = fn(...args);\n\n const handleResult = (resolved: any): any => {\n // A promise may resolve to a stream. Classify the resolved value before\n // ending the span so async factories remain open through consumption.\n if (isReadableStreamLike(resolved))\n return wrapReadableStream(resolved);\n if (isAsyncIterable(resolved)) return wrapAsyncIterable(resolved);\n if (isSyncIterator(resolved)) return wrapSyncIterator(resolved);\n finishSuccess(resolved);\n return resolved;\n };\n\n // Handle any Promise/A+ thenable, not only native Promise instances.\n if (isPromiseLike(result)) {\n return Promise.resolve(result)\n .then(handleResult)\n .catch((error: any) => {\n finishError(error);\n throw error;\n });\n }\n\n return handleResult(result);\n } catch (error: any) {\n finishError(error);\n throw error;\n }\n }, autoRoot.ctx, autoRoot.root);\n };\n\n // Preserve function name for debugging\n Object.defineProperty(wrapped, \"name\", {\n value: spanName,\n configurable: true,\n });\n\n return wrapped as any;\n}\n\n/** Extract named arguments from function call (best-effort). */\nfunction _extractBoundInputs(fn: Function, args: any[]): Record<string, any> {\n const result: Record<string, any> = {};\n // Parse function parameter names from toString()\n const fnStr = fn.toString();\n const match = fnStr.match(/\\(([^)]*)\\)/);\n if (match) {\n const paramNames = match[1]\n .split(\",\")\n .map((p) =>\n p\n .trim()\n .replace(/\\s*[:=].*$/, \"\")\n .replace(/^\\.\\.\\./, \"\"),\n )\n .filter(Boolean);\n for (let i = 0; i < Math.min(paramNames.length, args.length); i++) {\n result[paramNames[i]] = args[i];\n }\n }\n return result;\n}\n","/**\n * High-level span() function wrapper and Span() class-method decorator.\n *\n * Primary public API for instrumenting user code.\n */\n\nimport { type Span as OtelSpan } from '@opentelemetry/api';\nimport { VALID_SPAN_KINDS } from '../span-kinds/mapping.js';\nimport { decorateSpan, safeJsonDumps, serializeObj, type DecorateSpanOptions } from './base.js';\nimport { getLogger } from '../core/logger.js';\nimport { captureMedia, mediaReferences } from '../core/media.js';\nimport type { SpanOptions, SpanKind } from '../types.js';\n\nconst logger = getLogger();\n\n/**\n * Wrap a function with OpenTelemetry span instrumentation.\n *\n * @example\n * ```typescript\n * const myWorkflow = span({ kind: 'WORKFLOW' }, async (query: string) => {\n * return await process(query);\n * });\n * await myWorkflow('What is TypeScript?');\n * ```\n */\nexport function span<TArgs extends any[], TReturn>(\n options: SpanOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n // Validate kind\n if (!VALID_SPAN_KINDS.has(options.kind)) {\n throw new Error(\n `Invalid span kind: '${options.kind}'. Must be one of: ${[...VALID_SPAN_KINDS].join(', ')}`,\n );\n }\n\n const decorateOpts: DecorateSpanOptions = { ...options };\n\n // Kind-specific attribute setup\n switch (options.kind) {\n case 'AGENT':\n decorateOpts.postprocessResult = _agentPostprocessor(options);\n break;\n case 'TOOL':\n decorateOpts.postprocessResult = _toolPostprocessor(options);\n break;\n case 'EMBEDDING':\n decorateOpts.postprocessResult = _embeddingPostprocessor(options);\n break;\n case 'RETRIEVER':\n decorateOpts.postprocessResult = retrieverPostprocessor;\n break;\n case 'MCP_TOOL':\n return _createMcpToolWrapper(options, fn);\n default:\n break;\n }\n\n return decorateSpan(decorateOpts, fn);\n}\n\n/** Agent-specific: set role and goal attributes. */\nfunction _agentPostprocessor(options: SpanOptions) {\n return (span: OtelSpan, _result: any, _boundInputs: Record<string, any>) => {\n if (options.role) {\n span.setAttribute('neatlogs.agent.role', options.role);\n }\n if (options.goal) {\n span.setAttribute('neatlogs.agent.goal', options.goal);\n }\n };\n}\n\n/** Tool-specific: set tool_name and parameters attributes. */\nfunction _toolPostprocessor(options: SpanOptions) {\n return (span: OtelSpan, _result: any, _boundInputs: Record<string, any>) => {\n if (options.toolName) {\n span.setAttribute('tool.name', options.toolName);\n }\n if (options.parameters) {\n span.setAttribute(\n 'tool.parameters',\n safeJsonDumps(\n captureMedia(\n span,\n 'neatlogs.tool.parameters',\n serializeObj(options.parameters),\n 'input',\n ),\n ),\n );\n }\n };\n}\n\n/** Embedding-specific: set model and dimension attributes. */\nfunction _embeddingPostprocessor(options: SpanOptions) {\n return (span: OtelSpan, _result: any, _boundInputs: Record<string, any>) => {\n if (options.model) {\n span.setAttribute('embedding.model_name', options.model);\n }\n if (options.dimension) {\n span.setAttribute('embedding.dimension', options.dimension);\n }\n };\n}\n\n/**\n * RETRIEVER postprocessor: extract documents from result.\n * Looks for query in 'query', 'question', 'text' keys.\n * Extracts documents from list results or dict with 'documents'/'docs'/'results' keys.\n * Sets canonical neatlogs.retriever.documents.N.* attributes for every document.\n */\nexport function retrieverPostprocessor(\n span: OtelSpan,\n result: any,\n boundInputs: Record<string, any>,\n): void {\n // Extract query\n for (const key of ['query', 'question', 'text']) {\n if (key in boundInputs && typeof boundInputs[key] === 'string') {\n span.setAttribute('neatlogs.retriever.query', boundInputs[key]);\n break;\n }\n }\n\n // Extract documents\n let docs: any[] | null = null;\n\n if (Array.isArray(result)) {\n docs = result;\n } else if (result && typeof result === 'object') {\n for (const key of ['documents', 'docs', 'results']) {\n if (Array.isArray(result[key])) {\n docs = result[key];\n break;\n }\n }\n }\n\n if (!docs) return;\n\n // Preserve every document; backend ingestion owns payload-size limits.\n for (let i = 0; i < docs.length; i++) {\n const doc = docs[i];\n const prefix = `neatlogs.retriever.documents.${i}`;\n\n if (typeof doc === 'string') {\n span.setAttribute(`${prefix}.content`, doc);\n } else if (doc && typeof doc === 'object') {\n if (doc.content || doc.page_content || doc.text) {\n span.setAttribute(`${prefix}.content`, doc.content ?? doc.page_content ?? doc.text);\n }\n if (doc.id) {\n span.setAttribute(`${prefix}.id`, String(doc.id));\n }\n if (doc.score !== undefined) {\n span.setAttribute(`${prefix}.score`, doc.score);\n }\n if (doc.metadata) {\n span.setAttribute(`${prefix}.metadata`, safeJsonDumps(doc.metadata));\n }\n }\n }\n}\n\n/**\n * MCP_TOOL special handling.\n * Checks first arg for .toJSON() / plain object.\n * Wraps string results as { result: \"...\" }.\n * Sets both mcp.* and standard attributes.\n */\nfunction _createMcpToolWrapper<TArgs extends any[], TReturn>(\n options: SpanOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => any {\n const decorateOpts: DecorateSpanOptions = {\n ...options,\n postprocessResult: (span: OtelSpan, result: any, boundInputs: Record<string, any>) => {\n // Set MCP-specific attributes\n if (options.toolName) {\n span.setAttribute('mcp.tool.name', options.toolName);\n span.setAttribute('tool.name', options.toolName);\n }\n if (options.parameters) {\n const capturedParameters = captureMedia(\n span,\n 'neatlogs.mcp_tool.parameters',\n serializeObj(options.parameters),\n 'input',\n );\n const serializedParameters = safeJsonDumps(capturedParameters);\n span.setAttribute('mcp.tool.parameters', serializedParameters);\n span.setAttribute('tool.parameters', serializedParameters);\n }\n if (options.toolJsonSchema) {\n span.setAttribute(\n 'tool.json_schema',\n safeJsonDumps(\n captureMedia(\n span,\n 'neatlogs.mcp_tool.schema',\n serializeObj(options.toolJsonSchema),\n 'input',\n ),\n ),\n );\n }\n\n // Wrap string results\n if (typeof result === 'string') {\n span.setAttribute(\n 'output.value',\n safeJsonDumps({ result: captureMcpStringResult(span, result) }),\n );\n }\n\n // Extract input from first arg if it has toJSON or is a plain object\n if (boundInputs && Object.keys(boundInputs).length > 0) {\n const firstArg = Object.values(boundInputs)[0];\n if (firstArg && typeof firstArg === 'object') {\n const serialized = typeof firstArg.toJSON === 'function'\n ? firstArg.toJSON()\n : serializeObj(firstArg);\n span.setAttribute(\n 'mcp.tool.input',\n safeJsonDumps(\n captureMedia(\n span,\n 'neatlogs.mcp_tool.input',\n serialized,\n 'input',\n ),\n ),\n );\n }\n }\n },\n };\n\n return decorateSpan(decorateOpts, fn);\n}\n\nfunction captureMcpStringResult(span: OtelSpan, result: string): unknown {\n if (/^\\s*data:/i.test(result)) {\n const captured = captureMedia(\n span,\n 'neatlogs.mcp_tool.output',\n { type: 'file', url: result },\n 'output',\n ) as { url?: unknown };\n return captured.url ?? '[REDACTED_MEDIA]';\n }\n\n try {\n const parsed = JSON.parse(result);\n if (mediaReferences(parsed, 'output').length === 0) return result;\n return safeJsonDumps(\n captureMedia(span, 'neatlogs.mcp_tool.output', parsed, 'output'),\n );\n } catch {\n return result;\n }\n}\n\n/**\n * TC39 Stage 3 class-method decorator variant.\n *\n * @example\n * ```typescript\n * class MyAgent {\n * @Span({ kind: 'AGENT', role: 'researcher' })\n * async run(query: string) { ... }\n * }\n * ```\n */\nexport function Span(options: SpanOptions) {\n return function <T extends (...args: any[]) => any>(\n target: T,\n context: ClassMethodDecoratorContext,\n ): T {\n // Validate eagerly at decoration-time (same behaviour as before this fix)\n // by building a temporary wrapper with a no-op target. span() will throw\n // here for invalid kinds before the class is instantiated.\n span(options, target);\n\n // TC39 stage-3 decorators replace the method on the prototype, so `this`\n // is the instance when the method is called normally (e.g. agent.run()).\n // `decorateSpan`'s closure calls `fn(...args)` without a receiver, which\n // loses `this` for instance methods that call other instance methods.\n // Wrap at the call site: bind `target` to the live `this` on every call\n // so that `fn(…args)` inside `decorateSpan` retains the correct receiver.\n function decoratorWrapper(this: unknown, ...args: Parameters<T>): ReturnType<T> {\n const boundTarget = target.bind(this) as T;\n const wrapped = span(options, boundTarget);\n return wrapped(...args) as ReturnType<T>;\n }\n Object.defineProperty(decoratorWrapper, 'name', { value: context.name, configurable: true });\n return decoratorWrapper as unknown as T;\n };\n}\n","import { createHash } from 'node:crypto';\nimport { TELEMETRY_SCHEMA_VERSION } from './schema-v2.js';\nimport { __version__ } from './version.js';\nimport { getCapturedEnvelope } from './core/doctor-capture.js';\nimport { _doctorRuntimeSnapshot } from './init.js';\n\nexport const DOCTOR_V2_FORMAT_VERSION = 'neatlogs.doctor/v2' as const;\n\nexport type DoctorV2Status = 'pass' | 'warn' | 'fail';\nexport type DoctorV2CheckStatus = DoctorV2Status | 'unknown';\n\nexport type DiagnosticSpan = Readonly<{\n span_id: string;\n parent_span_id: string | null;\n name: string;\n kind: string;\n status: string;\n input?: unknown;\n output?: unknown;\n choices?: readonly unknown[];\n expected_choice_count?: number;\n tool_calls?: readonly Readonly<{\n id: string;\n name?: string;\n arguments?: unknown;\n choice_index?: number;\n tool_call_index?: number;\n }>[];\n tool_call?: Readonly<{ id: string; name?: string; result?: unknown }>;\n streaming?: boolean;\n stream_fragments?: readonly unknown[];\n oversized?: boolean;\n payload_references?: readonly Readonly<{ digest: string; size: number; mime_type: string }>[];\n sampled?: boolean;\n ended?: boolean;\n start_time_ns?: number;\n duration_ns?: number;\n attributes?: Readonly<Record<string, unknown>>;\n}>;\n\nexport type DiagnosticEnvelope = Readonly<{\n trace_id: string;\n root_span_id: string;\n spans: readonly DiagnosticSpan[];\n}>;\n\nexport type DoctorV2Check = Readonly<{\n name: string;\n status: DoctorV2CheckStatus;\n reason_code: string;\n remediation_code: string;\n message: string;\n details?: Readonly<Record<string, string | number | boolean | null>>;\n}>;\n\nexport type DoctorV2Result = Readonly<{\n format_version: typeof DOCTOR_V2_FORMAT_VERSION;\n mode: 'local';\n status: DoctorV2Status;\n first_failure: string | null;\n runtime: Readonly<{\n language: 'typescript';\n sdk_version: string;\n schema_version: string;\n transport: 'otlp_http_protobuf';\n }>;\n capture?: Readonly<{\n trace_id: string;\n root_span_id: string;\n span_count: number;\n semantic_digest: string;\n }>;\n sampling: Readonly<{ effective_sampler: string; root_sample_rate: number; sampled: boolean }>;\n ownership: Readonly<{ provider: 'private' | 'ambiguous'; instrumentor_count: number }>;\n queue: Readonly<{ mode: 'batch' | 'diagnostic_capture'; pending_spans: number; dropped_spans: number; capacity: number | null }>;\n retry: Readonly<{ attempts: number; window_ms: number; exhausted: boolean }>;\n flush: Readonly<{ outcome: 'not_attempted' | 'success' | 'timeout' | 'failed'; timeout_ms: number; duration_ms: number | null }>;\n checks: readonly DoctorV2Check[];\n}>;\n\nconst TRACE_ID = /^[0-9a-f]{32}$/;\nconst SPAN_ID = /^[0-9a-f]{16}$/;\nconst DIGEST = /^sha256:[0-9a-f]{64}$/;\n\nconst remediation: Readonly<Record<string, string>> = Object.freeze({\n TRACE_ID_INVALID: 'RECREATE_TRACE',\n SPAN_ID_INVALID: 'RECREATE_SPAN',\n SPAN_ID_DUPLICATE: 'RECREATE_SPAN',\n PARENT_ID_INVALID: 'FIX_PARENT_CONTEXT',\n PARENT_MISSING: 'FIX_PARENT_CONTEXT',\n ROOT_MISSING: 'CREATE_ROOT_SPAN',\n ROOT_MULTIPLE: 'USE_SINGLE_ROOT',\n ROOT_NOT_ENDED: 'END_ROOT_SPAN',\n INPUT_JSON_INVALID: 'SERIALIZE_INPUT_JSON',\n OUTPUT_JSON_INVALID: 'SERIALIZE_OUTPUT_JSON',\n TOOL_CALL_MISSING: 'CAPTURE_TOOL_REQUEST',\n TOOL_EXECUTION_MISSING: 'CAPTURE_TOOL_EXECUTION',\n CHOICE_LOSS: 'PRESERVE_ALL_CHOICES',\n STREAM_FRAGMENT_MISSING: 'PRESERVE_STREAM_FRAGMENTS',\n PAYLOAD_ATTACHMENT_REQUIRED: 'UPLOAD_PAYLOAD_ATTACHMENT',\n SAMPLING_INCONSISTENT: 'FIX_PARENT_BASED_SAMPLING',\n FLUSH_TIMEOUT: 'INCREASE_FLUSH_BUDGET',\n PROVIDER_OWNERSHIP_AMBIGUOUS: 'USE_PRIVATE_PROVIDER',\n LATENCY_OUTLIER: 'INVESTIGATE_SLOW_OPERATION',\n RATE_LIMITED: 'RESPECT_RETRY_AFTER',\n PII_DETECTED: 'MASK_SENSITIVE_CONTENT',\n LOCAL_ENVELOPE_VALID: 'NONE',\n});\n\nfunction canonicalize(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalize);\n if (value && typeof value === 'object') {\n const output: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n const item = (value as Record<string, unknown>)[key];\n if (item !== undefined) output[key] = canonicalize(item);\n }\n return output;\n }\n if (typeof value === 'number' && !Number.isFinite(value)) throw new TypeError('Diagnostic envelope contains a non-finite number');\n return value;\n}\n\nexport function doctorSemanticDigest(envelope: DiagnosticEnvelope): string {\n const namesById = new Map(envelope.spans.map((span) => [span.span_id, span.name]));\n const stableFields = [\n 'name',\n 'kind',\n 'status',\n 'input',\n 'output',\n 'choices',\n 'expected_choice_count',\n 'tool_calls',\n 'tool_call',\n 'streaming',\n 'oversized',\n 'payload_references',\n 'sampled',\n 'ended',\n ] as const;\n const projection = {\n spans: envelope.spans\n .filter((span) => span.name !== 'neatlogs.trace.complete')\n .map((span) => {\n const item: Record<string, unknown> = {};\n for (const field of stableFields) {\n if (span[field] !== undefined) item[field] = span[field];\n }\n item.parent = span.parent_span_id === null\n ? null\n : namesById.get(span.parent_span_id) ?? null;\n return item;\n })\n .sort((left, right) => {\n const leftKey = `${String(left.name)}\\u0000${String(left.kind)}`;\n const rightKey = `${String(right.name)}\\u0000${String(right.kind)}`;\n return leftKey < rightKey ? -1 : leftKey > rightKey ? 1 : 0;\n }),\n };\n const bytes = JSON.stringify(canonicalize(projection));\n return `sha256:${createHash('sha256').update(bytes, 'utf8').digest('hex')}`;\n}\n\nfunction failure(name: string, reason_code: keyof typeof remediation, message: string, details?: Record<string, string | number | boolean | null>): DoctorV2Check {\n return Object.freeze({ name, status: 'fail', reason_code, remediation_code: remediation[reason_code], message, ...(details ? { details: Object.freeze(details) } : {}) });\n}\n\nfunction warning(name: string, reason_code: keyof typeof remediation, message: string, details?: Record<string, string | number | boolean | null>): DoctorV2Check {\n return Object.freeze({ name, status: 'warn', reason_code, remediation_code: remediation[reason_code], message, ...(details ? { details: Object.freeze(details) } : {}) });\n}\n\nfunction median(values: readonly number[]): number {\n const sorted = [...values].sort((left, right) => left - right);\n const middle = Math.floor(sorted.length / 2);\n return sorted.length % 2 === 0\n ? ((sorted[middle - 1] ?? 0) + (sorted[middle] ?? 0)) / 2\n : (sorted[middle] ?? 0);\n}\n\nfunction latencyWarnings(envelope: DiagnosticEnvelope): DoctorV2Check[] {\n const groups = new Map<string, Array<{ span: DiagnosticSpan; index: number }>>();\n envelope.spans.forEach((span, index) => {\n if (span.kind.toUpperCase() !== 'LLM' || !Number.isFinite(span.duration_ns) || (span.duration_ns ?? 0) < 0) return;\n const operation = typeof span.attributes?.['gen_ai.operation.name'] === 'string'\n ? span.attributes['gen_ai.operation.name'] as string\n : span.name;\n const group = groups.get(operation) ?? [];\n group.push({ span, index });\n groups.set(operation, group);\n });\n const checks: DoctorV2Check[] = [];\n for (const [operation, group] of groups) {\n if (group.length < 3) continue;\n const ordered = [...group].sort((left, right) =>\n (left.span.start_time_ns ?? left.index) - (right.span.start_time_ns ?? right.index));\n const baseline = median(group.map(({ span }) => span.duration_ns ?? 0));\n const threshold = Math.max(500_000_000, baseline * 3);\n for (const { span } of ordered.slice(1)) {\n if ((span.duration_ns ?? 0) > threshold) {\n checks.push(warning('latency', 'LATENCY_OUTLIER', 'LLM latency is an outlier for this operation', {\n span_id: span.span_id,\n operation,\n duration_ns: span.duration_ns ?? 0,\n median_ns: baseline,\n threshold_ns: threshold,\n }));\n }\n }\n }\n return checks;\n}\n\nconst THROTTLE_CODES = new Set([\n 'rate_limit_exceeded', 'rate_limit_error', 'resource_exhausted',\n 'throttlingexception', 'toomanyrequests', 'too_many_requests',\n]);\n\nfunction rateLimitSignal(attributes: Readonly<Record<string, unknown>> | undefined): string | null {\n if (!attributes) return null;\n for (const [rawKey, value] of Object.entries(attributes)) {\n const key = rawKey.toLowerCase();\n const normalized = String(value).toLowerCase();\n if ((key.includes('http') || key.includes('status')) && (normalized === '429' || normalized === '503')) return 'http_status';\n if (key.includes('retry-after') || key.includes('retry_after')) return 'retry_after';\n if (THROTTLE_CODES.has(normalized)) return 'provider_code';\n if (key.includes('rate_limit_remaining') || key.includes('ratelimit_remaining')) {\n const remaining = typeof value === 'number' ? value : Number(value);\n if (Number.isFinite(remaining) && remaining <= 1) return 'rate_limit_remaining';\n }\n }\n return null;\n}\n\nfunction rateLimitWarnings(envelope: DiagnosticEnvelope): DoctorV2Check[] {\n return envelope.spans.flatMap((span) => {\n const signal = rateLimitSignal(span.attributes);\n return signal\n ? [warning('rate_limit', 'RATE_LIMITED', 'Span contains a provider throttling signal', { span_id: span.span_id, signal })]\n : [];\n });\n}\n\nconst PII_PATTERNS: ReadonlyArray<readonly [string, RegExp]> = [\n ['email', /\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/i],\n ['us_phone', /\\b(?:\\+?1[-.\\s]?)?(?:\\(?\\d{3}\\)?[-.\\s]?)\\d{3}[-.\\s]?\\d{4}\\b/],\n ['us_ssn', /\\b\\d{3}-\\d{2}-\\d{4}\\b/],\n ['credit_card', /\\b(?:\\d[ -]*?){13,19}\\b/],\n];\n\nfunction piiCategories(value: unknown): Set<string> {\n const categories = new Set<string>();\n const seen = new WeakSet<object>();\n let visited = 0;\n const walk = (item: unknown, depth: number): void => {\n if (depth > 12 || visited++ > 10_000) return;\n if (typeof item === 'string') {\n for (const [category, pattern] of PII_PATTERNS) if (pattern.test(item)) categories.add(category);\n return;\n }\n if (!item || typeof item !== 'object' || seen.has(item)) return;\n seen.add(item);\n if (Array.isArray(item)) for (const child of item) walk(child, depth + 1);\n else for (const child of Object.values(item as Record<string, unknown>)) walk(child, depth + 1);\n };\n walk(value, 0);\n return categories;\n}\n\nfunction piiWarnings(envelope: DiagnosticEnvelope): DoctorV2Check[] {\n return envelope.spans.flatMap((span) => {\n const categories = piiCategories(span.attributes);\n return categories.size > 0\n ? [warning('privacy', 'PII_DETECTED', 'Span attributes contain potential sensitive data', {\n span_id: span.span_id,\n categories: [...categories].sort().join(','),\n })]\n : [];\n });\n}\n\nfunction jsonSafe(value: unknown): boolean {\n try { JSON.stringify(canonicalize(value)); return true; } catch { return false; }\n}\n\nfunction collectNestedToolRequestIds(value: unknown, output: Set<string>): void {\n if (Array.isArray(value)) {\n for (const child of value) collectNestedToolRequestIds(child, output);\n return;\n }\n if (!value || typeof value !== 'object') return;\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n if (key === 'tool_calls' && Array.isArray(child)) {\n for (const call of child) {\n if (call && typeof call === 'object' && typeof (call as Record<string, unknown>).id === 'string') {\n output.add((call as Record<string, unknown>).id as string);\n }\n }\n }\n collectNestedToolRequestIds(child, output);\n }\n}\n\n/** Validate the finished, masked, normalized envelope captured before network send. */\nexport function doctorLocalV2(\n envelope: DiagnosticEnvelope,\n options: Readonly<{ flushOutcome?: 'not_attempted' | 'success' | 'timeout' | 'failed'; flushTimeoutMs?: number; flushDurationMs?: number | null; privateProvider?: boolean; instrumentorCount?: number; checkPii?: boolean; effectiveSampler?: string; rootSampleRate?: number; queueMode?: 'batch' | 'diagnostic_capture'; queueMaxSize?: number | null; pendingSpans?: number; droppedSpans?: number; retryAttempts?: number; retryWindowMs?: number; retryExhausted?: boolean }> = {},\n): DoctorV2Result {\n const checks: DoctorV2Check[] = [];\n if (!TRACE_ID.test(envelope.trace_id)) checks.push(failure('trace_id', 'TRACE_ID_INVALID', 'Trace ID must be 32 lowercase hexadecimal characters'));\n const ids = new Set<string>();\n for (const span of envelope.spans) {\n if (!SPAN_ID.test(span.span_id)) checks.push(failure('span_id', 'SPAN_ID_INVALID', 'Span ID must be 16 lowercase hexadecimal characters', { span_name: span.name }));\n if (ids.has(span.span_id)) checks.push(failure('span_id', 'SPAN_ID_DUPLICATE', 'Span IDs must be unique', { span_id: span.span_id }));\n ids.add(span.span_id);\n }\n const roots = envelope.spans.filter((span) => span.parent_span_id === null);\n if (roots.length === 0 || !ids.has(envelope.root_span_id)) checks.push(failure('root', 'ROOT_MISSING', 'Exactly one declared root span is required'));\n else if (roots.length > 1 || roots[0]?.span_id !== envelope.root_span_id) checks.push(failure('root', 'ROOT_MULTIPLE', 'The envelope must contain one declared root span'));\n else if (roots[0].ended !== true) checks.push(failure('root', 'ROOT_NOT_ENDED', 'The root span must be ended before capture'));\n for (const span of envelope.spans) {\n if (span.parent_span_id !== null && !SPAN_ID.test(span.parent_span_id)) checks.push(failure('parent', 'PARENT_ID_INVALID', 'Parent ID must be a valid span ID', { span_id: span.span_id }));\n else if (span.parent_span_id !== null && !ids.has(span.parent_span_id)) checks.push(failure('parent', 'PARENT_MISSING', 'Parent span is absent from the envelope', { span_id: span.span_id }));\n if (span.input !== undefined && !jsonSafe(span.input)) checks.push(failure('input', 'INPUT_JSON_INVALID', 'Span input is not canonical JSON', { span_id: span.span_id }));\n if (span.output !== undefined && !jsonSafe(span.output)) checks.push(failure('output', 'OUTPUT_JSON_INVALID', 'Span output is not canonical JSON', { span_id: span.span_id }));\n if (span.expected_choice_count !== undefined && (span.choices?.length ?? 0) < span.expected_choice_count) checks.push(failure('choices', 'CHOICE_LOSS', 'The normalized response lost one or more model choices', { span_id: span.span_id }));\n if (span.streaming && (span.stream_fragments?.length ?? 0) === 0) checks.push(failure('stream', 'STREAM_FRAGMENT_MISSING', 'Streaming span has no captured fragments', { span_id: span.span_id }));\n if (span.oversized && !(span.payload_references?.some((reference) => reference.size > 0 && DIGEST.test(reference.digest) && reference.mime_type.length > 0))) checks.push(failure('payload', 'PAYLOAD_ATTACHMENT_REQUIRED', 'Oversized content requires a valid payload reference', { span_id: span.span_id }));\n }\n const requested = new Set(envelope.spans.flatMap((span) => span.tool_calls ?? []).map((call) => call.id));\n for (const span of envelope.spans) collectNestedToolRequestIds(span.choices, requested);\n const executed = new Set(envelope.spans.flatMap((span) => span.tool_call ? [span.tool_call.id] : []));\n for (const callId of requested) if (!executed.has(callId)) checks.push(failure('tools', 'TOOL_EXECUTION_MISSING', 'Assistant-requested tool call has no execution span', { call_id: callId }));\n for (const callId of executed) if (!requested.has(callId)) checks.push(failure('tools', 'TOOL_CALL_MISSING', 'Tool execution has no preserved assistant request', { call_id: callId }));\n const sampling = new Set(envelope.spans.map((span) => span.sampled).filter((value): value is boolean => value !== undefined));\n if (sampling.size > 1) checks.push(failure('sampling', 'SAMPLING_INCONSISTENT', 'All spans in a trace must share the root sampling decision'));\n if (options.privateProvider === false) checks.push(failure('ownership', 'PROVIDER_OWNERSHIP_AMBIGUOUS', 'Doctor could not prove private provider ownership'));\n const flushOutcome = options.flushOutcome ?? 'success';\n if (flushOutcome === 'timeout') checks.push(failure('flush', 'FLUSH_TIMEOUT', 'Diagnostic capture did not flush within the configured deadline'));\n checks.push(...latencyWarnings(envelope), ...rateLimitWarnings(envelope));\n if (options.checkPii === true) checks.push(...piiWarnings(envelope));\n\n if (checks.length === 0) checks.push(Object.freeze({ name: 'local_envelope', status: 'pass', reason_code: 'LOCAL_ENVELOPE_VALID', remediation_code: 'NONE', message: 'The final normalized local envelope is valid' }));\n const first = checks.find((check) => check.status === 'fail');\n const hasWarning = checks.some((check) => check.status === 'warn');\n let digest: string | undefined;\n try { digest = doctorSemanticDigest(envelope); } catch { /* an existing JSON failure is safer than emitting a partial digest */ }\n return Object.freeze({\n format_version: DOCTOR_V2_FORMAT_VERSION,\n mode: 'local',\n status: first ? 'fail' : hasWarning ? 'warn' : 'pass',\n first_failure: first?.reason_code ?? null,\n runtime: Object.freeze({ language: 'typescript', sdk_version: __version__, schema_version: String(TELEMETRY_SCHEMA_VERSION), transport: 'otlp_http_protobuf' }),\n ...(digest && TRACE_ID.test(envelope.trace_id) && SPAN_ID.test(envelope.root_span_id) ? { capture: Object.freeze({ trace_id: envelope.trace_id, root_span_id: envelope.root_span_id, span_count: envelope.spans.length, semantic_digest: digest }) } : {}),\n sampling: Object.freeze({ effective_sampler: options.effectiveSampler ?? 'parentbased_traceidratio', root_sample_rate: options.rootSampleRate ?? 1, sampled: envelope.spans.find((span) => span.sampled !== undefined)?.sampled ?? true }),\n ownership: Object.freeze({ provider: options.privateProvider === false ? 'ambiguous' : 'private', instrumentor_count: options.instrumentorCount ?? 0 }),\n queue: Object.freeze({ mode: options.queueMode ?? 'diagnostic_capture', pending_spans: options.pendingSpans ?? 0, dropped_spans: options.droppedSpans ?? 0, capacity: options.queueMaxSize ?? 2_048 }),\n retry: Object.freeze({ attempts: options.retryAttempts ?? 0, window_ms: options.retryWindowMs ?? 0, exhausted: options.retryExhausted ?? false }),\n flush: Object.freeze({ outcome: flushOutcome, timeout_ms: options.flushTimeoutMs ?? 5_000, duration_ms: options.flushDurationMs ?? null }),\n checks: Object.freeze(checks),\n });\n}\n\n/** Inspect the latest trace captured at the final masked export boundary. */\nexport function doctorCapturedLocalV2(\n options: Readonly<{ traceId?: string; flushOutcome?: 'not_attempted' | 'success' | 'timeout' | 'failed'; flushTimeoutMs?: number; flushDurationMs?: number | null; checkPii?: boolean }> = {},\n): DoctorV2Result | null {\n const envelope = getCapturedEnvelope(options.traceId);\n if (!envelope) return null;\n const runtime = _doctorRuntimeSnapshot();\n return doctorLocalV2(envelope, {\n flushOutcome: options.flushOutcome,\n flushTimeoutMs: options.flushTimeoutMs,\n flushDurationMs: options.flushDurationMs,\n privateProvider: runtime.ownsTracerProvider,\n effectiveSampler: runtime.effectiveSampler.split(':')[0],\n rootSampleRate: Number(runtime.effectiveSampler.split(':').at(-1)) || 0,\n queueMode: runtime.exportEnabled ? 'batch' : 'diagnostic_capture',\n queueMaxSize: runtime.queueMaxSize,\n droppedSpans: runtime.exportHealth?.droppedSpans ?? 0,\n checkPii: options.checkPii,\n });\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.neatlogs.com/telemetry/v2/neatlogs-telemetry.schema.json\",\n \"title\": \"NeatLogs Canonical Telemetry Span Envelope v2\",\n \"description\": \"The language-neutral canonical span representation used after capture normalization and before masking/export.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"schema_version\",\n \"trace_id\",\n \"span_id\",\n \"parent_span_id\",\n \"name\",\n \"kind\",\n \"ownership\",\n \"wrapper\",\n \"input\",\n \"output\",\n \"status\",\n \"error\",\n \"code\",\n \"provenance\",\n \"conflicts\",\n \"semantic\",\n \"attributes\"\n ],\n \"properties\": {\n \"schema_version\": {\n \"const\": 2\n },\n \"trace_id\": {\n \"$ref\": \"#/$defs/traceId\"\n },\n \"span_id\": {\n \"$ref\": \"#/$defs/spanId\"\n },\n \"parent_span_id\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/spanId\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 1024\n },\n \"kind\": {\n \"$ref\": \"#/$defs/spanKind\"\n },\n \"start_time_unix_nano\": {\n \"$ref\": \"#/$defs/uint64String\"\n },\n \"end_time_unix_nano\": {\n \"$ref\": \"#/$defs/uint64String\"\n },\n \"ownership\": {\n \"$ref\": \"#/$defs/ownership\"\n },\n \"wrapper\": {\n \"$ref\": \"#/$defs/wrapper\"\n },\n \"input\": {\n \"$ref\": \"#/$defs/typedValue\"\n },\n \"output\": {\n \"$ref\": \"#/$defs/typedValue\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/status\"\n },\n \"error\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/error\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"code\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/codeLocation\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"provenance\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/provenance\"\n }\n },\n \"conflicts\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/conflict\"\n }\n },\n \"semantic\": {\n \"$ref\": \"#/$defs/semantic\"\n },\n \"attributes\": {\n \"type\": \"object\",\n \"description\": \"Non-canonical source attributes retained for compatibility and debugging. They never override canonical fields.\",\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n }\n },\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"LLM\"\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/llmSemantic\"\n }\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"TOOL\",\n \"MCP_TOOL\"\n ]\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/toolSemantic\"\n }\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"RETRIEVER\"\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/retrieverSemantic\"\n }\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"RERANKER\"\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/rerankerSemantic\"\n }\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"EMBEDDING\"\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/embeddingSemantic\"\n }\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"VECTOR_STORE\"\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/vectorStoreSemantic\"\n }\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"MEMORY\"\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/memorySemantic\"\n }\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"GUARDRAIL\"\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/guardrailSemantic\"\n }\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"LOG\"\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/logSemantic\"\n }\n }\n }\n }\n ],\n \"$defs\": {\n \"traceId\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9a-f]{32}$\"\n },\n \"spanId\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9a-f]{16}$\"\n },\n \"uint64String\": {\n \"type\": \"string\",\n \"pattern\": \"^(0|[1-9][0-9]*)$\"\n },\n \"jsonValue\": {\n \"oneOf\": [\n {\n \"type\": \"null\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n },\n {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n }\n ]\n },\n \"spanKind\": {\n \"type\": \"string\",\n \"enum\": [\n \"WORKFLOW\",\n \"AGENT\",\n \"CHAIN\",\n \"TASK\",\n \"LLM\",\n \"TOOL\",\n \"MCP_TOOL\",\n \"RETRIEVER\",\n \"RERANKER\",\n \"EMBEDDING\",\n \"VECTOR_STORE\",\n \"MEMORY\",\n \"GUARDRAIL\",\n \"EVALUATOR\",\n \"LOG\",\n \"HTTP\",\n \"UNKNOWN\"\n ]\n },\n \"ownership\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"owner\",\n \"provider_generation\",\n \"project_key_id\",\n \"propagation\"\n ],\n \"properties\": {\n \"owner\": {\n \"type\": \"string\",\n \"enum\": [\n \"neatlogs-sdk\",\n \"neatlogs-ingest-adapter\",\n \"neatlogs-backend-recovery\",\n \"external-otel\"\n ]\n },\n \"provider_generation\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"project_key_id\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"propagation\": {\n \"type\": \"string\",\n \"enum\": [\n \"local-private-context\",\n \"explicit-neatlogs-remote\",\n \"backend-projection\",\n \"external-ingest\"\n ]\n }\n }\n },\n \"wrapper\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"captured\",\n \"integration\",\n \"integration_version\",\n \"capture_fidelity\"\n ],\n \"properties\": {\n \"captured\": {\n \"type\": \"boolean\"\n },\n \"integration\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"integration_version\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"capture_fidelity\": {\n \"type\": \"string\",\n \"enum\": [\n \"native\",\n \"normalized\",\n \"flattened\",\n \"synthetic-recovery\",\n \"unknown\"\n ]\n }\n }\n },\n \"typedValue\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"value\",\n \"media\"\n ],\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"none\",\n \"text\",\n \"json\",\n \"messages\",\n \"documents\",\n \"media\",\n \"binary-reference\"\n ]\n },\n \"value\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"media\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/mediaReference\"\n }\n }\n }\n },\n \"mediaReference\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"sha256\",\n \"mime_type\",\n \"byte_length\",\n \"source\",\n \"purpose\",\n \"state\",\n \"safe_preview\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"sha256\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9a-f]{64}$\"\n },\n \"mime_type\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"byte_length\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"source\": {\n \"type\": \"string\",\n \"enum\": [\n \"inline\",\n \"url\",\n \"file\",\n \"provider\",\n \"uploaded\",\n \"generated\"\n ]\n },\n \"purpose\": {\n \"type\": \"string\",\n \"enum\": [\n \"input\",\n \"output\",\n \"tool-argument\",\n \"tool-result\",\n \"document\",\n \"raw-stream\",\n \"overflow\"\n ]\n },\n \"state\": {\n \"type\": \"string\",\n \"enum\": [\n \"inline\",\n \"pending-upload\",\n \"available\",\n \"failed\",\n \"expired\"\n ]\n },\n \"safe_preview\": {\n \"type\": [\n \"string\",\n \"null\"\n ],\n \"maxLength\": 4096\n }\n }\n },\n \"status\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"code\",\n \"message\",\n \"source\"\n ],\n \"properties\": {\n \"code\": {\n \"type\": \"string\",\n \"enum\": [\n \"UNSET\",\n \"OK\",\n \"ERROR\"\n ]\n },\n \"message\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"source\": {\n \"type\": \"string\",\n \"enum\": [\n \"application\",\n \"provider\",\n \"sdk\",\n \"backend-recovery\",\n \"unknown\"\n ]\n }\n }\n },\n \"error\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"message\",\n \"stack\",\n \"escaped\"\n ],\n \"properties\": {\n \"type\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"message\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"stack\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"escaped\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"codeLocation\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"file\",\n \"function\",\n \"line\",\n \"column\",\n \"namespace\"\n ],\n \"properties\": {\n \"file\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"function\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"line\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 1\n },\n \"column\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 1\n },\n \"namespace\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n }\n }\n },\n \"sourceDialect\": {\n \"type\": \"string\",\n \"enum\": [\n \"native-v2\",\n \"neatlogs-direct\",\n \"otel-genai\",\n \"openinference\",\n \"provider-specific\",\n \"external-legacy\",\n \"unknown-raw\"\n ]\n },\n \"provenance\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"target\",\n \"source_dialect\",\n \"source_key\",\n \"precedence\",\n \"action\"\n ],\n \"properties\": {\n \"target\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"source_dialect\": {\n \"$ref\": \"#/$defs/sourceDialect\"\n },\n \"source_key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"precedence\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 7\n },\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"accepted\",\n \"synthesized\",\n \"missing\",\n \"ignored-lower-precedence\",\n \"retained-raw\",\n \"rejected-invalid\"\n ]\n }\n }\n },\n \"conflict\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"target\",\n \"winner_source_key\",\n \"loser_source_key\",\n \"reason_code\"\n ],\n \"properties\": {\n \"target\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"winner_source_key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"loser_source_key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"reason_code\": {\n \"type\": \"string\",\n \"enum\": [\n \"LOWER_PRECEDENCE\",\n \"INVALID_TYPE\",\n \"INVALID_JSON\",\n \"EMPTY_VALUE\",\n \"DUPLICATE_SEMANTIC_VALUE\",\n \"UNSUPPORTED_SOURCE\"\n ]\n }\n }\n },\n \"message\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"role\",\n \"name\",\n \"content\",\n \"tool_calls\",\n \"tool_call_id\"\n ],\n \"properties\": {\n \"role\": {\n \"type\": \"string\",\n \"enum\": [\n \"system\",\n \"developer\",\n \"user\",\n \"assistant\",\n \"tool\"\n ]\n },\n \"name\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"content\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/contentPart\"\n }\n },\n \"tool_calls\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/toolCall\"\n }\n },\n \"tool_call_id\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n }\n }\n },\n \"contentPart\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"text\"\n ],\n \"properties\": {\n \"type\": {\n \"const\": \"text\"\n },\n \"text\": {\n \"type\": \"string\"\n }\n }\n },\n {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"reference\"\n ],\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"image\",\n \"audio\",\n \"document\",\n \"video\"\n ]\n },\n \"reference\": {\n \"$ref\": \"#/$defs/mediaReference\"\n }\n }\n },\n {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"call_id\",\n \"value\",\n \"is_error\"\n ],\n \"properties\": {\n \"type\": {\n \"const\": \"tool_result\"\n },\n \"call_id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"value\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"is_error\": {\n \"type\": \"boolean\"\n }\n }\n }\n ]\n },\n \"toolDefinition\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"name\",\n \"description\",\n \"schema\",\n \"configuration\"\n ],\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"description\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"schema\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"configuration\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n }\n },\n \"toolCall\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"id_origin\",\n \"type\",\n \"name\",\n \"arguments\",\n \"choice_index\",\n \"tool_index\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"id_origin\": {\n \"type\": \"string\",\n \"enum\": [\n \"neatlogs-direct\",\n \"provider\",\n \"deterministic-synthetic\"\n ]\n },\n \"type\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"arguments\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"choice_index\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"tool_index\": {\n \"type\": \"integer\",\n \"minimum\": 0\n }\n }\n },\n \"toolResult\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"call_id\",\n \"value\",\n \"is_error\",\n \"media\"\n ],\n \"properties\": {\n \"call_id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"value\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"is_error\": {\n \"type\": \"boolean\"\n },\n \"media\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/mediaReference\"\n }\n }\n }\n },\n \"llmParameters\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"temperature\",\n \"top_p\",\n \"top_k\",\n \"max_output_tokens\",\n \"stop\",\n \"seed\",\n \"frequency_penalty\",\n \"presence_penalty\",\n \"response_format\",\n \"reasoning\",\n \"service_tier\",\n \"provider_options\"\n ],\n \"properties\": {\n \"temperature\": {\n \"type\": [\n \"number\",\n \"null\"\n ]\n },\n \"top_p\": {\n \"type\": [\n \"number\",\n \"null\"\n ]\n },\n \"top_k\": {\n \"type\": [\n \"number\",\n \"null\"\n ]\n },\n \"max_output_tokens\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"stop\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"seed\": {\n \"type\": [\n \"integer\",\n \"null\"\n ]\n },\n \"frequency_penalty\": {\n \"type\": [\n \"number\",\n \"null\"\n ]\n },\n \"presence_penalty\": {\n \"type\": [\n \"number\",\n \"null\"\n ]\n },\n \"response_format\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"reasoning\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"service_tier\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"provider_options\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n }\n },\n \"llmRequest\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"provider\",\n \"model\",\n \"operation\",\n \"messages\",\n \"tools\",\n \"parameters\"\n ],\n \"properties\": {\n \"provider\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"model\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"operation\": {\n \"type\": \"string\",\n \"enum\": [\n \"chat\",\n \"completion\",\n \"responses\",\n \"generate\",\n \"unknown\"\n ]\n },\n \"messages\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/message\"\n }\n },\n \"tools\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/toolDefinition\"\n }\n },\n \"parameters\": {\n \"$ref\": \"#/$defs/llmParameters\"\n }\n }\n },\n \"llmChoice\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"choice_index\",\n \"message\",\n \"finish_reason\"\n ],\n \"properties\": {\n \"choice_index\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"message\": {\n \"$ref\": \"#/$defs/message\"\n },\n \"finish_reason\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n }\n }\n },\n \"llmResponse\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"model\",\n \"choices\",\n \"finish_reasons\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"model\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"choices\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/llmChoice\"\n }\n },\n \"finish_reasons\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n }\n }\n }\n },\n \"llmUsage\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"input_tokens\",\n \"output_tokens\",\n \"total_tokens\",\n \"reasoning_tokens\",\n \"cache_read_tokens\",\n \"cache_write_tokens\",\n \"cost_usd\"\n ],\n \"properties\": {\n \"input_tokens\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"output_tokens\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"total_tokens\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"reasoning_tokens\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"cache_read_tokens\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"cache_write_tokens\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"cost_usd\": {\n \"type\": [\n \"number\",\n \"null\"\n ],\n \"minimum\": 0\n }\n }\n },\n \"streamEvent\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"sequence\",\n \"time_unix_nano\",\n \"type\",\n \"choice_index\",\n \"tool_index\",\n \"value\"\n ],\n \"properties\": {\n \"sequence\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"time_unix_nano\": {\n \"$ref\": \"#/$defs/uint64String\"\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"output_text.delta\",\n \"reasoning.delta\",\n \"tool_call.delta\",\n \"choice.finish\",\n \"usage\",\n \"error\"\n ]\n },\n \"choice_index\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"tool_index\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"value\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n }\n },\n \"llmStream\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"time_to_first_token_ms\",\n \"chunk_count\",\n \"choice_count\",\n \"events\",\n \"raw_chunks\"\n ],\n \"properties\": {\n \"time_to_first_token_ms\": {\n \"type\": [\n \"number\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"chunk_count\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"choice_count\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"events\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/streamEvent\"\n }\n },\n \"raw_chunks\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/mediaReference\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n }\n },\n \"llmSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"request\",\n \"response\",\n \"usage\",\n \"stream\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"LLM\"\n },\n \"request\": {\n \"$ref\": \"#/$defs/llmRequest\"\n },\n \"response\": {\n \"$ref\": \"#/$defs/llmResponse\"\n },\n \"usage\": {\n \"$ref\": \"#/$defs/llmUsage\"\n },\n \"stream\": {\n \"$ref\": \"#/$defs/llmStream\"\n }\n }\n },\n \"toolSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"definition\",\n \"call\",\n \"result\",\n \"requesting_span_id\",\n \"transport\"\n ],\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"TOOL\",\n \"MCP_TOOL\"\n ]\n },\n \"definition\": {\n \"$ref\": \"#/$defs/toolDefinition\"\n },\n \"call\": {\n \"$ref\": \"#/$defs/toolCall\"\n },\n \"result\": {\n \"$ref\": \"#/$defs/toolResult\"\n },\n \"requesting_span_id\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/spanId\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"transport\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/mcpTransport\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n }\n },\n \"document\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"content\",\n \"score\",\n \"metadata\",\n \"media\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"content\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"score\": {\n \"type\": [\n \"number\",\n \"null\"\n ]\n },\n \"metadata\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"media\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/mediaReference\"\n }\n }\n }\n },\n \"retrieverSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"query\",\n \"documents\",\n \"top_k\",\n \"filters\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"RETRIEVER\"\n },\n \"query\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"documents\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/document\"\n }\n },\n \"top_k\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"filters\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n }\n },\n \"rerankerSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"model\",\n \"query\",\n \"input_documents\",\n \"output_documents\",\n \"top_n\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"RERANKER\"\n },\n \"model\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"query\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"input_documents\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/document\"\n }\n },\n \"output_documents\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/document\"\n }\n },\n \"top_n\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n }\n }\n },\n \"embeddingSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"provider\",\n \"model\",\n \"inputs\",\n \"vectors\",\n \"dimensions\",\n \"usage\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"EMBEDDING\"\n },\n \"provider\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"model\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"inputs\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n },\n \"vectors\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"number\"\n }\n }\n },\n \"dimensions\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"usage\": {\n \"$ref\": \"#/$defs/llmUsage\"\n }\n }\n },\n \"vectorStoreSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"provider\",\n \"operation\",\n \"collection\",\n \"query\",\n \"documents\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"VECTOR_STORE\"\n },\n \"provider\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"operation\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"collection\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"query\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"documents\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/document\"\n }\n }\n }\n },\n \"memorySemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"operation\",\n \"memory_id\",\n \"scope\",\n \"value\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"MEMORY\"\n },\n \"operation\": {\n \"type\": \"string\",\n \"enum\": [\n \"read\",\n \"write\",\n \"update\",\n \"delete\",\n \"search\",\n \"unknown\"\n ]\n },\n \"memory_id\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"scope\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"value\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n }\n },\n \"guardrailSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"name\",\n \"action\",\n \"triggered\",\n \"score\",\n \"reason\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"GUARDRAIL\"\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"action\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"triggered\": {\n \"type\": \"boolean\"\n },\n \"score\": {\n \"type\": [\n \"number\",\n \"null\"\n ]\n },\n \"reason\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n }\n }\n },\n \"mcpTransport\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"transport\",\n \"server\",\n \"method\",\n \"request_id\"\n ],\n \"properties\": {\n \"transport\": {\n \"type\": \"string\",\n \"enum\": [\n \"stdio\",\n \"sse\",\n \"streamable-http\",\n \"websocket\",\n \"unknown\"\n ]\n },\n \"server\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"method\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"request_id\": {\n \"type\": [\n \"string\",\n \"number\",\n \"null\"\n ]\n }\n }\n },\n \"logSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"severity_text\",\n \"severity_number\",\n \"body\",\n \"logger_name\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"LOG\"\n },\n \"severity_text\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"severity_number\": {\n \"type\": [\n \"integer\",\n \"null\"\n ]\n },\n \"body\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"logger_name\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n }\n }\n },\n \"operationSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"operation\",\n \"role\",\n \"metadata\",\n \"recovery\"\n ],\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"WORKFLOW\",\n \"AGENT\",\n \"CHAIN\",\n \"TASK\",\n \"EVALUATOR\",\n \"HTTP\",\n \"UNKNOWN\"\n ]\n },\n \"operation\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"role\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"metadata\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"recovery\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/recovery\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n }\n },\n \"recovery\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"synthetic\",\n \"reason\",\n \"recovery_span_id\",\n \"genuine_root_span_id\",\n \"reconciled\"\n ],\n \"properties\": {\n \"synthetic\": {\n \"const\": true\n },\n \"reason\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"recovery_span_id\": {\n \"$ref\": \"#/$defs/spanId\"\n },\n \"genuine_root_span_id\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/spanId\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"reconciled\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"semantic\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/llmSemantic\"\n },\n {\n \"$ref\": \"#/$defs/toolSemantic\"\n },\n {\n \"$ref\": \"#/$defs/retrieverSemantic\"\n },\n {\n \"$ref\": \"#/$defs/rerankerSemantic\"\n },\n {\n \"$ref\": \"#/$defs/embeddingSemantic\"\n },\n {\n \"$ref\": \"#/$defs/vectorStoreSemantic\"\n },\n {\n \"$ref\": \"#/$defs/memorySemantic\"\n },\n {\n \"$ref\": \"#/$defs/guardrailSemantic\"\n },\n {\n \"$ref\": \"#/$defs/logSemantic\"\n },\n {\n \"$ref\": \"#/$defs/operationSemantic\"\n }\n ]\n }\n },\n \"x-neatlogs-policy\": {\n \"contract_version\": \"2.0.0\",\n \"attribute_prefix\": \"neatlogs.v2\",\n \"conflict_precedence\": [\n \"native-v2\",\n \"neatlogs-direct\",\n \"otel-genai\",\n \"openinference\",\n \"provider-specific\",\n \"external-legacy\",\n \"unknown-raw\"\n ],\n \"tool_calls\": {\n \"assistant_requests_live_in_assistant_message\": true,\n \"execution_is_separate_tool_span\": true,\n \"id_precedence\": [\n \"neatlogs-direct\",\n \"provider\",\n \"deterministic-synthetic\"\n ],\n \"retain_unlinked_execution\": true,\n \"forbid_name_timing_merge\": true\n },\n \"root_finalization\": {\n \"launch_sdk_auto_workflow_roots\": true,\n \"launch_completion_markers\": true,\n \"stale_root_recovery_is_safety_net\": true,\n \"recovered_root_status_must_not_be_fabricated_ok\": true,\n \"preserve_late_genuine_root_identity\": true,\n \"logical_root_only_finalization\": \"deferred-post-launch\"\n },\n \"launch_scope\": {\n \"sdk_transport\": \"otlp-http-protobuf\",\n \"python_openinference_compatibility\": \"retain-where-active\",\n \"sdk_product_apis_excluded\": [\n \"datasets\",\n \"evaluations\",\n \"scoring\",\n \"experiments\",\n \"new-prompt-apis\"\n ],\n \"new_go_integrations\": false,\n \"typescript_edge_entrypoint\": false\n },\n \"compatibility\": [\n {\n \"dialect\": \"neatlogs-direct\",\n \"patterns\": [\n \"neatlogs.span.kind\",\n \"neatlogs.doctor\",\n \"neatlogs.doctor.*\",\n \"neatlogs.workflow.*\",\n \"neatlogs.agent.*\",\n \"neatlogs.llm.*\",\n \"neatlogs.tool.*\",\n \"neatlogs.retriever.*\",\n \"neatlogs.reranker.*\",\n \"neatlogs.embedding.*\",\n \"neatlogs.vector_store.*\",\n \"neatlogs.memory.*\",\n \"neatlogs.guardrail.*\",\n \"neatlogs.evaluator.*\",\n \"neatlogs.mcp.*\",\n \"neatlogs.code.*\"\n ],\n \"launch_state\": \"accepted\"\n },\n {\n \"dialect\": \"otel-genai\",\n \"patterns\": [\n \"gen_ai.*\"\n ],\n \"launch_state\": \"accepted-at-normalization-boundary\"\n },\n {\n \"dialect\": \"openinference\",\n \"patterns\": [\n \"openinference.span.kind\",\n \"input.value\",\n \"input.mime_type\",\n \"output.value\",\n \"output.mime_type\",\n \"llm.*\",\n \"tool.*\",\n \"retrieval.*\",\n \"embedding.*\"\n ],\n \"launch_state\": \"accepted-for-active-python-integrations\"\n },\n {\n \"dialect\": \"provider-specific\",\n \"patterns\": [\n \"ai.*\",\n \"openai.*\",\n \"anthropic.*\",\n \"aws.bedrock.*\",\n \"google_genai.*\",\n \"vertex_ai.*\"\n ],\n \"launch_state\": \"accepted-at-source-adapter\"\n },\n {\n \"dialect\": \"external-legacy\",\n \"patterns\": [\n \"traceloop.*\",\n \"openlit.*\"\n ],\n \"launch_state\": \"accepted-with-provenance\"\n },\n {\n \"dialect\": \"unknown-raw\",\n \"patterns\": [\n \"*\"\n ],\n \"launch_state\": \"retain-raw-never-overwrite-canonical\"\n }\n ],\n \"compatibility_removal_gate\": {\n \"minimum_releases\": 2,\n \"minimum_observation_days\": 30,\n \"requires_zero_mapping_hits\": true,\n \"requires_source_adapter_migration\": true,\n \"requires_golden_fixture_removal_review\": true\n },\n \"deferred_post_launch\": [\n \"logical-root-only-finalization\",\n \"automatic-root-removal\",\n \"completion-marker-removal\",\n \"user-defined-export-filter\",\n \"runtime-tracing-toggle\",\n \"new-go-integrations\",\n \"typescript-edge-entrypoint\",\n \"sdk-datasets-evaluations-scoring-experiments\"\n ]\n }\n}\n","import schema from './contracts/v2/neatlogs-telemetry.schema.json';\n\nexport const TELEMETRY_CONTRACT_VERSION = '2.0.0' as const;\nexport const TELEMETRY_SCHEMA_VERSION = 2 as const;\nexport const TELEMETRY_SCHEMA_SHA256 =\n 'ae79717d127e2faa761ad83c8a51a08cae6fce00a04446d46dcc6d1a371818ce' as const;\n\n/** Parsed canonical telemetry contract bundled from the public schema bytes. */\nexport const TELEMETRY_SCHEMA_V2 = Object.freeze(schema);\n\n/** The frozen source-dialect order used for canonical conflict resolution. */\nexport const TELEMETRY_CONFLICT_PRECEDENCE = Object.freeze(\n [...schema['x-neatlogs-policy'].conflict_precedence] as const,\n);\n","/**\n * SDK version. Kept in sync with package.json by the `version:sync` script\n * (runs automatically on `prebuild`). Do not edit by hand — bump package.json.\n */\nexport const __version__ = '1.1.20';\n","/**\n * Neatlogs SDK initialisation, flush, and shutdown.\n *\n * Port of Python neatlogs/init.py to TypeScript.\n *\n * `init()` sets up the OTel TracerProvider, MeterProvider, LoggerProvider,\n * span processors, and exporters.\n * `flush()` and `shutdown()` handle graceful cleanup.\n */\n\nimport * as path from \"node:path\";\nimport { createHash } from \"node:crypto\";\n\nimport { Resource } from \"@opentelemetry/resources\";\nimport { ATTR_SERVICE_NAME } from \"@opentelemetry/semantic-conventions\";\nimport { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\";\nimport {\n ParentBasedSampler,\n TraceIdRatioBasedSampler,\n type BasicTracerProvider,\n type SpanProcessor,\n type SpanExporter,\n} from \"@opentelemetry/sdk-trace-base\";\nimport { ExportResultCode } from \"@opentelemetry/core\";\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-proto\";\nimport { CompressionAlgorithm } from \"@opentelemetry/otlp-exporter-base\";\nimport { LoggerProvider } from \"@opentelemetry/sdk-logs\";\nimport { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-proto\";\n\nimport {\n CompletionMarkerSpanProcessor,\n NeatlogsSpanProcessor,\n} from \"./core/span-processor.js\";\nimport { addVerificationMarkerResourceAttribute } from \"./core/resource.js\";\nimport { getRegisteredClients } from \"./core/client-registry.js\";\nimport { FilteringExporter } from \"./core/filtering-exporter.js\";\nimport { capturePreparedSpans, clearDoctorCapture } from \"./core/doctor-capture.js\";\nimport { ByteLimitedSpanExporter } from \"./core/byte-limited-exporter.js\";\nimport { MaskingLogExporter } from \"./core/masking-log-exporter.js\";\nimport { discardPendingMediaOwner } from \"./core/media.js\";\nimport {\n DeliveryDiagnostics,\n type DeliveryDiagnosticsSnapshot,\n} from \"./core/delivery-diagnostics.js\";\nimport {\n ObservableBatchLogRecordProcessor,\n ObservableBatchSpanProcessor,\n} from \"./core/observable-batch-processors.js\";\nimport { _setOtelLogger } from \"./core/log.js\";\nimport { _setSessionConfig } from \"./core/context.js\";\nimport { _setNeatlogsProvider } from \"./core/provider.js\";\nimport { getLogger, enableDebugLogging } from \"./core/logger.js\";\nimport {\n PromptClient,\n closeSharedClient,\n setSharedClient,\n} from \"./prompt/client.js\";\nimport { _resetMastraCache } from \"./mastra.js\";\nimport { __version__ } from \"./version.js\";\nimport { NeatlogsConfigurationError } from \"./errors.js\";\nimport { DEFAULT_INGEST_ENDPOINT, exportQueueCapacity } from \"./constants.js\";\nimport { runByDeadline } from \"./core/deadline.js\";\nimport {\n DisabledUploadAuthority,\n isUploadAuthority,\n resolveUploadAuthority,\n uploadsEnabledFromEnv,\n type UploadAuthorityOption,\n} from \"./core/upload-authority.js\";\nimport type { InitOptions } from \"./types.js\";\n\nconst logger = getLogger();\n\n// ---------------------------------------------------------------------------\n// Module-level state\n// ---------------------------------------------------------------------------\n\nlet _initialized = false;\ntype LifecycleState = \"uninitialized\" | \"initializing\" | \"running\" | \"closing\";\nlet _lifecycleState: LifecycleState = \"uninitialized\";\nlet _initPromise: Promise<void> | null = null;\nlet _tracerProvider: BasicTracerProvider | null = null;\nlet _ownsTracerProvider = false;\nlet _logProvider: LoggerProvider | null = null;\nlet _spanProcessor: NeatlogsSpanProcessor | null = null;\nlet _transportSpanProcessors: SpanProcessor[] = [];\nlet _completionProcessor: CompletionMarkerSpanProcessor | null = null;\nlet _debugMode = false;\nlet _deliveryDiagnostics = new DeliveryDiagnostics();\ninterface InitIdentity {\n serialized: string;\n mask: InitOptions[\"mask\"];\n tracerProvider: InitOptions[\"tracerProvider\"];\n uploadAuthority: UploadAuthorityOption | undefined;\n doctorProbeExporter: InitOptions[\"doctorProbeExporter\"];\n}\nlet _initIdentity: InitIdentity | null = null;\nlet _effectiveSampleRate = 1;\nlet _exportEnabled = false;\nlet _queueMaxSize = 2_048;\n\n// Track signal handlers so we can remove them in shutdown()\nlet _sigHandlersRegistered = false;\nlet _signalShutdownStarted = false;\nlet _shutdownPromise: Promise<boolean> | null = null;\nconst _shutdownBeforeExit = () => {\n void shutdown(\"beforeExit\").catch((error) => {\n logger.error(`Error shutting down before exit: ${error}`);\n });\n};\nconst _shutdownOnSignal = (signal: NodeJS.Signals) => {\n if (_signalShutdownStarted) return;\n _signalShutdownStarted = true;\n // Node delivered this original signal to every registered listener. If the\n // host has one, it owns termination; re-sending would look like a second\n // signal. Only restore default signal semantics when Neatlogs was alone.\n const hostOwnsSignal = process\n .listeners(signal)\n .some((listener) => listener !== _shutdownOnSignal);\n void shutdown(signal)\n .catch((error) => {\n logger.error(`Error shutting down after ${signal}: ${error}`);\n })\n .finally(() => {\n if (hostOwnsSignal || process.listenerCount(signal) > 0) return;\n try {\n process.kill(process.pid, signal);\n } catch {\n process.exitCode = signal === \"SIGINT\" ? 130 : 143;\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a non-empty workflow name; derive from process.argv when omitted.\n */\nfunction _resolveWorkflowName(workflowName?: string): string {\n const provided = (workflowName ?? \"\").trim();\n if (provided) return provided;\n\n const argv1 = process.argv[1] ?? \"\";\n const base = path.basename(argv1, path.extname(argv1));\n const slug = base\n .replace(/[^a-zA-Z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .toLowerCase();\n\n if (slug && ![\"node\", \"ts-node\", \"tsx\", \"npx\", \"-e\"].includes(slug)) {\n return slug;\n }\n\n return \"neatlogs-app\";\n}\n\nconst INIT_OPTION_KEYS = new Set<keyof InitOptions>([\n \"apiKey\",\n \"workflowName\",\n \"userId\",\n \"tags\",\n \"metadata\",\n \"debug\",\n \"disableExport\",\n \"diagnosticCapture\",\n \"doctorProbe\",\n \"doctorProbeExporter\",\n \"doctorProbeTimeoutMillis\",\n \"tracerProvider\",\n \"registerShutdownHandlers\",\n \"mask\",\n \"sampleRate\",\n \"captureLogs\",\n \"pii\",\n \"version\",\n \"endpoint\",\n \"batchSize\",\n \"flushInterval\",\n \"piiEnabled\",\n \"piiSpanTypes\",\n \"uploadAuthority\",\n]);\n\nfunction validateInitOptions(options: InitOptions): void {\n const raw = options as Record<string, unknown>;\n if (Object.prototype.hasOwnProperty.call(raw, \"instrumentations\")) {\n throw new NeatlogsConfigurationError(\n \"UNSUPPORTED_INSTRUMENTATIONS\",\n \"instrumentations\",\n \"The instrumentations option was removed. Use an explicit Neatlogs wrapper, handler, hook, processor, or plugin for the library instance.\",\n );\n }\n const unknown = Object.keys(raw).find(\n (key) => !INIT_OPTION_KEYS.has(key as keyof InitOptions),\n );\n if (unknown) {\n throw new NeatlogsConfigurationError(\n \"UNKNOWN_INIT_OPTION\",\n unknown,\n `Unknown Neatlogs init option: ${unknown}`,\n );\n }\n if (\n options.sampleRate !== undefined &&\n (!Number.isFinite(options.sampleRate) ||\n options.sampleRate < 0 ||\n options.sampleRate > 1)\n ) {\n throw new RangeError(\"sampleRate must be a finite number between 0 and 1.\");\n }\n if (\n options.uploadAuthority !== undefined &&\n typeof options.uploadAuthority !== \"boolean\" &&\n !isUploadAuthority(options.uploadAuthority)\n ) {\n throw new TypeError(\n \"uploadAuthority must be a boolean or an UploadAuthority implementation\",\n );\n }\n if (options.doctorProbeExporter !== undefined && options.doctorProbe !== true) {\n throw new TypeError(\"doctorProbeExporter requires doctorProbe: true\");\n }\n if (options.doctorProbeTimeoutMillis !== undefined && options.doctorProbe !== true) {\n throw new TypeError(\"doctorProbeTimeoutMillis requires doctorProbe: true\");\n }\n if (\n options.doctorProbeTimeoutMillis !== undefined &&\n (!Number.isFinite(options.doctorProbeTimeoutMillis) || options.doctorProbeTimeoutMillis <= 0)\n ) {\n throw new RangeError(\"doctorProbeTimeoutMillis must be a positive finite number\");\n }\n if (options.doctorProbe === true && options.diagnosticCapture !== true) {\n throw new TypeError(\"doctorProbe requires diagnosticCapture: true\");\n }\n if (\n options.diagnosticCapture === true &&\n options.disableExport !== true &&\n options.doctorProbe !== true\n ) {\n throw new TypeError(\n \"diagnosticCapture requires disableExport: true or doctorProbe: true\",\n );\n }\n}\n\nfunction stableValue(\n value: unknown,\n ancestors = new WeakSet<object>(),\n location = \"init options\",\n): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"string\") return `string:${JSON.stringify(value)}`;\n if (typeof value === \"boolean\") return `boolean:${value}`;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new TypeError(`${location} must contain only finite numbers`);\n }\n return `number:${Object.is(value, -0) ? \"-0\" : String(value)}`;\n }\n if (typeof value !== \"object\") {\n throw new TypeError(\n `${location} contains unsupported value type ${typeof value}`,\n );\n }\n if (ancestors.has(value)) {\n throw new TypeError(`${location} contains a circular reference`);\n }\n\n ancestors.add(value);\n try {\n if (Array.isArray(value)) {\n return `array:[${value\n .map((item, index) => stableValue(item, ancestors, `${location}[${index}]`))\n .join(\",\")}]`;\n }\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new TypeError(\n `${location} contains unsupported value ${prototype?.constructor?.name ?? \"object\"}`,\n );\n }\n const record = value as Record<string, unknown>;\n return `object:{${Object.keys(record)\n .sort((left, right) => left.localeCompare(right))\n .map(\n (key) =>\n `${JSON.stringify(key)}:${stableValue(record[key], ancestors, `${location}.${key}`)}`,\n )\n .join(\",\")}}`;\n } finally {\n ancestors.delete(value);\n }\n}\n\nfunction initIdentity(options: InitOptions): InitIdentity {\n const apiKey = (options.apiKey ?? process.env.NEATLOGS_API_KEY ?? \"\").trim();\n const apiKeyDigest = createHash(\"sha256\").update(apiKey).digest(\"hex\");\n const serialized = stableValue({\n apiKeyDigest,\n workflowName: _resolveWorkflowName(options.workflowName),\n userId: options.userId ?? null,\n tags: options.tags ?? [],\n metadata: options.metadata ?? {},\n debug: options.debug ?? false,\n disableExport:\n !!options.disableExport ||\n [\"true\", \"1\", \"yes\"].includes(\n (process.env.NEATLOGS_DISABLE_EXPORT ?? \"\").toLowerCase(),\n ),\n diagnosticCapture: options.diagnosticCapture ?? false,\n doctorProbe: options.doctorProbe ?? false,\n doctorProbeTimeoutMillis: options.doctorProbeTimeoutMillis ?? null,\n registerShutdownHandlers: options.registerShutdownHandlers ?? null,\n sampleRate: options.sampleRate ?? 1,\n captureLogs: options.captureLogs ?? false,\n pii: options.pii ?? null,\n version: options.version ?? null,\n endpoint: options.endpoint ?? DEFAULT_INGEST_ENDPOINT,\n batchSize: options.batchSize ?? 100,\n flushInterval: options.flushInterval ?? 5,\n piiEnabled: options.piiEnabled ?? null,\n piiSpanTypes: options.piiSpanTypes ?? [],\n uploadsEnabled:\n typeof options.uploadAuthority === \"boolean\"\n ? options.uploadAuthority\n : isUploadAuthority(options.uploadAuthority)\n ? options.uploadAuthority.available\n : uploadsEnabledFromEnv(process.env.NEATLOGS_UPLOADS_ENABLED),\n });\n return {\n serialized,\n mask: options.mask,\n tracerProvider: options.tracerProvider,\n uploadAuthority: isUploadAuthority(options.uploadAuthority)\n ? options.uploadAuthority\n : undefined,\n doctorProbeExporter: options.doctorProbeExporter,\n };\n}\n\nfunction sameInitIdentity(\n left: InitIdentity | null,\n right: InitIdentity,\n): boolean {\n return (\n left !== null &&\n left.serialized === right.serialized &&\n left.mask === right.mask &&\n left.tracerProvider === right.tracerProvider &&\n left.uploadAuthority === right.uploadAuthority &&\n left.doctorProbeExporter === right.doctorProbeExporter\n );\n}\n\nfunction conflictingInit(): Promise<void> {\n return Promise.reject(\n new NeatlogsConfigurationError(\n \"CONFLICTING_INIT\",\n \"init\",\n \"Neatlogs is already initializing or running with different configuration. Shut it down before reinitializing.\",\n ),\n );\n}\n\n// ---------------------------------------------------------------------------\n// init()\n// ---------------------------------------------------------------------------\n\n/**\n * Initialise the Neatlogs SDK.\n *\n * Sets up OTel TracerProvider, MeterProvider, LoggerProvider, span processors,\n * and exporters. It returns a Promise so initialization remains lifecycle-safe\n * across concurrent callers and future asynchronous transports.\n */\nexport function init(options: InitOptions = {}): Promise<void> {\n let identity: InitIdentity;\n try {\n validateInitOptions(options);\n identity = initIdentity(options);\n } catch (error) {\n return Promise.reject(error);\n }\n if (_lifecycleState === \"initializing\" && _initPromise) {\n return sameInitIdentity(_initIdentity, identity)\n ? _initPromise\n : conflictingInit();\n }\n if (_lifecycleState === \"closing\" && _shutdownPromise) {\n return _shutdownPromise.then(() => init(options));\n }\n if (_lifecycleState === \"running\" || _initialized) {\n if (sameInitIdentity(_initIdentity, identity)) {\n logger.warn(\"Neatlogs already initialized with the same configuration\");\n return Promise.resolve();\n }\n return conflictingInit();\n }\n\n _lifecycleState = \"initializing\";\n _initIdentity = identity;\n const current = Promise.resolve().then(() => _performInit(options));\n _initPromise = current;\n void current.then(\n () => {\n if (_initPromise === current) _initPromise = null;\n if (_lifecycleState === \"initializing\") _lifecycleState = \"running\";\n },\n () => {\n if (_initPromise === current) _initPromise = null;\n if (_lifecycleState === \"initializing\") {\n closeSharedClient();\n _lifecycleState = \"uninitialized\";\n _initIdentity = null;\n }\n },\n );\n return current;\n}\n\nasync function _performInit(options: InitOptions): Promise<void> {\n // A new runtime must not diagnose envelopes from a previous initialization.\n clearDoctorCapture();\n const sampleRate = options.sampleRate ?? 1.0;\n if (!Number.isFinite(sampleRate) || sampleRate < 0 || sampleRate > 1) {\n throw new RangeError(\"sampleRate must be a finite number between 0 and 1.\");\n }\n if (options.tracerProvider && options.sampleRate !== undefined) {\n throw new Error(\n \"sampleRate cannot configure a caller-owned tracerProvider; configure its sampler directly.\",\n );\n }\n _deliveryDiagnostics = new DeliveryDiagnostics();\n\n // 2. Resolve API key\n let resolvedKey: string;\n if (options.apiKey && options.apiKey.trim()) {\n resolvedKey = options.apiKey.trim();\n } else {\n resolvedKey = (process.env.NEATLOGS_API_KEY ?? \"\").trim();\n }\n\n // 3. Resolve disableExport\n let disableExportResolved =\n !!options.disableExport ||\n [\"true\", \"1\", \"yes\"].includes(\n (process.env.NEATLOGS_DISABLE_EXPORT ?? \"\").toLowerCase(),\n );\n\n if (!resolvedKey) {\n disableExportResolved = true;\n resolvedKey = \"disabled\";\n if (options.debug) {\n logger.warn(\n \"No NEATLOGS_API_KEY set; HTTP export disabled. \" +\n \"Set NEATLOGS_API_KEY (or pass apiKey) to send spans to the backend.\",\n );\n }\n }\n _effectiveSampleRate = sampleRate;\n _exportEnabled = !disableExportResolved;\n _queueMaxSize = 2_048;\n\n // 4. Debug mode\n if (options.debug) {\n enableDebugLogging();\n }\n _debugMode = options.debug ?? false;\n\n // 5. Resolve workflow name\n const resolvedWorkflowName = _resolveWorkflowName(options.workflowName);\n\n // 6. Parse base URL from endpoint\n const endpoint = options.endpoint ?? DEFAULT_INGEST_ENDPOINT;\n const baseUrl = new URL(endpoint).origin;\n const uploadAuthority = disableExportResolved\n ? new DisabledUploadAuthority(\"export_disabled\")\n : resolveUploadAuthority(\n options.uploadAuthority,\n process.env.NEATLOGS_UPLOADS_ENABLED,\n baseUrl,\n resolvedKey,\n );\n _deliveryDiagnostics.configureUploadAuthority(\n uploadAuthority.available,\n uploadAuthority.unavailableReason,\n );\n\n // 7. Set session config. Session & end-user identity are PER-REQUEST (set via\n // trace()/span() or identify()), never on init() — only the operator userId\n // and workflow/transport config live here.\n _setSessionConfig({\n userId: options.userId,\n workflowName: resolvedWorkflowName,\n _apiKey: resolvedKey,\n _baseUrl: baseUrl,\n });\n\n // 8b. Initialize shared PromptClient so module-level helpers work after init()\n if (resolvedKey && resolvedKey !== \"disabled\") {\n setSharedClient(new PromptClient({ baseUrl, apiKey: resolvedKey }));\n }\n\n // 9. Build OTel Resource\n const resourceAttrs: Record<string, string | number | boolean> = {\n [ATTR_SERVICE_NAME]: options.workflowName || \"neatlogs-app\",\n \"service.version\": __version__,\n \"neatlogs.workflow_name\": resolvedWorkflowName,\n };\n if (options.doctorProbe) {\n resourceAttrs['neatlogs.doctor'] = true;\n resourceAttrs['neatlogs.doctor.version'] = 'v1';\n resourceAttrs['telemetry.sdk.language'] = 'typescript';\n resourceAttrs['telemetry.sdk.version'] = __version__;\n }\n addVerificationMarkerResourceAttribute(resourceAttrs);\n // Operator identity only — whoever RUNS the SDK. Session & end-user identity\n // are per-request (trace()/span()/identify()), never resource attributes.\n if (options.userId) resourceAttrs[\"user.id\"] = options.userId;\n\n const tags = options.tags;\n if (tags !== undefined) {\n if (!Array.isArray(tags) || !tags.every((t) => typeof t === \"string\")) {\n throw new Error(\"tags must be a list of strings\");\n }\n resourceAttrs[\"neatlogs.tags\"] = tags.join(\",\");\n }\n\n if (options.pii !== undefined) {\n resourceAttrs[\"neatlogs.pii.enabled\"] =\n options.pii === false ? \"false\" : \"true\";\n }\n\n if (options.piiSpanTypes !== undefined) {\n resourceAttrs[\"neatlogs.pii.span_types\"] = options.piiSpanTypes.join(\",\");\n }\n\n const resource = new Resource(resourceAttrs);\n\n // 10. Create or adopt a PRIVATE TracerProvider. Neatlogs never reads,\n // registers onto, or shuts down a foreign global provider, so Datadog,\n // Braintrust, and other co-tenants can neither export nor parent our spans\n // (and vice versa).\n const provider =\n options.tracerProvider ??\n new NodeTracerProvider({\n resource,\n spanLimits: { attributeCountLimit: 10_000 },\n sampler: new ParentBasedSampler({\n root: new TraceIdRatioBasedSampler(sampleRate),\n }),\n });\n _ownsTracerProvider = options.tracerProvider === undefined;\n\n // 11. Add NeatlogsSpanProcessor\n _spanProcessor = new NeatlogsSpanProcessor({\n debug: options.debug ?? false,\n mask: options.mask,\n emitCompletionMarkers: false,\n ownAllSpans: _ownsTracerProvider,\n mediaUploadsAvailable: uploadAuthority.available,\n mediaUploadsUnavailableReason: uploadAuthority.unavailableReason,\n });\n provider.addSpanProcessor(_spanProcessor);\n\n // 12. Add BatchSpanProcessor + exporter. Local Doctor uses the exact same\n // final masking/filtering boundary with a successful in-memory sink, so it\n // can inspect export-ready bytes without credentials or network access.\n if (!disableExportResolved || options.diagnosticCapture) {\n const tracesEndpoint = endpoint.endsWith(\"/v1/traces\")\n ? endpoint\n : `${baseUrl}/v1/traces`;\n\n const diagnosticSink: SpanExporter = {\n export(_spans, resultCallback) {\n resultCallback({ code: ExportResultCode.SUCCESS });\n },\n async shutdown() {},\n async forceFlush() {},\n };\n\n const transportExporter = disableExportResolved\n ? diagnosticSink\n : (options.doctorProbeExporter ?? new ByteLimitedSpanExporter(\n new OTLPTraceExporter({\n url: tracesEndpoint,\n ...(options.doctorProbeTimeoutMillis !== undefined\n ? { timeoutMillis: options.doctorProbeTimeoutMillis }\n : {}),\n headers: {\n \"x-api-key\": resolvedKey,\n ...(options.doctorProbe ? { \"x-neatlogs-doctor\": \"v1\" } : {}),\n },\n compression: CompressionAlgorithm.GZIP,\n }),\n undefined,\n _deliveryDiagnostics,\n uploadAuthority,\n ));\n const otlpExporter = new FilteringExporter(\n transportExporter,\n _deliveryDiagnostics,\n uploadAuthority,\n options.diagnosticCapture ? capturePreparedSpans : undefined,\n );\n\n const batchSize = options.batchSize ?? 100;\n const batchProcessor = new ObservableBatchSpanProcessor(\n otlpExporter,\n {\n maxExportBatchSize: batchSize,\n maxQueueSize: exportQueueCapacity(batchSize),\n scheduledDelayMillis: (options.flushInterval ?? 5) * 1000,\n },\n _deliveryDiagnostics,\n );\n const completionProcessor = new CompletionMarkerSpanProcessor(\n _spanProcessor,\n provider.getTracer(\"neatlogs.internal\"),\n );\n provider.addSpanProcessor(batchProcessor);\n provider.addSpanProcessor(completionProcessor);\n _transportSpanProcessors = [batchProcessor, completionProcessor];\n _completionProcessor = completionProcessor;\n\n if (options.debug && !options.diagnosticCapture) {\n logger.debug(`OTLP trace exporter configured: ${tracesEndpoint}`);\n } else if (options.debug) {\n logger.debug('Local Doctor diagnostic capture configured (network disabled)');\n }\n } else if (options.debug) {\n logger.debug(\"Export disabled — spans will not be sent to backend\");\n }\n\n // 13. Store privately. Neatlogs never registers an OTel provider globally.\n _tracerProvider = provider;\n _setNeatlogsProvider(provider);\n\n if (options.debug) {\n logger.debug(\"Neatlogs tracer provider initialized\");\n }\n\n // 14. Never replace the process-global meter provider.\n if (options.debug) {\n logger.debug(\"Global meter provider left unchanged\");\n }\n\n // 15. Set up LoggerProvider (if captureLogs)\n const captureLogs = options.captureLogs ?? false;\n if (captureLogs) {\n const logRecordProcessors: ObservableBatchLogRecordProcessor[] = [];\n\n // OTLP log export to /v1/logs (same pattern as Python SDK)\n if (!disableExportResolved) {\n const logsEndpoint = endpoint.endsWith(\"/v1/logs\")\n ? endpoint\n : `${baseUrl}/v1/logs`;\n const otlpLogExporter = new OTLPLogExporter({\n url: logsEndpoint,\n headers: resolvedKey ? { \"x-api-key\": resolvedKey } : undefined,\n compression: CompressionAlgorithm.GZIP,\n });\n const batchSize = options.batchSize ?? 100;\n logRecordProcessors.push(\n new ObservableBatchLogRecordProcessor(\n new MaskingLogExporter(\n otlpLogExporter,\n options.mask,\n undefined,\n _deliveryDiagnostics,\n ),\n {\n maxExportBatchSize: batchSize,\n maxQueueSize: exportQueueCapacity(batchSize),\n scheduledDelayMillis: (options.flushInterval ?? 5) * 1000,\n },\n _deliveryDiagnostics,\n ),\n );\n if (options.debug) {\n logger.debug(`OTLP log exporter configured: ${logsEndpoint}`);\n }\n }\n\n // sdk-logs >= 0.200 configures processors in the constructor and removed\n // addLogRecordProcessor(). Retain the older path so Neatlogs stays\n // compatible with applications that still resolve sdk-logs 0.57.\n const supportsDynamicProcessors =\n typeof LoggerProvider.prototype.addLogRecordProcessor === \"function\";\n _logProvider = supportsDynamicProcessors\n ? new LoggerProvider({ resource })\n : new LoggerProvider({\n resource,\n processors: logRecordProcessors,\n } as ConstructorParameters<typeof LoggerProvider>[0]);\n if (supportsDynamicProcessors) {\n for (const processor of logRecordProcessors) {\n _logProvider.addLogRecordProcessor(processor);\n }\n }\n\n // Wire the OTel logger for neatlogs.log() function\n const otelLogger = _logProvider.getLogger(\"neatlogs\");\n _setOtelLogger(otelLogger, options.debug ?? false);\n\n if (options.debug) {\n logger.debug(\n `Neatlogs log capture enabled (endpoint: ${baseUrl}/v1/logs)`,\n );\n }\n } else if (options.debug) {\n logger.debug(\"Log capture disabled (pass captureLogs: true to enable)\");\n }\n\n // 16. Register shutdown handlers. Default to flushing on exit whenever we own\n // the private provider so standalone scripts drain their spans;\n // only a caller-supplied provider defaults off (its owner controls shutdown).\n const registerShutdownHandlers =\n options.registerShutdownHandlers ?? _ownsTracerProvider;\n if (registerShutdownHandlers && !_sigHandlersRegistered) {\n process.on('beforeExit', _shutdownBeforeExit);\n // Run before pre-existing one-shot host listeners so ownership is observed\n // before EventEmitter removes them for their invocation.\n process.prependListener('SIGTERM', _shutdownOnSignal);\n process.prependListener('SIGINT', _shutdownOnSignal);\n _sigHandlersRegistered = true;\n }\n\n // 17. Mark as initialised\n _initialized = true;\n\n if (options.debug) {\n logger.info(\"Neatlogs SDK initialized successfully\");\n logger.info(`Endpoint: ${endpoint}`);\n logger.info(`Workflow: ${resolvedWorkflowName}`);\n logger.info(`User: ${options.userId ?? \"(none)\"}`);\n logger.info(`Tags: ${tags ?? []}`);\n logger.info(`Sample Rate: ${sampleRate}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// flush()\n// ---------------------------------------------------------------------------\n\n/**\n * Flush all pending spans, metrics, and log records.\n *\n * @returns true if all providers flushed successfully\n */\nexport async function flush(): Promise<boolean> {\n let success = true;\n\n // Flush regardless of ownership: our processors are attached to the provider\n // (owned or caller-supplied), so draining them is always ours to do. Shutdown\n // is what's ownership-gated — we never shut down a provider we didn't create.\n // Logs must drain before spans: the trace flush can export the root and its\n // completion marker, which may make the backend finalize the trace.\n if (_logProvider) {\n try {\n logger.debug(\"Flushing log provider...\");\n await _logProvider.forceFlush();\n logger.debug(\"Log provider flushed successfully\");\n } catch (e) {\n logger.error(`Error flushing logs: ${e}`);\n success = false;\n }\n }\n\n try {\n await _spanProcessor?.forceFlush();\n await _completionProcessor?.forceFlush();\n } catch (e) {\n logger.error(`Error completing span masking/finalization: ${e}`);\n success = false;\n }\n\n if (_tracerProvider) {\n try {\n logger.debug(\"Flushing tracer provider...\");\n await _tracerProvider.forceFlush();\n logger.debug(\"Tracer provider flushed successfully\");\n } catch (e) {\n logger.error(`Error flushing spans: ${e}`);\n success = false;\n }\n }\n\n return success;\n}\n\n/**\n * Flush the module-level SDK pipeline and every live Neatlogs `Client` in this\n * process. Foreign OpenTelemetry providers are never discovered or flushed.\n */\nexport interface FlushOutcome {\n pipeline: string;\n success: boolean;\n timedOut: boolean;\n error?: string;\n}\n\nexport interface FlushAllResult {\n success: boolean;\n outcomes: FlushOutcome[];\n}\n\nexport async function flushAllDetailed(\n timeoutMs = 30_000,\n): Promise<FlushAllResult> {\n const deadline = Date.now() + Math.max(0, timeoutMs);\n const clients = getRegisteredClients();\n const operations: Array<{ pipeline: string; run: () => Promise<boolean> }> =\n [];\n if (_initialized) operations.push({ pipeline: \"default\", run: flush });\n clients.forEach((client, index) =>\n operations.push({\n pipeline: `client:${client.workflowName ?? \"anonymous\"}:${index}`,\n run: () => client.flush(),\n }),\n );\n\n const outcomes = await Promise.all(\n operations.map(async ({ pipeline, run }): Promise<FlushOutcome> => {\n const remaining = Math.max(0, deadline - Date.now());\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n const timedOut = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(\n () => reject(new Error(\"NEATLOGS_FLUSH_TIMEOUT\")),\n remaining,\n );\n });\n const success = await Promise.race([\n Promise.resolve().then(run),\n timedOut,\n ]);\n return { pipeline, success: success === true, timedOut: false };\n } catch (error) {\n const timedOut =\n error instanceof Error && error.message === \"NEATLOGS_FLUSH_TIMEOUT\";\n return {\n pipeline,\n success: false,\n timedOut,\n error: timedOut\n ? \"timeout\"\n : error instanceof Error\n ? error.name\n : \"Error\",\n };\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n }),\n );\n return { success: outcomes.every((outcome) => outcome.success), outcomes };\n}\n\n/** Preserve the original aggregate boolean contract for shutdown callers. */\nexport async function flushAll(timeoutMs = 30_000): Promise<boolean> {\n return (await flushAllDetailed(timeoutMs)).success;\n}\n\n/** Snapshot bounded-queue, masking, and final-export loss counters. */\nexport function getDeliveryDiagnostics(): DeliveryDiagnosticsSnapshot {\n return _deliveryDiagnostics.snapshot();\n}\n\n// ---------------------------------------------------------------------------\n// shutdown()\n// ---------------------------------------------------------------------------\n\n/**\n * Shutdown the SDK and flush all pending spans, metrics, and log records.\n *\n * Resets all module-level state so `init()` can be called again.\n *\n * @returns true if all providers shut down successfully\n */\nexport function shutdown(\n terminationReason = \"shutdown\",\n timeoutMs = 30_000,\n): Promise<boolean> {\n if (_shutdownPromise) return _shutdownPromise;\n\n const initialization =\n _lifecycleState === \"initializing\" ? _initPromise : null;\n _lifecycleState = \"closing\";\n _completionProcessor?.beginShutdown();\n _spanProcessor?.beginShutdown(terminationReason);\n _setOtelLogger(null, false);\n\n // Defer all shutdown work until the shared promise has been installed.\n // endActiveSpans() synchronously invokes onEnd(), and a host processor may\n // re-enter shutdown() from there.\n const currentShutdown = Promise.resolve().then(async () => {\n if (initialization) {\n try {\n await initialization;\n } catch {\n // Teardown any partial state left by a failed initialization.\n }\n }\n return _performShutdown(terminationReason, timeoutMs);\n });\n _shutdownPromise = currentShutdown;\n const clearCurrentShutdown = () => {\n if (_shutdownPromise === currentShutdown) {\n _shutdownPromise = null;\n _lifecycleState = \"uninitialized\";\n }\n };\n void currentShutdown.then(clearCurrentShutdown, clearCurrentShutdown);\n return currentShutdown;\n}\n\nasync function _performShutdown(\n terminationReason: string,\n timeoutMs: number,\n): Promise<boolean> {\n // Remove signal handlers\n if (_sigHandlersRegistered) {\n process.removeListener(\"beforeExit\", _shutdownBeforeExit);\n process.removeListener(\"SIGTERM\", _shutdownOnSignal);\n process.removeListener(\"SIGINT\", _shutdownOnSignal);\n _sigHandlersRegistered = false;\n }\n\n let success = true;\n const deadline = Date.now() + Math.max(0, timeoutMs);\n const logProvider = _logProvider;\n const spanProcessor = _spanProcessor;\n const completionProcessor = _completionProcessor;\n const tracerProvider = _tracerProvider;\n const ownsTracerProvider = _ownsTracerProvider;\n const transportSpanProcessors = [..._transportSpanProcessors];\n\n const attempt = async (\n label: string,\n operation: () => unknown | PromiseLike<unknown>,\n ): Promise<void> => {\n const outcome = await runByDeadline(operation, deadline);\n if (!outcome.completed) {\n logger.error(\n `${label} failed or exceeded the Neatlogs shutdown deadline`,\n );\n success = false;\n }\n };\n\n // Clear the Mastra bridge cache so a subsequent init() rebinds to the fresh\n // provider instead of a stale one.\n _resetMastraCache();\n\n // Prompt CRUD has an independent transport and must never affect telemetry\n // flush success. Closing it here only aborts its own refreshes and cache.\n closeSharedClient();\n\n // LOG records must drain before trace completion. The trace provider carries\n // neatlogs.trace.complete, which can trigger server-side finalization.\n if (logProvider) {\n logger.debug(\"Shutting down log provider...\");\n await attempt(\"Log provider shutdown\", () => logProvider.shutdown());\n }\n\n // Ending the root creates the trace-completion marker. Do this only after\n // buffered logs have drained so finalization cannot overtake them.\n if (spanProcessor) {\n const ended = spanProcessor.endActiveSpans(terminationReason);\n if (ended > 0) {\n logger.info(\n `Ended ${ended} active Neatlogs span(s) during ${terminationReason}`,\n );\n }\n }\n completionProcessor?.emitDeferred();\n if (spanProcessor) {\n await attempt(\"Span masking/finalization\", () =>\n spanProcessor.forceFlush(),\n );\n }\n if (completionProcessor) {\n await attempt(\"Completion processor flush\", () =>\n completionProcessor.forceFlush(),\n );\n }\n\n // Only shut down a provider we created. A caller-supplied provider is flushed\n // (above / in flush()) but never shut down — its owner controls its lifecycle,\n // per the tracerProvider contract in InitOptions. Flush it here so a caller\n // that shuts down right after us doesn't lose our still-buffered spans.\n if (tracerProvider && ownsTracerProvider) {\n logger.debug(\"Shutting down tracer provider...\");\n await attempt(\"Tracer provider shutdown\", () => tracerProvider.shutdown());\n } else if (tracerProvider) {\n logger.debug(\n \"Flushing caller-owned tracer provider (not shutting down)...\",\n );\n await attempt(\"Caller-owned tracer provider flush\", () =>\n tracerProvider.forceFlush(),\n );\n // The provider is caller-owned, but these processors/exporters are ours.\n // SDKs cannot detach processors in OTel JS 1.x; shut every instance down\n // independently so one exporter failure cannot leave another active.\n for (const processor of transportSpanProcessors.reverse()) {\n await attempt(\"Neatlogs transport shutdown\", () => processor.shutdown());\n }\n if (spanProcessor) {\n await attempt(\"Neatlogs span processor shutdown\", () =>\n spanProcessor.shutdown(),\n );\n }\n }\n\n // Reset all module-level state\n _initialized = false;\n _tracerProvider = null;\n _ownsTracerProvider = false;\n _setNeatlogsProvider(null);\n discardPendingMediaOwner();\n _logProvider = null;\n _spanProcessor = null;\n _transportSpanProcessors = [];\n _completionProcessor = null;\n _debugMode = false;\n _effectiveSampleRate = 1;\n _exportEnabled = false;\n _queueMaxSize = 2_048;\n _signalShutdownStarted = false;\n _initIdentity = null;\n clearDoctorCapture();\n\n // Reset session config\n _setSessionConfig({});\n\n logger.info(\"Neatlogs SDK shutdown complete\");\n return success;\n}\n\n// ---------------------------------------------------------------------------\n// getTracerProvider()\n// ---------------------------------------------------------------------------\n\n/**\n * Return the active TracerProvider. Throws if init() has not been called.\n */\nexport function getTracerProvider(): BasicTracerProvider {\n if (!_tracerProvider) {\n throw new Error(\n \"Neatlogs is not initialized. Call init() before accessing the TracerProvider.\",\n );\n }\n return _tracerProvider;\n}\n\n// ---------------------------------------------------------------------------\n// isDebugEnabled()\n// ---------------------------------------------------------------------------\n\n/**\n * Return true if neatlogs was initialised with `debug: true`.\n */\nexport function isDebugEnabled(): boolean {\n return _debugMode;\n}\n\n// ---------------------------------------------------------------------------\n// Re-export getSessionConfig from context\n// ---------------------------------------------------------------------------\n\nexport { getSessionConfig } from \"./core/context.js\";\n\n/** @internal Immutable, credential-free state used by the read-only doctor. */\nexport function _doctorRuntimeSnapshot(): Readonly<{\n state: LifecycleState;\n initialized: boolean;\n ownsTracerProvider: boolean;\n exportHealth: { droppedSpans: number; exportFailures: number } | null;\n effectiveSampler: string;\n exportEnabled: boolean;\n queueMaxSize: number;\n}> {\n return {\n state: _lifecycleState,\n initialized: _initialized,\n ownsTracerProvider: _ownsTracerProvider,\n exportHealth: {\n droppedSpans:\n _deliveryDiagnostics.snapshot().spanQueueDrops +\n _deliveryDiagnostics.snapshot().frameworkSpanDrops +\n _deliveryDiagnostics.snapshot().maskedSpanDrops,\n exportFailures: _deliveryDiagnostics.snapshot().spanExportFailures,\n },\n effectiveSampler: `parentbased_traceidratio:${_effectiveSampleRate}`,\n exportEnabled: _exportEnabled,\n queueMaxSize: _queueMaxSize,\n };\n}\n","/**\n * NeatlogsSpanProcessor — attribute normalization and file logging.\n *\n * Port of Python neatlogs/core/span_processor.py\n *\n * Sits between span creation and export, normalizing attributes and handling\n * file logging. The downstream BatchSpanProcessor + OTLPSpanExporter handles\n * actual transport.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { performance } from 'node:perf_hooks';\n\nimport { ROOT_CONTEXT, trace as otelTrace, TraceFlags, SpanStatusCode } from '@opentelemetry/api';\nimport type { Context, HrTime, SpanContext, Tracer } from '@opentelemetry/api';\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport type { Span as SdkSpan, SpanProcessor } from '@opentelemetry/sdk-trace-base';\n\nimport { UnifiedAttributeProcessor } from './attribute-processor.js';\nimport type { SpanDict } from './attribute-processor.js';\nimport { getScheduledMask, scheduleMask } from './mask.js';\nimport { getLogger } from './logger.js';\nimport { applySessionAttributes } from './session.js';\nimport { applyEndUserAttributes } from './end-user.js';\nimport { PromptContext, UserPromptContext } from '../prompt/template.js';\nimport {\n PROMPT_VARIABLES_KEY,\n PROMPT_TEMPLATE_KEY,\n PROMPT_VERSION_KEY,\n USER_PROMPT_TEMPLATE_KEY,\n USER_PROMPT_VARIABLES_KEY,\n} from './context.js';\nimport { popEntry } from './crewai-task-registry.js';\nimport type { MaskFunction } from '../types.js';\nimport { AttributeMapper } from '../config/attribute-mapper.js';\nimport { getNeatlogsTracer } from './provider.js';\nimport { verificationMarkerFromEnv } from './resource.js';\nimport { setMediaCaptureAvailability } from './media.js';\nimport { isHttpSpan } from './http-span.js';\n\nconst logger = getLogger();\n\nfunction resolveLogFilePath(configuredPath: string): string {\n return path.isAbsolute(configuredPath)\n ? configuredPath\n : path.join(process.cwd(), configuredPath);\n}\n\nfunction createLogStream(configuredPath: string): fs.WriteStream | null {\n const logPath = resolveLogFilePath(configuredPath);\n let fd: number | null = null;\n\n try {\n fs.mkdirSync(path.dirname(logPath), { recursive: true });\n fd = fs.openSync(logPath, 'a');\n const stream = fs.createWriteStream(logPath, { fd, autoClose: true });\n fd = null;\n stream.on('error', (error) => {\n logger.warn(`Failed to write span log file ${logPath}: ${error}`);\n stream.destroy();\n });\n return stream;\n } catch (error) {\n if (fd !== null) {\n try {\n fs.closeSync(fd);\n } catch {\n // ignore cleanup failure; the open error below is the actionable one.\n }\n }\n logger.warn(`Failed to open span log file ${logPath}: ${error}`);\n return null;\n }\n}\n\nconst CLOSE_STREAM_TIMEOUT_MS = 5_000;\n\nasync function closeLogStream(stream: fs.WriteStream | null, description: string): Promise<void> {\n if (!stream || stream.destroyed || stream.writableEnded) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n let settled = false;\n const settle = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n stream.off('close', closeHandler);\n stream.off('error', errorHandler);\n resolve();\n };\n\n const closeHandler = settle;\n const errorHandler = (error: Error) => {\n logger.warn(`Failed to close ${description} log file handle: ${error}`);\n settle();\n };\n const timer = setTimeout(() => {\n logger.warn(`Timed out waiting for ${description} log stream to close; destroying`);\n stream.destroy();\n settle();\n }, CLOSE_STREAM_TIMEOUT_MS);\n\n stream.once('close', closeHandler);\n stream.once('error', errorHandler);\n\n try {\n stream.end();\n } catch (error) {\n logger.warn(`Failed to close ${description} log file handle: ${error}`);\n settle();\n }\n });\n}\n\n// ────────────────────────────────────────────────────────\n// LLM span detection patterns\n// ────────────────────────────────────────────────────────\n\nconst LLM_NAME_PATTERNS = /chat|completion|generate|embedding/i;\n\n// ────────────────────────────────────────────────────────\n// Performance stats\n// ────────────────────────────────────────────────────────\n\ninterface PerfStats {\n onStartTime: number;\n onEndTime: number;\n spansProcessed: number;\n spansExported: number;\n}\n\n// ────────────────────────────────────────────────────────\n// Helper: convert HrTime ([seconds, nanoseconds]) to ns\n// ────────────────────────────────────────────────────────\n\nfunction hrTimeToNanos(hr: HrTime): number {\n return hr[0] * 1_000_000_000 + hr[1];\n}\n\n// ────────────────────────────────────────────────────────\n// Helper: convert ReadableSpan to JSON-serializable dict\n//\n// When includeScope=true, includes instrumentation_scope\n// and uses `status.message` (for the UnifiedAttributeProcessor).\n// When false (default), uses `status.description` for\n// backward-compatible raw logging.\n// ────────────────────────────────────────────────────────\n\nexport function spanToDict(\n span: ReadableSpan,\n options?: { includeScope?: boolean },\n): Record<string, any> {\n const ctx = span.spanContext();\n const includeScope = options?.includeScope ?? false;\n\n const dict: Record<string, any> = {\n trace_id: ctx.traceId,\n span_id: ctx.spanId,\n parent_span_id: span.parentSpanId ?? null,\n name: span.name,\n kind: span.kind,\n start_time: hrTimeToNanos(span.startTime),\n end_time: hrTimeToNanos(span.endTime),\n attributes: { ...span.attributes },\n resource: span.resource?.attributes ? { ...span.resource.attributes } : {},\n status: includeScope\n ? { code: span.status.code, message: span.status.message ?? undefined }\n : { code: span.status.code, description: span.status.message ?? null },\n events: span.events\n ? span.events.map((e) => ({\n name: e.name,\n timestamp: hrTimeToNanos(e.time),\n attributes: e.attributes ? { ...e.attributes } : {},\n }))\n : [],\n };\n\n if (includeScope) {\n dict.instrumentation_scope = span.instrumentationLibrary\n ? {\n name: span.instrumentationLibrary.name,\n version: span.instrumentationLibrary.version,\n }\n : null;\n }\n\n return dict;\n}\n\n// ────────────────────────────────────────────────────────\n// Constructor options\n// ────────────────────────────────────────────────────────\n\nexport interface NeatlogsSpanProcessorOptions {\n debug?: boolean;\n mask?: MaskFunction;\n /** Pre-built AttributeMapper. If not supplied, a default mapper is created. */\n mapper?: AttributeMapper;\n emitCompletionMarkers?: boolean;\n /** Treat every span on this processor's private provider as SDK-owned. */\n ownAllSpans?: boolean;\n /** Gate raw typed-media staging for this processor's export pipeline. */\n mediaUploadsAvailable?: boolean;\n mediaUploadsUnavailableReason?: string;\n mediaOwner?: object;\n}\n\n// ────────────────────────────────────────────────────────\n// NeatlogsSpanProcessor\n// ────────────────────────────────────────────────────────\n\nexport class NeatlogsSpanProcessor implements SpanProcessor {\n private readonly debug: boolean;\n private readonly mask: MaskFunction | undefined;\n private readonly unifiedProcessor: UnifiedAttributeProcessor;\n private readonly emitCompletionMarkers: boolean;\n private readonly ownAllSpans: boolean;\n private readonly mediaUploadsAvailable: boolean;\n private readonly mediaUploadsUnavailableReason: string;\n private readonly mediaOwner: object | undefined;\n\n private perfStats: PerfStats;\n private _retrieversToSuppress: Set<string>;\n private _activeSpans: Map<string, SdkSpan>;\n private _closingReason: string | null;\n private _closed: boolean;\n private _completionEligibleRoots: WeakSet<object>;\n private _pendingMasks: Set<Promise<unknown>>;\n\n // File logging\n private _logRawSpansEnabled: boolean;\n private _logProcessedSpansEnabled: boolean;\n private _rawLogStream: fs.WriteStream | null;\n private _processedLogStream: fs.WriteStream | null;\n\n constructor(opts: NeatlogsSpanProcessorOptions = {}) {\n this.debug = opts.debug ?? false;\n this.mask = opts.mask;\n this.emitCompletionMarkers = opts.emitCompletionMarkers ?? true;\n this.ownAllSpans = opts.ownAllSpans ?? false;\n this.mediaUploadsAvailable = opts.mediaUploadsAvailable ?? false;\n this.mediaUploadsUnavailableReason =\n opts.mediaUploadsUnavailableReason ?? 'telemetry_uploads_disabled';\n this.mediaOwner = opts.mediaOwner;\n\n this.unifiedProcessor = new UnifiedAttributeProcessor(\n opts.mapper ?? new AttributeMapper(),\n this.debug,\n );\n\n this._logRawSpansEnabled = false;\n this._logProcessedSpansEnabled = false;\n this._rawLogStream = null;\n this._processedLogStream = null;\n\n this._initFileLogging();\n\n this.perfStats = {\n onStartTime: 0,\n onEndTime: 0,\n spansProcessed: 0,\n spansExported: 0,\n };\n\n this._retrieversToSuppress = new Set<string>();\n this._activeSpans = new Map<string, SdkSpan>();\n this._closingReason = null;\n this._closed = false;\n this._completionEligibleRoots = new WeakSet<object>();\n this._pendingMasks = new Set<Promise<unknown>>();\n }\n\n // ── File logging init ─────────────────────────────────\n\n private _initFileLogging(): void {\n // Raw OTel span JSON (before attribute normalization)\n this._logRawSpansEnabled =\n this.debug ||\n ['true', '1', 'yes'].includes((process.env.NEATLOGS_LOG_RAW_SPANS ?? '').toLowerCase());\n\n if (this._logRawSpansEnabled && this.mask) {\n logger.warn(\n 'Raw span logging is disabled while a mask is configured because raw files bypass redaction.',\n );\n this._logRawSpansEnabled = false;\n }\n\n if (this._logRawSpansEnabled) {\n const rawPath = process.env.NEATLOGS_LOG_RAW_SPANS_FILE ?? 'spans_raw_optimized.log';\n this._rawLogStream = createLogStream(rawPath);\n if (this._rawLogStream) {\n logger.info(`Raw span logging enabled: ${resolveLogFilePath(rawPath)}`);\n }\n }\n\n // Processed span dict (after normalization)\n this._logProcessedSpansEnabled = ['true', '1', 'yes'].includes(\n (process.env.NEATLOGS_LOG_SPANS ?? '').toLowerCase(),\n );\n\n if (this._logProcessedSpansEnabled) {\n const processedPath = process.env.NEATLOGS_LOG_SPANS_FILE ?? 'spans_optimized.log';\n this._processedLogStream = createLogStream(processedPath);\n if (this._processedLogStream) {\n logger.info(`Processed span logging enabled: ${resolveLogFilePath(processedPath)}`);\n }\n }\n }\n\n // ── SpanProcessor.onStart ─────────────────────────────\n\n onStart(span: SdkSpan, parentContext: Context): void {\n if (this._closed) return;\n const startTime = performance.now();\n try {\n const scopeName = span.instrumentationLibrary?.name ?? '';\n const isCompletionMarker = span.name === 'neatlogs.trace.complete';\n // Auto-instrumented framework children retain their own scope name. An\n // active Neatlogs parent makes them part of the SDK-owned trace, while a\n // foreign root on a caller-supplied provider remains untouched.\n const sdkOwned =\n this.ownAllSpans ||\n scopeName.startsWith('neatlogs') ||\n (span.parentSpanId !== undefined && this._activeSpans.has(span.parentSpanId));\n if (sdkOwned && !isCompletionMarker) {\n setMediaCaptureAvailability(\n span as object,\n this.mediaUploadsAvailable,\n this.mediaUploadsUnavailableReason,\n this.mediaOwner,\n );\n this._activeSpans.set(span.spanContext().spanId, span);\n const verificationMarker = verificationMarkerFromEnv();\n if (verificationMarker) {\n span.setAttribute('neatlogs.verification.marker', verificationMarker);\n }\n }\n if (sdkOwned && !isCompletionMarker && this._closingReason) {\n this._markInterrupted(span, this._closingReason);\n span.end();\n return;\n }\n\n // Stamp request-scoped identity (identify()) onto ANY root span as a\n // fallback. trace()/span() set it explicitly (overriding this); direct\n // wrappers' auto-roots stamp it themselves. This catch-all is what lets\n // identify() reach FRAMEWORK roots (openai-agents/strands/pi-agent) that\n // open their own root without stamping identity. No-ops when identify() is\n // inactive; child spans are skipped.\n if (!span.parentSpanId) {\n applySessionAttributes(span, undefined, true);\n applyEndUserAttributes(span, undefined, undefined, true);\n }\n\n const attrs = (span as any).attributes ?? {};\n const spanKind = attrs['openinference.span.kind'] as string | undefined;\n const spanName: string = typeof (span as any).name === 'string' ? (span as any).name : '';\n\n const isLlmSpan = spanKind === 'LLM' || LLM_NAME_PATTERNS.test(spanName);\n\n if (!isLlmSpan) return;\n\n // Read context values only from the span's OWN parentContext. The global\n // OTel context belongs to another SDK and must never be consulted.\n const getFrom = (ctx: Context | undefined, key: symbol): string | undefined =>\n typeof ctx?.getValue === 'function' ? (ctx.getValue(key) as string | undefined) : undefined;\n const readValue = (key: symbol): string | undefined => getFrom(parentContext, key);\n let variablesJson = readValue(PROMPT_VARIABLES_KEY);\n let template = readValue(PROMPT_TEMPLATE_KEY);\n const versionVal = readValue(PROMPT_VERSION_KEY);\n let userTemplate = readValue(USER_PROMPT_TEMPLATE_KEY);\n let userVariablesJson = readValue(USER_PROMPT_VARIABLES_KEY);\n\n // Fall back to PromptContext / UserPromptContext\n if (!variablesJson) {\n const captured = PromptContext.getVariables();\n if (captured) {\n variablesJson = JSON.stringify(captured);\n }\n }\n\n if (!template) {\n const captured = PromptContext.getTemplate();\n if (captured) {\n template = captured;\n }\n }\n\n if (!userTemplate) {\n const captured = UserPromptContext.getTemplate();\n if (captured) {\n userTemplate = captured;\n }\n }\n\n if (!userVariablesJson) {\n const captured = UserPromptContext.getVariables();\n if (captured) {\n userVariablesJson = JSON.stringify(captured);\n }\n }\n\n if (this.debug) {\n logger.debug(`[SpanProcessor.onStart] LLM span '${spanName}' starting`);\n logger.debug(` variables_json from context: ${variablesJson}`);\n logger.debug(` template from context: ${template}`);\n logger.debug(` version from context: ${versionVal}`);\n logger.debug(` user_template from context: ${userTemplate}`);\n logger.debug(` user_variables_json from context: ${userVariablesJson}`);\n }\n\n if (variablesJson) {\n span.setAttribute('llm.prompt_template_variables', variablesJson);\n }\n if (template) {\n span.setAttribute('llm.prompt_template', template);\n }\n if (versionVal) {\n span.setAttribute('llm.prompt_template.version', versionVal);\n }\n if (userTemplate) {\n span.setAttribute('llm.user_prompt_template', userTemplate);\n }\n if (userVariablesJson) {\n span.setAttribute('llm.user_prompt_template_variables', userVariablesJson);\n }\n } finally {\n this.perfStats.onStartTime += performance.now() - startTime;\n }\n }\n\n // ── SpanProcessor.onEnd ───────────────────────────────\n\n onEnd(span: ReadableSpan): void {\n this._activeSpans.delete(span.spanContext().spanId);\n if (this._closed) return;\n\n // Transport spans are never part of NeatLogs telemetry. Suppress them\n // before logging, normalization, root I/O backfill, masking, or markers.\n if (isHttpSpan(span)) return;\n\n // Completion markers skip normalization but still cross the same global\n // masking boundary: they carry root identity and metadata.\n if (span.name === 'neatlogs.trace.complete') {\n const markerData = spanToDict(span, { includeScope: true });\n markerData.resource = { attributes: markerData.resource };\n const maskResult = scheduleMask(span as object, markerData, this.mask ?? null);\n const pending = maskResult.finally(() => {\n this._pendingMasks.delete(pending);\n });\n this._pendingMasks.add(pending);\n return;\n }\n\n const startTime = performance.now();\n this.perfStats.spansProcessed += 1;\n\n try {\n if (this.debug) {\n logger.debug(`[SpanProcessor.onEnd] Span ending: ${span.name}`);\n }\n\n // 1. Log raw OTel span (before any processing)\n if (this._rawLogStream && !this._rawLogStream.destroyed) {\n try {\n this._rawLogStream.write(JSON.stringify(spanToDict(span)) + '\\n');\n } catch (e) {\n logger.warn(`Failed to write span to raw log file: ${e}`);\n }\n }\n\n // 2. Process and normalize attributes\n const spanDict = spanToDict(span, { includeScope: true }) as SpanDict;\n const unifiedAttrs = this.unifiedProcessor.normalize(spanDict);\n\n // 3. Filter large tokenized arrays for EMBEDDING/VECTOR_STORE spans\n let nlKind = unifiedAttrs['neatlogs.span.kind'] as string | undefined;\n if (nlKind === 'embedding' || nlKind === 'vector_store') {\n const skipOutput = unifiedAttrs['neatlogs._skip_output_value'] === true;\n const keysToRemove: string[] = [];\n\n for (const key of Object.keys(unifiedAttrs)) {\n if (\n key.includes('input_messages') ||\n key.includes('output_messages') ||\n key.includes('gen_ai.prompt') ||\n key.includes('gen_ai.completion') ||\n key.includes('.content')\n ) {\n keysToRemove.push(key);\n } else if (\n key === 'neatlogs.embedding.output' ||\n (skipOutput && key === 'neatlogs.embedding.input')\n ) {\n keysToRemove.push(key);\n }\n }\n\n for (const key of keysToRemove) {\n delete unifiedAttrs[key];\n }\n\n if (this.debug && keysToRemove.length > 0) {\n logger.debug(\n `[EMBEDDING Filter] Removed ${keysToRemove.length} large attribute keys ` +\n `from ${nlKind} span (skip_output=${skipOutput})`,\n );\n }\n }\n\n // 4. Filter prompt template keys for non-LLM spans\n nlKind = unifiedAttrs['neatlogs.span.kind'] as string | undefined;\n if (\n nlKind !== 'llm' &&\n nlKind !== 'embedding' &&\n nlKind !== 'crewai_task' &&\n span.name !== 'PromptTemplate'\n ) {\n delete unifiedAttrs['neatlogs.llm.prompt_template'];\n delete unifiedAttrs['neatlogs.llm.prompt_template_variables'];\n delete unifiedAttrs['neatlogs.llm.prompt_template.version'];\n }\n\n // PromptTemplate spans → internal\n if (span.name === 'PromptTemplate') {\n if (unifiedAttrs['neatlogs.internal'] === undefined) {\n unifiedAttrs['neatlogs.internal'] = true;\n }\n unifiedAttrs['neatlogs.span.kind'] = 'Neatlogs.INTERNAL';\n }\n\n // 4b. Retriever span dedup\n if (nlKind === 'retriever') {\n const isInternal = unifiedAttrs['neatlogs.internal'] === true;\n if (isInternal && span.parentSpanId) {\n this._retrieversToSuppress.add(span.parentSpanId);\n }\n const spanId = span.spanContext().spanId;\n if (this._retrieversToSuppress.has(spanId)) {\n this._retrieversToSuppress.delete(spanId);\n unifiedAttrs['neatlogs.internal'] = true;\n if (this.debug) {\n logger.debug(\n `[Retriever Merge] Marked OI retriever '${span.name}' as internal ` +\n `(had neatlogs retriever child)`,\n );\n }\n }\n }\n\n // 5. Build resource attributes\n const resourceAttrs: Record<string, any> = {};\n if (span.resource?.attributes) {\n for (const [key, value] of Object.entries(span.resource.attributes)) {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n resourceAttrs[key] = value;\n } else if (Array.isArray(value)) {\n resourceAttrs[key] = [...value];\n } else {\n resourceAttrs[key] = String(value);\n }\n }\n\n if (this.debug && 'neatlogs.tags' in resourceAttrs) {\n logger.debug(\n `[Tags] Span ${span.name}: resource.neatlogs.tags = ${resourceAttrs['neatlogs.tags']}`,\n );\n }\n }\n\n // Format IDs — JS OTel SDK already provides hex strings\n const traceId = span.spanContext().traceId;\n const spanId = span.spanContext().spanId;\n let parentSpanId: string | null = span.parentSpanId ?? null;\n\n // Detect self-parenting\n if (parentSpanId === spanId) {\n if (this.debug) {\n logger.warn(\n `[SpanProcessor] Detected self-parenting span. ` +\n `trace_id=${traceId} span_id=${spanId} name=${span.name}. ` +\n `Setting parent_span_id=None.`,\n );\n }\n parentSpanId = null;\n }\n\n // 6. Build span_data dict\n const kindValue = (unifiedAttrs['neatlogs.span.kind'] as string) ?? 'UNKNOWN';\n const startTimeNs = hrTimeToNanos(span.startTime);\n const endTimeNs = hrTimeToNanos(span.endTime);\n\n let spanData: Record<string, any> = {\n trace_id: traceId,\n span_id: spanId,\n parent_span_id: parentSpanId,\n name: span.name,\n kind: kindValue || 'UNKNOWN',\n start_time: startTimeNs,\n end_time: endTimeNs,\n duration_ns: endTimeNs > 0 ? endTimeNs - startTimeNs : null,\n attributes: unifiedAttrs,\n resource: { attributes: resourceAttrs },\n status: {\n code: SpanStatusCode[span.status.code] ?? String(span.status.code),\n description: span.status.message ?? null,\n },\n links: span.links.map((link) => ({\n trace_id: link.context.traceId,\n span_id: link.context.spanId,\n trace_flags: link.context.traceFlags,\n trace_state: link.context.traceState?.serialize(),\n attributes: link.attributes ? { ...link.attributes } : {},\n })),\n events: span.events\n ? span.events.map((e) => ({\n name: e.name,\n timestamp: hrTimeToNanos(e.time),\n attributes: e.attributes ? { ...e.attributes } : {},\n }))\n : [],\n };\n\n // 7. Post-processing: framework span name normalization, CrewAI tasks, model resolution\n let results = this._normalizeFrameworkSpanNames([spanData]);\n spanData = results[0] ?? spanData;\n results = this._injectCrewaiTaskTemplates([spanData]);\n spanData = results[0] ?? spanData;\n this._resolveActualModelName(spanData);\n\n // 7b. Write normalized neatlogs.* attributes back before the downstream\n // BatchSpanProcessor snapshots the span. Masking is applied later to an\n // exporter-owned clone, so async user callbacks never block onEnd().\n const finalAttrs = (spanData.attributes ?? {}) as Record<string, any>;\n try {\n const spanAttrs = (span as any).attributes ?? (span as any)._attributes;\n if (spanAttrs != null) {\n for (const [k, v] of Object.entries(finalAttrs)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n spanAttrs[k] = v;\n } else if (\n Array.isArray(v) &&\n v.every(\n (i: any) =>\n typeof i === 'string' || typeof i === 'number' || typeof i === 'boolean',\n )\n ) {\n spanAttrs[k] = [...v];\n }\n }\n }\n } catch (wbExc) {\n if (this.debug) {\n logger.debug(`[SpanProcessor] Attr write-back failed: ${wbExc}`);\n }\n }\n\n // 7c. Mask asynchronously. FilteringExporter awaits this exact promise\n // and exports a clone built only from the accepted result. Exceptions are\n // fail-closed in scheduleMask/applyMask.\n const maskResult = scheduleMask(span as object, spanData, this.mask ?? null);\n const pending = maskResult\n .then((maskedSpanData) => {\n if (maskedSpanData === null) return;\n if (isHttpSpan(span, maskedSpanData.attributes ?? {})) return;\n\n // Processed diagnostic logs follow the same masking boundary as OTLP.\n if (this._processedLogStream && !this._processedLogStream.destroyed) {\n try {\n this._processedLogStream.write(JSON.stringify(maskedSpanData) + '\\n');\n } catch (e) {\n logger.warn(`Failed to write span to processed log file: ${e}`);\n }\n }\n\n this.perfStats.spansExported += 1;\n if (!span.parentSpanId) {\n this._completionEligibleRoots.add(span as object);\n if (this.emitCompletionMarkers) {\n this.emitCompletionMarker(span, traceId, resourceAttrs);\n }\n }\n })\n .finally(() => {\n this._pendingMasks.delete(pending);\n });\n this._pendingMasks.add(pending);\n } finally {\n this.perfStats.onEndTime += performance.now() - startTime;\n }\n }\n\n /**\n * End active Neatlogs-owned spans child-first before provider shutdown.\n * Ending the actual root through the normal lifecycle emits the completion\n * marker; interruption attributes keep the termination explicit.\n */\n endActiveSpans(reason = 'shutdown'): number {\n // Claim the current registry synchronously before ending anything. Span\n // end calls onEnd synchronously, and shutdown can be entered again from a\n // host callback; swapping the map first makes those paths idempotent.\n const cleanReason = this.beginShutdown(reason);\n const activeById = this._activeSpans;\n this._activeSpans = new Map<string, SdkSpan>();\n const active = [...activeById.values()];\n if (active.length === 0) return 0;\n\n const activeIds = new Set(active.map((span) => span.spanContext().spanId));\n const depth = (span: SdkSpan): number => {\n let current: SdkSpan | undefined = span;\n const seen = new Set<string>();\n let value = 0;\n while (current?.parentSpanId && activeIds.has(current.parentSpanId)) {\n const parentId = current.parentSpanId;\n if (seen.has(parentId)) break;\n seen.add(parentId);\n value += 1;\n current = activeById.get(parentId);\n }\n return value;\n };\n\n let ended = 0;\n for (const span of active.sort((a, b) => depth(b) - depth(a))) {\n try {\n if (!span.isRecording()) continue;\n this._markInterrupted(span, cleanReason);\n span.end();\n ended += 1;\n } catch (error) {\n logger.warn(`Failed to end active span during ${cleanReason}: ${error}`);\n }\n }\n return ended;\n }\n\n beginShutdown(reason = 'shutdown'): string {\n const cleanReason = sanitizeTerminationReason(reason);\n this._closingReason ??= cleanReason;\n return this._closingReason;\n }\n\n ownsSpan(span: ReadableSpan): boolean {\n return this.ownAllSpans || (span.instrumentationLibrary?.name ?? '').startsWith('neatlogs');\n }\n\n isCompletionEligible(span: ReadableSpan): boolean {\n return !this._closed && this._completionEligibleRoots.has(span as object);\n }\n\n async whenMaskComplete(span: ReadableSpan): Promise<boolean> {\n const result = getScheduledMask(span as object);\n if (!result) return false;\n return (await result) !== null && !this._closed;\n }\n\n private _markInterrupted(span: SdkSpan, cleanReason: string): void {\n span.setAttribute('neatlogs.trace.interrupted', true);\n span.setAttribute('neatlogs.trace.termination.reason', cleanReason);\n // Preserve an explicit OK set by application/framework code. An interrupted\n // span that never reached a terminal status is an OTel ERROR; a completed\n // span remains OK and carries the interruption metadata/event separately.\n if (span.status.code === SpanStatusCode.UNSET) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: `Interrupted during ${cleanReason}`,\n });\n }\n span.addEvent('neatlogs.trace.interrupted', {\n 'neatlogs.trace.termination.reason': cleanReason,\n });\n }\n\n // ── Completion marker ─────────────────────────────────\n\n emitCompletionMarker(\n rootSpan: ReadableSpan,\n traceId: string,\n resourceAttrs: Record<string, any>,\n markerTracer: Tracer = getNeatlogsTracer('neatlogs.internal'),\n ): void {\n try {\n const spanCtx: SpanContext = {\n traceId: rootSpan.spanContext().traceId,\n spanId: rootSpan.spanContext().spanId,\n isRemote: false,\n traceFlags: TraceFlags.SAMPLED,\n };\n\n // Use wrapSpanContext to create a non-recording span from context\n const wrappedSpan = otelTrace.wrapSpanContext(spanCtx);\n const ctx = otelTrace.setSpan(ROOT_CONTEXT, wrappedSpan);\n\n const marker = markerTracer.startSpan('neatlogs.trace.complete', undefined, ctx);\n marker.setAttribute('neatlogs.trace.complete', true);\n marker.setAttribute('neatlogs.internal', true);\n marker.setAttribute('neatlogs.span.kind', 'Neatlogs.INTERNAL');\n\n // The completion marker may be exported in a batch without the root span.\n // Carry the root-owned identity so ingestion can finalize the trace under\n // the correct conversation and end-user without depending on batch order.\n for (const key of [\n 'neatlogs.session.id',\n 'neatlogs.session.parent_id',\n 'neatlogs.session.feature.name',\n 'neatlogs.session.entry_point',\n 'neatlogs.end_user.id',\n 'neatlogs.end_user.metadata',\n ]) {\n const value = rootSpan.attributes[key];\n if (value !== undefined) {\n marker.setAttribute(key, value);\n }\n }\n\n // Copy resource tags\n if (resourceAttrs['neatlogs.tags']) {\n marker.setAttribute('neatlogs.tags', resourceAttrs['neatlogs.tags']);\n }\n\n marker.end();\n\n if (this.debug) {\n logger.debug(`[SpanProcessor] Emitted completion marker for trace ${traceId}`);\n }\n } catch (e) {\n logger.warn(`[SpanProcessor] Failed to emit completion marker: ${e}`);\n }\n }\n\n // ── Framework span name normalization ─────────────────\n\n private _normalizeFrameworkSpanNames(spans: Record<string, any>[]): Record<string, any>[] {\n for (const s of spans) {\n const name: string = s.name ?? '';\n const kind: string = s.kind ?? s.attributes?.['neatlogs.span.kind'] ?? '';\n\n if (kind !== 'task' || !name.endsWith('.task')) {\n continue;\n }\n\n const attrs: Record<string, any> = s.attributes ?? {};\n if (!Object.keys(attrs).some((k) => k.startsWith('neatlogs.crewai.'))) {\n continue;\n }\n\n let desc = name.slice(0, -'.task'.length).trimEnd();\n while (desc.endsWith('.')) {\n desc = desc.slice(0, -1).trimEnd();\n }\n\n if (desc) {\n if (attrs['neatlogs.task.description'] === undefined) {\n attrs['neatlogs.task.description'] = desc;\n }\n }\n\n s.name = 'crewai.task';\n s.attributes = attrs;\n }\n\n return spans;\n }\n\n // ── CrewAI task template injection ────────────────────\n\n private _injectCrewaiTaskTemplates(spans: Record<string, any>[]): Record<string, any>[] {\n for (const s of spans) {\n const attrs: Record<string, any> = s.attributes ?? {};\n const taskId = attrs['neatlogs.task.id'];\n if (!taskId) continue;\n\n const entry = popEntry(String(taskId));\n if (!entry) continue;\n\n const [tplStr, varsJson] = entry;\n attrs['neatlogs.task.user_prompt_template'] = tplStr;\n if (varsJson) {\n attrs['neatlogs.task.user_prompt_template_variables'] = varsJson;\n }\n attrs['neatlogs.span.kind'] = 'crewai_task';\n s.attributes = attrs;\n }\n\n return spans;\n }\n\n // ── Resolve actual model name from LLM output ────────\n // LangChain/Azure spans report deployment names (e.g., \"gpt-3.5-turbo\") as\n // the model name. The actual resolved model (e.g., \"gpt-5-nano-2025-08-07\")\n // is buried in the LLM output JSON at response_metadata.model_name.\n\n private _resolveActualModelName(spanData: Record<string, any>): void {\n const attrs: Record<string, any> = spanData.attributes ?? {};\n const kind = attrs['neatlogs.span.kind'];\n if (kind !== 'llm') return;\n\n const currentModel = attrs['neatlogs.llm.model_name'] as string | undefined;\n if (!currentModel) return;\n\n const llmOutput = attrs['neatlogs.llm.output'] as string | undefined;\n if (!llmOutput) return;\n\n // Plenty of integrations put plain assistant text here — there is no model\n // name to recover from that, so don't try to parse it as JSON.\n const trimmed = llmOutput.trimStart();\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) return;\n\n try {\n const output = JSON.parse(llmOutput);\n\n // LangChain format: generations[0][0].message.kwargs.response_metadata.model_name\n const generations = output?.generations;\n if (Array.isArray(generations) && generations[0]?.[0]) {\n const respMeta = generations[0][0]?.message?.kwargs?.response_metadata;\n if (respMeta?.model_name && respMeta.model_name !== currentModel) {\n attrs['neatlogs.llm.model_name'] = respMeta.model_name;\n if (this.debug) {\n logger.debug(`[ModelResolve] LangChain span: ${currentModel} → ${respMeta.model_name}`);\n }\n return;\n }\n }\n\n // Vercel AI SDK / direct OpenAI format: model field at top level of response\n if (output?.model && output.model !== currentModel) {\n attrs['neatlogs.llm.model_name'] = output.model;\n if (this.debug) {\n logger.debug(`[ModelResolve] Direct response: ${currentModel} → ${output.model}`);\n }\n }\n } catch (e: unknown) {\n // Best-effort enrichment only — never worth warning the user about.\n if (this.debug) {\n logger.debug(`[ModelResolve] Failed to parse LLM output for model extraction: ${e}`);\n }\n }\n }\n\n // ── forceFlush / shutdown ─────────────────────────────\n\n async forceFlush(): Promise<void> {\n // Mask completion may create a trace-completion marker, so drain until no\n // newly-created masking work remains before transport processors flush.\n while (this._pendingMasks.size > 0) {\n await Promise.allSettled([...this._pendingMasks]);\n }\n }\n\n async shutdown(): Promise<void> {\n await this.forceFlush();\n this._closed = true;\n this._logPerformanceStats();\n\n await closeLogStream(this._rawLogStream, 'raw');\n this._rawLogStream = null;\n\n await closeLogStream(this._processedLogStream, 'processed');\n this._processedLogStream = null;\n }\n\n // ── Performance stats ─────────────────────────────────\n\n private _logPerformanceStats(): void {\n if (!this.debug) return;\n\n const stats = this.perfStats;\n if (stats.spansProcessed === 0) return;\n\n const totalTime = stats.onStartTime + stats.onEndTime;\n const avgMs = totalTime / stats.spansProcessed;\n\n try {\n logger.info(\n `Neatlogs overhead: ${totalTime.toFixed(2)}ms total, ${avgMs.toFixed(3)}ms/span ` +\n `(${stats.spansProcessed} spans processed, ` +\n `${stats.spansExported} spans logged)`,\n );\n } catch {\n // ignore\n }\n }\n\n // ── Accessors for testing ─────────────────────────────\n\n /** @internal — exposed for testing */\n get _perfStats(): PerfStats {\n return this.perfStats;\n }\n\n /** @internal — exposed for testing */\n get _suppressedRetrievers(): Set<string> {\n return this._retrieversToSuppress;\n }\n}\n\nexport function sanitizeTerminationReason(reason: unknown): string {\n const printable = String(reason || 'shutdown')\n .replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n return (printable || 'shutdown').slice(0, 256);\n}\n\nexport class CompletionMarkerSpanProcessor implements SpanProcessor {\n private closed = false;\n private deferring = false;\n private readonly deferredRoots: ReadableSpan[] = [];\n private readonly pending = new Set<Promise<void>>();\n\n constructor(\n private readonly source: NeatlogsSpanProcessor,\n private readonly tracer: Tracer,\n ) {}\n\n onStart(_span: SdkSpan, _parentContext: Context): void {}\n\n onEnd(span: ReadableSpan): void {\n if (\n this.closed ||\n span.name === 'neatlogs.trace.complete' ||\n span.parentSpanId ||\n isHttpSpan(span)\n )\n return;\n if (!this.source.ownsSpan(span)) return;\n const task = this.source\n .whenMaskComplete(span)\n .then((eligible) => {\n if (!eligible || this.closed) return;\n if (this.deferring) this.deferredRoots.push(span);\n else this.emit(span);\n })\n .finally(() => {\n this.pending.delete(task);\n });\n this.pending.add(task);\n }\n\n beginShutdown(): void {\n this.deferring = true;\n }\n\n emitDeferred(): void {\n const roots = this.deferredRoots.splice(0);\n // The log-drain boundary has passed. Roots ending after this point must\n // emit immediately rather than being stranded in a second deferred batch.\n this.deferring = false;\n for (const span of roots) this.emit(span);\n }\n\n private emit(span: ReadableSpan): void {\n const resourceAttrs = { ...span.resource.attributes };\n this.source.emitCompletionMarker(span, span.spanContext().traceId, resourceAttrs, this.tracer);\n }\n\n async forceFlush(): Promise<void> {\n while (this.pending.size > 0) {\n await Promise.allSettled([...this.pending]);\n }\n this.emitDeferred();\n }\n async shutdown(): Promise<void> {\n await this.forceFlush();\n this.closed = true;\n this.deferredRoots.splice(0);\n }\n}\n","/**\n * Framework and platform detection from instrumentation scope.\n *\n * Parses OpenTelemetry instrumentation_scope.name to extract:\n * - Provider: LLM provider (openai, anthropic, google, etc.)\n * - Framework: Orchestration framework (langchain, llamaindex, crewai, etc.)\n * - Platform: Cloud platform (bedrock, vertex_ai, azure_openai, etc.)\n *\n * Port of Python neatlogs/core/instrumentation_scope_parser.py\n */\n\n// ────────────────────────────────────────────────────────\n// Types\n// ────────────────────────────────────────────────────────\n\nexport interface ScopeInfo {\n provider?: string;\n framework?: string;\n platform?: string;\n}\n\n// ────────────────────────────────────────────────────────\n// Scope-name → provider / framework / platform tables\n// ────────────────────────────────────────────────────────\n\nconst SCOPE_PATTERNS: Record<string, ScopeInfo> = {\n // Neatlogs custom instrumentations\n '@neatlogs/instrumentation-google-genai': { provider: 'google', framework: 'google_genai' },\n '@neatlogs/instrumentation-mastra': { framework: 'mastra' },\n '@neatlogs/instrumentation-ai-sdk': { framework: 'vercel_ai_sdk' },\n\n // Vercel AI SDK native scope (the `ai` package emits this directly)\n ai: { framework: 'vercel_ai_sdk' },\n\n // OpenInference instrumentations (npm @arizeai scope names)\n '@arizeai/openinference-instrumentation-openai': { provider: 'openai', framework: 'openai' },\n '@arizeai/openinference-instrumentation-anthropic': { provider: 'anthropic', framework: 'anthropic' },\n '@arizeai/openinference-instrumentation-langchain': { framework: 'langchain' },\n '@arizeai/openinference-instrumentation-bedrock': { provider: 'bedrock', platform: 'bedrock', framework: 'bedrock' },\n '@arizeai/openinference-instrumentation-vertexai': { provider: 'vertex_ai', platform: 'vertex_ai', framework: 'vertex_ai' },\n '@arizeai/openinference-instrumentation-mistralai': { provider: 'mistral', framework: 'mistral' },\n '@arizeai/openinference-instrumentation-cohere': { provider: 'cohere', framework: 'cohere' },\n '@arizeai/openinference-instrumentation-groq': { provider: 'groq', framework: 'groq' },\n '@arizeai/openinference-instrumentation-llama-index': { framework: 'llamaindex' },\n '@arizeai/openinference-instrumentation-llamaindex': { framework: 'llamaindex' },\n '@arizeai/openinference-instrumentation-crewai': { framework: 'crewai' },\n '@arizeai/openinference-instrumentation-haystack': { framework: 'haystack' },\n '@arizeai/openinference-instrumentation-dspy': { framework: 'dspy' },\n '@arizeai/openinference-instrumentation-beeai': { framework: 'beeai' },\n '@arizeai/openinference-instrumentation-mcp': { framework: 'mcp' },\n '@arizeai/openinference-instrumentation-claude-agent-sdk': { framework: 'claude_agent_sdk' },\n\n // OpenInference instrumentations (Python-style scope names)\n 'openinference.instrumentation.openai': { provider: 'openai', framework: 'openai' },\n 'openinference.instrumentation.anthropic': { provider: 'anthropic', framework: 'anthropic' },\n 'openinference.instrumentation.google_genai': { provider: 'google', framework: 'google_genai' },\n 'openinference.instrumentation.bedrock': { provider: 'bedrock', platform: 'bedrock', framework: 'bedrock' },\n 'openinference.instrumentation.vertexai': { provider: 'vertex_ai', platform: 'vertex_ai', framework: 'vertex_ai' },\n 'openinference.instrumentation.mistralai': { provider: 'mistral', framework: 'mistral' },\n 'openinference.instrumentation.cohere': { provider: 'cohere', framework: 'cohere' },\n 'openinference.instrumentation.groq': { provider: 'groq', framework: 'groq' },\n\n // OpenInference frameworks (Python-style scope names)\n 'openinference.instrumentation.mastra': { framework: 'mastra' },\n 'openinference.instrumentation.langchain': { framework: 'langchain' },\n 'openinference.instrumentation.llama_index': { framework: 'llamaindex' },\n 'openinference.instrumentation.llamaindex': { framework: 'llamaindex' },\n 'openinference.instrumentation.crewai': { framework: 'crewai' },\n 'openinference.instrumentation.haystack': { framework: 'haystack' },\n 'openinference.instrumentation.dspy': { framework: 'dspy' },\n\n // OpenLLMetry (Traceloop) instrumentations\n 'opentelemetry.instrumentation.openai': { provider: 'openai', framework: 'openai' },\n 'opentelemetry.instrumentation.anthropic': { provider: 'anthropic', framework: 'anthropic' },\n 'opentelemetry.instrumentation.google_generativeai': { provider: 'google', framework: 'google_genai' },\n 'opentelemetry.instrumentation.bedrock': { provider: 'bedrock', platform: 'bedrock', framework: 'bedrock' },\n 'opentelemetry.instrumentation.vertexai': { provider: 'vertex_ai', platform: 'vertex_ai', framework: 'vertex_ai' },\n 'opentelemetry.instrumentation.cohere': { provider: 'cohere', framework: 'cohere' },\n 'opentelemetry.instrumentation.mistralai': { provider: 'mistral', framework: 'mistral' },\n\n // OpenLLMetry frameworks\n 'opentelemetry.instrumentation.langchain': { framework: 'langchain' },\n 'opentelemetry.instrumentation.llamaindex': { framework: 'llamaindex' },\n 'opentelemetry.instrumentation.crewai': { framework: 'crewai' },\n 'opentelemetry.instrumentation.haystack': { framework: 'haystack' },\n\n // Native framework telemetry\n 'haystack.telemetry': { framework: 'haystack' },\n crewai: { framework: 'crewai' },\n langchain: { framework: 'langchain' },\n llama_index: { framework: 'llamaindex' },\n};\n\n// gen_ai.system → neatlogs.provider mapping\nconst GEN_AI_SYSTEM_TO_PROVIDER: Record<string, string> = {\n openai: 'openai',\n anthropic: 'anthropic',\n google: 'google',\n vertex_ai: 'vertex_ai',\n bedrock: 'bedrock',\n azure_openai: 'openai', // Azure OpenAI uses OpenAI provider\n cohere: 'cohere',\n mistral: 'mistral',\n groq: 'groq',\n};\n\n// ────────────────────────────────────────────────────────\n// Public API\n// ────────────────────────────────────────────────────────\n\n/**\n * Parse instrumentation scope name to extract provider/framework/platform.\n *\n * @param scopeName - The instrumentation_scope.name from the span\n * @returns Dictionary with detected: provider, framework, platform (if found)\n *\n * @example\n * parseInstrumentationScope('openinference.instrumentation.openai')\n * // → { provider: 'openai' }\n *\n * parseInstrumentationScope('openinference.instrumentation.langchain')\n * // → { framework: 'langchain' }\n *\n * parseInstrumentationScope('opentelemetry.instrumentation.bedrock')\n * // → { provider: 'bedrock', platform: 'bedrock' }\n */\nexport function parseInstrumentationScope(scopeName: string | null | undefined): ScopeInfo {\n if (!scopeName) return {};\n\n const scopeLower = scopeName.toLowerCase();\n\n // Direct exact match\n if (scopeLower in SCOPE_PATTERNS) {\n return { ...SCOPE_PATTERNS[scopeLower] };\n }\n\n // Prefix match (handles versioned scopes like \"openinference.instrumentation.openai.v1\")\n for (const [pattern, info] of Object.entries(SCOPE_PATTERNS)) {\n if (scopeLower.startsWith(pattern)) {\n return { ...info };\n }\n }\n\n // Fuzzy extraction as fallback\n const result: ScopeInfo = {};\n\n // Check for framework indicators\n if (scopeLower.includes('langchain')) {\n result.framework = 'langchain';\n } else if (scopeLower.includes('llama') || scopeLower.includes('llamaindex')) {\n result.framework = 'llamaindex';\n } else if (scopeLower.includes('crewai') || scopeLower.includes('crew')) {\n result.framework = 'crewai';\n } else if (scopeLower.includes('haystack')) {\n result.framework = 'haystack';\n } else if (scopeLower.includes('dspy')) {\n result.framework = 'dspy';\n } else if (scopeLower.includes('vercel-ai') || scopeLower.includes('ai-sdk')) {\n result.framework = 'vercel_ai_sdk';\n }\n\n // Check for provider indicators\n if (scopeLower.includes('openai')) {\n result.provider = 'openai';\n if (scopeLower.includes('azure')) {\n result.platform = 'azure_openai';\n }\n } else if (scopeLower.includes('anthropic') || scopeLower.includes('claude')) {\n result.provider = 'anthropic';\n } else if (\n scopeLower.includes('google') ||\n scopeLower.includes('gemini') ||\n scopeLower.includes('genai')\n ) {\n result.provider = 'google';\n } else if (scopeLower.includes('bedrock')) {\n result.provider = 'bedrock';\n result.platform = 'bedrock';\n } else if (scopeLower.includes('vertex')) {\n result.platform = 'vertex_ai';\n // Vertex can host multiple providers, default to google\n if (!result.provider) {\n result.provider = 'vertex_ai';\n }\n } else if (scopeLower.includes('mistral')) {\n result.provider = 'mistral';\n } else if (scopeLower.includes('cohere')) {\n result.provider = 'cohere';\n } else if (scopeLower.includes('groq')) {\n result.provider = 'groq';\n }\n\n return result;\n}\n\n/**\n * Enrich attributes with framework/platform/provider detected from instrumentation scope.\n *\n * Modifies attrs **in-place** by adding:\n * - neatlogs.instrumentation.name\n * - neatlogs.provider\n * - neatlogs.framework\n * - neatlogs.platform\n *\n * Logic:\n * 1. Parse current span's scope → gives provider/platform\n * 2. Parse parent span's scope (if provided) → gives orchestrating framework\n * 3. Only set attributes if not already present (explicit attrs take precedence)\n * 4. Cross-reference with gen_ai.system / model name patterns\n */\nexport function enrichWithScopeDetection(\n attrs: Record<string, any>,\n scopeName: string | null | undefined,\n parentScopeName: string | null | undefined = null,\n): void {\n // Store original instrumentation scope info\n if (scopeName) {\n if (!('neatlogs.instrumentation.name' in attrs)) {\n attrs['neatlogs.instrumentation.name'] = scopeName;\n }\n }\n\n // Parse current span's scope\n const currentInfo = parseInstrumentationScope(scopeName);\n\n // Set provider (from current span's scope)\n if (currentInfo.provider && !('neatlogs.provider' in attrs)) {\n attrs['neatlogs.provider'] = currentInfo.provider;\n }\n\n // Set platform (from current span's scope)\n if (currentInfo.platform && !('neatlogs.platform' in attrs)) {\n attrs['neatlogs.platform'] = currentInfo.platform;\n }\n\n // Set framework — prioritize parent scope, fallback to current scope\n if (parentScopeName) {\n const parentInfo = parseInstrumentationScope(parentScopeName);\n if (parentInfo.framework && !('neatlogs.framework' in attrs)) {\n attrs['neatlogs.framework'] = parentInfo.framework;\n }\n }\n\n // If no framework from parent, check current scope\n if (!('neatlogs.framework' in attrs) && currentInfo.framework) {\n attrs['neatlogs.framework'] = currentInfo.framework;\n }\n\n // Cross-reference with gen_ai.system if available\n const genAiSystem = (attrs['gen_ai.system'] ?? '').toLowerCase();\n if (genAiSystem && !('neatlogs.provider' in attrs)) {\n const mapped = GEN_AI_SYSTEM_TO_PROVIDER[genAiSystem];\n if (mapped) {\n attrs['neatlogs.provider'] = mapped;\n }\n }\n\n // Detect platform from model name patterns (e.g., \"anthropic.claude-3-5-sonnet-v1:0\" → Bedrock)\n const llmModel: string = attrs['llm.model_name'] ?? '';\n if (llmModel && !('neatlogs.platform' in attrs)) {\n if (\n llmModel.startsWith('anthropic.') ||\n llmModel.startsWith('meta.') ||\n llmModel.startsWith('amazon.')\n ) {\n attrs['neatlogs.platform'] = 'bedrock';\n } else if (llmModel.toLowerCase().includes('azure')) {\n attrs['neatlogs.platform'] = 'azure_openai';\n }\n }\n}\n\n/**\n * Get the effective provider to use for pricing lookups.\n *\n * Logic:\n * 1. Use neatlogs.platform if it's set (bedrock/vertex_ai/azure_openai)\n * 2. Otherwise use neatlogs.provider\n * 3. Fallback to gen_ai.system or llm.system\n */\nexport function getEffectiveProviderForPricing(attrs: Record<string, any>): string {\n // Platform takes precedence for pricing (different pricing on cloud platforms)\n const platform = (attrs['neatlogs.platform'] ?? '').toLowerCase();\n if (platform) {\n const platformPricingMap: Record<string, string> = {\n bedrock: 'bedrock',\n vertex_ai: 'vertex_ai',\n azure_openai: 'azure_openai',\n };\n if (platform in platformPricingMap) {\n return platformPricingMap[platform];\n }\n }\n\n // Use detected provider\n const provider = (attrs['neatlogs.provider'] ?? '').toLowerCase();\n if (provider) {\n return provider;\n }\n\n // Fallback to gen_ai.system or llm.system\n return (attrs['gen_ai.system'] ?? attrs['llm.system'] ?? '').toLowerCase();\n}\n\n/**\n * Get the effective provider to use for defaults lookups.\n *\n * Currently uses the same logic as pricing. Exported as a separate\n * name so callers express intent (defaults vs pricing) even though\n * the implementation is shared.\n */\nexport const getEffectiveProviderForDefaults = getEffectiveProviderForPricing;\n","{\n \"openai\": {\n \"chat.completions\": {\n \"gpt-5.2\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-5.1\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-5\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-5-mini\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0\n },\n \"gpt-5-nano\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0\n },\n \"gpt-4.1\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-4.1-mini\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0\n },\n \"gpt-4o\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-4o-mini\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0\n },\n \"o4-mini\": {\n \"max_completion_tokens\": null\n },\n \"o3\": {\n \"max_completion_tokens\": null\n },\n \"o3-mini\": {\n \"max_completion_tokens\": null\n },\n \"o1\": {\n \"max_completion_tokens\": null\n },\n \"o1-mini\": {\n \"max_completion_tokens\": null\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"stream\": false\n }\n },\n \"embeddings\": {\n \"_default\": {\n \"encoding_format\": \"float\",\n \"dimensions\": null\n }\n }\n },\n \"anthropic\": {\n \"messages\": {\n \"claude-opus-4-6\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-opus-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-opus-4-1\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"claude-opus-4\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"claude-sonnet-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-sonnet-4\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-haiku-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-3-5-sonnet\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false,\n \"stop_sequences\": null\n },\n \"claude-3-5-haiku\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"claude-3-opus\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"claude-3-haiku\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"stream\": false\n }\n }\n },\n \"cohere\": {\n \"chat\": {\n \"_default\": {\n \"temperature\": 0.3,\n \"p\": 0.75,\n \"k\": 0,\n \"max_tokens\": null,\n \"safety_mode\": \"CONTEXTUAL\"\n }\n },\n \"generate\": {\n \"_default\": {\n \"temperature\": 0.9,\n \"p\": null,\n \"k\": 0,\n \"max_tokens\": null,\n \"safety_mode\": \"CONTEXTUAL\"\n }\n }\n },\n \"google\": {\n \"generateContent\": {\n \"gemini-2.5-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.5-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.0-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.0-flash-lite\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.0-flash-thinking\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 64,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.5-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.94,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"stop_sequences\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.5-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.0-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n }\n }\n },\n \"vertex_ai\": {\n \"generateContent\": {\n \"gemini-2.5-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.5-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.0-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.5-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.94,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.5-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n }\n }\n },\n \"bedrock\": {\n \"_note\": \"Claude Sonnet 4.5 and Haiku 4.5 on Bedrock: Use EITHER temperature OR top_p, not both\",\n \"messages\": {\n \"anthropic.claude-sonnet-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-haiku-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-3-5-sonnet-20241022\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-3-5-sonnet-20240620\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null,\n \"stop_sequences\": null\n },\n \"anthropic.claude-3-5-haiku-20241022\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-3-opus\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-3-haiku\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"meta.llama3\": {\n \"temperature\": 0.5,\n \"top_p\": 0.9,\n \"max_gen_len\": null\n },\n \"mistral.mistral-7b-instruct\": {\n \"temperature\": 0.5,\n \"top_p\": 0.9,\n \"top_k\": 50,\n \"max_tokens\": null\n },\n \"amazon.titan-text\": {\n \"temperature\": 0.7,\n \"topP\": 0.9,\n \"maxTokenCount\": null\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0\n }\n }\n },\n \"groq\": {\n \"chat.completions\": {\n \"llama-3.3-70b-versatile\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 1024,\n \"stream\": false\n },\n \"llama-3.1-70b-versatile\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 1024,\n \"stream\": false\n },\n \"mixtral-8x7b-32768\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 1024,\n \"stream\": false\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 1024,\n \"stream\": false\n }\n }\n },\n \"deepseek\": {\n \"chat.completions\": {\n \"deepseek-chat\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 4096,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"stream\": false\n },\n \"deepseek-reasoner\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"stream\": false\n }\n }\n },\n \"mistral\": {\n \"chat\": {\n \"mistral-large-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null,\n \"safe_prompt\": false\n },\n \"mistral-small-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"pixtral-large-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"pixtral-12b-2409\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"codestral-latest\": {\n \"temperature\": 0.0,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"ministral-8b-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"ministral-3b-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0\n }\n }\n },\n \"ollama\": {\n \"generate\": {\n \"_default\": {\n \"temperature\": 0.8,\n \"top_k\": 40,\n \"top_p\": 0.9,\n \"num_predict\": -1,\n \"repeat_penalty\": 1.1,\n \"stream\": false\n }\n },\n \"chat\": {\n \"_default\": {\n \"temperature\": 0.8,\n \"top_k\": 40,\n \"top_p\": 0.9,\n \"num_predict\": -1,\n \"stream\": false\n }\n }\n },\n \"together\": {\n \"chat.completions\": {\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 0.7,\n \"top_k\": 50,\n \"max_tokens\": 512,\n \"stream\": false\n }\n },\n \"completions\": {\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 0.7,\n \"top_k\": 50,\n \"max_tokens\": 128\n }\n }\n },\n \"replicate\": {\n \"predictions\": {\n \"meta/llama-2\": {\n \"temperature\": 0.75,\n \"top_p\": 0.9,\n \"max_new_tokens\": 500\n },\n \"meta/llama-3\": {\n \"temperature\": 0.75,\n \"top_p\": 0.9,\n \"max_new_tokens\": 500\n },\n \"_default\": {\n \"temperature\": 0.75,\n \"top_p\": 0.9\n }\n }\n },\n \"huggingface\": {\n \"text_generation\": {\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_new_tokens\": null,\n \"do_sample\": true\n }\n },\n \"conversational\": {\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_length\": null\n }\n }\n },\n \"azure_openai\": {\n \"chat.completions\": {\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false\n }\n }\n },\n \"aleph_alpha\": {\n \"completion\": {\n \"_default\": {\n \"temperature\": 0.0,\n \"top_p\": 0.0,\n \"top_k\": 0,\n \"maximum_tokens\": 64\n }\n }\n },\n \"watsonx\": {\n \"generate\": {\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"top_k\": 50,\n \"max_new_tokens\": 200\n }\n }\n },\n \"writer\": {\n \"completion\": {\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": 1024\n }\n }\n }\n}\n","/**\n * Model defaults enricher for invocation parameters.\n *\n * Loads defaults from config/model_defaults.json and intelligently merges\n * them with explicitly set parameters.\n */\n\nimport { getLogger } from '../core/logger.js';\nimport modelDefaultsConfig from './model_defaults.json';\n\nconst logger = getLogger();\n\n/**\n * Get default parameters for a specific provider/operation/model.\n */\nexport function getDefaults(\n provider: string,\n operation: string,\n model: string,\n): Record<string, any> {\n const defaultsData = modelDefaultsConfig as Record<string, any>;\n\n const providerData = defaultsData[provider.toLowerCase()] ?? {};\n const operationData = providerData[operation] ?? {};\n\n if (Object.keys(operationData).length === 0) {\n return {};\n }\n\n // Exact match\n if (model in operationData) {\n return { ...operationData[model] };\n }\n\n // Prefix match\n for (const [modelKey, defaults] of Object.entries(operationData)) {\n if (modelKey !== '_default' && model.startsWith(modelKey)) {\n logger.debug(`Matched model '${model}' to defaults for '${modelKey}'`);\n return { ...(defaults as Record<string, any>) };\n }\n }\n\n // Default fallback\n if ('_default' in operationData) {\n logger.debug(`Using _default for ${provider}/${operation}/${model}`);\n return { ...operationData._default };\n }\n\n return {};\n}\n\n/**\n * Enrich invocation parameters with model defaults.\n *\n * Merges default parameters from model_defaults.json with explicitly captured\n * parameters. Explicit parameters always take precedence.\n *\n * Modifies mergedAttrs in-place.\n */\nexport function enrichInvocationParameters(\n mergedAttrs: Record<string, any>,\n enableEnrichment = true,\n): void {\n if (!enableEnrichment) return;\n\n const spanKind = mergedAttrs['openinference.span.kind'];\n if (spanKind !== 'LLM' && spanKind !== 'EMBEDDING') return;\n\n const provider = (mergedAttrs['llm.system'] ?? '').toLowerCase();\n const model =\n spanKind === 'EMBEDDING'\n ? mergedAttrs['embedding.model_name'] ?? ''\n : mergedAttrs['llm.model_name'] ?? '';\n\n if (!provider || !model) return;\n\n let operation: string | undefined;\n if (spanKind === 'LLM') {\n operation = provider === 'openai' ? 'chat.completions' : 'messages';\n } else if (spanKind === 'EMBEDDING') {\n operation = 'embeddings';\n }\n\n if (!operation) return;\n\n const defaults = getDefaults(provider, operation, model);\n if (Object.keys(defaults).length === 0) {\n logger.debug(`No defaults found for ${provider}/${operation}/${model}`);\n return;\n }\n\n const existingParamsStr = mergedAttrs['llm.invocation_parameters'] ?? '{}';\n let existingParams: Record<string, any>;\n try {\n existingParams =\n typeof existingParamsStr === 'string'\n ? JSON.parse(existingParamsStr)\n : existingParamsStr;\n } catch {\n existingParams = {};\n }\n\n const enrichedParams = { ...defaults, ...existingParams };\n mergedAttrs['llm.invocation_parameters'] = JSON.stringify(enrichedParams);\n\n logger.debug(\n `Enriched params for ${provider}/${model}: added ${Object.keys(defaults).length} defaults`,\n );\n}\n","/**\n * Unified Attribute Processor — the core normalization pipeline.\n *\n * Port of Python neatlogs/core/attribute_processor.py\n *\n * Receives a span dict (already serialized from an OTel ReadableSpan) and\n * produces a normalized dict with neatlogs.* attributes.\n *\n * The processor handles three conventions:\n * - OpenInference (llm.*, embedding.*, openinference.*)\n * - OpenLLMetry (gen_ai.*, traceloop.*)\n * - Raw OTel (http.*, db.*, etc.)\n */\n\nimport { getLogger } from './logger.js';\nimport { enrichWithScopeDetection } from './instrumentation-scope-parser.js';\nimport { inferSpanKindFromName } from '../span-kinds/mapping.js';\nimport { enrichInvocationParameters } from '../config/defaults-enricher.js';\nimport { VECTOR_DB_SYSTEMS, RETRIEVAL_OPS, WRITE_OPS } from '../span-kinds/constants.js';\nimport type { AttributeMapper } from '../config/attribute-mapper.js';\n\nconst logger = getLogger();\n\n// ────────────────────────────────────────────────────────\n// Regular expressions\n// ────────────────────────────────────────────────────────\n\n/** Matches Python object repr strings like `<function BaseTool.<lambda> at 0x110107be0>` */\nconst PYTHON_REPR_RE = /^<[A-Za-z_].*?\\bat\\s+0x[0-9a-fA-F]+>$/;\n\n// Tool-call extraction from OpenInference output messages\nconst OI_TOOL_RE =\n /^llm\\.output_messages\\.(\\d+)\\.message\\.tool_calls\\.(\\d+)\\.tool_call\\.function\\.(name|arguments)$/;\nconst OI_TOOL_ID_RE =\n /^llm\\.output_messages\\.(\\d+)\\.message\\.tool_calls\\.(\\d+)\\.tool_call\\.id$/;\n\n// Tool definitions\nconst OI_SCHEMA_RE = /^llm\\.tools\\.(\\d+)\\.tool\\.json_schema$/;\nconst OL_FN_RE = /^llm\\.request\\.functions\\.(\\d+)\\.(name|description|input_schema)$/;\n\n// Input message tool fields\nconst INPUT_MSG_TOOL_RE = /^llm\\.input_messages\\.(\\d+)\\.message\\.(tool_call_id|name)$/;\n\n// Maps neatlogs.provider → neatlogs.llm.system\nconst PROVIDER_TO_SYSTEM: Record<string, string> = {\n openai: 'openai',\n azure: 'openai',\n azure_openai: 'openai',\n anthropic: 'anthropic',\n cohere: 'cohere',\n mistral: 'mistralai',\n mistralai: 'mistralai',\n google: 'google',\n vertex_ai: 'vertexai',\n groq: 'groq',\n xai: 'xai',\n deepseek: 'deepseek',\n};\n\n// ────────────────────────────────────────────────────────\n// Helpers\n// ────────────────────────────────────────────────────────\n\nfunction isPythonRepr(s: string): boolean {\n return PYTHON_REPR_RE.test(s.trim());\n}\n\n/** Recursively remove Python object repr strings from a parsed JSON structure. */\nfunction cleanPythonReprs(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n\n if (Array.isArray(obj)) {\n return obj\n .filter((item) => !(typeof item === 'string' && isPythonRepr(item)))\n .map((item) => cleanPythonReprs(item));\n }\n\n if (typeof obj === 'object') {\n const cleaned: Record<string, any> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (typeof v === 'string' && isPythonRepr(v)) continue;\n cleaned[k] = cleanPythonReprs(v);\n }\n return cleaned;\n }\n\n return obj;\n}\n\nfunction safeParse(val: string): any {\n try {\n return JSON.parse(val);\n } catch {\n return undefined;\n }\n}\n\nfunction safeStringify(val: any): string {\n try {\n return JSON.stringify(val);\n } catch {\n return String(val);\n }\n}\n\n// ────────────────────────────────────────────────────────\n// Span dict shape\n// ────────────────────────────────────────────────────────\n\nexport interface SpanDict {\n name: string;\n kind: number | string;\n trace_id: string;\n span_id: string;\n parent_span_id?: string | null;\n start_time: number | string;\n end_time: number | string;\n status?: { code?: number | string; message?: string };\n attributes: Record<string, any>;\n resource?: Record<string, any>;\n instrumentation_scope?: { name?: string; version?: string } | null;\n events?: Array<{\n name: string;\n timestamp: number | string;\n attributes: Record<string, any>;\n }>;\n}\n\n// ────────────────────────────────────────────────────────\n// UnifiedAttributeProcessor\n// ────────────────────────────────────────────────────────\n\nexport class UnifiedAttributeProcessor {\n private mapper: AttributeMapper;\n private debug: boolean;\n\n constructor(mapper: AttributeMapper, debug = false) {\n this.mapper = mapper;\n this.debug = debug;\n }\n\n // ── Public entry point ──────────────────────────────\n\n /**\n * Normalize a raw span dict into the neatlogs.* namespace.\n *\n * Steps:\n * 1. Merge resource + span attributes\n * 2. Detect framework/provider/platform from instrumentation scope\n * 3. Normalize vendor conventions (tool calls, tool defs, MCP, vector DB, etc.)\n * 4. Extract operational metrics (duration, TTFT)\n * 5. Upcycle events (retriever docs, embedding dimensions)\n * 6. Enrich invocation parameters with model defaults\n * 7. Apply namespace mapping via AttributeMapper\n * 8. Fill provider / system gaps\n * 9. Add intermediate ReAct steps\n * 10. Filter embedding vectors if applicable\n */\n normalize(spanDict: SpanDict): Record<string, any> {\n // 1. Merge resource + span attributes\n const resAttrs = spanDict.resource ?? {};\n const attrs: Record<string, any> = { ...resAttrs, ...spanDict.attributes };\n\n // Add span name for downstream processing\n attrs['_span_name'] = spanDict.name;\n\n // 2. Detect framework/provider/platform from instrumentation scope\n const scopeName = spanDict.instrumentation_scope?.name ?? null;\n enrichWithScopeDetection(attrs, scopeName, null);\n\n if (this.debug) {\n logger.debug(\n `[ScopeDetection] trace_id=${spanDict.trace_id} span_id=${spanDict.span_id} ` +\n `span_name=${spanDict.name} scope=${scopeName} ` +\n `framework=${attrs['neatlogs.framework'] ?? ''} ` +\n `provider=${attrs['neatlogs.provider'] ?? ''} ` +\n `platform=${attrs['neatlogs.platform'] ?? ''}`,\n );\n }\n\n // 3. Normalize vendor conventions\n this.normalizeConventions(spanDict, attrs);\n\n // 4. Extract operational metrics\n const computedMetrics = this.extractOperationalMetrics(spanDict, attrs);\n Object.assign(attrs, computedMetrics);\n\n // 5. Upcycle events\n const eventAttrs = this.upcycleEvents(spanDict);\n Object.assign(attrs, eventAttrs);\n\n // 6. Enrich invocation parameters\n try {\n enrichInvocationParameters(attrs, true);\n } catch (e: any) {\n logger.warn(`Failed to enrich invocation parameters: ${e?.message ?? e}`);\n }\n\n // 7. Apply namespace mapping\n const unified = this.applyNamespaceMapping(attrs);\n\n // 8. Add intermediate ReAct steps\n this.addIntermediateSteps(unified);\n\n // 9. Filter embedding vectors\n const spanKind = (unified['neatlogs.span.kind'] ?? '').toLowerCase();\n if (spanKind === 'embedding' || spanKind === 'vector_store') {\n return this.filterEmbeddingVectors(unified);\n }\n\n return unified;\n }\n\n // ── Convention normalization ────────────────────────\n\n private normalizeConventions(spanDict: SpanDict, attrs: Record<string, any>): void {\n // Detect HTTP spans\n if (this.isHttpLikeSpanKind(spanDict.kind) && this.looksLikeHttp(attrs)) {\n attrs['openinference.span.kind'] = 'HTTP';\n }\n\n // CrewAI fallback: if no span kind and has crewai.crew.* attrs → CHAIN\n if (\n !('openinference.span.kind' in attrs) &&\n Object.keys(attrs).some((k) => k.startsWith('crewai.crew.'))\n ) {\n attrs['openinference.span.kind'] = 'CHAIN';\n }\n\n // CrewAI token usage fallback\n this.addCrewaiTokenUsageFallback(attrs);\n\n // Reasoning tokens from output.value\n this.addReasoningTokensFromOutputValue(attrs);\n\n // CrewAI kickoff telemetry\n this.addCrewaiKickoffTelemetry(attrs);\n\n // Vercel AI SDK ai.* normalization MUST run before extractToolCalls so\n // the exploded llm.output_messages.0.message.tool_calls.* keys get\n // collapsed into the canonical llm.tool_calls.{i}.* shape that\n // attribute-mapping.json understands.\n this.extractVercelAiSdkAttrs(attrs);\n\n // Extract tool calls from output messages (OpenInference format)\n this.extractToolCalls(attrs);\n\n // Extract tool_call_id and name from input messages (tool response messages)\n for (const [k, v] of Object.entries(attrs)) {\n const m = INPUT_MSG_TOOL_RE.exec(k);\n if (m) {\n const [, msgIdx, field] = m;\n attrs[`llm.input_messages.${msgIdx}.${field}`] = v;\n }\n }\n\n // Extract invalid_tool_calls from output\n this.extractInvalidToolCalls(attrs);\n\n // Extract tool_call_id from tool output (for TOOL kind spans)\n this.extractToolCallIdFromOutput(attrs);\n\n // Extract tool definitions\n this.extractToolDefinitions(attrs);\n\n // Detect vector DB span kind from db.system\n this.detectVectorDbSpanKind(attrs);\n\n // Parse traceloop.entity.input for MCP signals\n this.parseMcpFromTraceloop(attrs);\n\n // Process MCP-specific signals\n this.processMcpSignals(attrs);\n\n // Handle EMBEDDING spans\n this.handleEmbeddingSpans(attrs);\n\n // Handle vector DB doc attributes\n this.handleVectorDbDocAttributes(attrs);\n\n // Extract LangChain metadata (ls_*) into standard positions\n this.extractLangchainMetadata(attrs);\n }\n\n private extractToolCalls(attrs: Record<string, any>): void {\n const toolCalls: Record<number, Record<string, any>> = {};\n const keysToRemove: string[] = [];\n\n for (const [k, v] of Object.entries(attrs)) {\n let m = OI_TOOL_RE.exec(k);\n if (m) {\n const [, , callIdxStr, field] = m;\n const idx = parseInt(callIdxStr, 10);\n if (!toolCalls[idx]) toolCalls[idx] = {};\n toolCalls[idx][field] = v;\n keysToRemove.push(k);\n continue;\n }\n\n m = OI_TOOL_ID_RE.exec(k);\n if (m) {\n const [, , callIdxStr] = m;\n const idx = parseInt(callIdxStr, 10);\n if (!toolCalls[idx]) toolCalls[idx] = {};\n toolCalls[idx]['id'] = v;\n keysToRemove.push(k);\n continue;\n }\n }\n\n for (const idx of Object.keys(toolCalls).map(Number).sort((a, b) => a - b)) {\n const tc = toolCalls[idx];\n if (tc.id !== undefined) attrs[`llm.tool_calls.${idx}.id`] = tc.id;\n if (tc.name !== undefined) attrs[`llm.tool_calls.${idx}.name`] = tc.name;\n if (tc.arguments !== undefined) attrs[`llm.tool_calls.${idx}.arguments`] = tc.arguments;\n }\n\n for (const k of keysToRemove) {\n delete attrs[k];\n }\n }\n\n private extractInvalidToolCalls(attrs: Record<string, any>): void {\n const llmOutput = attrs['llm.output'] ?? attrs['output.value'];\n if (!llmOutput || typeof llmOutput !== 'string') return;\n\n try {\n const outputData = JSON.parse(llmOutput);\n if (typeof outputData === 'object' && outputData !== null && !Array.isArray(outputData)) {\n const generations = outputData.generations;\n if (\n Array.isArray(generations) &&\n generations.length > 0 &&\n Array.isArray(generations[0]) &&\n generations[0].length > 0\n ) {\n const message = generations[0][0]?.message;\n const invalidCalls = message?.invalid_tool_calls;\n if (Array.isArray(invalidCalls) && invalidCalls.length > 0) {\n attrs['llm.invalid_tool_calls'] = JSON.stringify(invalidCalls);\n }\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n private extractToolCallIdFromOutput(attrs: Record<string, any>): void {\n const toolOutput = attrs['tool.output'] ?? attrs['output.value'];\n if (!toolOutput || typeof toolOutput !== 'string') return;\n\n try {\n const outputData = JSON.parse(toolOutput);\n if (typeof outputData === 'object' && outputData !== null && !Array.isArray(outputData)) {\n const toolCallId = outputData.tool_call_id ?? outputData.toolCallId;\n if (toolCallId) {\n attrs['tool_call_id'] = toolCallId;\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n private extractToolDefinitions(attrs: Record<string, any>): void {\n const toolDefs: Record<number, Record<string, any>> = {};\n const keysToRemove: string[] = [];\n\n for (const [k, v] of Object.entries(attrs)) {\n let m = OL_FN_RE.exec(k);\n if (m) {\n const [, idxStr, field] = m;\n const idx = parseInt(idxStr, 10);\n if (!toolDefs[idx]) toolDefs[idx] = {};\n toolDefs[idx][field] = v;\n keysToRemove.push(k);\n continue;\n }\n\n m = OI_SCHEMA_RE.exec(k);\n if (m) {\n const idx = parseInt(m[1], 10);\n let schema = v;\n if (typeof schema === 'string') {\n schema = safeParse(schema) ?? null;\n }\n if (typeof schema === 'object' && schema !== null) {\n if (!toolDefs[idx]) toolDefs[idx] = {};\n const td = toolDefs[idx];\n if (!td.name) td.name = schema.name;\n if (!td.description) td.description = schema.description;\n if (!td.input_schema) td.input_schema = schema.input_schema ?? schema.parameters;\n }\n keysToRemove.push(k);\n }\n }\n\n for (const idx of Object.keys(toolDefs).map(Number).sort((a, b) => a - b)) {\n const td = toolDefs[idx];\n if (td.name !== undefined && td.name !== null) {\n if (!('llm.tools.' + idx + '.name' in attrs)) {\n attrs[`llm.tools.${idx}.name`] = td.name;\n }\n }\n if (td.description !== undefined && td.description !== null) {\n if (!('llm.tools.' + idx + '.description' in attrs)) {\n attrs[`llm.tools.${idx}.description`] = td.description;\n }\n }\n if (td.input_schema !== undefined && td.input_schema !== null) {\n let val = td.input_schema;\n if (typeof val !== 'string') {\n val = safeStringify(val);\n }\n if (!('llm.tools.' + idx + '.input_schema' in attrs)) {\n attrs[`llm.tools.${idx}.input_schema`] = val;\n }\n }\n }\n\n for (const k of keysToRemove) {\n delete attrs[k];\n }\n }\n\n private detectVectorDbSpanKind(attrs: Record<string, any>): void {\n if ('openinference.span.kind' in attrs) return;\n\n const dbSystem = attrs['db.system'];\n if (typeof dbSystem !== 'string') return;\n\n if (!VECTOR_DB_SYSTEMS.has(dbSystem.toLowerCase())) return;\n\n const dbOperation = (attrs['db.operation'] ?? '').toLowerCase();\n const spanName = (attrs['_span_name'] ?? '').toLowerCase();\n\n let isRetrieval = false;\n if (dbOperation) {\n isRetrieval = RETRIEVAL_OPS.some((op) => dbOperation.includes(op));\n } else {\n isRetrieval = RETRIEVAL_OPS.some((op) => spanName.includes(op));\n }\n\n attrs['openinference.span.kind'] = isRetrieval ? 'RETRIEVER' : 'VECTOR_STORE';\n }\n\n private parseMcpFromTraceloop(attrs: Record<string, any>): void {\n const rawInput = attrs['traceloop.entity.input'];\n if (rawInput === undefined || rawInput === null) return;\n\n try {\n const entityInput = typeof rawInput === 'string' ? JSON.parse(rawInput) : rawInput;\n if (typeof entityInput !== 'object' || entityInput === null || Array.isArray(entityInput))\n return;\n\n if ('method' in entityInput) {\n attrs['mcp.method.name'] = entityInput.method;\n }\n if ('params' in entityInput) {\n attrs['mcp.request.argument'] = JSON.stringify(entityInput.params);\n }\n if ('tool_name' in entityInput) {\n attrs['mcp.tool.name'] = entityInput.tool_name;\n if (\n 'arguments' in entityInput &&\n typeof entityInput.arguments === 'object' &&\n entityInput.arguments !== null\n ) {\n attrs['mcp.tool.arguments'] = JSON.stringify(entityInput.arguments);\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n private processMcpSignals(attrs: Record<string, any>): void {\n const hasMcpSignal =\n (typeof attrs['mcp.method.name'] === 'string' && !!attrs['mcp.method.name']) ||\n (typeof attrs['mcp.tool.name'] === 'string' && !!attrs['mcp.tool.name']) ||\n 'mcp.request.argument' in attrs ||\n 'mcp.tool.arguments' in attrs;\n\n if (hasMcpSignal && 'traceloop.entity.output' in attrs && !('mcp.response.value' in attrs)) {\n attrs['mcp.response.value'] = attrs['traceloop.entity.output'];\n }\n\n // MCP initialize response\n if (attrs['mcp.method.name'] === 'initialize' && 'traceloop.entity.output' in attrs) {\n try {\n const output =\n typeof attrs['traceloop.entity.output'] === 'string'\n ? JSON.parse(attrs['traceloop.entity.output'])\n : attrs['traceloop.entity.output'];\n\n if (output && typeof output === 'object') {\n if ('protocolVersion' in output) {\n attrs['mcp.protocol_version'] = output.protocolVersion;\n }\n if ('serverInfo' in output && typeof output.serverInfo === 'object') {\n const info = output.serverInfo;\n attrs['mcp.server.name'] = info.name ?? '';\n attrs['mcp.server.version'] = info.version ?? '';\n }\n if ('capabilities' in output) {\n attrs['mcp.server.capabilities'] = JSON.stringify(output.capabilities);\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n // MCP tools/list response\n if (attrs['mcp.method.name'] === 'tools/list' && 'traceloop.entity.output' in attrs) {\n try {\n const output =\n typeof attrs['traceloop.entity.output'] === 'string'\n ? JSON.parse(attrs['traceloop.entity.output'])\n : attrs['traceloop.entity.output'];\n\n if (output && typeof output === 'object' && Array.isArray(output.tools)) {\n const tools: any[] = output.tools;\n attrs['mcp.tools.count'] = tools.length;\n const toolNames = tools.filter((t) => 'name' in t).map((t) => t.name);\n attrs['mcp.tools.names'] = JSON.stringify(toolNames);\n }\n } catch {\n // ignore parse errors\n }\n }\n }\n\n private handleEmbeddingSpans(attrs: Record<string, any>): void {\n const spanKind = (attrs['openinference.span.kind'] ?? '').toUpperCase();\n if (spanKind !== 'EMBEDDING') return;\n\n const embeddings: Array<{ index: number; text: any }> = [];\n for (const [key, value] of Object.entries(attrs)) {\n if (key.startsWith('embedding.embeddings.') && key.endsWith('.embedding.text')) {\n const parts = key.split('.');\n if (parts.length >= 3) {\n const index = parseInt(parts[2], 10);\n if (!isNaN(index)) {\n embeddings.push({ index, text: value });\n }\n }\n }\n }\n\n if (embeddings.length > 0) {\n embeddings.sort((a, b) => a.index - b.index);\n attrs['embeddings_data'] = JSON.stringify(embeddings);\n }\n\n // Only skip output if it's a REAL embedding operation from OpenLLMetry\n const hasEmbeddingAttrs = Object.keys(attrs).some(\n (k) => k.startsWith('embedding.') || k.startsWith('gen_ai.embedding'),\n );\n if (hasEmbeddingAttrs) {\n attrs['neatlogs._skip_output_value'] = true;\n }\n }\n\n /**\n * Extract vendor-specific keys from attrs into a plain object,\n * mapping each source key to a short target name.\n */\n private _extractKeys(\n attrs: Record<string, any>,\n keyMap: Record<string, string>,\n ): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [srcKey, tgtName] of Object.entries(keyMap)) {\n if (srcKey in attrs) {\n result[tgtName] = attrs[srcKey];\n }\n }\n return result;\n }\n\n private handleVectorDbDocAttributes(attrs: Record<string, any>): void {\n const dbSystem = (attrs['db.system'] ?? '').toLowerCase();\n\n if (dbSystem === 'chroma') {\n const docKeyMap: Record<string, string> = {\n 'db.chroma.add.ids_count': 'ids_count',\n 'db.chroma.add.embeddings_count': 'embeddings_count',\n 'db.chroma.add.metadatas_count': 'metadatas_count',\n 'db.chroma.add.documents_count': 'documents_count',\n 'db.chroma.upsert.ids_count': 'ids_count',\n 'db.chroma.upsert.embeddings_count': 'embeddings_count',\n 'db.chroma.upsert.metadatas_count': 'metadatas_count',\n 'db.chroma.upsert.documents_count': 'documents_count',\n 'db.chroma.query.n_results': 'requested_top_k',\n 'db.chroma.query.include': 'include',\n };\n const docAttrs = this._extractKeys(attrs, docKeyMap);\n if (Object.keys(docAttrs).length > 0) {\n attrs['document_attributes'] = JSON.stringify(docAttrs);\n }\n } else if (dbSystem === 'marqo') {\n const inputKeyMap: Record<string, string> = {\n 'marqo.limit': 'limit',\n 'marqo.hits_count': 'hits_count',\n 'marqo.filter': 'filter',\n };\n const inputParams = this._extractKeys(attrs, inputKeyMap);\n if (Object.keys(inputParams).length > 0) {\n attrs['retrieval_input_params'] = JSON.stringify(inputParams);\n }\n const docKeyMap: Record<string, string> = {\n 'marqo.document_count': 'document_count',\n 'marqo.items_processed': 'items_processed',\n };\n const docAttrs = this._extractKeys(attrs, docKeyMap);\n if (Object.keys(docAttrs).length > 0) {\n attrs['document_attributes'] = JSON.stringify(docAttrs);\n }\n } else if (dbSystem === 'qdrant') {\n const docKeyMap: Record<string, string> = {\n 'qdrant.upsert.points_count': 'points_count',\n };\n const docAttrs = this._extractKeys(attrs, docKeyMap);\n if (Object.keys(docAttrs).length > 0) {\n attrs['document_attributes'] = JSON.stringify(docAttrs);\n }\n } else if (dbSystem === 'milvus') {\n const docKeyMap: Record<string, string> = {\n 'db.milvus.insert.data_count': 'insert.data_count',\n 'db.milvus.search.data_count': 'search.data_count',\n 'db.milvus.search.limit': 'search.limit',\n 'db.milvus.search.output_fields_count': 'search.output_fields_count',\n 'db.milvus.search.result_count': 'search.result_count',\n 'db.milvus.search.filter': 'search.filter',\n };\n const docAttrs = this._extractKeys(attrs, docKeyMap);\n if (Object.keys(docAttrs).length > 0) {\n attrs['document_attributes'] = JSON.stringify(docAttrs);\n }\n }\n }\n\n // ── LangChain metadata extraction ───────────────────\n\n /**\n * LangChain instrumentation puts model info in `metadata` as a JSON string\n * with `ls_provider`, `ls_model_name`, `ls_temperature`, `ls_max_tokens`.\n * Extract these into standard positions when the standard attributes are missing.\n */\n private extractLangchainMetadata(attrs: Record<string, any>): void {\n const raw = attrs['metadata'];\n if (!raw || typeof raw !== 'string') return;\n\n let meta: Record<string, any>;\n try {\n meta = JSON.parse(raw);\n } catch {\n return;\n }\n if (typeof meta !== 'object' || meta === null) return;\n\n // ls_model_name → llm.model_name\n if (meta.ls_model_name && !attrs['llm.model_name']) {\n attrs['llm.model_name'] = meta.ls_model_name;\n }\n\n // ls_provider → llm.system (used by defaults enricher and provider detection)\n if (meta.ls_provider && !attrs['llm.system']) {\n const providerMap: Record<string, string> = {\n google_genai: 'google',\n openai: 'openai',\n anthropic: 'anthropic',\n };\n attrs['llm.system'] = providerMap[meta.ls_provider] ?? meta.ls_provider;\n }\n\n // ls_temperature / ls_max_tokens → merge into invocation_parameters\n const hasTemp = meta.ls_temperature !== undefined;\n const hasMaxTokens = meta.ls_max_tokens !== undefined;\n if (hasTemp || hasMaxTokens) {\n let existing: Record<string, any> = {};\n try {\n existing = JSON.parse(attrs['llm.invocation_parameters'] ?? '{}');\n } catch {\n existing = {};\n }\n if (hasTemp && !('temperature' in existing)) {\n existing['temperature'] = meta.ls_temperature;\n }\n if (hasMaxTokens && !('max_tokens' in existing)) {\n existing['max_tokens'] = meta.ls_max_tokens;\n }\n // Also inject model if missing\n if (meta.ls_model_name && !('model' in existing)) {\n existing['model'] = meta.ls_model_name;\n }\n attrs['llm.invocation_parameters'] = JSON.stringify(existing);\n }\n }\n\n // ── Vercel AI SDK extraction ───────────────────────\n\n /**\n * The Vercel AI SDK emits its own `ai.*` namespace alongside `gen_ai.*`. Map\n * the AI-SDK-specific keys onto the canonical `llm.*` / `gen_ai.*` / `tool.*`\n * keys that the existing pipeline already understands. Span-kind inference\n * runs first so downstream `applyNamespaceMapping` resolves it correctly.\n */\n private extractVercelAiSdkAttrs(attrs: Record<string, any>): void {\n const spanName: string = attrs['_span_name'] ?? '';\n const isAiSdkSpan =\n spanName.startsWith('ai.') ||\n 'ai.model.id' in attrs ||\n 'ai.toolCall.name' in attrs;\n\n if (!isAiSdkSpan) return;\n\n // Span-kind inference (only when not already set)\n if (!('openinference.span.kind' in attrs)) {\n if (spanName === 'ai.toolCall') {\n attrs['openinference.span.kind'] = 'TOOL';\n } else if (spanName.startsWith('ai.embed')) {\n attrs['openinference.span.kind'] = 'EMBEDDING';\n } else if (spanName.startsWith('ai.rerank')) {\n attrs['openinference.span.kind'] = 'RERANKER';\n } else if (spanName.endsWith('.doStream') || spanName.endsWith('.doGenerate') || spanName.endsWith('.doRerank') || spanName.endsWith('.doEmbed')) {\n // Actual provider API calls (ai.streamText.doStream, ai.generateText.doGenerate, etc.)\n if (spanName.includes('embed')) {\n attrs['openinference.span.kind'] = 'EMBEDDING';\n } else if (spanName.includes('rerank')) {\n attrs['openinference.span.kind'] = 'RERANKER';\n } else {\n attrs['openinference.span.kind'] = 'LLM';\n }\n } else if (spanName === 'ai.generateText' || spanName === 'ai.streamText' || spanName === 'ai.generateObject' || spanName === 'ai.streamObject') {\n // Top-level AI SDK orchestration spans (multi-step loops)\n attrs['openinference.span.kind'] = 'CHAIN';\n }\n }\n\n // Model id / provider\n if ('ai.model.id' in attrs && !('llm.model_name' in attrs)) {\n attrs['llm.model_name'] = attrs['ai.model.id'];\n }\n if ('ai.model.provider' in attrs && !('llm.provider' in attrs)) {\n // ai.model.provider is e.g. \"openai.chat\" — take the leading segment\n const raw = String(attrs['ai.model.provider']);\n attrs['llm.provider'] = raw.split('.')[0];\n }\n\n // Token usage\n if ('ai.usage.promptTokens' in attrs && !('llm.token_count.prompt' in attrs)) {\n attrs['llm.token_count.prompt'] = attrs['ai.usage.promptTokens'];\n }\n if ('ai.usage.completionTokens' in attrs && !('llm.token_count.completion' in attrs)) {\n attrs['llm.token_count.completion'] = attrs['ai.usage.completionTokens'];\n }\n if ('ai.usage.totalTokens' in attrs && !('llm.token_count.total' in attrs)) {\n attrs['llm.token_count.total'] = attrs['ai.usage.totalTokens'];\n }\n\n // Settings → gen_ai.request.*\n const settingMap: Record<string, string> = {\n 'ai.settings.temperature': 'gen_ai.request.temperature',\n 'ai.settings.maxTokens': 'gen_ai.request.max_tokens',\n 'ai.settings.topP': 'gen_ai.request.top_p',\n 'ai.settings.topK': 'gen_ai.request.top_k',\n 'ai.settings.frequencyPenalty': 'gen_ai.request.frequency_penalty',\n 'ai.settings.presencePenalty': 'gen_ai.request.presence_penalty',\n 'ai.settings.stopSequences': 'gen_ai.request.stop_sequences',\n };\n for (const [src, tgt] of Object.entries(settingMap)) {\n if (src in attrs && !(tgt in attrs)) {\n attrs[tgt] = attrs[src];\n }\n }\n\n // Build llm.invocation_parameters from gen_ai.request.* if not already set\n if (!('llm.invocation_parameters' in attrs)) {\n const params: Record<string, any> = {};\n if ('gen_ai.request.temperature' in attrs) params.temperature = attrs['gen_ai.request.temperature'];\n if ('gen_ai.request.max_tokens' in attrs) params.max_tokens = attrs['gen_ai.request.max_tokens'];\n if ('gen_ai.request.top_p' in attrs) params.top_p = attrs['gen_ai.request.top_p'];\n if ('gen_ai.request.top_k' in attrs) params.top_k = attrs['gen_ai.request.top_k'];\n if ('gen_ai.request.frequency_penalty' in attrs) params.frequency_penalty = attrs['gen_ai.request.frequency_penalty'];\n if ('gen_ai.request.presence_penalty' in attrs) params.presence_penalty = attrs['gen_ai.request.presence_penalty'];\n if ('gen_ai.request.stop_sequences' in attrs) params.stop_sequences = attrs['gen_ai.request.stop_sequences'];\n if (Object.keys(params).length > 0) {\n attrs['llm.invocation_parameters'] = JSON.stringify(params);\n }\n }\n\n // Operation id → gen_ai.operation.name (helps RERANKER detection)\n if ('ai.operationId' in attrs && !('gen_ai.operation.name' in attrs)) {\n attrs['gen_ai.operation.name'] = attrs['ai.operationId'];\n }\n\n // Response text → output message 0\n if (\n 'ai.response.text' in attrs &&\n !('llm.output_messages.0.message.content' in attrs)\n ) {\n attrs['llm.output_messages.0.message.role'] = 'assistant';\n attrs['llm.output_messages.0.message.content'] = attrs['ai.response.text'];\n }\n\n // generateObject/streamObject emit ai.response.object (structured), not\n // ai.response.text — build the same output message from it so the doGenerate\n // LLM child shows the object instead of a blank output.\n if (\n 'ai.response.object' in attrs &&\n !('llm.output_messages.0.message.content' in attrs)\n ) {\n const obj = attrs['ai.response.object'];\n attrs['llm.output_messages.0.message.role'] = 'assistant';\n attrs['llm.output_messages.0.message.content'] =\n typeof obj === 'string' ? obj : JSON.stringify(obj);\n }\n\n // Response finish reason / id\n if ('ai.response.finishReason' in attrs && !('llm.response.finish_reason' in attrs)) {\n attrs['llm.response.finish_reason'] = attrs['ai.response.finishReason'];\n }\n if ('ai.response.id' in attrs && !('gen_ai.response.id' in attrs)) {\n attrs['gen_ai.response.id'] = attrs['ai.response.id'];\n }\n\n // Prompt messages → exploded indexed keys\n const rawMessages = attrs['ai.prompt.messages'];\n if (typeof rawMessages === 'string') {\n try {\n const parsed = JSON.parse(rawMessages);\n if (Array.isArray(parsed)) {\n parsed.forEach((msg, i) => {\n if (msg && typeof msg === 'object') {\n if (typeof msg.role === 'string') {\n attrs[`llm.input_messages.${i}.message.role`] = msg.role;\n }\n if (typeof msg.content === 'string') {\n attrs[`llm.input_messages.${i}.message.content`] = msg.content;\n } else if (msg.content !== undefined) {\n attrs[`llm.input_messages.${i}.message.content`] = JSON.stringify(msg.content);\n }\n }\n });\n }\n } catch {\n // Leave the raw string in place if parse fails\n }\n }\n\n // Response toolCalls → exploded under output message 0\n const rawToolCalls = attrs['ai.response.toolCalls'];\n if (typeof rawToolCalls === 'string') {\n try {\n const parsed = JSON.parse(rawToolCalls);\n if (Array.isArray(parsed)) {\n parsed.forEach((tc, i) => {\n if (tc && typeof tc === 'object') {\n if (tc.toolName !== undefined) {\n attrs[`llm.output_messages.0.message.tool_calls.${i}.tool_call.function.name`] = tc.toolName;\n }\n if (tc.args !== undefined) {\n const argStr =\n typeof tc.args === 'string' ? tc.args : JSON.stringify(tc.args);\n attrs[`llm.output_messages.0.message.tool_calls.${i}.tool_call.function.arguments`] = argStr;\n }\n if (tc.toolCallId !== undefined) {\n attrs[`llm.output_messages.0.message.tool_calls.${i}.tool_call.id`] = tc.toolCallId;\n }\n }\n });\n }\n } catch {\n // Ignore parse failure\n }\n }\n\n // Embedding input: Vercel AI SDK JSON.stringify()s each value for OTel transport — unwrap\n if ('ai.value' in attrs && typeof attrs['ai.value'] === 'string') {\n try { attrs['ai.value'] = JSON.parse(attrs['ai.value']); } catch {}\n }\n if ('ai.values' in attrs && Array.isArray(attrs['ai.values'])) {\n attrs['ai.values'] = JSON.stringify(attrs['ai.values'].map((v: unknown) => {\n if (typeof v === 'string') { try { return JSON.parse(v); } catch {} }\n return v;\n }));\n }\n\n // Tool span attributes\n if (spanName === 'ai.toolCall') {\n if ('ai.toolCall.name' in attrs && !('tool.name' in attrs)) {\n attrs['tool.name'] = attrs['ai.toolCall.name'];\n }\n // Normalize args/result to JSON strings so downstream parsers\n // (e.g. extractToolCallIdFromOutput) can JSON.parse them safely.\n if ('ai.toolCall.args' in attrs && !('input.value' in attrs)) {\n const raw = attrs['ai.toolCall.args'];\n attrs['input.value'] = typeof raw === 'string' ? raw : JSON.stringify(raw);\n }\n if ('ai.toolCall.result' in attrs && !('output.value' in attrs)) {\n const raw = attrs['ai.toolCall.result'];\n attrs['output.value'] = typeof raw === 'string' ? raw : JSON.stringify(raw);\n }\n }\n }\n\n // ── CrewAI-specific ─────────────────────────────────\n\n private addCrewaiTokenUsageFallback(attrs: Record<string, any>): void {\n const usage = attrs['neatlogs.crew.token_usage'];\n if (typeof usage !== 'string' || !usage) return;\n\n if (\n 'llm.token_count.prompt' in attrs ||\n 'llm.token_count.completion' in attrs ||\n 'llm.token_count.total' in attrs\n ) {\n return;\n }\n\n const parsed: Record<string, number> = {};\n const re = /([a-zA-Z_]+)=(\\d+)/g;\n let match: RegExpExecArray | null;\n while ((match = re.exec(usage)) !== null) {\n parsed[match[1]] = parseInt(match[2], 10);\n }\n\n if ('prompt_tokens' in parsed) {\n attrs['llm.token_count.prompt'] = parsed['prompt_tokens'];\n }\n if ('completion_tokens' in parsed) {\n attrs['llm.token_count.completion'] = parsed['completion_tokens'];\n }\n if ('total_tokens' in parsed) {\n attrs['llm.token_count.total'] = parsed['total_tokens'];\n }\n if ('cached_prompt_tokens' in parsed) {\n attrs['llm.token_count.prompt_details.cache_read'] = parsed['cached_prompt_tokens'];\n }\n }\n\n private addReasoningTokensFromOutputValue(attrs: Record<string, any>): void {\n if ('llm.token_count.completion_details.reasoning' in attrs) return;\n if ('llm.usage.reasoning_tokens' in attrs) return;\n\n const outputValue = attrs['output.value'];\n if (typeof outputValue !== 'string') return;\n\n try {\n const parsed = JSON.parse(outputValue);\n const usage = parsed?.usage ?? {};\n const details = usage.completion_tokens_details ?? {};\n const reasoning = details.reasoning_tokens;\n if (reasoning && reasoning > 0) {\n attrs['llm.token_count.completion_details.reasoning'] = reasoning;\n }\n } catch {\n // ignore\n }\n }\n\n private addCrewaiKickoffTelemetry(attrs: Record<string, any>): void {\n const spanName = String(attrs['_span_name'] ?? '');\n if (!(spanName.startsWith('Crew_') && spanName.endsWith('.kickoff'))) return;\n\n if (!('crew_number_of_tasks' in attrs)) {\n const count = this.coerceCollectionCount(attrs['crew_tasks']);\n if (count !== null) {\n attrs['crew_number_of_tasks'] = count;\n }\n }\n\n if (!('crew_number_of_agents' in attrs)) {\n const count = this.coerceCollectionCount(attrs['crew_agents']);\n if (count !== null) {\n attrs['crew_number_of_agents'] = count;\n }\n }\n }\n\n private coerceCollectionCount(value: any): number | null {\n if (value === null || value === undefined) return null;\n\n if (typeof value === 'boolean') return value ? 1 : 0;\n if (typeof value === 'number') {\n return Number.isFinite(value) ? Math.floor(value) : null;\n }\n if (Array.isArray(value)) return value.length;\n if (typeof value === 'object' && value !== null) return Object.keys(value).length;\n\n if (typeof value === 'string') {\n const s = value.trim();\n if (!s) return null;\n\n // Direct integer string\n if (/^\\d+$/.test(s)) {\n return parseInt(s, 10);\n }\n\n // Try JSON parse\n try {\n const parsed = JSON.parse(s);\n if (Array.isArray(parsed)) return parsed.length;\n if (typeof parsed === 'object' && parsed !== null) return Object.keys(parsed).length;\n } catch {\n // ignore\n }\n }\n\n return null;\n }\n\n // ── Operational metrics ─────────────────────────────\n\n private extractOperationalMetrics(\n spanDict: SpanDict,\n attrs: Record<string, any>,\n ): Record<string, any> {\n const computed: Record<string, any> = {};\n\n const startTime =\n typeof spanDict.start_time === 'number' ? spanDict.start_time : Number(spanDict.start_time);\n const endTime =\n typeof spanDict.end_time === 'number' ? spanDict.end_time : Number(spanDict.end_time);\n\n const durationNs = endTime - startTime;\n computed['neatlogs.metrics.duration_ms'] = durationNs / 1_000_000;\n\n // Skip event-based TTFT computation if already set live by streaming patch\n if (attrs['neatlogs.llm.metrics.ttft_ms'] !== undefined) {\n return computed;\n }\n\n // Google GenAI emits \"gen_ai.content.chunk\" on every text chunk — use for TTFT\n const chunkTimestamps: number[] = [];\n if (spanDict.events) {\n for (const event of spanDict.events) {\n if (event.name === 'gen_ai.content.chunk') {\n const ts =\n typeof event.timestamp === 'number' ? event.timestamp : Number(event.timestamp);\n chunkTimestamps.push(ts);\n }\n }\n }\n\n if (chunkTimestamps.length > 0) {\n const firstNs = chunkTimestamps[0];\n const ttftMs = Math.round(((firstNs - startTime) / 1_000_000) * 1000) / 1000;\n computed['neatlogs.llm.metrics.ttft_ms'] = ttftMs;\n\n if (chunkTimestamps.length >= 2) {\n const lastNs = chunkTimestamps[chunkTimestamps.length - 1];\n const stgMs = Math.round(((lastNs - firstNs) / 1_000_000) * 1000) / 1000;\n computed['neatlogs.llm.metrics.streaming_time_to_generate_ms'] = stgMs;\n }\n }\n\n return computed;\n }\n\n // ── Event upcycling ─────────────────────────────────\n\n private upcycleEvents(spanDict: SpanDict): Record<string, any> {\n const upcycled: Record<string, any> = {};\n const retrieverDocs: Array<Record<string, any>> = [];\n\n if (!spanDict.events) return upcycled;\n\n for (const event of spanDict.events) {\n const eAttrs = event.attributes ?? {};\n\n if (event.name === 'db.query.result') {\n const doc: Record<string, any> = {\n timestamp: String(event.timestamp),\n };\n if ('db.query.result.id' in eAttrs) doc['id'] = eAttrs['db.query.result.id'];\n if ('db.query.result.distance' in eAttrs)\n doc['distance'] = eAttrs['db.query.result.distance'];\n if ('db.query.result.document' in eAttrs)\n doc['document'] = eAttrs['db.query.result.document'];\n if ('db.query.result.metadata' in eAttrs) {\n const metadata = eAttrs['db.query.result.metadata'];\n if (typeof metadata === 'string') {\n doc['metadata'] = safeParse(metadata) ?? String(metadata);\n } else {\n doc['metadata'] = metadata;\n }\n }\n for (const field of ['_id', 'title', 'text', 'category', '_score']) {\n if (field in eAttrs) doc[field] = eAttrs[field];\n }\n retrieverDocs.push(doc);\n } else if (event.name === 'db.search.result') {\n const doc: Record<string, any> = {\n timestamp: String(event.timestamp),\n };\n if ('db.search.query.id' in eAttrs) doc['query_id'] = eAttrs['db.search.query.id'];\n if ('db.search.result.id' in eAttrs) doc['result_id'] = eAttrs['db.search.result.id'];\n if ('db.search.result.distance' in eAttrs)\n doc['distance'] = eAttrs['db.search.result.distance'];\n if ('db.search.result.entity' in eAttrs)\n doc['entity'] = eAttrs['db.search.result.entity'];\n retrieverDocs.push(doc);\n } else if (event.name === 'db.query.embeddings') {\n const vector =\n eAttrs['db.query.embeddings.vector'] ?? eAttrs['vector'];\n if (vector && (Array.isArray(vector) || ArrayBuffer.isView(vector))) {\n upcycled['neatlogs.db.query.embeddings.dimension'] = (vector as any).length;\n if (this.debug) {\n logger.debug(`Calculated embedding dimension: ${(vector as any).length}`);\n }\n }\n }\n }\n\n if (retrieverDocs.length > 0) {\n upcycled['retrieval_documents'] = JSON.stringify(retrieverDocs);\n }\n\n return upcycled;\n }\n\n // ── Namespace mapping ───────────────────────────────\n\n private applyNamespaceMapping(attrs: Record<string, any>): Record<string, any> {\n // Use the AttributeMapper for the heavy lifting\n const unified = this.mapper.mapAttributes(attrs);\n\n // Ensure neatlogs.span.kind is meaningful (not 'unknown')\n const currentKind = unified['neatlogs.span.kind'];\n if (!currentKind || currentKind === 'unknown') {\n const oiKind = attrs['openinference.span.kind'];\n if (oiKind) {\n unified['neatlogs.span.kind'] = String(oiKind).toLowerCase();\n } else {\n // Fallback: infer from span name — skip for framework-internal spans (e.g. next.js routes)\n const scopeName = attrs['neatlogs.instrumentation.name'] ?? '';\n const spanName = attrs['_span_name'] ?? '';\n if (spanName && scopeName !== 'next.js') {\n const inferred = inferSpanKindFromName(spanName).toLowerCase();\n unified['neatlogs.span.kind'] = inferred;\n }\n }\n }\n\n // Detect RERANKER operations (only infer if kind wasn't explicitly set)\n const llmRequestType = (attrs['llm.request.type'] ?? '').toLowerCase();\n const genAiOperation = (attrs['gen_ai.operation.name'] ?? '').toLowerCase();\n const spanNameLower = (attrs['_span_name'] ?? '').toLowerCase();\n const hasExplicitKind = 'openinference.span.kind' in attrs || 'traceloop.span.kind' in attrs;\n\n if (\n !hasExplicitKind && (\n llmRequestType === 'rerank' ||\n genAiOperation === 'rerank' ||\n spanNameLower.includes('rerank')\n )\n ) {\n unified['neatlogs.span.kind'] = 'reranker';\n }\n\n // Remove vectordb.embedding_model for non-vector span kinds\n const spanKind = (\n attrs['neatlogs.span.kind'] ?? attrs['openinference.span.kind'] ?? ''\n ).toLowerCase();\n if (!['embedding', 'retriever', 'vector_store'].includes(spanKind)) {\n delete unified['neatlogs.vectordb.embedding_model'];\n }\n\n if (this.debug) {\n logger.debug(\n `[ScopeDetectionFinal] span_name=${attrs['_span_name']} ` +\n `scope=${attrs['neatlogs.instrumentation.name']} ` +\n `framework=${unified['neatlogs.framework']}`,\n );\n }\n\n // Fill provider/system gaps\n this.fillProviderGaps(attrs, unified);\n\n return unified;\n }\n\n // ── Provider/system gap filling ─────────────────────\n\n private fillProviderGaps(attrs: Record<string, any>, unified: Record<string, any>): void {\n // --- neatlogs.llm.provider ---\n if (!unified['neatlogs.llm.provider']) {\n const scopeProvider = unified['neatlogs.provider'] ?? attrs['neatlogs.provider'] ?? '';\n if (scopeProvider) {\n unified['neatlogs.llm.provider'] = scopeProvider;\n } else {\n const model = String(\n attrs['llm.model_name'] ??\n attrs['gen_ai.request.model'] ??\n attrs['llm.model'] ??\n '',\n );\n const inferred = this.inferProviderFromModel(model);\n if (inferred) {\n unified['neatlogs.llm.provider'] = inferred;\n }\n }\n }\n\n // --- neatlogs.llm.system ---\n if (!unified['neatlogs.llm.system']) {\n const provider = (\n unified['neatlogs.llm.provider'] ??\n unified['neatlogs.provider'] ??\n ''\n ).toLowerCase();\n const system = PROVIDER_TO_SYSTEM[provider] ?? '';\n if (system) {\n unified['neatlogs.llm.system'] = system;\n }\n }\n }\n\n private inferProviderFromModel(model: string): string {\n if (!model) return '';\n const m = model.toLowerCase();\n\n // OpenAI model families\n if (/^(gpt-|o1-|o3-|o4-|text-embedding-|text-davinci-)/.test(m)) return 'openai';\n // Anthropic\n if (m.startsWith('claude-')) return 'anthropic';\n // Google\n if (m.startsWith('gemini-') || m.startsWith('gemma-')) return 'google';\n // Mistral\n if (m.startsWith('mistral-') || m.startsWith('mixtral-')) return 'mistralai';\n // Cohere\n if (m.startsWith('command-') || m.startsWith('embed-english') || m.startsWith('embed-multilingual'))\n return 'cohere';\n // Bedrock model IDs\n if (\n m.startsWith('anthropic.') ||\n m.startsWith('meta.') ||\n m.startsWith('amazon.') ||\n m.startsWith('nova-') ||\n m.startsWith('titan-')\n )\n return 'aws';\n // xAI\n if (m.startsWith('grok-')) return 'xai';\n // DeepSeek\n if (m.startsWith('deepseek-')) return 'deepseek';\n\n return '';\n }\n\n // ── Intermediate ReAct steps ────────────────────────\n\n private addIntermediateSteps(unified: Record<string, any>): void {\n if ('neatlogs.llm.intermediate_steps' in unified) return;\n if (String(unified['neatlogs.span.kind'] ?? '').toLowerCase() !== 'llm') return;\n\n const steps = this.extractReactStepsFromMessages(unified);\n if (steps.length === 0) return;\n\n unified['neatlogs.llm.intermediate_steps'] = JSON.stringify(steps);\n }\n\n private extractReactStepsFromMessages(unified: Record<string, any>): Array<Record<string, string>> {\n // Try output messages first\n const outputTexts = this.collectRoleTexts(\n unified,\n 'neatlogs.llm.output_messages',\n 'assistant',\n );\n const steps = this.parseReactSteps(outputTexts);\n if (steps.length > 0) return steps;\n\n // Fallback to input messages\n const inputTexts = this.collectRoleTexts(\n unified,\n 'neatlogs.llm.input_messages',\n 'assistant',\n );\n return this.parseReactSteps(inputTexts);\n }\n\n private collectRoleTexts(\n unified: Record<string, any>,\n prefix: string,\n role: string,\n ): string[] {\n const idxRe = new RegExp(`^${escapeRegExp(prefix)}\\\\.(\\\\d+)\\\\.content$`);\n const idxs = new Set<number>();\n for (const k of Object.keys(unified)) {\n const m = idxRe.exec(k);\n if (m) {\n idxs.add(parseInt(m[1], 10));\n }\n }\n\n const texts: string[] = [];\n for (const i of [...idxs].sort((a, b) => a - b)) {\n const r = unified[`${prefix}.${i}.role`];\n if (typeof r !== 'string' || r.toLowerCase() !== role) continue;\n const c = unified[`${prefix}.${i}.content`];\n if (typeof c === 'string' && c.toLowerCase().includes('thought:')) {\n texts.push(c);\n }\n }\n return texts;\n }\n\n private parseReactSteps(texts: string[]): Array<Record<string, string>> {\n if (texts.length === 0) return [];\n\n const markerRe = /(?:^|\\n)\\s*(Thought|Context|Action|Action Input|Observation|Final Answer)\\s*:\\s*/gim;\n\n const allSteps: Array<Record<string, string>> = [];\n\n for (const text of texts) {\n const matches: Array<{ label: string; start: number; matchStart: number }> = [];\n let m: RegExpExecArray | null;\n // Reset lastIndex for global regex\n markerRe.lastIndex = 0;\n while ((m = markerRe.exec(text)) !== null) {\n matches.push({\n label: m[1].trim().toLowerCase(),\n start: m.index + m[0].length,\n matchStart: m.index,\n });\n }\n\n if (matches.length === 0) continue;\n\n let cur: Record<string, string> = {};\n\n const commit = () => {\n if (Object.keys(cur).length === 0) return;\n if (!Object.values(cur).some((v) => v)) {\n cur = {};\n return;\n }\n if (allSteps.length > 0) {\n const last = allSteps[allSteps.length - 1];\n if (JSON.stringify(last) === JSON.stringify(cur)) {\n cur = {};\n return;\n }\n }\n allSteps.push(cur);\n cur = {};\n };\n\n for (let idx = 0; idx < matches.length; idx++) {\n const { label, start: contentStart } = matches[idx];\n const contentEnd = idx + 1 < matches.length ? matches[idx + 1].matchStart : text.length;\n const value = text.slice(contentStart, contentEnd).trim();\n\n if (label === 'thought' && Object.keys(cur).length > 0) {\n commit();\n }\n\n if (label === 'thought') {\n cur['thought'] = truncate(value, 600);\n } else if (label === 'context') {\n cur['context'] = truncate(value, 500);\n } else if (label === 'action') {\n cur['action'] = truncate(value, 200);\n } else if (label === 'action input') {\n cur['action_input'] = truncate(value, 1000);\n } else if (label === 'observation') {\n cur['observation'] = truncate(value, 500);\n } else if (label === 'final answer') {\n cur['final_answer'] = truncate(value, 1200);\n }\n }\n\n commit();\n }\n\n return allSteps;\n }\n\n // ── I/O sanitization ────────────────────────────────\n\n /**\n * Remove Python object reprs from input.value / output.value JSON strings.\n * Also drops the top-level \"self\" key that CrewAI injects.\n */\n sanitizeIoValue(val: any): any {\n if (typeof val !== 'string') return val;\n\n try {\n const parsed = JSON.parse(val);\n const cleaned = cleanPythonReprs(parsed);\n if (typeof cleaned === 'object' && cleaned !== null && !Array.isArray(cleaned)) {\n delete cleaned['self'];\n }\n if (JSON.stringify(cleaned) !== JSON.stringify(parsed)) {\n return JSON.stringify(cleaned);\n }\n } catch {\n // not JSON, return as-is\n }\n return val;\n }\n\n // ── Embedding vector filter ─────────────────────────\n\n private filterEmbeddingVectors(attrs: Record<string, any>): Record<string, any> {\n const filtered: Record<string, any> = {};\n for (const [key, value] of Object.entries(attrs)) {\n // Skip embedding vector keys\n if (key.includes('.embedding.vector') || key.includes('.embeddings.') || key === 'ai.embeddings' || key === 'ai.embedding') {\n if (this.debug) {\n logger.debug(`[FILTER] Dropped embedding vector key: ${key}`);\n }\n continue;\n }\n\n // Skip large arrays (likely embedding vectors)\n if ((Array.isArray(value) || ArrayBuffer.isView(value)) && (value as any).length > 1000) {\n if (this.debug) {\n logger.debug(`[FILTER] Dropped large array (${(value as any).length} elements): ${key}`);\n }\n continue;\n }\n\n filtered[key] = value;\n }\n return filtered;\n }\n\n // ── Helpers ─────────────────────────────────────────\n\n private looksLikeHttp(attrs: Record<string, any>): boolean {\n for (const k of ['http.method', 'http.url', 'http.status_code', 'http.route']) {\n if (k in attrs) return true;\n }\n return Object.keys(attrs).some((key) => key.startsWith('http.'));\n }\n\n /**\n * Check if the raw span kind indicates CLIENT (OTel SpanKind.CLIENT = 3).\n */\n private isHttpLikeSpanKind(kind: number | string): boolean {\n if (typeof kind === 'number') return kind === 3; // SpanKind.CLIENT = 3\n return String(kind).toUpperCase() === 'CLIENT';\n }\n}\n\n// ────────────────────────────────────────────────────────\n// Utility functions\n// ────────────────────────────────────────────────────────\n\nfunction truncate(val: string, maxLen: number): string {\n val = (val ?? '').trim();\n if (val.length <= maxLen) return val;\n return val.slice(0, maxLen) + `...(truncated,len=${val.length})`;\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","/**\n * Registry for CrewAI task template bindings.\n *\n * Call registerCrewaiTask(task, userTpl, vars) in your task setup after creating\n * each Task. The span processor reads and clears the entry when the corresponding\n * AGENT span ends, stamping the template onto that span.\n */\n\nimport { getLogger } from './logger.js';\n\nconst logger = getLogger();\n\n/** Registry: taskId -> [templateStr, varsJson] */\nconst _registry = new Map<string, [string, string | null]>();\n\n/**\n * Register a user prompt template for a CrewAI task.\n *\n * @param task - A CrewAI Task instance (must have an .id property)\n * @param userTpl - A neatlogs UserPromptTemplate describing the task prompt\n * @param vars - Variable values passed to userTpl at task-creation time\n */\nexport function registerCrewaiTask(\n task: { id: string | number },\n userTpl: { template: string | any },\n vars?: Record<string, any>,\n): void {\n const taskId = String(task.id);\n const tplStr = String(userTpl.template);\n const varsJson =\n vars && Object.keys(vars).length > 0\n ? JSON.stringify(vars, (_key, val) => (typeof val === 'undefined' ? null : val))\n : null;\n\n _registry.set(taskId, [tplStr, varsJson]);\n logger.debug(`Registered CrewAI task ${taskId}`);\n}\n\n/**\n * Remove and return the registry entry for taskId, or undefined if absent.\n */\nexport function popEntry(taskId: string): [string, string | null] | undefined {\n const entry = _registry.get(taskId);\n if (entry) {\n _registry.delete(taskId);\n }\n return entry;\n}\n\n/**\n * Clear all registered tasks. Used for testing.\n * @internal\n */\nexport function _clearTaskRegistry(): void {\n _registry.clear();\n}\n","const VERIFICATION_MARKER_KEY = 'neatlogs.verification.marker';\nconst MAX_VERIFICATION_MARKER_LENGTH = 128;\n\nfunction decodeResourceComponent(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\n/** Read only the temporary Wizard correlation marker from OTel resource env. */\nexport function verificationMarkerFromEnv(\n value = process.env.OTEL_RESOURCE_ATTRIBUTES ?? '',\n): string | undefined {\n for (const entry of value.split(',')) {\n const separator = entry.indexOf('=');\n if (separator < 1) continue;\n const key = decodeResourceComponent(entry.slice(0, separator).trim());\n if (key !== VERIFICATION_MARKER_KEY) continue;\n const marker = decodeResourceComponent(entry.slice(separator + 1).trim());\n if (!marker || marker.length > MAX_VERIFICATION_MARKER_LENGTH) return undefined;\n return marker;\n }\n return undefined;\n}\n\nexport function addVerificationMarkerResourceAttribute(\n attributes: Record<string, string | number | boolean>,\n): void {\n const marker = verificationMarkerFromEnv();\n if (marker) attributes[VERIFICATION_MARKER_KEY] = marker;\n}\n\n","import { SpanKind, type Attributes } from '@opentelemetry/api';\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport { resolveExplicitSpanKind } from '../span-kinds/mapping.js';\n\nconst HTTP_SCOPE_PREFIXES = [\n '@opentelemetry/instrumentation-http',\n '@opentelemetry/instrumentation-fetch',\n '@opentelemetry/instrumentation-undici',\n];\n\nconst HTTP_ATTRIBUTE_KEYS = [\n 'http.method',\n 'http.request.method',\n 'http.url',\n 'http.route',\n 'url.full',\n];\n\nconst SEMANTIC_AI_KINDS = new Set([\n 'WORKFLOW',\n 'AGENT',\n 'CHAIN',\n 'TOOL',\n 'RETRIEVER',\n 'EMBEDDING',\n 'GUARDRAIL',\n 'LLM',\n 'RERANKER',\n 'VECTOR_STORE',\n 'TASK',\n 'EVALUATOR',\n 'LOG',\n 'MEMORY',\n 'MCP_TOOL',\n]);\n\n/** True only for transport HTTP spans, not semantic AI spans carrying HTTP metadata. */\nexport function isHttpSpan(\n span: ReadableSpan,\n attributes: Attributes = span.attributes ?? {},\n): boolean {\n const resolvedKind = resolveExplicitSpanKind(attributes).toUpperCase();\n if (resolvedKind === 'HTTP') return true;\n if (SEMANTIC_AI_KINDS.has(resolvedKind)) return false;\n\n const scopeName = span.instrumentationLibrary.name ?? '';\n if (HTTP_SCOPE_PREFIXES.some((prefix) => scopeName.startsWith(prefix))) return true;\n\n return span.kind === SpanKind.CLIENT && HTTP_ATTRIBUTE_KEYS.some((key) => key in attributes);\n}\n","/**\n * A SpanExporter wrapper that filters out spans marked as dropped by the mask system.\n *\n * When NeatlogsSpanProcessor's onEnd() determines a mask returned null (meaning\n * \"drop this span\"), it sets `neatlogs.dropped = true` on the OTel span's attributes.\n * This exporter wrapper checks for that attribute and excludes those spans before\n * delegating to the real exporter.\n */\nimport { SpanStatusCode, type Attributes, type HrTime } from '@opentelemetry/api';\nimport { ExportResultCode, type ExportResult } from '@opentelemetry/core';\nimport { Resource } from '@opentelemetry/resources';\nimport type { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport { getScheduledMask } from './mask.js';\nimport type { DeliveryDiagnostics } from './delivery-diagnostics.js';\nimport {\n captureMediaInSnapshot,\n discardPendingMedia,\n resolvePendingMediaUploads,\n} from './media.js';\nimport { DisabledUploadAuthority, type UploadAuthority } from './upload-authority.js';\nimport { isHttpSpan } from './http-span.js';\n\nconst MEDIA_RESOLUTION_CONCURRENCY = 4;\n\nasync function mapWithConcurrency<T, R>(\n values: readonly T[],\n concurrency: number,\n worker: (value: T) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(values.length);\n let cursor = 0;\n const workers = Array.from({ length: Math.min(concurrency, values.length) }, async () => {\n while (cursor < values.length) {\n const index = cursor;\n cursor += 1;\n results[index] = await worker(values[index]);\n }\n });\n await Promise.all(workers);\n return results;\n}\n\nfunction toHrTime(nanos: unknown, fallback: HrTime): HrTime {\n if (typeof nanos !== 'number' || !Number.isFinite(nanos)) return fallback;\n const seconds = Math.floor(nanos / 1_000_000_000);\n return [seconds, Math.max(0, Math.floor(nanos - seconds * 1_000_000_000))];\n}\n\nfunction toAttributes(value: unknown): Attributes {\n if (!value || typeof value !== 'object') return {};\n const result: Attributes = {};\n for (const [key, item] of Object.entries(value)) {\n if (\n typeof item === 'string' ||\n typeof item === 'number' ||\n typeof item === 'boolean' ||\n (Array.isArray(item) &&\n item.every(\n (entry) =>\n entry === null ||\n typeof entry === 'string' ||\n typeof entry === 'number' ||\n typeof entry === 'boolean',\n ))\n ) {\n result[key] = item as any;\n } else if (item !== undefined) {\n result[key] = JSON.stringify(item);\n }\n }\n return result;\n}\n\nfunction statusCode(value: unknown, fallback: SpanStatusCode): SpanStatusCode {\n if (typeof value === 'number') return value as SpanStatusCode;\n if (typeof value === 'string') {\n const resolved = SpanStatusCode[value as keyof typeof SpanStatusCode];\n if (typeof resolved === 'number') return resolved;\n }\n return fallback;\n}\n\nfunction maskedReadableSpan(span: ReadableSpan, data: Record<string, any>): ReadableSpan {\n const resourceData = data.resource?.attributes ?? data.resource;\n const eventData = Array.isArray(data.events) ? data.events : [];\n const linkData = Array.isArray(data.links) ? data.links : [];\n const status = data.status ?? {};\n\n return {\n name: typeof data.name === 'string' ? data.name : span.name,\n kind: span.kind,\n spanContext: () => span.spanContext(),\n parentSpanId:\n data.parent_span_id === null\n ? undefined\n : typeof data.parent_span_id === 'string'\n ? data.parent_span_id\n : span.parentSpanId,\n startTime: span.startTime,\n endTime: span.endTime,\n duration: span.duration,\n ended: span.ended,\n status: {\n code: statusCode(status.code, span.status.code),\n message:\n typeof status.message === 'string'\n ? status.message\n : typeof status.description === 'string'\n ? status.description\n : span.status.message,\n },\n attributes: toAttributes(data.attributes),\n events: eventData.map((event: any, index: number) => ({\n name: typeof event?.name === 'string' ? event.name : (span.events[index]?.name ?? 'event'),\n time: toHrTime(event?.timestamp, span.events[index]?.time ?? span.endTime),\n attributes: toAttributes(event?.attributes),\n droppedAttributesCount: span.events[index]?.droppedAttributesCount ?? 0,\n })),\n links: linkData.map((link: any, index: number) => {\n const original = span.links[index];\n return {\n context: {\n traceId:\n typeof link?.trace_id === 'string'\n ? link.trace_id\n : (original?.context.traceId ?? span.spanContext().traceId),\n spanId:\n typeof link?.span_id === 'string'\n ? link.span_id\n : (original?.context.spanId ?? span.spanContext().spanId),\n traceFlags:\n typeof link?.trace_flags === 'number'\n ? link.trace_flags\n : (original?.context.traceFlags ?? 0),\n traceState: original?.context.traceState,\n isRemote: original?.context.isRemote,\n },\n attributes: toAttributes(link?.attributes),\n droppedAttributesCount: original?.droppedAttributesCount ?? 0,\n };\n }),\n resource: new Resource(toAttributes(resourceData)),\n instrumentationLibrary: span.instrumentationLibrary,\n droppedAttributesCount: span.droppedAttributesCount,\n droppedEventsCount: span.droppedEventsCount,\n droppedLinksCount: span.droppedLinksCount,\n };\n}\n\nexport class FilteringExporter implements SpanExporter {\n constructor(\n private readonly _delegate: SpanExporter,\n private readonly diagnostics?: DeliveryDiagnostics,\n private readonly uploadAuthority: UploadAuthority = new DisabledUploadAuthority(),\n private readonly _onPrepared?: (spans: readonly ReadableSpan[]) => void,\n ) {}\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n void mapWithConcurrency(spans, MEDIA_RESOLUTION_CONCURRENCY, async (span) => {\n if (isHttpSpan(span)) {\n discardPendingMedia(span as object);\n return { span: null, mediaReady: true };\n }\n if (span.instrumentationLibrary.name === 'next.js') {\n discardPendingMedia(span as object);\n this.diagnostics?.recordFrameworkSpanDrop();\n return { span: null, mediaReady: true };\n }\n const scheduled = getScheduledMask(span as object);\n if (!scheduled) {\n discardPendingMedia(span as object);\n return { span, mediaReady: true };\n }\n const masked = await scheduled;\n if (masked === null) {\n discardPendingMedia(span as object);\n this.diagnostics?.recordMaskedDrop('span');\n return { span: null, mediaReady: true };\n }\n const attributes = {\n ...(masked.attributes && typeof masked.attributes === 'object' ? masked.attributes : {}),\n };\n const maskedData = { ...masked, attributes };\n const maskedSpan = maskedReadableSpan(span, maskedData);\n if (isHttpSpan(maskedSpan)) {\n discardPendingMedia(span as object);\n return { span: null, mediaReady: true };\n }\n captureMediaInSnapshot(\n span as object,\n maskedData,\n this.uploadAuthority.available,\n this.uploadAuthority.unavailableReason,\n );\n const mediaReady = await resolvePendingMediaUploads(\n span as object,\n maskedData,\n this.uploadAuthority,\n this.diagnostics,\n );\n return {\n span: maskedReadableSpan(span, maskedData),\n mediaReady,\n };\n }).then(\n (prepared) => {\n const filtered = prepared\n .map((item) => item.span)\n .filter((span): span is ReadableSpan => span !== null);\n const mediaFailures = prepared.filter(\n (item) => item.span !== null && !item.mediaReady,\n ).length;\n try {\n this._onPrepared?.(Object.freeze([...filtered]));\n } catch {\n // Diagnostics must never affect application telemetry delivery.\n }\n if (filtered.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS });\n return;\n }\n try {\n this._delegate.export(filtered, (result) => {\n if (result.code === ExportResultCode.SUCCESS && mediaFailures > 0) {\n this.diagnostics?.recordExportFailure('span', mediaFailures);\n resultCallback({\n code: ExportResultCode.FAILED,\n error: new Error('one or more typed media uploads failed'),\n });\n return;\n }\n resultCallback(result);\n });\n } catch {\n this.diagnostics?.recordExportFailure('span', filtered.length);\n resultCallback({\n code: ExportResultCode.FAILED,\n error: new Error('span exporter failed synchronously'),\n });\n }\n },\n () => {\n this.diagnostics?.recordExportFailure('span', spans.length);\n resultCallback({\n code: ExportResultCode.FAILED,\n error: new Error('span preparation failed'),\n });\n },\n );\n }\n\n async shutdown(): Promise<void> {\n return this._delegate.shutdown();\n }\n\n async forceFlush?(): Promise<void> {\n return this._delegate.forceFlush?.();\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { ExportResultCode, type ExportResult } from \"@opentelemetry/core\";\nimport { ProtobufTraceSerializer } from \"@opentelemetry/otlp-transformer\";\nimport type { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\nimport type { DeliveryDiagnostics } from \"./delivery-diagnostics.js\";\nimport { getLogger } from \"./logger.js\";\nimport {\n assertReadyUploadReceipt,\n DisabledUploadAuthority,\n DEFAULT_MAX_OTLP_OVERFLOW_BYTES,\n TelemetryUploadError,\n type UploadAuthority,\n type UploadPayload,\n} from \"./upload-authority.js\";\n\nexport const DEFAULT_MAX_EXPORT_BYTES = 4 * 1024 * 1024;\nexport const DEFAULT_OVERFLOW_EXPORT_DEADLINE_MS = 15_000;\n\nconst logger = getLogger();\n\ntype ExportAction =\n | { type: \"batch\"; spans: ReadableSpan[] }\n | { type: \"overflow\"; span: ReadableSpan };\n\n/** Split batches by encoded size and route a single oversized span by claim-check. */\nexport class ByteLimitedSpanExporter implements SpanExporter {\n constructor(\n private readonly delegate: SpanExporter,\n private readonly maxExportBytes = DEFAULT_MAX_EXPORT_BYTES,\n private readonly diagnostics?: DeliveryDiagnostics,\n private readonly uploadAuthority: UploadAuthority = new DisabledUploadAuthority(),\n private readonly overflowExportDeadlineMs = DEFAULT_OVERFLOW_EXPORT_DEADLINE_MS,\n ) {\n if (!Number.isSafeInteger(maxExportBytes) || maxExportBytes <= 0) {\n throw new RangeError(\"maxExportBytes must be a positive safe integer\");\n }\n if (!Number.isFinite(overflowExportDeadlineMs) || overflowExportDeadlineMs <= 0) {\n throw new RangeError(\"overflowExportDeadlineMs must be positive\");\n }\n diagnostics?.configureUploadAuthority(\n uploadAuthority.available,\n uploadAuthority.unavailableReason,\n );\n }\n\n static encoded(span: ReadableSpan): Uint8Array {\n const encoded = ProtobufTraceSerializer.serializeRequest([span]);\n if (!encoded) throw new Error(\"failed to encode OTLP trace request\");\n return encoded;\n }\n\n static encodedUpperBound(span: ReadableSpan): number {\n return ProtobufTraceSerializer.serializeRequest([span])?.byteLength ?? Number.MAX_SAFE_INTEGER;\n }\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n const deadlineUnixMs = Date.now() + this.overflowExportDeadlineMs;\n let actions: ExportAction[];\n try {\n actions = this.actions(spans);\n } catch (error) {\n this.diagnostics?.recordExportFailure(\"span\", spans.length);\n resultCallback({\n code: ExportResultCode.FAILED,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n return;\n }\n void this.exportSequentially(actions, deadlineUnixMs).then(resultCallback, (error) => {\n resultCallback({\n code: ExportResultCode.FAILED,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n });\n }\n\n private actions(spans: ReadableSpan[]): ExportAction[] {\n const actions: ExportAction[] = [];\n let current: ReadableSpan[] = [];\n let currentBytes = 0;\n for (const span of spans) {\n // Classify one span at a time. Do not retain every oversized encoded\n // request in the action list: a full batch may contain many large spans.\n const spanBytes = ByteLimitedSpanExporter.encodedUpperBound(span);\n if (spanBytes > this.maxExportBytes) {\n if (current.length > 0) actions.push({ type: \"batch\", spans: current });\n current = [];\n currentBytes = 0;\n actions.push({\n type: \"overflow\",\n span,\n });\n continue;\n }\n if (current.length > 0 && currentBytes + spanBytes > this.maxExportBytes) {\n actions.push({ type: \"batch\", spans: current });\n current = [];\n currentBytes = 0;\n }\n current.push(span);\n currentBytes += spanBytes;\n }\n if (current.length > 0) actions.push({ type: \"batch\", spans: current });\n return actions;\n }\n\n private async exportSequentially(\n actions: ExportAction[],\n deadlineUnixMs: number,\n ): Promise<ExportResult> {\n let overflowFailed = false;\n for (let index = 0; index < actions.length; index += 1) {\n const action = actions[index];\n if (action.type === \"overflow\") {\n const success = await this.exportOverflow(action.span, deadlineUnixMs);\n if (!success) overflowFailed = true;\n continue;\n }\n let result: ExportResult;\n try {\n result = await new Promise<ExportResult>((resolve) => {\n this.delegate.export(action.spans, resolve);\n });\n } catch (error) {\n this.recordUnsent(actions, index);\n throw error;\n }\n if (result.code !== ExportResultCode.SUCCESS) {\n this.recordUnsent(actions, index);\n return result;\n }\n }\n return {\n code: overflowFailed ? ExportResultCode.FAILED : ExportResultCode.SUCCESS,\n ...(overflowFailed\n ? { error: new Error(\"one or more oversized spans failed authenticated upload\") }\n : {}),\n };\n }\n\n private async exportOverflow(\n span: ReadableSpan,\n deadlineUnixMs: number,\n ): Promise<boolean> {\n if (deadlineUnixMs <= Date.now()) {\n this.recordOverflowFailure(\"prepare\", \"overflow_export_deadline_exceeded\");\n return false;\n }\n if (!this.uploadAuthority.available) {\n const unavailableReason = /^[a-zA-Z0-9_.-]{1,64}$/.test(\n this.uploadAuthority.unavailableReason,\n )\n ? this.uploadAuthority.unavailableReason\n : \"upload_authority_unavailable\";\n this.diagnostics?.recordOverflow(\"span\", \"unavailable\");\n this.diagnostics?.recordOverflow(\"span\", \"failures\");\n this.diagnostics?.recordExportFailure(\"span\", 1);\n this.diagnostics?.recordUploadFailure(\"prepare\", unavailableReason);\n logger.error(\n `oversized span rejected: limit=${this.maxExportBytes} reason=${unavailableReason}`,\n );\n return false;\n }\n const content = ByteLimitedSpanExporter.encoded(span);\n if (deadlineUnixMs <= Date.now()) {\n this.recordOverflowFailure(\"prepare\", \"overflow_export_deadline_exceeded\");\n return false;\n }\n const uploadLimit = Math.min(\n this.uploadAuthority.maxPayloadBytes,\n DEFAULT_MAX_OTLP_OVERFLOW_BYTES,\n );\n if (content.byteLength > uploadLimit) {\n this.diagnostics?.recordOverflow(\"span\", \"failures\");\n this.diagnostics?.recordExportFailure(\"span\", 1);\n this.diagnostics?.recordUploadFailure(\"validate\", \"payload_too_large\");\n logger.error(\n `oversized span upload rejected locally: bytes=${content.byteLength} upload_limit=${uploadLimit}`,\n );\n return false;\n }\n const sha256 = createHash(\"sha256\").update(content).digest(\"hex\");\n if (deadlineUnixMs <= Date.now()) {\n this.recordOverflowFailure(\"prepare\", \"overflow_export_deadline_exceeded\");\n return false;\n }\n const payload: UploadPayload = {\n content,\n purpose: \"otlp_overflow\",\n sha256,\n byteLength: content.byteLength,\n mimeType: \"application/x-protobuf\",\n contentEncoding: \"identity\",\n idempotencyKey: `nl-ts-v1:otlp_overflow:${sha256}`,\n payloadSchema: \"otlp.traces.v1\",\n };\n try {\n assertReadyUploadReceipt(\n await this.uploadWithinDeadline(payload, deadlineUnixMs),\n payload,\n );\n this.diagnostics?.recordOverflow(\"span\", \"uploads\");\n return true;\n } catch (error) {\n const stage = error instanceof TelemetryUploadError ? error.stage : \"upload\";\n const rawReason =\n error instanceof TelemetryUploadError ? error.reasonCode : \"unexpected_error\";\n const reason = /^[a-zA-Z0-9_.-]{1,64}$/.test(rawReason)\n ? rawReason\n : \"unsafe_reason_code\";\n this.diagnostics?.recordOverflow(\"span\", \"failures\");\n this.diagnostics?.recordExportFailure(\"span\", 1);\n this.diagnostics?.recordUploadFailure(stage, reason);\n logger.error(`oversized span upload failed: ${stage}/${reason}`);\n return false;\n }\n }\n\n private async uploadWithinDeadline(\n payload: UploadPayload,\n deadlineUnixMs: number,\n ) {\n const remaining = deadlineUnixMs - Date.now();\n if (remaining <= 0) {\n throw new TelemetryUploadError(\n \"prepare\",\n \"overflow_export_deadline_exceeded\",\n true,\n );\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n this.uploadAuthority.upload(payload, { deadlineUnixMs }),\n new Promise<never>((_resolve, reject) => {\n timer = setTimeout(\n () =>\n reject(\n new TelemetryUploadError(\n \"prepare\",\n \"overflow_export_deadline_exceeded\",\n true,\n ),\n ),\n remaining,\n );\n timer.unref?.();\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n\n private recordOverflowFailure(stage: string, reason: string): void {\n this.diagnostics?.recordOverflow(\"span\", \"failures\");\n this.diagnostics?.recordExportFailure(\"span\", 1);\n this.diagnostics?.recordUploadFailure(stage, reason);\n logger.error(`oversized span upload failed: ${stage}/${reason}`);\n }\n\n private recordUnsent(actions: ExportAction[], failedIndex: number): void {\n const count = actions.slice(failedIndex).reduce(\n (total, action) => total + (action.type === \"batch\" ? action.spans.length : 1),\n 0,\n );\n this.diagnostics?.recordExportFailure(\"span\", count);\n }\n\n async shutdown(): Promise<void> {\n await this.delegate.shutdown();\n }\n\n async forceFlush(): Promise<void> {\n await this.delegate.forceFlush?.();\n }\n}\n","import type { Attributes } from '@opentelemetry/api';\nimport type { LogAttributes, LogBody, SeverityNumber } from '@opentelemetry/api-logs';\nimport { ExportResultCode, type ExportResult } from '@opentelemetry/core';\nimport { Resource } from '@opentelemetry/resources';\nimport type {\n LogRecordExporter,\n ReadableLogRecord,\n} from '@opentelemetry/sdk-logs';\nimport type { MaskFunction } from '../types.js';\nimport type { DeliveryDiagnostics } from './delivery-diagnostics.js';\nimport { applyMask, DEFAULT_MASK_TIMEOUT_MS } from './mask.js';\n\nfunction cloneValue<T>(value: T): T {\n if (value === undefined || value === null) return value;\n try {\n return structuredClone(value);\n } catch {\n return value;\n }\n}\n\nfunction resourceAttributes(value: unknown): Attributes {\n if (!value || typeof value !== 'object') return {};\n const result: Attributes = {};\n for (const [key, item] of Object.entries(value)) {\n if (\n typeof item === 'string' ||\n typeof item === 'number' ||\n typeof item === 'boolean' ||\n (Array.isArray(item) &&\n item.every(\n (entry) =>\n entry === null ||\n typeof entry === 'string' ||\n typeof entry === 'number' ||\n typeof entry === 'boolean',\n ))\n ) {\n result[key] = item as any;\n } else if (item !== undefined) {\n result[key] = JSON.stringify(item);\n }\n }\n return result;\n}\n\nfunction snapshot(log: ReadableLogRecord): Record<string, any> {\n return {\n signal_type: 'log',\n body: cloneValue(log.body),\n attributes: cloneValue(log.attributes),\n resource: { attributes: cloneValue(log.resource.attributes) },\n severity_text: log.severityText,\n severity_number: log.severityNumber,\n trace_id: log.spanContext?.traceId,\n span_id: log.spanContext?.spanId,\n };\n}\n\nfunction maskedReadableLogRecord(\n log: ReadableLogRecord,\n data: Record<string, any>,\n): ReadableLogRecord {\n const resourceData = data.resource?.attributes ?? data.resource;\n return {\n hrTime: log.hrTime,\n hrTimeObserved: log.hrTimeObserved,\n spanContext: log.spanContext,\n severityText:\n typeof data.severity_text === 'string' ? data.severity_text : log.severityText,\n severityNumber:\n typeof data.severity_number === 'number'\n ? (data.severity_number as SeverityNumber)\n : log.severityNumber,\n body: data.body as LogBody,\n resource: new Resource(resourceAttributes(resourceData)),\n instrumentationScope: log.instrumentationScope,\n attributes: (data.attributes && typeof data.attributes === 'object'\n ? data.attributes\n : {}) as LogAttributes,\n droppedAttributesCount: log.droppedAttributesCount,\n };\n}\n\n/** Applies the global fail-closed mask to immutable log snapshots at export. */\nexport class MaskingLogExporter implements LogRecordExporter {\n constructor(\n private readonly delegate: LogRecordExporter,\n private readonly mask: MaskFunction | null | undefined,\n private readonly timeoutMs = DEFAULT_MASK_TIMEOUT_MS,\n private readonly diagnostics?: DeliveryDiagnostics,\n ) {}\n\n export(logs: ReadableLogRecord[], resultCallback: (result: ExportResult) => void): void {\n if (!this.mask) {\n this.delegate.export(logs, (result) => {\n if (result.code !== ExportResultCode.SUCCESS) {\n this.diagnostics?.recordExportFailure('log', logs.length);\n }\n resultCallback(result);\n });\n return;\n }\n\n void Promise.all(\n logs.map(async (log) => {\n const masked = await applyMask(snapshot(log), this.mask, {\n signalType: 'log',\n timeoutMs: this.timeoutMs,\n });\n if (masked === null) this.diagnostics?.recordMaskedDrop('log');\n return masked === null ? null : maskedReadableLogRecord(log, masked);\n }),\n ).then(\n (prepared) => {\n const retained = prepared.filter((log): log is ReadableLogRecord => log !== null);\n if (retained.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS });\n return;\n }\n this.delegate.export(retained, (result) => {\n if (result.code !== ExportResultCode.SUCCESS) {\n this.diagnostics?.recordExportFailure('log', retained.length);\n }\n resultCallback(result);\n });\n },\n (error) => resultCallback({ code: ExportResultCode.FAILED, error }),\n );\n }\n\n async shutdown(): Promise<void> {\n return this.delegate.shutdown();\n }\n}\n","export type DeliverySignal = 'span' | 'log';\n\nexport interface DeliveryDiagnosticsSnapshot {\n spanQueueDrops: number;\n logQueueDrops: number;\n spanExportFailures: number;\n logExportFailures: number;\n frameworkSpanDrops: number;\n maskedSpanDrops: number;\n maskedLogDrops: number;\n typedMediaUploads: number;\n typedMediaFailures: number;\n typedMediaUnavailable: number;\n spanOverflowUploads: number;\n spanOverflowFailures: number;\n spanOverflowUnavailable: number;\n logOverflowUploads: number;\n logOverflowFailures: number;\n logOverflowUnavailable: number;\n uploadAuthorityAvailable: boolean;\n uploadAuthorityReason: string;\n lastUploadFailureStage?: string;\n lastUploadFailureReason?: string;\n}\n\n/** Per-pipeline loss counters retained for launch diagnostics and doctor. */\nexport class DeliveryDiagnostics {\n private readonly counters: DeliveryDiagnosticsSnapshot = {\n spanQueueDrops: 0,\n logQueueDrops: 0,\n spanExportFailures: 0,\n logExportFailures: 0,\n frameworkSpanDrops: 0,\n maskedSpanDrops: 0,\n maskedLogDrops: 0,\n typedMediaUploads: 0,\n typedMediaFailures: 0,\n typedMediaUnavailable: 0,\n spanOverflowUploads: 0,\n spanOverflowFailures: 0,\n spanOverflowUnavailable: 0,\n logOverflowUploads: 0,\n logOverflowFailures: 0,\n logOverflowUnavailable: 0,\n uploadAuthorityAvailable: false,\n uploadAuthorityReason: \"telemetry_uploads_disabled\",\n };\n\n recordQueueDrop(signal: DeliverySignal, count = 1): void {\n if (signal === 'span') this.counters.spanQueueDrops += count;\n else this.counters.logQueueDrops += count;\n }\n\n recordExportFailure(signal: DeliverySignal, count: number): void {\n if (signal === 'span') this.counters.spanExportFailures += count;\n else this.counters.logExportFailures += count;\n }\n\n recordMaskedDrop(signal: DeliverySignal, count = 1): void {\n if (signal === 'span') this.counters.maskedSpanDrops += count;\n else this.counters.maskedLogDrops += count;\n }\n\n recordFrameworkSpanDrop(count = 1): void {\n this.counters.frameworkSpanDrops += count;\n }\n\n configureUploadAuthority(available: boolean, reason: string): void {\n this.counters.uploadAuthorityAvailable = available;\n this.counters.uploadAuthorityReason =\n available && reason.length === 0\n ? \"\"\n : /^[a-zA-Z0-9_.-]{1,64}$/.test(reason)\n ? reason\n : \"upload_authority_unavailable\";\n }\n\n recordTypedMedia(outcome: \"uploads\" | \"failures\" | \"unavailable\", count = 1): void {\n if (outcome === \"uploads\") this.counters.typedMediaUploads += count;\n else if (outcome === \"failures\") this.counters.typedMediaFailures += count;\n else this.counters.typedMediaUnavailable += count;\n }\n\n recordOverflow(\n signal: DeliverySignal,\n outcome: \"uploads\" | \"failures\" | \"unavailable\",\n count = 1,\n ): void {\n const prefix = signal === \"span\" ? \"spanOverflow\" : \"logOverflow\";\n const suffix =\n outcome === \"uploads\"\n ? \"Uploads\"\n : outcome === \"failures\"\n ? \"Failures\"\n : \"Unavailable\";\n const key = `${prefix}${suffix}` as keyof DeliveryDiagnosticsSnapshot;\n (this.counters[key] as number) += count;\n }\n\n recordUploadFailure(stage: string, reason: string): void {\n this.counters.lastUploadFailureStage = /^[a-zA-Z0-9_.-]{1,64}$/.test(stage)\n ? stage\n : \"upload\";\n this.counters.lastUploadFailureReason = /^[a-zA-Z0-9_.-]{1,64}$/.test(reason)\n ? reason\n : \"unsafe_reason_code\";\n }\n\n snapshot(): DeliveryDiagnosticsSnapshot {\n return { ...this.counters };\n }\n}\n","import { TraceFlags } from '@opentelemetry/api';\nimport {\n BatchSpanProcessor,\n type BufferConfig as SpanBufferConfig,\n type ReadableSpan,\n type SpanExporter,\n} from '@opentelemetry/sdk-trace-base';\nimport {\n BatchLogRecordProcessor,\n type BufferConfig as LogBufferConfig,\n type LogRecord,\n type LogRecordExporter,\n} from '@opentelemetry/sdk-logs';\nimport { DeliveryDiagnostics } from './delivery-diagnostics.js';\nimport { discardPendingMedia } from './media.js';\n\ninterface SpanQueueState {\n _finishedSpans: ReadableSpan[];\n _maxQueueSize: number;\n}\ninterface LogQueueState {\n _finishedLogRecords: LogRecord[];\n _maxQueueSize: number;\n}\n\n/** Adds stable Neatlogs loss counters to OTel's bounded span processor. */\nexport class ObservableBatchSpanProcessor extends BatchSpanProcessor {\n constructor(\n exporter: SpanExporter,\n config: SpanBufferConfig,\n private readonly diagnostics: DeliveryDiagnostics,\n ) {\n super(exporter, config);\n }\n\n override onEnd(span: ReadableSpan): void {\n const state = this as unknown as SpanQueueState;\n if (\n (span.spanContext().traceFlags & TraceFlags.SAMPLED) !== 0 &&\n state._finishedSpans.length >= state._maxQueueSize\n ) {\n discardPendingMedia(span as object);\n this.diagnostics.recordQueueDrop('span');\n }\n super.onEnd(span);\n }\n}\n\n/** Adds stable Neatlogs loss counters to OTel's bounded log processor. */\nexport class ObservableBatchLogRecordProcessor extends BatchLogRecordProcessor {\n constructor(\n exporter: LogRecordExporter,\n config: LogBufferConfig,\n private readonly diagnostics: DeliveryDiagnostics,\n ) {\n super(exporter, config);\n }\n\n override onEmit(logRecord: LogRecord): void {\n const state = this as unknown as LogQueueState;\n if (state._finishedLogRecords.length >= state._maxQueueSize) {\n this.diagnostics.recordQueueDrop('log');\n }\n super.onEmit(logRecord);\n }\n}\n","/**\n * Structured logging for Neatlogs traces.\n *\n * The log() function captures timestamped steps within a trace,\n * emitting OTel LogRecords that are associated with the active span.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { getLogger } from './logger.js';\nimport {\n getActiveNeatlogsSpan,\n getNeatlogsActiveContext,\n} from './provider.js';\nimport { getActiveClient } from './active-client.js';\n\nconst logger = getLogger();\n\n// Module-level reference to the OTel Logger, set during init()\nlet _otelLogger: any = null;\nlet _debugMode = false;\nconst stdoutCaptureContext = new AsyncLocalStorage<boolean>();\nlet stdoutCaptureDepth = 0;\nlet originalConsoleLog: typeof console.log | null = null;\nlet captureConsoleLog: typeof console.log | null = null;\n\nfunction resolveOtelLogger(): any | null {\n const client = getActiveClient();\n // An active Client owns the whole context. `null` means logging is disabled\n // for that Client; it must never fall through to the process-global project.\n return client ? client.getLogger() : _otelLogger;\n}\n\n/**\n * Set the OTel logger instance. Called by init().\n * @internal\n */\nexport function _setOtelLogger(otelLogger: any, debug: boolean): void {\n _otelLogger = otelLogger;\n _debugMode = debug;\n}\n\n/**\n * Capture a timestamped log step within the current trace.\n *\n * @param msgTemplate - Message template with {key} placeholders\n * @param options - Optional key-value pairs for template rendering and attributes\n *\n * @example\n * ```typescript\n * log('Processing query: {query}', { query: 'What is TypeScript?', level: 'info' });\n * ```\n */\nexport function log(\n msgTemplate: string,\n options?: Record<string, any>,\n): void {\n const { level = 'info', ...variables } = options ?? {};\n\n // Render template\n let rendered = msgTemplate;\n for (const [key, value] of Object.entries(variables)) {\n rendered = rendered.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), String(value));\n }\n\n // Echo to console in debug mode\n if (_debugMode) {\n console.log(`[neatlogs:log] ${rendered}`);\n }\n\n // Emit OTel LogRecord if logger is available\n const otelLogger = resolveOtelLogger();\n if (otelLogger) {\n // Correlate to the active NEATLOGS span, not the global active span: in\n // isolated mode the latter is the foreign co-tenant's (Datadog/Braintrust)\n // span, which would either mis-correlate the log or attach a foreign context.\n const activeSpan = getActiveNeatlogsSpan();\n const activeContext = activeSpan ? getNeatlogsActiveContext() : undefined;\n\n const attributes: Record<string, any> = {\n 'log.template': msgTemplate,\n 'log.level': level,\n };\n\n // Add template variables as log.{key} attributes\n for (const [key, value] of Object.entries(variables)) {\n attributes[`log.${key}`] = String(value);\n }\n\n try {\n otelLogger.emit({\n body: rendered,\n attributes,\n // The OTel Logs API accepts a Context, not a raw SpanContext. Passing\n // `spanContext` is silently ignored by sdk-logs, producing a log with\n // no trace id that the Neatlogs ingest route correctly discards.\n ...(activeContext ? { context: activeContext } : {}),\n });\n } catch (err) {\n logger.warn(`Failed to emit log record: ${err}`);\n }\n }\n}\n\n/**\n * Capture stdout (console.log) within a callback and route to OTel logger.\n *\n * @param fn - The function to execute while capturing stdout\n * @returns The return value of fn\n */\nexport async function captureStdout<T>(fn: () => T | Promise<T>): Promise<T> {\n if (!resolveOtelLogger()) {\n return fn();\n }\n\n if (stdoutCaptureDepth === 0) {\n originalConsoleLog = console.log;\n captureConsoleLog = (...args: any[]) => {\n originalConsoleLog?.apply(console, args);\n if (!stdoutCaptureContext.getStore()) return;\n const otelLogger = resolveOtelLogger();\n if (!otelLogger) return;\n const activeSpan = getActiveNeatlogsSpan();\n const activeContext = activeSpan ? getNeatlogsActiveContext() : undefined;\n const message = args\n .map((a) => (typeof a === 'string' ? a : JSON.stringify(a)))\n .join(' ');\n try {\n otelLogger.emit({\n body: message,\n attributes: {\n 'log.source': 'stdout',\n 'log.level': 'info',\n },\n ...(activeContext ? { context: activeContext } : {}),\n });\n } catch {\n // Ignore errors in log capture\n }\n };\n console.log = captureConsoleLog;\n }\n stdoutCaptureDepth += 1;\n\n try {\n return await stdoutCaptureContext.run(true, fn);\n } finally {\n stdoutCaptureDepth -= 1;\n if (stdoutCaptureDepth === 0) {\n if (captureConsoleLog && console.log === captureConsoleLog && originalConsoleLog) {\n console.log = originalConsoleLog;\n }\n originalConsoleLog = null;\n captureConsoleLog = null;\n }\n }\n}\n","import { context } from '@opentelemetry/api';\nimport { suppressTracing } from '@opentelemetry/core';\nimport type { CachedPrompt, PromptMessage } from '../types.js';\n\n// ---------------------------------------------------------------------------\n// Error classes\n// ---------------------------------------------------------------------------\n\n/** Base exception for prompt client failures. */\nexport class PromptClientError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'PromptClientError';\n }\n}\n\n/** Raised when the backend returns an API error. */\nexport class PromptApiError extends PromptClientError {\n readonly method?: string;\n readonly path?: string;\n readonly status?: number;\n readonly requestId?: string;\n\n constructor(\n message: string,\n details?: { method?: string; path?: string; status?: number; requestId?: string },\n ) {\n super(message);\n this.name = 'PromptApiError';\n this.method = details?.method;\n this.path = details?.path;\n this.status = details?.status;\n this.requestId = details?.requestId;\n }\n}\n\n/** Raised when a prompt/label/version is not found. */\nexport class PromptNotFoundError extends PromptClientError {\n constructor(message: string) {\n super(message);\n this.name = 'PromptNotFoundError';\n }\n}\n\n/** Raised when a prompt request exceeds its configured deadline. */\nexport class PromptRequestTimeoutError extends PromptApiError {\n constructor(message: string) {\n super(message);\n this.name = 'PromptRequestTimeoutError';\n }\n}\n\n/** Raised when work is attempted after the prompt client has been closed. */\nexport class PromptClientClosedError extends PromptClientError {\n constructor(message = 'PromptClient is closed.') {\n super(message);\n this.name = 'PromptClientClosedError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Template rendering helper\n// ---------------------------------------------------------------------------\n\nconst PLACEHOLDER_PATTERN = /\\{\\{\\s*([A-Za-z0-9_.-]+)\\s*\\}\\}/g;\n\n/**\n * Replace `{{key}}` placeholders in a template string with the corresponding\n * values from the provided variables map. Unknown placeholders are left as-is.\n */\nexport function renderTemplate(template: string, variables: Record<string, any>): string {\n return template.replace(PLACEHOLDER_PATTERN, (full, key: string) => {\n return key in variables ? String(variables[key]) : full;\n });\n}\n\n// ---------------------------------------------------------------------------\n// Normalize raw API response → CachedPrompt\n// ---------------------------------------------------------------------------\n\nconst MAX_PROMPT_JSON_DEPTH = 32;\nconst MAX_PROMPT_JSON_NODES = 10_000;\nconst MAX_PROMPT_MESSAGES = 10_000;\n\ninterface PromptJsonCloneState {\n nodes: number;\n ancestors: Set<object>;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction clonePromptJson(value: unknown, depth: number, state: PromptJsonCloneState): unknown {\n state.nodes += 1;\n if (state.nodes > MAX_PROMPT_JSON_NODES || depth > MAX_PROMPT_JSON_DEPTH) {\n throw new Error('Prompt JSON exceeds defensive copy limits.');\n }\n\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return value;\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) throw new Error('Prompt JSON contains a non-finite number.');\n return value;\n }\n if (typeof value !== 'object') throw new Error('Prompt config is not JSON-compatible.');\n if (state.ancestors.has(value)) throw new Error('Prompt config contains a cycle.');\n\n state.ancestors.add(value);\n try {\n if (Array.isArray(value)) {\n if (\n Object.getOwnPropertySymbols(value).length > 0 ||\n Object.keys(value).some((key, index) => key !== String(index))\n ) {\n throw new Error('Prompt config contains a non-JSON array.');\n }\n const result: unknown[] = [];\n for (let index = 0; index < value.length; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n if (!descriptor || !descriptor.enumerable || !('value' in descriptor)) {\n throw new Error('Prompt config contains an accessor or sparse array.');\n }\n result.push(clonePromptJson(descriptor.value, depth + 1, state));\n }\n return result;\n }\n if (!isPlainRecord(value) || Object.getOwnPropertySymbols(value).length > 0) {\n throw new Error('Prompt config contains a non-JSON object.');\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(value))) {\n if (!descriptor.enumerable || !('value' in descriptor)) {\n throw new Error('Prompt config contains an accessor or non-enumerable value.');\n }\n Object.defineProperty(result, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value: clonePromptJson(descriptor.value, depth + 1, state),\n });\n }\n return result;\n } finally {\n state.ancestors.delete(value);\n }\n}\n\nfunction clonePromptConfig(value: unknown): Record<string, any> {\n try {\n if (!isPlainRecord(value)) return {};\n const cloned = clonePromptJson(value, 0, { nodes: 0, ancestors: new Set() });\n return isPlainRecord(cloned) ? cloned : {};\n } catch {\n // Prompt configuration is untrusted product data. Unsupported, cyclic, or\n // excessively deep structures are discarded instead of retained by cache.\n return {};\n }\n}\n\nfunction clonePromptMessages(messages: PromptMessage[] | null): PromptMessage[] | null {\n if (messages !== null && messages.length > MAX_PROMPT_MESSAGES) return null;\n return messages?.map((message) => ({ role: message.role, content: message.content })) ?? null;\n}\n\n/** Normalize a raw API response object into a well-typed {@link CachedPrompt}. */\nexport function normalizePromptObject(raw: Record<string, any>): CachedPrompt {\n // Messages\n let messages: PromptMessage[] | null = null;\n const rawMessages = raw['messages'];\n if (Array.isArray(rawMessages) && rawMessages.length <= MAX_PROMPT_MESSAGES) {\n const messageList: PromptMessage[] = [];\n for (const item of rawMessages) {\n if (item && typeof item === 'object') {\n messageList.push({\n role: String(item['role'] ?? 'system'),\n content: String(item['content'] ?? ''),\n });\n }\n }\n if (messageList.length > 0) {\n messages = messageList;\n }\n }\n\n // Labels\n let labels: string[] = [];\n const rawLabels = raw['labels'];\n if (Array.isArray(rawLabels)) {\n labels = rawLabels.filter((l) => String(l).trim()).map(String);\n }\n\n // Config\n const config = clonePromptConfig(raw['config']);\n\n // Scalar fields\n const content: string | null = typeof raw['content'] === 'string' ? raw['content'] : null;\n const id: string = typeof raw['id'] === 'string' ? raw['id'] : '';\n const name: string = typeof raw['name'] === 'string' ? raw['name'] : '';\n\n let version = 0;\n try {\n if (raw['version'] != null) {\n version = Number(raw['version']) || 0;\n }\n } catch {\n version = 0;\n }\n\n let updatedAt: string = '';\n if (typeof raw['updatedAt'] === 'string') {\n updatedAt = raw['updatedAt'];\n } else if (typeof raw['updated_at'] === 'string') {\n updatedAt = raw['updated_at'];\n }\n\n let type: 'text' | 'chat' = 'text';\n if (messages !== null || raw['type'] === 'chat') {\n type = 'chat';\n }\n\n return {\n id,\n name,\n version,\n content,\n messages,\n config,\n labels,\n updatedAt,\n type,\n };\n}\n\n// ---------------------------------------------------------------------------\n// PromptHandle\n// ---------------------------------------------------------------------------\n\n/**\n * Compiled prompt handle returned by {@link PromptClient.getPrompt}.\n */\nexport class PromptHandle {\n private readonly _prompt: CachedPrompt;\n\n constructor(prompt: CachedPrompt) {\n this._prompt = {\n id: prompt.id,\n name: prompt.name,\n version: prompt.version,\n content: prompt.content,\n messages: clonePromptMessages(prompt.messages),\n config: clonePromptConfig(prompt.config),\n labels: [...prompt.labels],\n updatedAt: prompt.updatedAt,\n type: prompt.type,\n };\n }\n\n get id(): string {\n return this._prompt.id;\n }\n get name(): string {\n return this._prompt.name;\n }\n get version(): number {\n return this._prompt.version;\n }\n get content(): string | null {\n return this._prompt.content;\n }\n get messages(): PromptMessage[] | null {\n return clonePromptMessages(this._prompt.messages);\n }\n get config(): Record<string, any> {\n return clonePromptConfig(this._prompt.config);\n }\n get labels(): string[] {\n return [...this._prompt.labels];\n }\n get updatedAt(): string {\n return this._prompt.updatedAt;\n }\n get type(): string {\n return this._prompt.type;\n }\n\n /**\n * Compile string content with `{{variable}}` replacement.\n *\n * If the prompt has `content`, renders it directly.\n * If it only has `messages`, renders and joins all message contents.\n */\n compile(variables?: Record<string, any>): string {\n const vars = variables ?? {};\n\n if (this._prompt.content) {\n return renderTemplate(this._prompt.content, vars);\n }\n\n if (this._prompt.messages) {\n const rendered = this._prompt.messages\n .map((msg) => renderTemplate(msg.content ?? '', vars))\n .filter(Boolean);\n return rendered.join('\\n\\n');\n }\n\n return '';\n }\n\n /**\n * Compile message list with `{{variable}}` replacement.\n *\n * If no messages exist, returns a single synthetic system message from content.\n */\n compileMessages(variables?: Record<string, any>): PromptMessage[] {\n const vars = variables ?? {};\n\n if (this._prompt.messages) {\n return this._prompt.messages.map((msg) => ({\n role: String(msg.role ?? 'system'),\n content: renderTemplate(String(msg.content ?? ''), vars),\n }));\n }\n\n return [\n {\n role: 'system',\n content: renderTemplate(this._prompt.content ?? '', vars),\n },\n ];\n }\n}\n\n// ---------------------------------------------------------------------------\n// PromptClient\n// ---------------------------------------------------------------------------\n\nexport interface PromptClientOptions {\n baseUrl: string;\n apiKey: string;\n /** How long an unpinned cache entry is fresh. Defaults to 60 seconds. */\n cacheTtlMs?: number;\n /** How long an expired unpinned entry may be served during refresh. Defaults to 5 minutes. */\n staleWhileRevalidateMs?: number;\n /** Deadline for each backend request. Defaults to 10 seconds. */\n requestTimeoutMs?: number;\n /** Maximum cached prompt selectors. Least-recently-used entries are evicted. Defaults to 100. */\n maxCacheEntries?: number;\n}\n\nexport interface GetPromptOptions {\n version?: number;\n label?: string;\n /** Override the client's cache lifetime for this prompt lookup. */\n cacheTtlMs?: number;\n /** Override the client's stale-while-revalidate window for this prompt lookup. */\n staleWhileRevalidateMs?: number;\n}\n\n/** Select one immutable prompt version for a mutation. Defaults to the latest version. */\nexport interface PromptMutationSelector {\n promptId?: string;\n version?: number;\n label?: string;\n}\n\nexport interface PromptWriteMetadata {\n config?: Record<string, any>;\n labels?: string[];\n tags?: string[];\n commitMessage?: string;\n}\n\nexport interface PromptWriteInput extends PromptWriteMetadata {\n content?: string;\n messages?: PromptMessage[];\n}\n\nexport interface CreatePromptInput extends PromptWriteInput {\n name: string;\n}\n\nexport type SavePromptVersionOptions = PromptWriteMetadata &\n (\n | { content: string; messages?: PromptMessage[] }\n | { content?: string; messages: PromptMessage[] }\n ) & {\n /** @deprecated Use `labels: [label]`; retained as a source-compatible alias. */\n label?: string;\n };\n\n/** @deprecated A label alone cannot create a backend prompt version. */\nexport interface LegacySavePromptVersionOptions {\n label?: string;\n}\n\nconst DEFAULT_PROMPT_CACHE_TTL_MS = 60_000;\nconst DEFAULT_PROMPT_STALE_WHILE_REVALIDATE_MS = 300_000;\nconst DEFAULT_PROMPT_REQUEST_TIMEOUT_MS = 10_000;\nconst DEFAULT_PROMPT_MAX_CACHE_ENTRIES = 100;\nconst PROMPT_LIST_PAGE_SIZE = 500;\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\ninterface PromptCacheEntry {\n prompt: CachedPrompt;\n fetchedAtMs: number;\n ttlMs: number;\n staleWhileRevalidateMs: number;\n pinned: boolean;\n}\n\ninterface PromptCachePolicy {\n ttlMs: number;\n staleWhileRevalidateMs: number;\n}\n\n/**\n * Prompt client for Neatlogs managed prompts.\n *\n * Fetches prompts on-demand from the backend.\n * Uses an in-memory cache to avoid redundant HTTP calls.\n */\nexport class PromptClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly cacheTtlMs: number;\n private readonly staleWhileRevalidateMs: number;\n private readonly requestTimeoutMs: number;\n private readonly maxCacheEntries: number;\n private readonly _cache: Map<string, PromptCacheEntry> = new Map();\n private readonly _inflight: Map<string, Promise<PromptHandle>> = new Map();\n private readonly _inflightPromptNames: Map<string, { name: string; pinned: boolean }> = new Map();\n private readonly _requestControllers = new Set<AbortController>();\n private _cacheEpoch = 0;\n private _mutationEpoch = 0;\n private _closed = false;\n\n constructor(options: PromptClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.apiKey = options.apiKey;\n this.cacheTtlMs = PromptClient.validateCacheTtl(\n options.cacheTtlMs ?? DEFAULT_PROMPT_CACHE_TTL_MS,\n );\n this.staleWhileRevalidateMs = PromptClient.validateCacheDuration(\n 'staleWhileRevalidateMs',\n options.staleWhileRevalidateMs ?? DEFAULT_PROMPT_STALE_WHILE_REVALIDATE_MS,\n );\n this.requestTimeoutMs = PromptClient.validatePositiveDuration(\n 'requestTimeoutMs',\n options.requestTimeoutMs ?? DEFAULT_PROMPT_REQUEST_TIMEOUT_MS,\n );\n this.maxCacheEntries = PromptClient.validateMaxCacheEntries(\n options.maxCacheEntries ?? DEFAULT_PROMPT_MAX_CACHE_ENTRIES,\n );\n }\n\n // ---- public API ----------------------------------------------------------\n\n /**\n * Get a prompt by name, optionally pinned to a version or label.\n * Results are cached in memory by cache key.\n */\n async getPrompt(name: string, options?: GetPromptOptions): Promise<PromptHandle> {\n this.assertOpen();\n const version = options?.version;\n const label = options?.label;\n\n if (label != null && version != null) {\n throw new PromptClientError('Cannot specify both label and version.');\n }\n\n const cacheKey = JSON.stringify([name, label ?? null, version ?? null]);\n const cached = this._cache.get(cacheKey);\n if (cached) {\n const policy = this.resolveCachePolicy(options, cached);\n cached.ttlMs = policy.ttlMs;\n cached.staleWhileRevalidateMs = policy.staleWhileRevalidateMs;\n this.touchCacheEntry(cacheKey, cached);\n\n if (cached.pinned) {\n return new PromptHandle(cached.prompt);\n }\n\n const ageMs = Math.max(0, Date.now() - cached.fetchedAtMs);\n if (ageMs < policy.ttlMs) return new PromptHandle(cached.prompt);\n\n if (ageMs < policy.ttlMs + policy.staleWhileRevalidateMs) {\n // Temporary backend failures cannot take down a caller while the\n // explicitly bounded stale window remains open.\n this.revalidatePrompt(cacheKey, name, { version, label }, policy);\n return new PromptHandle(cached.prompt);\n }\n }\n\n const policy = this.resolveCachePolicy(options, cached);\n return this.fetchAndCache(cacheKey, name, { version, label }, policy);\n }\n\n private static validateCacheTtl(ttlMs: number): number {\n return PromptClient.validateCacheDuration('cacheTtlMs', ttlMs);\n }\n\n private static validateCacheDuration(name: string, durationMs: number): number {\n if (!Number.isFinite(durationMs) || durationMs < 0) {\n throw new PromptClientError(`${name} must be a finite number greater than or equal to 0.`);\n }\n return durationMs;\n }\n\n private static validatePositiveDuration(name: string, durationMs: number): number {\n if (!Number.isFinite(durationMs) || durationMs <= 0) {\n throw new PromptClientError(`${name} must be a finite number greater than 0.`);\n }\n return durationMs;\n }\n\n private static validateMaxCacheEntries(value: number): number {\n if (!Number.isInteger(value) || value <= 0) {\n throw new PromptClientError('maxCacheEntries must be a positive integer.');\n }\n return value;\n }\n\n private assertOpen(): void {\n if (this._closed) throw new PromptClientClosedError();\n }\n\n private resolveCachePolicy(\n options: GetPromptOptions | undefined,\n cached?: PromptCacheEntry,\n ): PromptCachePolicy {\n return {\n ttlMs: PromptClient.validateCacheTtl(\n options?.cacheTtlMs ?? cached?.ttlMs ?? this.cacheTtlMs,\n ),\n staleWhileRevalidateMs: PromptClient.validateCacheDuration(\n 'staleWhileRevalidateMs',\n options?.staleWhileRevalidateMs ??\n cached?.staleWhileRevalidateMs ??\n this.staleWhileRevalidateMs,\n ),\n };\n }\n\n private snapshotPrompt(handle: PromptHandle): CachedPrompt {\n return {\n id: handle.id,\n name: handle.name,\n version: handle.version,\n content: handle.content,\n messages: handle.messages,\n config: handle.config,\n labels: handle.labels,\n updatedAt: handle.updatedAt,\n type: handle.type as 'text' | 'chat',\n };\n }\n\n private cachePrompt(\n cacheKey: string,\n handle: PromptHandle,\n policy: PromptCachePolicy,\n pinned: boolean,\n ): void {\n this._cache.delete(cacheKey);\n this._cache.set(cacheKey, {\n prompt: this.snapshotPrompt(handle),\n fetchedAtMs: Date.now(),\n ttlMs: policy.ttlMs,\n staleWhileRevalidateMs: policy.staleWhileRevalidateMs,\n pinned,\n });\n this.evictCacheEntries();\n }\n\n private touchCacheEntry(cacheKey: string, entry: PromptCacheEntry): void {\n this._cache.delete(cacheKey);\n this._cache.set(cacheKey, entry);\n }\n\n private evictCacheEntries(): void {\n while (this._cache.size > this.maxCacheEntries) {\n const oldestKey = this._cache.keys().next().value as string | undefined;\n if (oldestKey === undefined) return;\n this._cache.delete(oldestKey);\n }\n }\n\n private fetchAndCache(\n cacheKey: string,\n name: string,\n options: { version?: number; label?: string },\n policy: PromptCachePolicy,\n ): Promise<PromptHandle> {\n this.assertOpen();\n const existing = this._inflight.get(cacheKey);\n if (existing) return existing;\n\n const mutationEpoch = this._mutationEpoch;\n const cacheEpoch = this._cacheEpoch;\n const pinned = options.version != null;\n const request = this.fetchPrompt(name, options)\n .then((handle) => {\n if (\n !this._closed &&\n this._cacheEpoch === cacheEpoch &&\n this._mutationEpoch === mutationEpoch\n ) {\n this.cachePrompt(cacheKey, handle, policy, pinned);\n }\n return handle;\n })\n .finally(() => {\n if (this._inflight.get(cacheKey) === request) {\n this._inflight.delete(cacheKey);\n this._inflightPromptNames.delete(cacheKey);\n }\n });\n this._inflight.set(cacheKey, request);\n this._inflightPromptNames.set(cacheKey, { name, pinned });\n return request;\n }\n\n private revalidatePrompt(\n cacheKey: string,\n name: string,\n options: { version?: number; label?: string },\n policy: PromptCachePolicy,\n ): void {\n if (this._inflight.has(cacheKey)) return;\n void this.fetchAndCache(cacheKey, name, options, policy).catch(() => {\n // Stale-while-revalidate deliberately preserves the last known prompt.\n // The in-flight entry is cleared in finally so a later lookup retries.\n });\n }\n\n private invalidatePrompt(name: string, includePinned = false): void {\n // A single process-wide epoch prevents an in-flight read from repopulating\n // stale data without retaining one generation counter per mutated name.\n this._mutationEpoch += 1;\n for (const [cacheKey, entry] of this._cache) {\n if (entry.prompt.name === name && (includePinned || !entry.pinned)) {\n this._cache.delete(cacheKey);\n }\n }\n for (const [cacheKey, request] of this._inflightPromptNames) {\n if (request.name !== name || (!includePinned && request.pinned)) continue;\n this._inflight.delete(cacheKey);\n this._inflightPromptNames.delete(cacheKey);\n }\n }\n\n /** Clear cached values without changing or shutting down the telemetry SDK. */\n clearCache(): void {\n this.assertOpen();\n this._cacheEpoch += 1;\n this._cache.clear();\n }\n\n /** Abort prompt requests, release the cache, and permanently close this client. */\n close(): void {\n if (this._closed) return;\n this._closed = true;\n this._cacheEpoch += 1;\n for (const controller of this._requestControllers) controller.abort();\n this._requestControllers.clear();\n this._cache.clear();\n this._inflight.clear();\n this._inflightPromptNames.clear();\n }\n\n /**\n * Always fetch from the API (bypasses cache).\n */\n async fetchPrompt(\n name: string,\n options?: { version?: number; label?: string },\n ): Promise<PromptHandle> {\n this.assertOpen();\n const version = options?.version;\n const label = options?.label;\n\n if (label != null && version != null) {\n throw new PromptClientError('Cannot specify both label and version.');\n }\n\n if (label != null) {\n const path = `/api/v1/prompts/${encodeURIComponent(name)}/fetch`;\n const url = `${path}?label=${encodeURIComponent(label)}`;\n const payload = await this._request(url);\n return new PromptHandle(normalizePromptObject(payload));\n }\n\n const items = await this.listPromptRecords(\n name,\n version == null\n ? (page) => page.length > 0\n : (page) => page.some((item) => Number(item['version']) === version),\n );\n\n if (items.length === 0) {\n throw new PromptNotFoundError('Managed prompt not found');\n }\n\n if (version != null) {\n const match = items.find((item) => Number(item['version']) === version);\n if (!match) {\n throw new PromptNotFoundError(`Managed prompt version ${version} not found`);\n }\n return new PromptHandle(normalizePromptObject(match));\n }\n\n // The backend orders a name-filtered listing by descending version.\n return new PromptHandle(normalizePromptObject(items[0]));\n }\n\n /**\n * List all prompts.\n */\n async listPrompts(): Promise<PromptHandle[]> {\n this.assertOpen();\n const items = await this.listPromptRecords();\n return items.map((item) => new PromptHandle(normalizePromptObject(item)));\n }\n\n /**\n * Create a new prompt.\n */\n async createPrompt(data: CreatePromptInput): Promise<PromptHandle> {\n this.assertOpen();\n this.assertPromptWrite(data, 'createPrompt');\n const body: Record<string, any> = { name: data.name };\n if (data.content !== undefined) body['content'] = data.content;\n if (data.messages !== undefined) body['messages'] = data.messages;\n if (data.config !== undefined) body['config'] = data.config;\n if (data.labels !== undefined) body['labels'] = data.labels;\n if (data.tags !== undefined) body['tags'] = data.tags;\n if (data.commitMessage !== undefined) body['commit_message'] = data.commitMessage;\n\n const payload = await this._request('/api/managed-prompts', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n const promptData = payload['prompt'] ?? payload;\n this.invalidatePrompt(data.name);\n return new PromptHandle(normalizePromptObject(promptData));\n }\n\n /**\n * Save changed content as a new immutable version.\n *\n * @deprecated Managed prompts are immutable. Prefer {@link saveAsVersion}.\n */\n async updatePrompt(\n name: string,\n data: PromptWriteInput,\n ): Promise<PromptHandle> {\n this.assertOpen();\n this.assertPromptWrite(data, 'updatePrompt');\n return this.saveAsVersion(name, data as SavePromptVersionOptions);\n }\n\n /**\n * Delete one immutable prompt version. A name-only call resolves the latest\n * version first for compatibility; pass a version, label, or promptId when\n * the target must be explicit.\n */\n async deletePrompt(name: string, selector?: PromptMutationSelector): Promise<void> {\n this.assertOpen();\n const promptId = await this.resolvePromptId(name, selector);\n await this._request(`/api/managed-prompts/${encodeURIComponent(promptId)}`, {\n method: 'DELETE',\n });\n this.invalidatePrompt(name, true);\n }\n\n /**\n * Assign a label to one immutable prompt version.\n */\n async setLabel(\n name: string,\n label: string,\n selector?: PromptMutationSelector,\n ): Promise<void> {\n this.assertOpen();\n this.assertLabel(label, 'setLabel');\n const promptId = await this.resolvePromptId(name, selector);\n await this._request(`/api/managed-prompts/${encodeURIComponent(promptId)}/labels`, {\n method: 'POST',\n body: JSON.stringify({ label }),\n });\n this.invalidatePrompt(name);\n }\n\n /**\n * Add a tag to one immutable prompt version.\n */\n async addTag(name: string, tag: string, selector?: PromptMutationSelector): Promise<void> {\n this.assertOpen();\n this.assertTag(tag, 'addTag');\n const promptId = await this.resolvePromptId(name, selector);\n await this._request(`/api/managed-prompts/${encodeURIComponent(promptId)}/tags`, {\n method: 'POST',\n body: JSON.stringify({ tag }),\n });\n this.invalidatePrompt(name);\n }\n\n /** Remove a tag from one immutable prompt version. */\n async removeTag(name: string, tag: string, selector?: PromptMutationSelector): Promise<void> {\n this.assertOpen();\n this.assertTag(tag, 'removeTag');\n const promptId = await this.resolvePromptId(name, selector);\n await this._request(`/api/managed-prompts/${encodeURIComponent(promptId)}/tags`, {\n method: 'DELETE',\n body: JSON.stringify({ tag }),\n });\n this.invalidatePrompt(name);\n }\n\n /** Save supplied content or messages as a new immutable version. */\n async saveAsVersion(\n name: string,\n options: SavePromptVersionOptions,\n ): Promise<PromptHandle>;\n /** @deprecated Pass non-empty `content` or `messages`; label-only saves are rejected. */\n async saveAsVersion(\n name: string,\n options?: LegacySavePromptVersionOptions,\n ): Promise<PromptHandle>;\n async saveAsVersion(\n name: string,\n options?: SavePromptVersionOptions | LegacySavePromptVersionOptions,\n ): Promise<PromptHandle> {\n this.assertOpen();\n const writeOptions = options ?? {};\n this.assertPromptWrite(writeOptions, 'saveAsVersion');\n const write = writeOptions as SavePromptVersionOptions;\n const body: Record<string, any> = { promptName: name };\n if (write.content !== undefined) body['content'] = write.content;\n if (write.messages !== undefined) body['messages'] = write.messages;\n if (write.config !== undefined) body['config'] = write.config;\n const labels = this.resolveWriteLabels(write, 'saveAsVersion');\n if (labels.length > 0) body['labels'] = labels;\n if (write.tags !== undefined) body['tags'] = write.tags;\n if (write.commitMessage !== undefined) body['commitMessage'] = write.commitMessage;\n\n const payload = await this._request('/api/prompt-playground/save-as-version', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n const promptData = payload['prompt'] ?? payload;\n this.invalidatePrompt(name);\n return new PromptHandle(normalizePromptObject(promptData));\n }\n\n // ---- internal ------------------------------------------------------------\n\n private assertPromptWrite(\n data: PromptWriteInput | LegacySavePromptVersionOptions,\n operation: string,\n ): void {\n const content = 'content' in data ? data.content : undefined;\n const messages = 'messages' in data ? data.messages : undefined;\n const hasContent = typeof content === 'string' && content.trim().length > 0;\n const hasMessages = Array.isArray(messages) && messages.length > 0;\n if (!hasContent && !hasMessages) {\n throw new PromptClientError(`${operation} requires non-empty content or messages.`);\n }\n this.resolveWriteLabels(data, operation);\n for (const tag of (data as PromptWriteInput).tags ?? []) this.assertTag(tag, operation);\n }\n\n private resolveWriteLabels(\n data: PromptWriteInput | LegacySavePromptVersionOptions,\n operation: string,\n ): string[] {\n const write = data as PromptWriteInput & { label?: string };\n const labels = [...(write.labels ?? [])];\n if (write.label !== undefined && !labels.includes(write.label)) labels.unshift(write.label);\n if (labels.length > 1) {\n throw new PromptClientError(`${operation} accepts at most one label per prompt version.`);\n }\n for (const label of labels) this.assertLabel(label, operation);\n return labels;\n }\n\n private assertLabel(label: string, operation: string): void {\n if (typeof label !== 'string' || !/^[A-Za-z0-9_-]{1,50}$/.test(label)) {\n throw new PromptClientError(\n `${operation} labels must contain 1-50 letters, numbers, underscores, or hyphens.`,\n );\n }\n }\n\n private assertTag(tag: string, operation: string): void {\n if (\n typeof tag !== 'string' ||\n tag !== tag.trim() ||\n tag.length < 1 ||\n tag.length > 64 ||\n /[\\r\\n]/.test(tag)\n ) {\n throw new PromptClientError(\n `${operation} tags must contain 1-64 characters without surrounding whitespace or newlines.`,\n );\n }\n }\n\n private validateMutationSelector(selector?: PromptMutationSelector): void {\n const selected = [selector?.promptId, selector?.version, selector?.label].filter(\n (value) => value != null,\n );\n if (selected.length > 1) {\n throw new PromptClientError('Specify only one of promptId, version, or label.');\n }\n if (selector?.promptId != null && !UUID_PATTERN.test(selector.promptId)) {\n throw new PromptClientError('promptId must be a UUID.');\n }\n if (\n selector?.version != null &&\n (!Number.isInteger(selector.version) || selector.version <= 0)\n ) {\n throw new PromptClientError('version must be a positive integer.');\n }\n if (selector?.label != null) this.assertLabel(selector.label, 'selector');\n }\n\n private async resolvePromptId(\n name: string,\n selector?: PromptMutationSelector,\n ): Promise<string> {\n this.validateMutationSelector(selector);\n if (selector?.promptId != null) return selector.promptId;\n const handle = await this.fetchPrompt(name, {\n version: selector?.version,\n label: selector?.label,\n });\n if (!handle.id) {\n throw new PromptNotFoundError('Managed prompt response did not include a version id');\n }\n return handle.id;\n }\n\n private async listPromptRecords(\n name?: string,\n stopWhen?: (page: Record<string, any>[]) => boolean,\n ): Promise<Record<string, any>[]> {\n const records: Record<string, any>[] = [];\n let offset = 0;\n\n for (;;) {\n const nameQuery = name == null ? '' : `name=${encodeURIComponent(name)}&`;\n const payload = await this._request(\n `/api/managed-prompts?${nameQuery}limit=${PROMPT_LIST_PAGE_SIZE}&offset=${offset}`,\n );\n const page = Array.isArray(payload?.['items'])\n ? (payload['items'] as Record<string, any>[])\n : [];\n records.push(...page);\n offset += page.length;\n\n if (stopWhen?.(page)) return records;\n\n const rawTotal = Number(payload?.['total']);\n const total = Number.isFinite(rawTotal) && rawTotal >= 0 ? rawTotal : undefined;\n if (\n page.length === 0 ||\n page.length < PROMPT_LIST_PAGE_SIZE ||\n (total !== undefined && offset >= total)\n ) {\n return records;\n }\n }\n }\n\n /**\n * Internal fetch wrapper with auth headers and OTel suppression.\n */\n async _request(path: string, options?: RequestInit): Promise<any> {\n this.assertOpen();\n const url = `${this.baseUrl}${path}`;\n const safePath = PromptClient.safeErrorPath(path);\n const headers: Record<string, string> = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n 'x-api-key': this.apiKey,\n ...(options?.headers as Record<string, string> | undefined),\n };\n\n const fetchOptions: RequestInit = {\n method: options?.method ?? 'GET',\n headers,\n body: options?.body,\n };\n\n const controller = new AbortController();\n this._requestControllers.add(controller);\n let timedOut = false;\n const timeout = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, this.requestTimeoutMs);\n (timeout as ReturnType<typeof setTimeout> & { unref?: () => void }).unref?.();\n fetchOptions.signal = controller.signal;\n\n let transportPromise: Promise<Response> | undefined;\n const startTransport = (): Promise<Response> => {\n if (transportPromise) return transportPromise;\n\n try {\n transportPromise = fetch(url, fetchOptions);\n } catch (error) {\n transportPromise = Promise.reject(error);\n }\n return transportPromise;\n };\n\n let contextResult: Promise<Response> | undefined;\n try {\n try {\n // Suppress OTel instrumentation on our own HTTP calls so prompt CRUD\n // never becomes a child span of user telemetry.\n const suppressedContext = suppressTracing(context.active());\n contextResult = context.with(suppressedContext, startTransport);\n } catch {\n // A started transport remains authoritative; setup failures fall through.\n }\n\n if (contextResult && contextResult !== transportPromise) {\n void Promise.resolve(contextResult).catch(() => undefined);\n }\n\n const response = await (transportPromise ?? startTransport());\n const requestId = PromptClient.safeRequestId(response.headers?.get?.('x-request-id'));\n const requestIdSuffix = requestId ? `; request_id=${requestId}` : '';\n\n if (!response.ok) {\n await response.body?.cancel().catch(() => undefined);\n throw new PromptApiError(\n `${fetchOptions.method} ${safePath} failed (${response.status})${requestIdSuffix}`,\n {\n method: fetchOptions.method,\n path: safePath,\n status: response.status,\n requestId,\n },\n );\n }\n\n try {\n return await response.json();\n } catch {\n throw new PromptApiError(\n `${fetchOptions.method} ${safePath} returned non-JSON response (${response.status})${requestIdSuffix}`,\n { method: fetchOptions.method, path: safePath, status: response.status, requestId },\n );\n }\n } catch (error) {\n if (error instanceof PromptClientError) throw error;\n if (timedOut) {\n throw new PromptRequestTimeoutError(\n `${fetchOptions.method} ${safePath} exceeded ${this.requestTimeoutMs}ms`,\n );\n }\n if (this._closed) throw new PromptClientClosedError();\n throw new PromptApiError(`${fetchOptions.method} ${safePath} request failed`, {\n method: fetchOptions.method,\n path: safePath,\n });\n } finally {\n clearTimeout(timeout);\n this._requestControllers.delete(controller);\n }\n }\n\n private static safeRequestId(value: string | null | undefined): string | undefined {\n if (value == null) return undefined;\n const trimmed = value.trim();\n return /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$/.test(trimmed) ? trimmed : undefined;\n }\n\n private static safeErrorPath(path: string): string {\n const route = path.split('?', 1)[0];\n if (/^\\/api\\/v1\\/prompts\\/[^/]+\\/fetch$/.test(route)) {\n return '/api/v1/prompts/:name/fetch';\n }\n return route.replace(\n /^\\/api\\/managed-prompts\\/[^/]+(?=\\/|$)/,\n '/api/managed-prompts/:promptId',\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level shared client (set by init())\n// ---------------------------------------------------------------------------\n\nlet _sharedClient: PromptClient | null = null;\n\n/** Set the module-level shared prompt client (called by init()). */\nexport function setSharedClient(client: PromptClient): void {\n if (_sharedClient && _sharedClient !== client) _sharedClient.close();\n _sharedClient = client;\n}\n\n/** Close and forget the module-level prompt client without affecting telemetry flush status. */\nexport function closeSharedClient(): void {\n const client = _sharedClient;\n _sharedClient = null;\n client?.close();\n}\n\n/** Get the module-level shared prompt client. Throws if not initialized. */\nexport function getSharedClient(): PromptClient {\n if (!_sharedClient) {\n throw new PromptClientError(\n 'No prompt client available. Call neatlogs.init(apiKey: ...) or setSharedClient() first.',\n );\n }\n return _sharedClient;\n}\n\n// ---------------------------------------------------------------------------\n// Module-level convenience functions that delegate to shared client\n// ---------------------------------------------------------------------------\n\nexport async function getPrompt(name: string, options?: GetPromptOptions): Promise<PromptHandle> {\n return getSharedClient().getPrompt(name, options);\n}\n\nexport async function fetchPrompt(\n name: string,\n options?: { version?: number; label?: string },\n): Promise<PromptHandle> {\n return getSharedClient().fetchPrompt(name, options);\n}\n\nexport async function listPrompts(): Promise<PromptHandle[]> {\n return getSharedClient().listPrompts();\n}\n\nexport async function createPrompt(data: CreatePromptInput): Promise<PromptHandle> {\n return getSharedClient().createPrompt(data);\n}\n\nexport async function updatePrompt(\n name: string,\n data: PromptWriteInput,\n): Promise<PromptHandle> {\n return getSharedClient().updatePrompt(name, data);\n}\n\nexport async function saveAsVersion(\n name: string,\n options: SavePromptVersionOptions,\n): Promise<PromptHandle>;\n/** @deprecated Pass non-empty `content` or `messages`; label-only saves are rejected. */\nexport async function saveAsVersion(\n name: string,\n options?: LegacySavePromptVersionOptions,\n): Promise<PromptHandle>;\nexport async function saveAsVersion(\n name: string,\n options?: SavePromptVersionOptions | LegacySavePromptVersionOptions,\n): Promise<PromptHandle> {\n return getSharedClient().saveAsVersion(name, options);\n}\n\nexport async function deletePrompt(\n name: string,\n selector?: PromptMutationSelector,\n): Promise<void> {\n return getSharedClient().deletePrompt(name, selector);\n}\n\nexport async function setLabel(\n name: string,\n label: string,\n selector?: PromptMutationSelector,\n): Promise<void> {\n return getSharedClient().setLabel(name, label, selector);\n}\n\nexport async function addTag(\n name: string,\n tag: string,\n selector?: PromptMutationSelector,\n): Promise<void> {\n return getSharedClient().addTag(name, tag, selector);\n}\n\nexport async function removeTag(\n name: string,\n tag: string,\n selector?: PromptMutationSelector,\n): Promise<void> {\n return getSharedClient().removeTag(name, tag, selector);\n}\n","/**\n * @deprecated Use `wrapMastra()` from `neatlogs/mastra`.\n *\n * The current `@neatlogs/instrumentation-mastra`\n * bridge activates its spans on the GLOBAL OpenTelemetry context\n * (`context.active()` / `context.with()`), so a foreign co-tenant (Datadog, …)\n * can still parent or be parented by Mastra's spans in both directions — the\n * private provider alone cannot isolate that. Until the bridge is redesigned to\n * accept the injected Neatlogs private-context runtime, use the explicit\n * `wrapMastra()` wrapper instead.\n */\nexport async function getMastraObservability(): Promise<any> {\n throw new Error(\n 'getMastraObservability() is not supported because the ' +\n '@neatlogs/instrumentation-mastra bridge activates spans on the global ' +\n 'OpenTelemetry context, which cannot be isolated from other tracing SDKs ' +\n '(Datadog, etc.).\\n\\n' +\n \"Use wrapMastra() from 'neatlogs/mastra' instead.\",\n );\n}\n\n/** @internal Legacy lifecycle hook retained until this export is removed. */\nexport function _resetMastraCache(): void {\n // Kept as an internal lifecycle hook until the legacy bridge export is\n // removed in the next major release.\n}\n","export interface DeadlineOutcome<T> {\n completed: boolean;\n value?: T;\n error?: unknown;\n}\n\n/** Bound a third-party exporter/lifecycle promise by one absolute deadline. */\nexport async function runByDeadline<T>(\n operation: () => T | PromiseLike<T>,\n deadlineMs: number,\n): Promise<DeadlineOutcome<T>> {\n const remaining = Math.max(0, deadlineMs - Date.now());\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(\n () => reject(new Error(\"NEATLOGS_DEADLINE_EXCEEDED\")),\n remaining,\n );\n });\n try {\n const value = await Promise.race([\n Promise.resolve().then(operation),\n timeout,\n ]);\n return { completed: true, value };\n } catch (error) {\n return { completed: false, error };\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n}\n","#!/usr/bin/env node\nimport { runDoctorCli } from './doctor-cli.js';\n\nvoid runDoctorCli(process.argv.slice(2)).then((code) => { process.exitCode = code; });\n"],"mappings":"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","names":["import_api","result","span","context","trace","import_api","logger","span","import_node_async_hooks","import_node_async_hooks","import_api","import_node_async_hooks","neatlogsGlobal","otelTrace","context","context","span","otelTrace","span","otelTrace","logger","span","logger","span","import_node_crypto","reference","init","span","result","span","snapshot","failure","import_api","otelTrace","import_api","logger","span","encodedBytes","logger","span","otelTrace","logger","span","import_node_crypto","path","import_node_crypto","import_resources","import_sdk_trace_base","import_core","import_sdk_logs","import_api","logger","logger","mapper","usage","durationNs","logger","import_api","span","logger","span","spanId","otelTrace","import_api","span","import_node_crypto","import_core","logger","span","import_core","import_resources","import_api","span","import_node_async_hooks","logger","import_api","import_core","result","UUID_PATTERN","policy","path","logger","_debugMode","logger","_debugMode","span","first","check","canonicalize","result","failure","boundedJson","local"]}
1
+ {"version":3,"sources":["../src/doctor-cli.ts","../src/core/doctor-capture.ts","../src/core/logger.ts","../src/span-kinds/constants.ts","../src/span-kinds/mapping.ts","../src/config/attribute-mapping.json","../src/config/attribute-mapper.ts","../src/constants.ts","../src/core/context.ts","../src/prompt/template.ts","../src/core/mask.ts","../src/core/identity.ts","../src/core/provider.ts","../src/core/active-client.ts","../src/core/end-user.ts","../src/core/session.ts","../src/core/media.ts","../src/core/upload-authority.ts","../src/core/auto-root.ts","../src/errors.ts","../src/decorators/base.ts","../src/decorators/orchestration.ts","../src/doctor-v2.ts","../src/contracts/v2/neatlogs-telemetry.schema.json","../src/schema-v2.ts","../src/version.ts","../src/init.ts","../src/core/span-processor.ts","../src/core/instrumentation-scope-parser.ts","../src/config/model_defaults.json","../src/config/defaults-enricher.ts","../src/core/attribute-processor.ts","../src/core/crewai-task-registry.ts","../src/core/resource.ts","../src/core/http-span.ts","../src/core/filtering-exporter.ts","../src/core/byte-limited-exporter.ts","../src/core/masking-log-exporter.ts","../src/core/delivery-diagnostics.ts","../src/core/observable-batch-processors.ts","../src/core/log.ts","../src/prompt/client.ts","../src/mastra.ts","../src/core/deadline.ts","../src/cli.ts"],"sourcesContent":["import { SpanStatusCode } from '@opentelemetry/api';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport { getCapturedEnvelope, getDoctorCaptureStats } from './core/doctor-capture.js';\nimport { trace, setTraceOutput } from './core/context.js';\nimport { disableLogging, enableLogging } from './core/logger.js';\nimport { getActiveNeatlogsSpan, getRoutingNeatlogsTracer } from './core/provider.js';\nimport { span } from './decorators/orchestration.js';\nimport {\n doctorCapturedLocalV2,\n DOCTOR_V2_FORMAT_VERSION,\n type DoctorV2Result,\n} from './doctor-v2.js';\nimport { flush, init, shutdown } from './init.js';\nimport { TELEMETRY_SCHEMA_VERSION } from './schema-v2.js';\nimport { __version__ } from './version.js';\n\nconst DOCTOR_SERVICE = 'neatlogs.doctor.v2';\nconst DOCTOR_MARKER_VERSION = 'v1';\nconst PROBE_TIMEOUT_MS = 48_000;\nconst REQUEST_TIMEOUT_MS = 5_000;\nconst POLL_INTERVAL_MS = 1_000;\nconst MAX_READBACK_BYTES = 1 << 20;\nconst EXPECTED_TOKENS = [11, 7, 18] as const;\n\nconst EXPECTED_TYPES = new Map([\n ['doctor.probe.root', 'workflow'],\n ['doctor.probe.agent', 'agent_action'],\n ['doctor.probe.llm', 'llm'],\n ['doctor.probe.tool', 'tool_call'],\n]);\n\nconst EXPECTED_SPAN_TYPES = new Map([\n ['doctor.probe.root', 'WORKFLOW'],\n ['doctor.probe.agent', 'AGENT'],\n ['doctor.probe.llm', 'LLM'],\n ['doctor.probe.tool', 'TOOL'],\n]);\n\nconst EXPECTED_IO = new Map<string, Readonly<{ input: unknown; output: unknown }>>([\n ['doctor.probe.root', {\n input: { prompt: 'generated diagnostic input' },\n output: { result: { value: 2 } },\n }],\n ['doctor.probe.agent', {\n input: { prompt: 'generated diagnostic input' },\n output: { text: 'generated diagnostic output' },\n }],\n ['doctor.probe.llm', {\n input: { messages: [{ role: 'user', content: 'generated diagnostic input' }] },\n output: { text: 'generated diagnostic output' },\n }],\n ['doctor.probe.tool', { input: { value: 1 }, output: { value: 2 } }],\n]);\n\n// The v3 read path intentionally returns the UI-facing simplified view. It may\n// preserve normalized JSON or render the same deterministic semantic value for\n// display. Keep this allowlist identical across SDKs.\nconst EXPECTED_PERSISTED_IO = new Map<string, Readonly<{\n inputs: readonly unknown[];\n outputs: readonly unknown[];\n}>>([\n ['doctor.probe.root', {\n inputs: [{ prompt: 'generated diagnostic input' }, 'generated diagnostic input'],\n outputs: [{ result: { value: 2 } }, 'Value: 2'],\n }],\n ['doctor.probe.agent', {\n inputs: [{ prompt: 'generated diagnostic input' }, 'Prompt: generated diagnostic input'],\n outputs: [{ text: 'generated diagnostic output' }],\n }],\n ['doctor.probe.llm', {\n inputs: [\n { messages: [{ role: 'user', content: 'generated diagnostic input' }] },\n { prompt: 'generated diagnostic input' },\n ],\n outputs: [{ text: 'generated diagnostic output' }, 'Text: generated diagnostic output'],\n }],\n ['doctor.probe.tool', {\n inputs: [{ value: 1 }, 'Value: 1'],\n outputs: [{ value: 2 }, 'Value: 2'],\n }],\n]);\n\nexport type DoctorCliIO = Readonly<{\n stdout: (line: string) => void;\n stderr: (line: string) => void;\n fetch: typeof globalThis.fetch;\n env: NodeJS.ProcessEnv;\n sleep: (milliseconds: number) => Promise<void>;\n probeExporter?: SpanExporter;\n probeTimeoutMs: number;\n requestTimeoutMs: number;\n pollIntervalMs: number;\n}>;\n\nconst defaultIO: DoctorCliIO = {\n stdout: (line) => process.stdout.write(`${line}\\n`),\n stderr: (line) => process.stderr.write(`${line}\\n`),\n fetch: globalThis.fetch,\n env: process.env,\n sleep: (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)),\n probeTimeoutMs: PROBE_TIMEOUT_MS,\n requestTimeoutMs: REQUEST_TIMEOUT_MS,\n pollIntervalMs: POLL_INTERVAL_MS,\n};\n\ntype PersistedSpan = Readonly<{\n span_id?: unknown;\n parent_span_id?: unknown;\n node_name?: unknown;\n span_name?: unknown;\n node_type?: unknown;\n span_type?: unknown;\n data?: unknown;\n span_metadata?: unknown;\n}>;\n\ntype PersistedTrace = Readonly<{\n _id?: unknown;\n status?: unknown;\n finalizationStatus?: unknown;\n spanCount?: unknown;\n promptTokens?: unknown;\n completionTokens?: unknown;\n totalTokensUsed?: unknown;\n workflowName?: unknown;\n spans?: unknown;\n ingestionDiagnostics?: unknown;\n}>;\n\nconst INGESTION_STAGES = new Set([\n 'kafka_published', 'pii_dispatch', 'pii_redaction', 'storage_consumer',\n 'raw_durable', 'root_resolution', 'simplification', 'finalized',\n]);\nconst INGESTION_STATES = new Set(['processing', 'failed', 'succeeded']);\nconst SAFE_FAILURE_CODE = /^[A-Z0-9_]{1,64}$/;\ntype CheckDetails = Readonly<Record<string, string | number | boolean | null>>;\n\ntype ProbeCheck = Readonly<{\n name: string;\n status: 'pass' | 'fail';\n reason_code: string;\n remediation_code: string;\n message: string;\n details?: CheckDetails;\n}>;\n\ntype DoctorProbeFailureResult = Omit<DoctorV2Result, 'mode'> &\n Readonly<{ mode: 'probe' }>;\n\ntype DoctorFailureBase = Omit<\n DoctorV2Result,\n 'mode' | 'first_failure' | 'checks' | 'capture'\n>;\n\ntype ProbeFailureReason =\n | 'AUTH_FAILED'\n | 'BACKEND_PROBE_UNAVAILABLE'\n | 'TRACE_READBACK_TIMEOUT'\n | 'INGESTION_PIPELINE_FAILED'\n | 'BACKEND_HTTP_ERROR'\n | 'BACKEND_CONNECTION_FAILED'\n | 'TRACE_READBACK_INVALID';\n\nconst PROBE_FAILURE = {\n AUTH_FAILED: {\n remediationCode: 'CHECK_INGEST_CREDENTIAL',\n message: 'The project key was rejected by the existing trace API',\n },\n BACKEND_PROBE_UNAVAILABLE: {\n remediationCode: 'CHECK_TRACE_ENDPOINT',\n message: 'The existing trace ingestion or read path is unavailable',\n },\n TRACE_READBACK_TIMEOUT: {\n remediationCode: 'WAIT_FOR_TRACE',\n message: 'Timed out waiting for the exact Doctor trace',\n },\n INGESTION_PIPELINE_FAILED: {\n remediationCode: 'CONTACT_SUPPORT',\n message: 'Trace ingestion reported a terminal pipeline failure',\n },\n BACKEND_HTTP_ERROR: {\n remediationCode: 'CHECK_TRACE_ENDPOINT',\n message: 'The existing trace read path returned an unexpected HTTP status',\n },\n BACKEND_CONNECTION_FAILED: {\n remediationCode: 'CHECK_TRACE_ENDPOINT',\n message: 'Could not connect to the existing trace read path',\n },\n TRACE_READBACK_INVALID: {\n remediationCode: 'CONTACT_SUPPORT',\n message: 'Trace read-back returned an invalid response',\n },\n} as const satisfies Readonly<Record<\n ProbeFailureReason,\n Readonly<{ remediationCode: string; message: string }>\n>>;\n\nclass ProbeReadError extends Error {\n constructor(\n readonly reasonCode: ProbeFailureReason,\n message: string,\n readonly details?: CheckDetails,\n ) {\n super(message);\n }\n}\n\nfunction ingestionDiagnosticDetails(value: unknown): CheckDetails | undefined {\n const diagnostics = objectValue(objectValue(value).ingestionDiagnostics);\n if (diagnostics.protocolVersion !== 'v1' ||\n typeof diagnostics.currentStage !== 'string' ||\n !INGESTION_STAGES.has(diagnostics.currentStage) ||\n typeof diagnostics.state !== 'string' ||\n !INGESTION_STATES.has(diagnostics.state) ||\n typeof diagnostics.retryable !== 'boolean') {\n return undefined;\n }\n const validOptionalStage = (key: 'lastSuccessfulStage' | 'failedStage') => {\n const item = diagnostics[key];\n return item === undefined ||\n (typeof item === 'string' && INGESTION_STAGES.has(item));\n };\n if (!validOptionalStage('lastSuccessfulStage') ||\n !validOptionalStage('failedStage') ||\n (diagnostics.failureCode !== undefined &&\n (typeof diagnostics.failureCode !== 'string' ||\n !SAFE_FAILURE_CODE.test(diagnostics.failureCode)))) {\n return undefined;\n }\n return Object.freeze({\n ingestion_state: diagnostics.state,\n current_stage: diagnostics.currentStage,\n ...(typeof diagnostics.lastSuccessfulStage === 'string'\n ? { last_successful_stage: diagnostics.lastSuccessfulStage }\n : {}),\n ...(typeof diagnostics.failedStage === 'string'\n ? { failed_stage: diagnostics.failedStage }\n : {}),\n ...(typeof diagnostics.failureCode === 'string'\n ? { failure_code: diagnostics.failureCode }\n : {}),\n retryable: diagnostics.retryable,\n });\n}\n\nfunction markDoctorSpan(spanType: 'WORKFLOW' | 'AGENT' | 'LLM' | 'TOOL'): void {\n getActiveNeatlogsSpan()?.setAttributes({\n 'neatlogs.doctor': true,\n 'neatlogs.doctor.version': DOCTOR_MARKER_VERSION,\n 'service.name': DOCTOR_SERVICE,\n 'telemetry.sdk.language': 'typescript',\n 'telemetry.sdk.version': __version__,\n 'neatlogs.span.kind': spanType.toLowerCase(),\n });\n}\n\nfunction canonicalize(value: unknown): unknown {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n try { return canonicalize(JSON.parse(trimmed)); } catch { return value; }\n }\n return value;\n }\n if (Array.isArray(value)) return value.map(canonicalize);\n if (value && typeof value === 'object') {\n return Object.fromEntries(Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, item]) => [key, canonicalize(item)]));\n }\n return value;\n}\n\nfunction sameValue(left: unknown, right: unknown): boolean {\n return JSON.stringify(canonicalize(left)) === JSON.stringify(canonicalize(right));\n}\n\nfunction matchesMaterializedValue(value: unknown, expected: readonly unknown[]): boolean {\n return value !== null && value !== undefined &&\n expected.some((candidate) => sameValue(value, candidate));\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : {};\n}\n\nfunction check(\n name: string,\n passed: boolean,\n passCode: string,\n failureCode: string,\n remediationCode: string,\n message: string,\n details?: CheckDetails,\n): ProbeCheck {\n return {\n name,\n status: passed ? 'pass' : 'fail',\n reason_code: passed ? passCode : failureCode,\n remediation_code: passed ? 'NONE' : remediationCode,\n message,\n ...(details ? { details } : {}),\n };\n}\n\nfunction validateLocalFixture(traceId: string): readonly ProbeCheck[] {\n const envelope = getCapturedEnvelope(traceId);\n const stats = getDoctorCaptureStats(traceId);\n if (!envelope) {\n return [check(\n 'controlled_fixture', false, 'CONTROLLED_FIXTURE_VALID',\n 'CONTROLLED_FIXTURE_MISSING', 'ENABLE_INSTRUMENTOR',\n 'The controlled Doctor fixture was not captured',\n )];\n }\n\n const byName = new Map(envelope.spans.map((item) => [item.name, item]));\n const root = byName.get('doctor.probe.root');\n const agent = byName.get('doctor.probe.agent');\n const llm = byName.get('doctor.probe.llm');\n const tool = byName.get('doctor.probe.tool');\n const exactSet = envelope.spans.length === EXPECTED_SPAN_TYPES.size &&\n byName.size === EXPECTED_SPAN_TYPES.size &&\n [...EXPECTED_SPAN_TYPES].every(([name, kind]) => byName.get(name)?.kind === kind);\n const exactEdges = !!root && !!agent && !!llm && !!tool &&\n root.parent_span_id === null &&\n agent.parent_span_id === root.span_id &&\n llm.parent_span_id === agent.span_id &&\n tool.parent_span_id === root.span_id;\n const exactIo = [...EXPECTED_IO].every(([name, expected]) => {\n const item = byName.get(name);\n return !!item && sameValue(item.input, expected.input) && sameValue(item.output, expected.output);\n });\n const exactMetadata = [...EXPECTED_SPAN_TYPES].every(([name, spanType]) => {\n const attributes = byName.get(name)?.attributes ?? {};\n return attributes['neatlogs.doctor'] === true &&\n attributes['neatlogs.doctor.version'] === DOCTOR_MARKER_VERSION &&\n attributes['service.name'] === DOCTOR_SERVICE &&\n attributes['telemetry.sdk.language'] === 'typescript' &&\n attributes['telemetry.sdk.version'] === __version__ &&\n attributes['neatlogs.span.kind'] === spanType.toLowerCase();\n });\n const exactTokens = !!llm && [\n llm.attributes?.['neatlogs.llm.token_count.prompt'],\n llm.attributes?.['neatlogs.llm.token_count.completion'],\n llm.attributes?.['neatlogs.llm.token_count.total'],\n ].every((value, index) => typeof value === 'number' && value === EXPECTED_TOKENS[index]);\n\n return [\n check('controlled_fixture_spans', exactSet, 'CONTROLLED_SPANS_VALID', 'CONTROLLED_SPANS_INVALID', 'CHECK_SDK_INSTRUMENTATION', 'Doctor captured exactly the four expected semantic spans'),\n check('controlled_fixture_hierarchy', exactEdges, 'CONTROLLED_HIERARCHY_VALID', 'CONTROLLED_HIERARCHY_INVALID', 'CHECK_PARENT_CONTEXT', 'Doctor captured the exact root-agent-LLM and root-tool edges'),\n check('controlled_fixture_io', exactIo, 'CONTROLLED_IO_VALID', 'CONTROLLED_IO_INVALID', 'CHECK_PAYLOAD_MAPPING', 'Doctor captured the deterministic non-null input and output values'),\n check('controlled_fixture_metadata', exactMetadata, 'CONTROLLED_METADATA_VALID', 'CONTROLLED_METADATA_INVALID', 'CHECK_ATTRIBUTE_MAPPING', 'Doctor captured all versioned metadata on every semantic span'),\n check('controlled_fixture_tokens', exactTokens, 'CONTROLLED_TOKENS_VALID', 'CONTROLLED_TOKENS_INVALID', 'CHECK_TOKEN_MAPPING', 'Doctor captured the exact numeric token values'),\n check('controlled_fixture_bounds', stats.droppedSpans === 0, 'CONTROLLED_BOUNDS_VALID', 'CONTROLLED_CAPTURE_TRUNCATED', 'REDUCE_DIAGNOSTIC_CAPTURE', 'Doctor stayed inside the bounded capture budget'),\n ];\n}\n\nasync function withTimeout<T>(\n operation: () => Promise<T>,\n timeoutMs: number,\n onTimeout?: () => void,\n timeoutReason: ProbeFailureReason = 'BACKEND_PROBE_UNAVAILABLE',\n): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n Promise.resolve().then(operation),\n new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n onTimeout?.();\n reject(new ProbeReadError(timeoutReason, 'Doctor operation timed out'));\n }, Math.max(1, timeoutMs));\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\nasync function localResult(\n env: NodeJS.ProcessEnv,\n options: Readonly<{\n exportProbe?: boolean;\n probeExporter?: SpanExporter;\n flushTimeoutMs?: number;\n }> = {},\n) {\n const flushTimeoutMs = Math.max(1, options.flushTimeoutMs ?? 5_000);\n const started = Date.now();\n let traceId = '';\n disableLogging();\n try {\n await init({\n apiKey: env.NEATLOGS_API_KEY,\n workflowName: DOCTOR_SERVICE,\n endpoint: options.exportProbe ? env.NEATLOGS_ENDPOINT : undefined,\n disableExport: !options.exportProbe,\n diagnosticCapture: true,\n doctorProbe: options.exportProbe === true,\n doctorProbeExporter: options.probeExporter,\n doctorProbeTimeoutMillis: options.exportProbe ? flushTimeoutMs : undefined,\n registerShutdownHandlers: false,\n batchSize: 32,\n flushInterval: 60,\n });\n\n const diagnosticTool = span(\n { kind: 'TOOL', name: 'doctor.probe.tool' },\n async (input: { value: number }) => {\n markDoctorSpan('TOOL');\n return { value: input.value + 1 };\n },\n );\n const diagnosticAgent = span(\n { kind: 'AGENT', name: 'doctor.probe.agent', role: 'diagnostic-agent' },\n async (input: { prompt: string }) => {\n markDoctorSpan('AGENT');\n return getRoutingNeatlogsTracer('neatlogs.doctor').startActiveSpan(\n 'doctor.probe.llm',\n {\n attributes: {\n 'openinference.span.kind': 'LLM',\n 'input.value': JSON.stringify({\n messages: [{ role: 'user', content: input.prompt }],\n }),\n 'neatlogs.llm.token_count.prompt': EXPECTED_TOKENS[0],\n 'neatlogs.llm.token_count.completion': EXPECTED_TOKENS[1],\n 'neatlogs.llm.token_count.total': EXPECTED_TOKENS[2],\n },\n },\n (llm) => {\n markDoctorSpan('LLM');\n const output = { text: 'generated diagnostic output' };\n llm.setAttribute('output.value', JSON.stringify(output));\n llm.setStatus({ code: SpanStatusCode.OK });\n llm.end();\n return output;\n },\n );\n },\n );\n\n await trace({\n name: 'doctor.probe.root',\n kind: 'WORKFLOW',\n sessionId: 'neatlogs-doctor-probe',\n input: { prompt: 'generated diagnostic input' },\n }, async (root) => {\n markDoctorSpan('WORKFLOW');\n traceId = root.spanContext().traceId;\n await diagnosticAgent({ prompt: 'generated diagnostic input' });\n const output = await diagnosticTool({ value: 1 });\n const result = { result: output };\n setTraceOutput(result);\n root.setStatus({ code: SpanStatusCode.OK });\n return result;\n });\n\n let flushed = false;\n try {\n flushed = await withTimeout(flush, flushTimeoutMs);\n } catch {\n flushed = false;\n }\n const result = doctorCapturedLocalV2({\n traceId,\n flushOutcome: flushed ? 'success' : 'timeout',\n flushTimeoutMs,\n flushDurationMs: Date.now() - started,\n });\n if (!result) throw new Error('Diagnostic envelope was not captured');\n\n const fixtureChecks = validateLocalFixture(traceId);\n const fixtureFailure = fixtureChecks.find((item) => item.status === 'fail');\n return Object.freeze({\n ...result,\n status: fixtureFailure ? 'fail' : result.status,\n first_failure: fixtureFailure?.reason_code ?? result.first_failure,\n checks: Object.freeze([...result.checks, ...fixtureChecks]),\n });\n } finally {\n await shutdown('doctor-complete', flushTimeoutMs).catch(() => false);\n enableLogging();\n }\n}\n\nfunction persistedProbeResult(\n local: Awaited<ReturnType<typeof localResult>>,\n traceValue: PersistedTrace,\n diagnosticDetails?: CheckDetails,\n) {\n const spans = Array.isArray(traceValue.spans)\n ? traceValue.spans.filter((value): value is PersistedSpan =>\n !!value && typeof value === 'object')\n : [];\n const normalized = spans.map((item) => ({\n id: typeof item.span_id === 'string' ? item.span_id : '',\n parentId: typeof item.parent_span_id === 'string' ? item.parent_span_id : null,\n name: String(item.node_name ?? item.span_name ?? ''),\n type: String(item.node_type ?? item.span_type ?? '').toLowerCase(),\n data: objectValue(item.data),\n metadata: objectValue(item.span_metadata),\n }));\n const byName = new Map(normalized.map((item) => [item.name, item]));\n const root = byName.get('doctor.probe.root');\n const agent = byName.get('doctor.probe.agent');\n const llm = byName.get('doctor.probe.llm');\n const tool = byName.get('doctor.probe.tool');\n const ids = normalized.map((item) => item.id);\n const duplicateSpanCount = ids.length - new Set(ids).size;\n const meaningfulRootCount = normalized.filter((item) =>\n item.name !== 'neatlogs.trace.complete' && item.parentId === null).length;\n const readbackSpanCount = typeof traceValue.spanCount === 'number'\n ? traceValue.spanCount\n : spans.length;\n\n const readbackTraceId = typeof traceValue._id === 'string' ? traceValue._id : null;\n const visible = readbackTraceId === local.capture?.trace_id;\n const finalized = traceValue.status === 'success' &&\n (traceValue.finalizationStatus === undefined || traceValue.finalizationStatus === 'finalized');\n const exactSet = spans.length === EXPECTED_TYPES.size &&\n readbackSpanCount === EXPECTED_TYPES.size &&\n byName.size === EXPECTED_TYPES.size &&\n ids.every((id) => /^[0-9a-f]{16}$/.test(id)) &&\n duplicateSpanCount === 0 &&\n [...EXPECTED_TYPES].every(([name, type]) => byName.get(name)?.type === type);\n const exactEdges = !!root && !!agent && !!llm && !!tool &&\n root.parentId === null &&\n agent.parentId === root.id &&\n llm.parentId === agent.id &&\n tool.parentId === root.id;\n const exactIo = [...EXPECTED_PERSISTED_IO].every(([name, expected]) => {\n const data = byName.get(name)?.data ?? {};\n return matchesMaterializedValue(data.input_value, expected.inputs) &&\n matchesMaterializedValue(data.output_value, expected.outputs);\n });\n const exactMetadata = [...EXPECTED_SPAN_TYPES].every(([name, spanType]) => {\n const metadata = byName.get(name)?.metadata ?? {};\n return metadata['neatlogs.doctor'] === true &&\n metadata['neatlogs.doctor.version'] === DOCTOR_MARKER_VERSION &&\n metadata['service.name'] === DOCTOR_SERVICE &&\n metadata['telemetry.sdk.language'] === 'typescript' &&\n metadata['telemetry.sdk.version'] === __version__ &&\n metadata['neatlogs.span.kind'] === spanType.toLowerCase();\n });\n const exactTokens = [\n traceValue.promptTokens,\n traceValue.completionTokens,\n traceValue.totalTokensUsed,\n ].every((value, index) =>\n typeof value === 'number' && Number.isFinite(value) && value === EXPECTED_TOKENS[index]);\n\n const probeChecks = [\n check('probe_visibility', visible, 'TRACE_VISIBLE', 'TRACE_ID_MISMATCH', 'WAIT_FOR_TRACE', 'The read-back trace ID exactly matches the exported Doctor trace ID'),\n check('probe_finalization', finalized, 'TRACE_FINALIZED', 'TRACE_NOT_FINALIZED', 'WAIT_FOR_TRACE', 'The Doctor trace reached a successful finalized state', diagnosticDetails),\n check('probe_root_count', meaningfulRootCount === 1, 'ROOT_COUNT_VALID', 'ROOT_COUNT_INVALID', 'CHECK_TRACE_FINALIZER', 'The persisted Doctor trace has exactly one meaningful root'),\n check('probe_duplicates', duplicateSpanCount === 0, 'NO_DUPLICATE_SPANS', 'DUPLICATE_SPANS', 'CHECK_TRACE_FINALIZER', 'The persisted Doctor trace contains no duplicate span IDs'),\n check('probe_span_set', exactSet, 'SPAN_SET_VALID', 'TRACE_INCOMPLETE', 'WAIT_FOR_TRACE', 'The exact four-span Doctor trace is visible through the authenticated trace API'),\n check('probe_hierarchy', exactEdges, 'HIERARCHY_VALID', 'HIERARCHY_INVALID', 'CHECK_TRACE_FINALIZER', 'The persisted Doctor trace retains the exact semantic parent edges'),\n check('probe_attributes', exactSet, 'ATTRIBUTES_VALID', 'ATTRIBUTES_INVALID', 'CHECK_ATTRIBUTE_MAPPING', 'The persisted Doctor span names and semantic types are exact'),\n check('probe_input_output', exactIo, 'INPUT_OUTPUT_VALID', 'INPUT_OUTPUT_INVALID', 'CHECK_PAYLOAD_MAPPING', 'The persisted Doctor spans retain the exact non-null deterministic input and output'),\n check('probe_metadata', exactMetadata, 'METADATA_VALID', 'METADATA_INVALID', 'CHECK_METADATA_FINALIZATION', 'All versioned Doctor SDK metadata survived finalization'),\n check('probe_typed_tokens', exactTokens, 'TYPED_TOKENS_VALID', 'TYPED_TOKENS_INVALID', 'CHECK_TOKEN_MAPPING', 'Persisted token totals remain exact numeric values'),\n ];\n const firstFailure = probeChecks.find((item) => item.status === 'fail');\n\n return {\n ...local,\n mode: 'probe',\n status: firstFailure || local.status !== 'pass' ? 'fail' : 'pass',\n first_failure: firstFailure?.reason_code ??\n (local.status === 'fail' ? local.first_failure : null),\n probe: {\n ingest_route: '/v1/traces',\n marker_header: 'x-neatlogs-doctor',\n marker_version: DOCTOR_MARKER_VERSION,\n visible,\n readback_trace_id: readbackTraceId,\n finalized,\n meaningful_root_count: meaningfulRootCount,\n duplicate_span_count: duplicateSpanCount,\n readback_span_count: readbackSpanCount,\n hierarchy_valid: exactEdges,\n attributes_valid: exactSet,\n input_output_valid: exactIo,\n metadata_valid: exactMetadata,\n typed_tokens_valid: exactTokens,\n },\n checks: [...local.checks, ...probeChecks],\n } as const;\n}\n\nfunction failedProbeResult(\n local: Awaited<ReturnType<typeof localResult>>,\n reasonCode: ProbeFailureReason,\n details?: CheckDetails,\n) {\n const transportCheck = failedProbeTransportCheck(reasonCode, details);\n return {\n ...local,\n mode: 'probe',\n status: 'fail',\n first_failure: reasonCode,\n checks: [...local.checks, transportCheck],\n } as const;\n}\n\nfunction failedProbeTransportCheck(\n reasonCode: ProbeFailureReason,\n details?: CheckDetails,\n): ProbeCheck {\n const failure = PROBE_FAILURE[reasonCode];\n return {\n name: 'probe_transport',\n status: 'fail',\n reason_code: reasonCode,\n remediation_code: failure.remediationCode,\n message: failure.message,\n ...(details ? { details } : {}),\n };\n}\n\nfunction failedProbeWithoutCapture(\n reasonCode: ProbeFailureReason,\n flushTimeoutMs: number,\n details?: CheckDetails,\n): DoctorProbeFailureResult {\n return {\n ...failedDoctorBase(flushTimeoutMs),\n mode: 'probe',\n first_failure: reasonCode,\n checks: [failedProbeTransportCheck(reasonCode, details)],\n };\n}\n\nfunction failedLocalWithoutCapture(flushTimeoutMs: number): DoctorV2Result {\n const reasonCode = 'INSTRUMENTOR_INACTIVE';\n return {\n ...failedDoctorBase(flushTimeoutMs),\n mode: 'local',\n first_failure: reasonCode,\n checks: [{\n name: 'local_envelope',\n status: 'fail',\n reason_code: reasonCode,\n remediation_code: 'ENABLE_INSTRUMENTOR',\n message: 'Doctor could not capture a local diagnostic envelope',\n }],\n };\n}\n\nfunction failedDoctorBase(flushTimeoutMs: number): DoctorFailureBase {\n return {\n format_version: DOCTOR_V2_FORMAT_VERSION,\n status: 'fail',\n runtime: {\n language: 'typescript',\n sdk_version: __version__,\n schema_version: String(TELEMETRY_SCHEMA_VERSION),\n transport: 'otlp_http_protobuf',\n },\n sampling: {\n effective_sampler: 'unknown',\n root_sample_rate: 0,\n sampled: false,\n },\n ownership: {\n provider: 'ambiguous',\n instrumentor_count: 0,\n },\n queue: {\n mode: 'diagnostic_capture',\n pending_spans: 0,\n dropped_spans: 0,\n capacity: null,\n },\n retry: {\n attempts: 0,\n window_ms: 0,\n exhausted: false,\n },\n flush: {\n outcome: 'failed',\n timeout_ms: flushTimeoutMs,\n duration_ms: null,\n },\n };\n}\n\nfunction human(result: {\n status: string;\n first_failure?: unknown;\n checks?: readonly Readonly<{\n status: string;\n reason_code: string;\n message: string;\n details?: CheckDetails;\n }>[];\n note?: string;\n}): string {\n const lines = [`Neatlogs Doctor: ${result.status.toUpperCase()}`];\n for (const item of result.checks ?? []) {\n lines.push(`${item.status === 'pass' ? 'PASS' : item.status === 'fail' ? 'FAIL' : 'INFO'} ${item.reason_code}: ${item.message}`);\n }\n const diagnostics = result.checks?.find((item) => item.details?.current_stage)?.details;\n if (diagnostics) {\n const failed = diagnostics.failed_stage\n ? `; failed: ${String(diagnostics.failed_stage)}`\n : '';\n lines.push(`Ingestion: ${String(diagnostics.ingestion_state)} at ${String(diagnostics.current_stage)}${failed}`);\n }\n if (result.first_failure) lines.push(`First failure: ${String(result.first_failure)}`);\n if (result.note) lines.push(result.note);\n return lines.join('\\n');\n}\n\nfunction readbackTimeoutReason(\n remainingMs: number,\n requestTimeoutMs: number,\n): ProbeFailureReason {\n return remainingMs <= requestTimeoutMs\n ? 'TRACE_READBACK_TIMEOUT'\n : 'BACKEND_CONNECTION_FAILED';\n}\n\nfunction responseBodyFailureReason(\n status: number,\n remainingMs: number,\n requestTimeoutMs: number,\n): ProbeFailureReason {\n return status === 409 || (status >= 200 && status < 300 && status !== 202)\n ? 'TRACE_READBACK_INVALID'\n : readbackTimeoutReason(remainingMs, requestTimeoutMs);\n}\n\nasync function boundedFetch(\n io: DoctorCliIO,\n input: URL,\n initOptions: RequestInit,\n deadline: number,\n): Promise<Response> {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n throw new ProbeReadError('TRACE_READBACK_TIMEOUT', 'Doctor probe deadline expired');\n }\n const controller = new AbortController();\n return withTimeout(\n () => io.fetch(input, { ...initOptions, signal: controller.signal }),\n Math.min(io.requestTimeoutMs, remaining),\n () => controller.abort(),\n readbackTimeoutReason(remaining, io.requestTimeoutMs),\n );\n}\n\nasync function discardResponseBody(\n response: Response,\n reader?: ReadableStreamDefaultReader<Uint8Array>,\n): Promise<void> {\n if (reader) {\n try {\n await reader.cancel();\n } catch {\n // Response cleanup is best effort and must not replace the probe result.\n }\n return;\n }\n const body = response.body;\n if (!body || body.locked) return;\n try {\n await body.cancel();\n } catch {\n // Response cleanup is best effort and must not replace the probe result.\n }\n}\n\nasync function boundedJson(\n response: Response,\n io: DoctorCliIO,\n deadline: number,\n): Promise<unknown> {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n await discardResponseBody(response);\n throw new ProbeReadError('TRACE_READBACK_TIMEOUT', 'Doctor probe deadline expired');\n }\n const contentLength = Number(response.headers.get('content-length'));\n if (Number.isFinite(contentLength) && contentLength > MAX_READBACK_BYTES) {\n await discardResponseBody(response);\n return null;\n }\n const reader = response.body?.getReader();\n if (!reader) return null;\n return withTimeout(async () => {\n const chunks: Uint8Array[] = [];\n let size = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n size += value.byteLength;\n if (size > MAX_READBACK_BYTES) {\n await discardResponseBody(response, reader);\n return null;\n }\n chunks.push(value);\n }\n const body = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n try {\n return JSON.parse(new TextDecoder().decode(body));\n } catch {\n return null;\n }\n }, Math.min(io.requestTimeoutMs, remaining), () => {\n void discardResponseBody(response, reader);\n }, responseBodyFailureReason(\n response.status,\n remaining,\n io.requestTimeoutMs,\n )).catch(async (error: unknown) => {\n await discardResponseBody(response, reader);\n if (error instanceof ProbeReadError) throw error;\n throw new ProbeReadError(\n 'BACKEND_CONNECTION_FAILED',\n 'Trace read-back response could not be read',\n );\n });\n}\n\nfunction usage(): string {\n return 'Usage: neatlogs doctor (--local | --probe) [--json]';\n}\n\n/** Run the credential-safe Doctor CLI. Returns a stable process exit code. */\nexport async function runDoctorCli(\n argv: readonly string[],\n overrides: Partial<DoctorCliIO> = {},\n): Promise<number> {\n const io: DoctorCliIO = { ...defaultIO, ...overrides };\n const json = argv.includes('--json');\n const modes = ['--local', '--probe'].filter((flag) => argv.includes(flag));\n if (argv.includes('--help') || argv.includes('-h')) {\n io.stdout(usage());\n return 0;\n }\n if (argv[0] !== 'doctor' || modes.length !== 1 ||\n argv.some((arg) => !['doctor', '--local', '--probe', '--json'].includes(arg))) {\n io.stderr(usage());\n return 4;\n }\n\n if (modes[0] === '--local') {\n try {\n const result = await localResult(io.env);\n io.stdout(json ? JSON.stringify(result, null, 2) : human(result));\n return result.status === 'fail' ? 2 : result.status === 'warn' ? 1 : 0;\n } catch {\n const result = failedLocalWithoutCapture(io.requestTimeoutMs);\n io.stdout(json ? JSON.stringify(result, null, 2) : human(result));\n return 2;\n }\n }\n\n const apiKey = io.env.NEATLOGS_API_KEY?.trim();\n if (!apiKey) {\n try {\n const local = await localResult(io.env);\n const result = {\n ...local,\n mode: 'probe',\n status: 'fail',\n first_failure: 'CREDENTIAL_MISSING',\n checks: [...local.checks, {\n name: 'credentials', status: 'fail', reason_code: 'CREDENTIAL_MISSING',\n remediation_code: 'SET_CREDENTIAL',\n message: 'Configure an ingestion credential to run a backend probe',\n }],\n } as const;\n io.stdout(json ? JSON.stringify(result, null, 2) : human(result));\n } catch {\n io.stderr('Doctor could not capture its local preflight');\n }\n return 3;\n }\n\n let endpoint: URL;\n try {\n endpoint = new URL(io.env.NEATLOGS_ENDPOINT?.trim() || 'https://ingest.neatlogs.com');\n if (!['http:', 'https:'].includes(endpoint.protocol) || endpoint.username || endpoint.password) {\n throw new Error('Invalid endpoint');\n }\n } catch {\n const local = await localResult({ ...io.env, NEATLOGS_API_KEY: undefined });\n const result = {\n ...local,\n mode: 'probe',\n status: 'fail',\n first_failure: 'ENDPOINT_INVALID',\n checks: [...local.checks, {\n name: 'endpoint', status: 'fail', reason_code: 'ENDPOINT_INVALID',\n remediation_code: 'SET_ENDPOINT',\n message: 'Configure an absolute HTTP or HTTPS diagnostic endpoint',\n }],\n } as const;\n io.stdout(json ? JSON.stringify(result, null, 2) : human(result));\n return 3;\n }\n\n let local: Awaited<ReturnType<typeof localResult>> | null = null;\n try {\n local = await localResult(io.env, {\n exportProbe: true,\n probeExporter: io.probeExporter,\n flushTimeoutMs: io.requestTimeoutMs,\n });\n const onlyExportFailed = local.status === 'fail' &&\n local.first_failure === 'FLUSH_TIMEOUT';\n if (!local.capture || (local.status === 'fail' && !onlyExportFailed)) {\n throw new ProbeReadError('BACKEND_PROBE_UNAVAILABLE', 'Local Doctor fixture failed');\n }\n\n const readbackUrl = new URL(\n `/api/traces/v3/${encodeURIComponent(local.capture.trace_id)}`,\n endpoint.origin,\n );\n const deadline = Date.now() + Math.max(1, io.probeTimeoutMs);\n let persisted: PersistedTrace | null = null;\n let lastDiagnostics: CheckDetails | undefined;\n while (Date.now() < deadline) {\n let response: Response;\n try {\n response = await boundedFetch(io, readbackUrl, {\n method: 'GET',\n redirect: 'error',\n headers: {\n 'x-api-key': apiKey,\n 'x-neatlogs-doctor': DOCTOR_MARKER_VERSION,\n },\n }, deadline);\n } catch (error: unknown) {\n if (error instanceof ProbeReadError) throw error;\n throw new ProbeReadError(\n 'BACKEND_CONNECTION_FAILED',\n 'Could not connect to the existing trace read path',\n lastDiagnostics,\n );\n }\n if (response.ok && response.status !== 202) {\n const value = await boundedJson(response, io, deadline);\n if (!value || typeof value !== 'object') {\n throw new ProbeReadError(\n 'TRACE_READBACK_INVALID',\n 'Trace read-back returned an invalid response',\n );\n }\n persisted = value as PersistedTrace;\n lastDiagnostics = ingestionDiagnosticDetails(value);\n break;\n }\n if (response.status === 401 || response.status === 403) {\n await discardResponseBody(response);\n throw new ProbeReadError('AUTH_FAILED', 'Trace read-back rejected the project key');\n }\n if ([202, 404, 409].includes(response.status)) {\n const value = await boundedJson(response, io, deadline);\n const currentDiagnostics = ingestionDiagnosticDetails(value);\n if (currentDiagnostics) lastDiagnostics = currentDiagnostics;\n if (response.status === 409) {\n const terminalValue = objectValue(value);\n const isDlq = terminalValue.finalizationStatus === 'dlq';\n const hasDiagnostics = Object.hasOwn(terminalValue, 'ingestionDiagnostics');\n const validDlq = typeof terminalValue.error === 'string' &&\n (terminalValue.message === undefined || typeof terminalValue.message === 'string') &&\n (!hasDiagnostics || currentDiagnostics !== undefined);\n const validReceipt = currentDiagnostics?.ingestion_state === 'failed';\n if (isDlq ? !validDlq : !validReceipt) {\n throw new ProbeReadError(\n 'TRACE_READBACK_INVALID',\n 'Trace read-back returned an invalid terminal receipt',\n );\n }\n throw new ProbeReadError(\n 'INGESTION_PIPELINE_FAILED',\n 'Trace ingestion reported a terminal failure',\n currentDiagnostics,\n );\n }\n } else {\n await discardResponseBody(response);\n throw new ProbeReadError(\n 'BACKEND_HTTP_ERROR',\n `Trace read-back failed with HTTP ${response.status}`,\n response.status >= 500 ? lastDiagnostics : undefined,\n );\n }\n const delay = Math.min(io.pollIntervalMs, Math.max(0, deadline - Date.now()));\n if (delay > 0) await withTimeout(() => io.sleep(delay), delay + 100);\n }\n if (!persisted) {\n throw new ProbeReadError(\n 'TRACE_READBACK_TIMEOUT',\n 'Timed out waiting for the exact Doctor trace',\n lastDiagnostics,\n );\n }\n\n const result = persistedProbeResult(local, persisted, lastDiagnostics);\n io.stdout(json ? JSON.stringify(result, null, 2) : human(result));\n return result.status === 'pass' ? 0 : 3;\n } catch (error) {\n const reason = error instanceof ProbeReadError\n ? error.reasonCode\n : 'BACKEND_PROBE_UNAVAILABLE';\n const result = local\n ? failedProbeResult(\n local,\n reason,\n error instanceof ProbeReadError ? error.details : undefined,\n )\n : failedProbeWithoutCapture(\n reason,\n io.requestTimeoutMs,\n error instanceof ProbeReadError ? error.details : undefined,\n );\n io.stdout(json ? JSON.stringify(result, null, 2) : human(result));\n return 3;\n }\n}\n","import { SpanStatusCode, type AttributeValue } from '@opentelemetry/api';\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport { AttributeMapper } from '../config/attribute-mapper.js';\nimport { utf8ByteLength } from '../constants.js';\nimport type { DiagnosticEnvelope, DiagnosticSpan } from '../doctor-v2.js';\n\nconst MAX_TRACES = 16;\nconst MAX_SPANS_PER_TRACE = 64;\nconst MAX_BYTES_PER_TRACE = 256 * 1024;\nconst MAX_STREAM_EVENTS_PER_SPAN = 128;\nconst COMPLETION_MARKER = 'neatlogs.trace.complete';\nconst mapper = new AttributeMapper();\n\ntype CapturedTrace = {\n readonly spans: Map<string, DiagnosticSpan>;\n readonly spanBytes: Map<string, number>;\n bytes: number;\n droppedSpans: number;\n};\n\nconst traces = new Map<string, CapturedTrace>();\nlet latestTraceId: string | null = null;\n\nfunction jsonValue(value: AttributeValue | undefined): unknown {\n if (typeof value !== 'string') return value;\n const trimmed = value.trim();\n if (!trimmed || !['{', '['].includes(trimmed[0] ?? '')) return value;\n try { return JSON.parse(trimmed); } catch { return value; }\n}\n\nfunction first(\n attributes: Readonly<Record<string, AttributeValue | undefined>>,\n keys: readonly string[],\n): unknown {\n for (const key of keys) {\n if (attributes[key] !== undefined) return jsonValue(attributes[key]);\n }\n return undefined;\n}\n\nfunction arrayValue(value: unknown): readonly unknown[] | undefined {\n return Array.isArray(value) ? value : undefined;\n}\n\nfunction indexedMessages(\n attributes: Readonly<Record<string, AttributeValue | undefined>>,\n direction: 'input' | 'output',\n): readonly Readonly<Record<string, unknown>>[] | undefined {\n const messages = new Map<number, Record<string, unknown>>();\n const pattern = new RegExp(\n `^neatlogs\\\\.llm\\\\.${direction}_messages\\\\.(\\\\d+)\\\\.(role|content|tool_call_id|name)$`,\n );\n for (const [key, value] of Object.entries(attributes)) {\n const match = pattern.exec(key);\n if (!match || value === undefined) continue;\n const index = Number(match[1]);\n const message = messages.get(index) ?? {};\n message[match[2] as string] = jsonValue(value);\n messages.set(index, message);\n }\n const normalized = [...messages.entries()]\n .sort(([left], [right]) => left - right)\n .map(([, message]) => Object.freeze(message));\n return normalized.length ? Object.freeze(normalized) : undefined;\n}\n\nfunction payloadReferences(\n attributes: Readonly<Record<string, AttributeValue | undefined>>,\n): readonly Readonly<{ digest: string; size: number; mime_type: string }>[] | undefined {\n const references = new Map<string, { sha256?: string; byte_length?: number; mime_type?: string }>();\n const pattern = /^neatlogs\\.llm\\.(?:input|output)_messages\\.(\\d+)\\.media\\.(\\d+)\\.(sha256|byte_length|mime_type)$/;\n for (const [key, value] of Object.entries(attributes)) {\n const match = pattern.exec(key);\n if (!match) continue;\n const referenceKey = `${match[1]}:${match[2]}:${key.includes('.input_messages.') ? 'input' : 'output'}`;\n const reference = references.get(referenceKey) ?? {};\n if (match[3] === 'sha256' && typeof value === 'string') reference.sha256 = value;\n if (match[3] === 'byte_length' && typeof value === 'number') reference.byte_length = value;\n if (match[3] === 'mime_type' && typeof value === 'string') reference.mime_type = value;\n references.set(referenceKey, reference);\n }\n const normalized = [...references.values()].flatMap((reference) =>\n reference.sha256 && Number.isFinite(reference.byte_length) && (reference.byte_length ?? 0) > 0 && reference.mime_type\n ? [{\n digest: `sha256:${reference.sha256}`,\n size: reference.byte_length as number,\n mime_type: reference.mime_type,\n }]\n : []);\n return normalized.length ? Object.freeze(normalized.map((reference) => Object.freeze(reference))) : undefined;\n}\n\nfunction durationNs(span: ReadableSpan): number {\n return span.duration[0] * 1_000_000_000 + span.duration[1];\n}\n\nfunction attributeBytes(value: AttributeValue | undefined, limit: number): number {\n limit = Math.max(0, limit);\n if (value === undefined) return 0;\n if (typeof value === 'string') return utf8ByteLength(value, limit);\n if (Array.isArray(value)) {\n let bytes = 0;\n for (const item of value) {\n bytes += typeof item === 'string' ? utf8ByteLength(item, limit - bytes) : 16;\n if (bytes > limit) return limit + 1;\n }\n return bytes;\n }\n return 16;\n}\n\nfunction exceedsRawProjectionBudget(span: ReadableSpan, limit: number): boolean {\n // Reject a hostile diagnostic field before JSON parsing or projection can\n // duplicate it. The complete span still belongs to the normal exporter.\n let bytes = 512;\n if (limit <= bytes) return true;\n for (const [key, value] of Object.entries(span.attributes)) {\n if (!(\n key === 'input.value' || key === 'output.value' ||\n key === 'openinference.span.kind' || key === 'neatlogs.span.kind' ||\n key.startsWith('neatlogs.doctor') || key.startsWith('telemetry.sdk.') ||\n key === 'service.name' || key.startsWith('neatlogs.llm.input_messages.') ||\n key.startsWith('neatlogs.llm.output_messages.') ||\n key.startsWith('neatlogs.llm.tool_calls.') ||\n key.startsWith('neatlogs.llm.token_count.')\n )) continue;\n const remaining = Math.max(0, limit - bytes);\n bytes += utf8ByteLength(key, remaining) + attributeBytes(value, remaining);\n if (bytes > limit) return true;\n }\n let streamEvents = 0;\n for (const event of span.events) {\n if (event.name !== 'neatlogs.stream.chunk') continue;\n streamEvents += 1;\n if (streamEvents > MAX_STREAM_EVENTS_PER_SPAN) break;\n bytes += attributeBytes(\n event.attributes?.['neatlogs.stream.chunk.summary'],\n Math.max(0, limit - bytes),\n );\n if (bytes > limit) return true;\n }\n return false;\n}\n\nfunction startNs(span: ReadableSpan): number {\n return span.startTime[0] * 1_000_000_000 + span.startTime[1];\n}\n\nfunction normalizeKind(value: unknown): string {\n return typeof value === 'string'\n ? value.replace(/^Neatlogs\\./i, '').toUpperCase()\n : 'INTERNAL';\n}\n\nfunction indexedToolCalls(\n attributes: Readonly<Record<string, AttributeValue | undefined>>,\n): readonly Readonly<{\n id: string;\n name?: string;\n arguments?: unknown;\n choice_index?: number;\n tool_call_index?: number;\n}>[] | undefined {\n const calls = new Map<number, Record<string, unknown>>();\n for (const [key, value] of Object.entries(attributes)) {\n const match = /^neatlogs\\.llm\\.tool_calls\\.(\\d+)\\.(id|name|arguments|choice_index|tool_call_index)$/.exec(key);\n if (!match) continue;\n const index = Number(match[1]);\n const call = calls.get(index) ?? {};\n call[match[2] as string] = jsonValue(value);\n calls.set(index, call);\n }\n const normalized = [...calls.entries()]\n .sort(([left], [right]) => left - right)\n .flatMap(([, call]) => typeof call.id === 'string'\n ? [{\n id: call.id,\n ...(typeof call.name === 'string' ? { name: call.name } : {}),\n ...(call.arguments !== undefined ? { arguments: call.arguments } : {}),\n ...(typeof call.choice_index === 'number' ? { choice_index: call.choice_index } : {}),\n ...(typeof call.tool_call_index === 'number' ? { tool_call_index: call.tool_call_index } : {}),\n }]\n : []);\n return normalized.length ? normalized : undefined;\n}\n\nfunction normalizedChoices(\n value: unknown,\n attributes: Readonly<Record<string, AttributeValue | undefined>>,\n): readonly Readonly<Record<string, unknown>>[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const choices = value.map((raw, index) => {\n const record: Record<string, unknown> =\n raw && typeof raw === 'object' && !Array.isArray(raw)\n ? raw as Record<string, unknown>\n : { content: raw };\n const explicitIndex = typeof record.index === 'number' ? record.index : index;\n const message = record.message && typeof record.message === 'object' && !Array.isArray(record.message)\n ? record.message\n : Object.fromEntries(\n ['role', 'content', 'name', 'tool_call_id']\n .filter((key) => record[key] !== undefined)\n .map((key) => [key, record[key]]),\n );\n const finish = attributes[`neatlogs.llm.choices.${explicitIndex}.finish_reason`] ??\n record.finish_reason;\n return Object.freeze({\n index: explicitIndex,\n message: Object.freeze({ ...(message as Record<string, unknown>) }),\n ...(finish !== undefined ? { finish_reason: jsonValue(finish as AttributeValue) } : {}),\n });\n });\n return choices.length ? Object.freeze(choices) : undefined;\n}\n\nfunction streamFragments(span: ReadableSpan): readonly unknown[] | undefined {\n const fragments = span.events\n .filter((event) => event.name === 'neatlogs.stream.chunk')\n .slice(0, MAX_STREAM_EVENTS_PER_SPAN)\n .map((event) => jsonValue(event.attributes?.['neatlogs.stream.chunk.summary']));\n return fragments.length ? fragments : undefined;\n}\n\nfunction diagnosticAttributes(\n attributes: Readonly<Record<string, AttributeValue | undefined>>,\n): Readonly<Record<string, unknown>> {\n const allowed = [\n 'neatlogs.doctor',\n 'neatlogs.doctor.version',\n 'service.name',\n 'telemetry.sdk.language',\n 'telemetry.sdk.version',\n 'neatlogs.span.kind',\n 'neatlogs.llm.token_count.prompt',\n 'neatlogs.llm.token_count.completion',\n 'neatlogs.llm.token_count.total',\n 'gen_ai.operation.name',\n 'http.response.status_code',\n 'error.type',\n 'retry-after',\n 'retry_after',\n 'neatlogs.llm.rate_limit_remaining',\n ] as const;\n return Object.freeze(Object.fromEntries(\n allowed.flatMap((key) => attributes[key] === undefined\n ? []\n : [[key, jsonValue(attributes[key])]]),\n ));\n}\n\nfunction toDiagnosticSpan(span: ReadableSpan): DiagnosticSpan {\n const context = span.spanContext();\n const attributes = mapper.mapAttributes({ ...span.attributes });\n const kind = normalizeKind(attributes['neatlogs.span.kind']);\n const kindKey = kind.toLowerCase();\n const choicesValue = jsonValue(attributes['neatlogs.llm.generation_choices']);\n const inputMessages = kind === 'LLM' ? indexedMessages(attributes, 'input') : undefined;\n const outputMessages = kind === 'LLM' ? indexedMessages(attributes, 'output') : undefined;\n const choices = normalizedChoices(arrayValue(choicesValue) ?? outputMessages, attributes);\n const expectedChoiceCount = typeof choicesValue === 'number' && Number.isInteger(choicesValue)\n ? choicesValue\n : choices?.length;\n const toolCalls = indexedToolCalls(attributes);\n const fragments = streamFragments(span);\n const references = payloadReferences(attributes);\n const oversized = attributes['neatlogs.capture.truncated'] === true;\n const toolCallId = first(attributes, ['neatlogs.tool_call.id']);\n const streaming = attributes['neatlogs.llm.is_streaming'] === true ||\n attributes['neatlogs.tool.is_streaming'] === true ||\n fragments !== undefined;\n\n return Object.freeze({\n span_id: context.spanId,\n parent_span_id: span.parentSpanId ?? null,\n name: span.name,\n kind,\n status: span.status.code === SpanStatusCode.ERROR\n ? 'ERROR'\n : span.status.code === SpanStatusCode.OK\n ? 'OK'\n : 'UNSET',\n input: first(attributes, [`neatlogs.${kindKey}.input`]) ?? inputMessages,\n output: first(attributes, [`neatlogs.${kindKey}.output`]) ?? outputMessages,\n ...(choices ? { choices } : {}),\n ...(expectedChoiceCount !== undefined ? { expected_choice_count: expectedChoiceCount } : {}),\n ...(toolCalls ? { tool_calls: toolCalls } : {}),\n ...(kind === 'TOOL' && typeof toolCallId === 'string'\n ? {\n tool_call: {\n id: toolCallId,\n ...(typeof attributes['neatlogs.tool.name'] === 'string'\n ? { name: attributes['neatlogs.tool.name'] }\n : {}),\n },\n }\n : {}),\n ...(streaming ? {\n streaming: true,\n ...(fragments ? { stream_fragments: fragments } : {}),\n } : {}),\n ...(references ? { payload_references: references } : {}),\n ...(oversized ? { oversized: true } : {}),\n sampled: (context.traceFlags & 1) === 1,\n ended: true,\n start_time_ns: startNs(span),\n duration_ns: durationNs(span),\n attributes: diagnosticAttributes(attributes),\n });\n}\n\nfunction encodedBytes(value: DiagnosticSpan): number {\n return new TextEncoder().encode(JSON.stringify(value)).byteLength;\n}\n\n/** Capture a Doctor-only, bounded projection at the final masked export boundary. */\nexport function capturePreparedSpans(spans: readonly ReadableSpan[]): void {\n for (const span of spans) {\n // The backend folds this transport control record out of the materialized trace.\n if (span.name === COMPLETION_MARKER) continue;\n\n const traceId = span.spanContext().traceId;\n const current = traces.get(traceId) ?? {\n spans: new Map<string, DiagnosticSpan>(),\n spanBytes: new Map<string, number>(),\n bytes: 0,\n droppedSpans: 0,\n };\n const spanId = span.spanContext().spanId;\n const previousBytes = current.spanBytes.get(spanId) ?? 0;\n const isNewSpan = !current.spans.has(spanId);\n const remainingBytes = MAX_BYTES_PER_TRACE - current.bytes + previousBytes;\n if ((isNewSpan && current.spans.size >= MAX_SPANS_PER_TRACE) ||\n exceedsRawProjectionBudget(span, remainingBytes)) {\n current.droppedSpans += 1;\n traces.delete(traceId);\n traces.set(traceId, current);\n latestTraceId = traceId;\n while (traces.size > MAX_TRACES) {\n traces.delete(traces.keys().next().value as string);\n }\n continue;\n }\n const projected = toDiagnosticSpan(span);\n const bytes = encodedBytes(projected);\n const nextBytes = current.bytes - previousBytes + bytes;\n\n if (nextBytes > MAX_BYTES_PER_TRACE) {\n current.droppedSpans += 1;\n } else {\n current.spans.set(spanId, projected);\n current.spanBytes.set(spanId, bytes);\n current.bytes = nextBytes;\n }\n\n traces.delete(traceId);\n traces.set(traceId, current);\n latestTraceId = traceId;\n while (traces.size > MAX_TRACES) {\n traces.delete(traces.keys().next().value as string);\n }\n }\n}\n\nexport function getCapturedEnvelope(traceId = latestTraceId ?? ''): DiagnosticEnvelope | null {\n const trace = traces.get(traceId);\n if (!trace?.spans.size) return null;\n const values = [...trace.spans.values()];\n const root = values.find((span) => span.parent_span_id === null);\n if (!root) return null;\n return Object.freeze({\n trace_id: traceId,\n root_span_id: root.span_id,\n spans: Object.freeze(values),\n });\n}\n\n/** @internal Credential-free capture accounting for tests and Doctor output. */\nexport function getDoctorCaptureStats(traceId = latestTraceId ?? ''): Readonly<{\n traceCount: number;\n spanCount: number;\n bytes: number;\n droppedSpans: number;\n maxTraces: number;\n maxSpansPerTrace: number;\n maxBytesPerTrace: number;\n}> {\n const trace = traces.get(traceId);\n return Object.freeze({\n traceCount: traces.size,\n spanCount: trace?.spans.size ?? 0,\n bytes: trace?.bytes ?? 0,\n droppedSpans: trace?.droppedSpans ?? 0,\n maxTraces: MAX_TRACES,\n maxSpansPerTrace: MAX_SPANS_PER_TRACE,\n maxBytesPerTrace: MAX_BYTES_PER_TRACE,\n });\n}\n\n/** @internal Test/lifecycle reset. */\nexport function clearDoctorCapture(): void {\n traces.clear();\n latestTraceId = null;\n}\n","/**\n * Centralized logging configuration for Neatlogs SDK.\n * Provides structured logging with configurable levels.\n */\n\ntype LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'NONE';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n DEBUG: 0,\n INFO: 1,\n WARN: 2,\n ERROR: 3,\n NONE: 4,\n};\n\nlet _logLevel: LogLevel = 'INFO';\nlet _disabled = false;\n\nfunction _getConfiguredLevel(): LogLevel {\n const envLevel = process.env.NEATLOGS_LOG_LEVEL?.toUpperCase();\n if (envLevel && envLevel in LOG_LEVELS) {\n return envLevel as LogLevel;\n }\n return 'INFO';\n}\n\n// Initialize from env on first import\n_logLevel = _getConfiguredLevel();\n\nexport function getLogger() {\n return {\n debug(message: string, ...args: any[]) {\n if (!_disabled && LOG_LEVELS[_logLevel] <= LOG_LEVELS.DEBUG) {\n console.debug(`[neatlogs] ${message}`, ...args);\n }\n },\n info(message: string, ...args: any[]) {\n if (!_disabled && LOG_LEVELS[_logLevel] <= LOG_LEVELS.INFO) {\n console.info(`[neatlogs] ${message}`, ...args);\n }\n },\n warn(message: string, ...args: any[]) {\n if (!_disabled && LOG_LEVELS[_logLevel] <= LOG_LEVELS.WARN) {\n console.warn(`[neatlogs] ${message}`, ...args);\n }\n },\n error(message: string, ...args: any[]) {\n if (!_disabled && LOG_LEVELS[_logLevel] <= LOG_LEVELS.ERROR) {\n console.error(`[neatlogs] ${message}`, ...args);\n }\n },\n };\n}\n\nexport function setLogLevel(level: LogLevel): void {\n _logLevel = level;\n}\n\nexport function enableDebugLogging(): void {\n _logLevel = 'DEBUG';\n}\n\nexport function disableLogging(): void {\n _disabled = true;\n}\n\nexport function enableLogging(): void {\n _disabled = false;\n}\n","/**\n * Shared constants for vector DB systems and retrieval operations.\n *\n * Used by both attribute-processor.ts and mapping.ts to avoid\n * divergent keyword lists.\n */\n\n/** Known vector database system identifiers. */\nexport const VECTOR_DB_SYSTEMS = new Set([\n 'chroma',\n 'chromadb',\n 'pinecone',\n 'qdrant',\n 'milvus',\n 'marqo',\n 'weaviate',\n 'lancedb',\n 'pgvector',\n 'elasticsearch',\n]);\n\n/** Operations that indicate a retrieval / read from a vector DB. */\nexport const RETRIEVAL_OPS = [\n 'query',\n 'search',\n 'get',\n 'fetch',\n 'find',\n 'retrieve',\n 'scroll',\n 'peek',\n 'discover',\n 'recommend',\n 'aggregate',\n 'hybrid_search',\n 'select',\n];\n\n/** Operations that indicate a write to a vector DB. */\nexport const WRITE_OPS = [\n 'upsert',\n 'insert',\n 'add',\n 'update',\n 'delete',\n 'create',\n 'drop',\n 'put',\n 'set',\n 'upload',\n 'index',\n];\n\n/** Vector DB names used for span-name-based inference. */\nexport const VECTOR_DB_NAMES = [\n 'chroma',\n 'pinecone',\n 'weaviate',\n 'qdrant',\n 'milvus',\n 'lancedb',\n 'marqo',\n];\n","/**\n * Span kind constants and inference from span names.\n * Mirrors Python span_kinds/mapping.py.\n */\n\nimport type { SpanKind } from '../types.js';\nimport { VECTOR_DB_NAMES, RETRIEVAL_OPS } from './constants.js';\n\n/** All valid span kinds for the span() decorator. */\nexport const VALID_SPAN_KINDS = new Set<SpanKind>([\n 'WORKFLOW',\n 'AGENT',\n 'CHAIN',\n 'TOOL',\n 'RETRIEVER',\n 'EMBEDDING',\n 'MCP_TOOL',\n 'GUARDRAIL',\n 'EVALUATOR',\n]);\n\n/** Extended span kinds that can appear in processed spans (from OpenInference). */\nexport const ALL_SPAN_KINDS = new Set<string>([\n ...VALID_SPAN_KINDS,\n 'LLM',\n 'RERANKER',\n 'VECTOR_STORE',\n]);\n\n/** Resolve explicit kinds using the canonical Neatlogs attribute first. */\nexport function resolveExplicitSpanKind(attributes: Record<string, any>): string {\n for (const key of [\n 'neatlogs.span.kind',\n 'openinference.span.kind',\n 'traceloop.span.kind',\n ]) {\n const value = String(attributes[key] ?? '').trim();\n if (value) return value;\n }\n return '';\n}\n\n/**\n * Infer OpenInference span kind from span name.\n * Distinguishes RETRIEVER (read ops) vs VECTOR_STORE (write ops) for vector DBs.\n */\nexport function inferSpanKindFromName(spanName: string): string {\n const nameLower = spanName.toLowerCase();\n\n // LLM operations\n if (\n ['openai', 'anthropic', 'cohere', 'bedrock', 'chat', 'completion', 'llm', 'gemini', 'google_genai'].some(\n (kw) => nameLower.includes(kw),\n )\n ) {\n return 'LLM';\n }\n\n // Embedding operations\n if (nameLower.includes('embed')) {\n return 'EMBEDDING';\n }\n\n // Vector DB: Distinguish RETRIEVER (read) vs VECTOR_STORE (write)\n if (VECTOR_DB_NAMES.some((db) => nameLower.includes(db))) {\n if (RETRIEVAL_OPS.some((kw) => nameLower.includes(kw))) {\n return 'RETRIEVER';\n }\n return 'VECTOR_STORE';\n }\n\n // Generic retrieval\n if (['retriev', 'search', 'query'].some((kw) => nameLower.includes(kw))) {\n return 'RETRIEVER';\n }\n\n // Reranker\n if (nameLower.includes('rerank')) {\n return 'RERANKER';\n }\n\n // Agent\n if (nameLower.includes('agent')) {\n return 'AGENT';\n }\n\n // Tool/function\n if (['tool', 'function'].some((kw) => nameLower.includes(kw))) {\n return 'TOOL';\n }\n\n // Guardrail\n if (['guardrail', 'validate', 'moderate', 'safety'].some((kw) => nameLower.includes(kw))) {\n return 'GUARDRAIL';\n }\n\n // Evaluator\n if (['evaluat', 'score', 'metric'].some((kw) => nameLower.includes(kw))) {\n return 'EVALUATOR';\n }\n\n // Default\n return 'CHAIN';\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"title\": \"Neatlogs Semantic Conventions - Attribute Mapping Configuration\",\n \"description\": \"Maps vendor-specific attributes (OpenInference, OpenLLMetry) to unified neatlogs.* namespace\",\n \"version\": \"1.0.0\",\n \"mappings\": {\n \"span_kind\": {\n \"description\": \"Span classification/type\",\n \"sources\": [\n \"openinference.span.kind\",\n \"traceloop.span.kind\"\n ],\n \"target\": \"neatlogs.span.kind\",\n \"values\": {\n \"LLM\": \"llm\",\n \"TOOL\": \"tool\",\n \"AGENT\": \"agent\",\n \"CHAIN\": \"chain\",\n \"WORKFLOW\": \"workflow\",\n \"TASK\": \"task\",\n \"RETRIEVER\": \"retriever\",\n \"EMBEDDING\": \"embedding\",\n \"VECTOR_STORE\": \"vector_store\",\n \"RERANKER\": \"reranker\",\n \"GUARDRAIL\": \"guardrail\",\n \"EVALUATOR\": \"evaluator\",\n \"MCP_TOOL\": \"mcp_tool\",\n \"HTTP\": \"http\"\n },\n \"priority\": \"openinference\"\n },\n \"llm\": {\n \"description\": \"LLM-specific attributes\",\n \"mappings\": {\n \"model_name\": {\n \"sources\": [\n \"llm.model_name\",\n \"gen_ai.response.model\",\n \"gen_ai.request.model\",\n \"traceloop.association.properties.ls_model_name\"\n ],\n \"target\": \"neatlogs.llm.model_name\"\n },\n \"provider\": {\n \"sources\": [\n \"llm.provider\",\n \"traceloop.association.properties.ls_provider\"\n ],\n \"target\": \"neatlogs.llm.provider\"\n },\n \"system\": {\n \"sources\": [\n \"llm.system\",\n \"gen_ai.system\"\n ],\n \"target\": \"neatlogs.llm.system\"\n },\n \"request_type\": {\n \"sources\": [\n \"llm.request.type\",\n \"neatlogs.llm.operation.name\",\n \"neatlogs.llm.operation.type\"\n ],\n \"target\": \"neatlogs.llm.request_type\"\n },\n \"choices\": {\n \"sources\": [\n \"gen_ai.client.generation.choices\",\n \"llm.request.n\"\n ],\n \"target\": \"neatlogs.llm.generation_choices\"\n },\n \"token_count\": {\n \"mappings\": {\n \"total\": {\n \"sources\": [\n \"llm.token_count.total\",\n \"llm.usage.total_tokens\",\n \"ai.usage.totalTokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.total\"\n },\n \"prompt\": {\n \"sources\": [\n \"llm.token_count.prompt\",\n \"gen_ai.usage.input_tokens\",\n \"ai.usage.promptTokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.prompt\"\n },\n \"completion\": {\n \"sources\": [\n \"llm.token_count.completion\",\n \"gen_ai.usage.output_tokens\",\n \"ai.usage.completionTokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.completion\"\n },\n \"reasoning\": {\n \"sources\": [\n \"llm.token_count.completion_details.reasoning\",\n \"llm.usage.reasoning_tokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.reasoning\"\n },\n \"cached\": {\n \"sources\": [\n \"neatlogs.llm.token_count.cached_read\",\n \"llm.token_count.prompt_details.cache_read\",\n \"llm.token_count.prompt.cache_read\",\n \"gen_ai.usage.cache_read_input_tokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.cache_read\"\n },\n \"cache_write\": {\n \"sources\": [\n \"neatlogs.llm.token_count.cached_write\",\n \"llm.token_count.prompt_details.cache_write\",\n \"gen_ai.usage.cache_creation_input_tokens\"\n ],\n \"target\": \"neatlogs.llm.token_count.cache_write\"\n },\n \"prompt_audio\": {\n \"sources\": [\n \"llm.token_count.prompt_details.audio\"\n ],\n \"target\": \"neatlogs.llm.token_count.prompt_audio\"\n },\n \"completion_audio\": {\n \"sources\": [\n \"neatlogs.llm.token_count.audio\",\n \"llm.token_count.completion_details.audio\"\n ],\n \"target\": \"neatlogs.llm.token_count.completion_audio\"\n }\n }\n },\n \"tool_calls\": {\n \"description\": \"Tool/function calls extracted from provider responses\",\n \"sources\": {\n \"id\": [\n \"llm.tool_calls.{i}.id\"\n ],\n \"name\": [\n \"llm.tool_calls.{i}.name\"\n ],\n \"arguments\": [\n \"llm.tool_calls.{i}.arguments\"\n ]\n },\n \"target\": \"neatlogs.llm.tool_calls.{i}\",\n \"indexed\": true\n },\n \"invalid_tool_calls\": {\n \"description\": \"Invalid or malformed tool calls\",\n \"sources\": [\n \"llm.invalid_tool_calls\"\n ],\n \"target\": \"neatlogs.llm.invalid_tool_calls\"\n },\n \"tools\": {\n \"description\": \"Tool definitions passed to the model\",\n \"sources\": {\n \"name\": [\n \"llm.tools.{i}.name\"\n ],\n \"description\": [\n \"llm.tools.{i}.description\"\n ],\n \"input_schema\": [\n \"llm.tools.{i}.input_schema\"\n ]\n },\n \"target\": \"neatlogs.llm.tools.{i}\",\n \"indexed\": true\n },\n \"messages\": {\n \"mappings\": {\n \"input_role\": {\n \"sources\": [\n \"llm.input_messages.{i}.message.role\",\n \"gen_ai.prompt.{i}.role\"\n ],\n \"target\": \"neatlogs.llm.input_messages.{i}.role\",\n \"indexed\": true\n },\n \"input_content\": {\n \"sources\": [\n \"llm.input_messages.{i}.message.content\",\n \"gen_ai.prompt.{i}.content\"\n ],\n \"target\": \"neatlogs.llm.input_messages.{i}.content\",\n \"indexed\": true\n },\n \"input_tool_call_id\": {\n \"sources\": [\n \"llm.input_messages.{i}.tool_call_id\",\n \"llm.input_messages.{i}.message.tool_call_id\"\n ],\n \"target\": \"neatlogs.llm.input_messages.{i}.tool_call_id\",\n \"indexed\": true\n },\n \"input_name\": {\n \"sources\": [\n \"llm.input_messages.{i}.name\",\n \"llm.input_messages.{i}.message.name\"\n ],\n \"target\": \"neatlogs.llm.input_messages.{i}.name\",\n \"indexed\": true\n },\n \"output_role\": {\n \"sources\": [\n \"llm.output_messages.{i}.message.role\",\n \"gen_ai.completion.{i}.role\"\n ],\n \"target\": \"neatlogs.llm.output_messages.{i}.role\",\n \"indexed\": true\n },\n \"output_content\": {\n \"sources\": [\n \"llm.output_messages.{i}.message.content\",\n \"gen_ai.completion.{i}.content\"\n ],\n \"target\": \"neatlogs.llm.output_messages.{i}.content\",\n \"indexed\": true\n },\n \"system_prompt\": {\n \"sources\": [\n \"gen_ai.system_instructions\"\n ],\n \"target\": \"neatlogs.llm.system_prompt\"\n }\n },\n \"invocation_parameters\": {\n \"sources\": [\n \"llm.invocation_parameters\"\n ],\n \"target\": \"neatlogs.llm.invocation_parameters\"\n },\n \"temperature\": {\n \"sources\": [\n \"gen_ai.request.temperature\",\n \"traceloop.association.properties.ls_temperature\"\n ],\n \"target\": \"neatlogs.llm.temperature\"\n },\n \"intermediate_steps\": {\n \"description\": \"Derived ReAct-style steps extracted by the SDK (JSON array string).\",\n \"sources\": [\n \"llm.intermediate_steps\"\n ],\n \"target\": \"neatlogs.llm.intermediate_steps\"\n },\n \"top_p\": {\n \"sources\": [\n \"gen_ai.request.top_p\"\n ],\n \"target\": \"neatlogs.llm.top_p\"\n },\n \"top_k\": {\n \"sources\": [\n \"gen_ai.request.top_k\",\n \"llm.top_k\"\n ],\n \"target\": \"neatlogs.llm.top_k\"\n },\n \"max_tokens\": {\n \"sources\": [\n \"gen_ai.request.max_tokens\"\n ],\n \"target\": \"neatlogs.llm.max_tokens\"\n },\n \"frequency_penalty\": {\n \"sources\": [\n \"gen_ai.request.frequency_penalty\",\n \"llm.frequency_penalty\"\n ],\n \"target\": \"neatlogs.llm.frequency_penalty\"\n },\n \"presence_penalty\": {\n \"sources\": [\n \"gen_ai.request.presence_penalty\",\n \"llm.presence_penalty\"\n ],\n \"target\": \"neatlogs.llm.presence_penalty\"\n },\n \"stop_sequences\": {\n \"sources\": [\n \"gen_ai.request.stop_sequences\",\n \"llm.chat.stop_sequences\"\n ],\n \"target\": \"neatlogs.llm.stop_sequences\"\n },\n \"is_streaming\": {\n \"sources\": [\n \"llm.is_streaming\"\n ],\n \"target\": \"neatlogs.llm.is_streaming\"\n },\n \"headers\": {\n \"sources\": [\n \"llm.headers\"\n ],\n \"target\": \"neatlogs.llm.headers\"\n },\n \"finish_reason\": {\n \"sources\": [\n \"llm.response.finish_reason\",\n \"llm.finish_reason\",\n \"gen_ai.response.finish_reasons\",\n \"gen_ai.completion.0.finish_reason\"\n ],\n \"target\": \"neatlogs.llm.finish_reason\"\n },\n \"stop_reason\": {\n \"sources\": [\n \"llm.response.stop_reason\",\n \"gen_ai.response.stop_reason\"\n ],\n \"target\": \"neatlogs.llm.stop_reason\"\n },\n \"response_id\": {\n \"sources\": [\n \"gen_ai.response.id\"\n ],\n \"target\": \"neatlogs.llm.response_id\"\n },\n \"prompt_template\": {\n \"template\": {\n \"sources\": [\n \"neatlogs.prompt.template\",\n \"llm.prompt_template.template\",\n \"llm.prompt_template\",\n \"traceloop.prompt.template\"\n ],\n \"target\": \"neatlogs.llm.prompt_template\"\n },\n \"variables\": {\n \"sources\": [\n \"neatlogs.prompt.template_variables\",\n \"llm.prompt_template.variables\",\n \"llm.prompt_template_variables\",\n \"traceloop.prompt.template_variables\"\n ],\n \"target\": \"neatlogs.llm.prompt_template_variables\"\n },\n \"user_template\": {\n \"sources\": [\n \"llm.user_prompt_template\",\n \"neatlogs.user_prompt.template\"\n ],\n \"target\": \"neatlogs.llm.user_prompt_template\"\n },\n \"user_variables\": {\n \"sources\": [\n \"llm.user_prompt_template_variables\",\n \"neatlogs.user_prompt.template_variables\"\n ],\n \"target\": \"neatlogs.llm.user_prompt_template_variables\"\n },\n \"version\": {\n \"sources\": [\n \"neatlogs.prompt.version\",\n \"llm.prompt_template.version\",\n \"traceloop.prompt.version\"\n ],\n \"target\": \"neatlogs.llm.prompt_template.version\"\n },\n \"key\": {\n \"sources\": [\n \"traceloop.prompt.key\"\n ],\n \"target\": \"neatlogs.llm.prompt_key\"\n },\n \"vendor\": {\n \"sources\": [\n \"prompt.vendor\"\n ],\n \"target\": \"neatlogs.llm.prompt_vendor\"\n },\n \"id\": {\n \"sources\": [\n \"prompt.id\"\n ],\n \"target\": \"neatlogs.llm.prompt_id\"\n },\n \"url\": {\n \"sources\": [\n \"prompt.url\"\n ],\n \"target\": \"neatlogs.llm.prompt_url\"\n }\n }\n }\n },\n \"generic_io\": {\n \"description\": \"Generic input/output for any span type\",\n \"input\": {\n \"sources\": [\n \"input.value\",\n \"traceloop.entity.input\"\n ],\n \"target\": \"neatlogs.{span_kind}.input\"\n },\n \"output\": {\n \"sources\": [\n \"output.value\",\n \"traceloop.entity.output\"\n ],\n \"target\": \"neatlogs.{span_kind}.output\"\n },\n \"input_mime_type\": {\n \"sources\": [\n \"input.mime_type\"\n ],\n \"target\": \"neatlogs.{span_kind}.input_mime_type\"\n },\n \"output_mime_type\": {\n \"sources\": [\n \"output.mime_type\"\n ],\n \"target\": \"neatlogs.{span_kind}.output_mime_type\"\n }\n },\n \"span\": {\n \"description\": \"Span metadata\",\n \"name\": {\n \"sources\": [\n \"traceloop.entity.name\"\n ],\n \"target\": \"neatlogs.span.name\"\n },\n \"path\": {\n \"sources\": [\n \"traceloop.entity.path\"\n ],\n \"target\": \"neatlogs.span.path\"\n }\n },\n \"tool\": {\n \"name\": {\n \"sources\": [\n \"tool.name\",\n \"gen_ai.tool.name\"\n ],\n \"target\": \"neatlogs.tool.name\"\n },\n \"description\": {\n \"sources\": [\n \"tool.description\",\n \"gen_ai.tool.description\"\n ],\n \"target\": \"neatlogs.tool.description\"\n },\n \"parameters\": {\n \"sources\": [\n \"tool.parameters\"\n ],\n \"target\": \"neatlogs.tool.parameters\"\n },\n \"json_schema\": {\n \"sources\": [\n \"tool.json_schema\"\n ],\n \"target\": \"neatlogs.tool.json_schema\"\n },\n \"id\": {\n \"sources\": [\n \"tool.id\",\n \"gen_ai.tool.call.id\"\n ],\n \"target\": \"neatlogs.tool.id\"\n },\n \"call_id\": {\n \"sources\": [\n \"tool.call_id\",\n \"tool_call_id\"\n ],\n \"target\": \"neatlogs.tool_call.id\"\n }\n },\n \"agent\": {\n \"description\": \"Agent attributes\",\n \"name\": {\n \"sources\": [\n \"agent.name\"\n ],\n \"target\": \"neatlogs.agent.name\"\n },\n \"role\": {\n \"sources\": [\n \"agent_role\"\n ],\n \"target\": \"neatlogs.agent.role\"\n }\n },\n \"crewai\": {\n \"description\": \"CrewAI framework attributes (from OpenInference instrumentation)\",\n \"crew_id\": {\n \"sources\": [\"crew_id\"],\n \"target\": \"neatlogs.crewai.crew_id\"\n },\n \"crew_key\": {\n \"sources\": [\"crew_key\"],\n \"target\": \"neatlogs.crewai.crew_key\"\n },\n \"crew_number_of_agents\": {\n \"sources\": [\"crew_number_of_agents\"],\n \"target\": \"neatlogs.crewai.crew_number_of_agents\"\n },\n \"crew_number_of_tasks\": {\n \"sources\": [\"crew_number_of_tasks\"],\n \"target\": \"neatlogs.crewai.crew_number_of_tasks\"\n },\n \"version\": {\n \"sources\": [\"crewai_version\"],\n \"target\": \"neatlogs.crewai.version\"\n },\n \"task_id\": {\n \"sources\": [\"task_id\"],\n \"target\": \"neatlogs.task.id\"\n },\n \"task_key\": {\n \"sources\": [\"task_key\"],\n \"target\": \"neatlogs.task.key\"\n }\n },\n \"retriever\": {\n \"description\": \"Retrieval/Vector DB attributes\",\n \"documents\": {\n \"sources\": {\n \"id\": [\n \"retrieval.documents.{i}.document.id\",\n \"db.query.result.id\"\n ],\n \"content\": [\n \"retrieval.documents.{i}.document.content\",\n \"db.query.result.document\"\n ],\n \"score\": [\n \"retrieval.documents.{i}.document.score\",\n \"document.score\",\n \"db.query.result.score\",\n \"db.query.result.distance\"\n ],\n \"metadata\": [\n \"retrieval.documents.{i}.document.metadata\",\n \"db.query.result.metadata\"\n ]\n },\n \"target\": \"neatlogs.retriever.documents.{i}\",\n \"indexed\": true\n },\n \"query\": {\n \"sources\": [\n \"retrieval.query\",\n \"db.query.text\"\n ],\n \"target\": \"neatlogs.retriever.query\"\n },\n \"top_k\": {\n \"sources\": [\n \"retrieval.top_k\",\n \"db.vector.query.top_k\"\n ],\n \"target\": \"neatlogs.retriever.top_k\"\n }\n },\n \"db\": {\n \"description\": \"Database operations (vector DBs, etc.)\",\n \"system\": {\n \"sources\": [\n \"db.system\"\n ],\n \"target\": \"neatlogs.db.system\"\n },\n \"collection_name\": {\n \"sources\": [\n \"db.collection.name\"\n ],\n \"target\": \"neatlogs.db.collection_name\"\n },\n \"operation\": {\n \"sources\": [\n \"db.operation\"\n ],\n \"target\": \"neatlogs.db.operation\"\n },\n \"documents_count\": {\n \"sources\": [\n \"db.chroma.add.documents_count\",\n \"db.pinecone.add.documents_count\"\n ],\n \"target\": \"neatlogs.db.documents_count\"\n },\n \"ids_count\": {\n \"sources\": [\n \"db.chroma.add.ids_count\",\n \"db.pinecone.add.ids_count\"\n ],\n \"target\": \"neatlogs.db.ids_count\"\n },\n \"metadatas_count\": {\n \"sources\": [\n \"db.chroma.add.metadatas_count\",\n \"db.pinecone.add.metadatas_count\"\n ],\n \"target\": \"neatlogs.db.metadatas_count\"\n }\n },\n \"vectordb\": {\n \"description\": \"Vector Database specific attributes (Marqo, Qdrant, Milvus, etc.)\",\n \"index_name\": {\n \"sources\": [\n \"vector_db_index_name\",\n \"marqo.index_name\",\n \"qdrant.upsert.collection_name\",\n \"qdrant.search.collection_name\",\n \"db.milvus.create_collection.collection_name\",\n \"db.milvus.search.collection_name\",\n \"db.milvus.insert.collection_name\",\n \"db.chroma.collection.name\"\n ],\n \"target\": \"neatlogs.vectordb.index_name\"\n },\n \"embedding_model\": {\n \"sources\": [\n \"embedding_model\",\n \"marqo.model\",\n \"embedding.model_name\"\n ],\n \"target\": \"neatlogs.vectordb.embedding_model\"\n },\n \"retrieval_query\": {\n \"sources\": [\n \"retrieval_query\",\n \"db.marqo.search.query\"\n ],\n \"target\": \"neatlogs.vectordb.retrieval_query\"\n },\n \"retrieval_time_taken\": {\n \"sources\": [\n \"retrieval_time_taken\",\n \"db.marqo.search.processing_time\"\n ],\n \"target\": \"neatlogs.vectordb.retrieval_time_taken\"\n },\n \"vector_dimension\": {\n \"sources\": [\n \"vector_dimension\",\n \"db.milvus.create_collection.dimension\",\n \"db.milvus.search.query_vector_dimension\"\n ],\n \"target\": \"neatlogs.vectordb.vector_dimension\"\n },\n \"similarity_algorithm\": {\n \"sources\": [\n \"vector_similarity_algorithm\",\n \"db.milvus.create_collection.metric_type\"\n ],\n \"target\": \"neatlogs.vectordb.similarity_algorithm\"\n },\n \"document_attributes\": {\n \"sources\": [\n \"document_attributes\"\n ],\n \"target\": \"neatlogs.vectordb.document_attributes\",\n \"description\": \"Computed JSON field from SDK\"\n },\n \"retrieval_input_params\": {\n \"sources\": [\n \"retrieval_input_params\"\n ],\n \"target\": \"neatlogs.vectordb.retrieval_input_params\",\n \"description\": \"Computed JSON field from SDK (Marqo limit, hits_count, filter)\"\n },\n \"retrieval_documents\": {\n \"sources\": [\n \"retrieval_documents\"\n ],\n \"target\": \"neatlogs.vectordb.retrieval_documents\",\n \"description\": \"Computed JSON array from SDK events\"\n }\n },\n \"reranker\": {\n \"description\": \"Reranker model attributes\",\n \"applies_to\": [\"reranker\"],\n \"model_name\": {\n \"sources\": [\n \"reranker.model_name\",\n \"ai.model.id\"\n ],\n \"target\": \"neatlogs.reranker.model_name\"\n },\n \"provider\": {\n \"sources\": [\n \"ai.model.provider\"\n ],\n \"target\": \"neatlogs.reranker.provider\",\n \"description\": \"Vercel AI SDK reranker provider (e.g. gateway, cohere)\"\n },\n \"query\": {\n \"sources\": [\n \"reranker.query\",\n \"ai.rerank.query\"\n ],\n \"target\": \"neatlogs.reranker.query\"\n },\n \"documents\": {\n \"sources\": [\n \"ai.documents\"\n ],\n \"target\": \"neatlogs.reranker.input_documents\",\n \"description\": \"Vercel AI SDK rerank input documents array\"\n },\n \"ranking\": {\n \"sources\": [\n \"ai.ranking\"\n ],\n \"target\": \"neatlogs.reranker.output_documents\",\n \"description\": \"Vercel AI SDK rerank output ranking array\"\n },\n \"ranking_type\": {\n \"sources\": [\n \"ai.ranking.type\"\n ],\n \"target\": \"neatlogs.reranker.ranking_type\",\n \"description\": \"Vercel AI SDK rerank type (e.g. text)\"\n },\n \"top_k\": {\n \"sources\": [\n \"reranker.top_k\"\n ],\n \"target\": \"neatlogs.reranker.top_k\"\n },\n \"max_retries\": {\n \"sources\": [\n \"ai.settings.maxRetries\"\n ],\n \"target\": \"neatlogs.reranker.max_retries\",\n \"description\": \"Vercel AI SDK max retries setting\"\n },\n \"input_documents\": {\n \"sources\": {\n \"id\": [\n \"reranker.input_documents.{i}.document.id\"\n ],\n \"content\": [\n \"reranker.input_documents.{i}.document.content\"\n ],\n \"metadata\": [\n \"reranker.input_documents.{i}.document.metadata\"\n ]\n },\n \"target\": \"neatlogs.reranker.input_documents.{i}\",\n \"indexed\": true\n },\n \"output_documents\": {\n \"sources\": {\n \"id\": [\n \"reranker.output_documents.{i}.document.id\"\n ],\n \"content\": [\n \"reranker.output_documents.{i}.document.content\"\n ],\n \"score\": [\n \"reranker.output_documents.{i}.document.score\",\n \"reranker.output_documents.{i}.relevance_score\"\n ],\n \"metadata\": [\n \"reranker.output_documents.{i}.document.metadata\"\n ]\n },\n \"target\": \"neatlogs.reranker.output_documents.{i}\",\n \"indexed\": true\n }\n },\n \"embedding\": {\n \"description\": \"Embedding model attributes\",\n \"applies_to\": [\"embedding\"],\n \"input\": {\n \"sources\": [\n \"ai.value\",\n \"ai.values\"\n ],\n \"target\": \"neatlogs.embedding.input\",\n \"description\": \"Vercel AI SDK embed/embedMany input value(s)\"\n },\n \"model_name\": {\n \"sources\": [\n \"embedding.model_name\",\n \"ai.model.id\"\n ],\n \"target\": \"neatlogs.embedding.model_name\"\n },\n \"text\": {\n \"sources\": [\n \"embedding.text\"\n ],\n \"target\": \"neatlogs.embedding.text\"\n },\n \"vector\": {\n \"sources\": [\n \"embedding.vector\"\n ],\n \"target\": \"neatlogs.embedding.vector\"\n },\n \"token_count\": {\n \"sources\": [\n \"embedding.token_count\",\n \"ai.usage.tokens\"\n ],\n \"target\": \"neatlogs.embedding.token_count\"\n },\n \"invocation_parameters\": {\n \"sources\": [\n \"embedding.invocation_parameters\"\n ],\n \"target\": \"neatlogs.embedding.invocation_parameters\"\n },\n \"embeddings_data\": {\n \"sources\": [\n \"embeddings_data\"\n ],\n \"target\": \"neatlogs.embedding.embeddings_data\",\n \"description\": \"Computed JSON array from SDK (embedding.embeddings.*.embedding.text)\"\n }\n },\n \"session\": {\n \"description\": \"Session tracking\",\n \"id\": {\n \"sources\": [\n \"session.id\"\n ],\n \"target\": \"neatlogs.session.id\"\n }\n },\n \"user\": {\n \"description\": \"User tracking\",\n \"id\": {\n \"sources\": [\n \"user.id\"\n ],\n \"target\": \"neatlogs.user.id\"\n }\n },\n \"workflow\": {\n \"description\": \"Workflow/Chain metadata\",\n \"name\": {\n \"sources\": [\n \"traceloop.workflow.name\"\n ],\n \"target\": \"neatlogs.workflow.name\"\n }\n },\n \"entity\": {\n \"description\": \"LangChain entity metadata (from OpenLLMetry/Traceloop)\",\n \"name\": {\n \"sources\": [\n \"traceloop.entity.name\"\n ],\n \"target\": \"neatlogs.entity.name\"\n },\n \"path\": {\n \"sources\": [\n \"traceloop.entity.path\"\n ],\n \"target\": \"neatlogs.entity.path\"\n }\n },\n \"langgraph\": {\n \"description\": \"LangGraph execution metadata (from OpenLLMetry/Traceloop association properties)\",\n \"step\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_step\"\n ],\n \"target\": \"neatlogs.langgraph.step\"\n },\n \"node\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_node\"\n ],\n \"target\": \"neatlogs.langgraph.node\"\n },\n \"triggers\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_triggers\"\n ],\n \"target\": \"neatlogs.langgraph.triggers\"\n },\n \"path\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_path\"\n ],\n \"target\": \"neatlogs.langgraph.path\"\n },\n \"checkpoint_ns\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_checkpoint_ns\",\n \"traceloop.association.properties.checkpoint_ns\"\n ],\n \"target\": \"neatlogs.langgraph.checkpoint_ns\"\n },\n \"task_id\": {\n \"sources\": [\n \"traceloop.association.properties.langgraph_task_id\"\n ],\n \"target\": \"neatlogs.langgraph.task_id\"\n },\n \"thread_id\": {\n \"sources\": [\n \"traceloop.association.properties.thread_id\"\n ],\n \"target\": \"neatlogs.langgraph.thread_id\"\n }\n },\n \"mcp\": {\n \"description\": \"Model Context Protocol (MCP) attributes\",\n \"method\": {\n \"sources\": [\n \"mcp.method.name\",\n \"mcp.method\"\n ],\n \"target\": \"neatlogs.mcp.method\"\n },\n \"request_id\": {\n \"sources\": [\n \"mcp.request.id\"\n ],\n \"target\": \"neatlogs.mcp.request_id\"\n },\n \"request_argument\": {\n \"sources\": [\n \"mcp.request.argument\"\n ],\n \"target\": \"neatlogs.mcp.request_argument\"\n },\n \"response_value\": {\n \"sources\": [\n \"mcp.response.value\"\n ],\n \"target\": \"neatlogs.mcp.response_value\"\n },\n \"session_init_options\": {\n \"sources\": [\n \"mcp.session.init_options\"\n ],\n \"target\": \"neatlogs.mcp.session_init_options\"\n },\n \"protocol_version\": {\n \"sources\": [\n \"mcp.protocol_version\"\n ],\n \"target\": \"neatlogs.mcp.protocol_version\"\n },\n \"server\": {\n \"name\": {\n \"sources\": [\n \"mcp.server.name\"\n ],\n \"target\": \"neatlogs.mcp.server.name\"\n },\n \"version\": {\n \"sources\": [\n \"mcp.server.version\"\n ],\n \"target\": \"neatlogs.mcp.server.version\"\n },\n \"capabilities\": {\n \"sources\": [\n \"mcp.server.capabilities\"\n ],\n \"target\": \"neatlogs.mcp.server.capabilities\"\n }\n },\n \"tool\": {\n \"name\": {\n \"sources\": [\n \"mcp.tool.name\"\n ],\n \"target\": \"neatlogs.mcp.tool.name\"\n },\n \"arguments\": {\n \"sources\": [\n \"mcp.tool.arguments\"\n ],\n \"target\": \"neatlogs.mcp.tool.arguments\"\n }\n },\n \"tools\": {\n \"count\": {\n \"sources\": [\n \"mcp.tools.count\"\n ],\n \"target\": \"neatlogs.mcp.tools.count\"\n },\n \"names\": {\n \"sources\": [\n \"mcp.tools.names\"\n ],\n \"target\": \"neatlogs.mcp.tools.names\"\n }\n }\n },\n \"framework\": {\n \"description\": \"Framework-specific attributes\",\n \"langsmith\": {\n \"model_name\": {\n \"sources\": [\n \"traceloop.association.properties.ls_model_name\"\n ],\n \"target\": \"neatlogs.framework.langsmith.model_name\"\n },\n \"model_type\": {\n \"sources\": [\n \"traceloop.association.properties.ls_model_type\"\n ],\n \"target\": \"neatlogs.framework.langsmith.model_type\"\n },\n \"provider\": {\n \"sources\": [\n \"traceloop.association.properties.ls_provider\"\n ],\n \"target\": \"neatlogs.framework.langsmith.provider\"\n },\n \"temperature\": {\n \"sources\": [\n \"traceloop.association.properties.ls_temperature\"\n ],\n \"target\": \"neatlogs.framework.langsmith.temperature\"\n }\n }\n },\n \"graph\": {\n \"description\": \"Execution Graph / Chain attributes\",\n \"node\": {\n \"name\": {\n \"sources\": [\n \"graph.node.name\",\n \"traceloop.association.properties.langgraph_node\"\n ],\n \"target\": \"neatlogs.graph.node.name\"\n },\n \"id\": {\n \"sources\": [\n \"graph.node.id\"\n ],\n \"target\": \"neatlogs.graph.node.id\"\n },\n \"parent_id\": {\n \"sources\": [\n \"graph.node.parent_id\"\n ],\n \"target\": \"neatlogs.graph.node.parent_id\"\n }\n }\n },\n \"metadata\": {\n \"description\": \"Custom metadata\",\n \"sources\": [\n \"metadata\"\n ],\n \"target\": \"neatlogs.metadata\"\n },\n \"tags\": {\n \"description\": \"Tags array\",\n \"sources\": [\n \"tag.tags\"\n ],\n \"target\": \"neatlogs.tags\"\n },\n \"metrics\": {\n \"description\": \"Performance metrics from OpenLLMetry/OpenLit\",\n \"llm\": {\n \"time_to_first_token\": {\n \"sources\": [\n \"neatlogs.llm.metrics.time_to_first_token\",\n \"gen_ai.server.time_to_first_token\",\n \"llm.time_to_first_token\"\n ],\n \"target\": \"neatlogs.llm.metrics.time_to_first_token\"\n },\n \"streaming_time_to_generate\": {\n \"sources\": [\n \"neatlogs.llm.metrics.streaming_time_to_generate\",\n \"llm.chat_completions.streaming_time_to_generate\"\n ],\n \"target\": \"neatlogs.llm.metrics.streaming_time_to_generate\"\n },\n \"time_per_output_token\": {\n \"sources\": [\n \"neatlogs.llm.metrics.time_per_output_token\",\n \"gen_ai.server.time_per_output_token\"\n ],\n \"target\": \"neatlogs.llm.metrics.time_per_output_token\"\n }\n }\n }\n },\n \"keep_as_is\": {\n \"description\": \"OpenTelemetry standard attributes to keep unchanged\",\n \"attributes\": [\n \"neatlogs.internal\",\n \"http.method\",\n \"http.request.method\",\n \"http.url\",\n \"url.full\",\n \"url.path\",\n \"http.status_code\",\n \"http.response.status_code\",\n \"http.request.body.size\",\n \"http.response.body.size\",\n \"service.name\",\n \"service.version\",\n \"telemetry.sdk.name\",\n \"telemetry.sdk.version\",\n \"telemetry.sdk.language\"\n ]\n },\n \"ignore\": {\n \"description\": \"Attributes to ignore/drop during ingestion\",\n \"patterns\": [\n \"telemetry.distro.*\",\n \"code.*\",\n \"exception.*\"\n ]\n }\n }\n}\n","/**\n * Neatlogs Semantic Conventions - Attribute Mapper\n *\n * Maps vendor-specific attributes to the unified neatlogs.* namespace\n * using configuration from attribute-mapping.json.\n */\n\nimport { getLogger } from '../core/logger.js';\nimport { resolveExplicitSpanKind } from '../span-kinds/mapping.js';\nimport attributeMappingConfig from './attribute-mapping.json';\n\nconst logger = getLogger();\n\ninterface MappingConfig {\n sources: string[] | Record<string, string[]>;\n target?: string;\n indexed?: boolean;\n target_content?: string;\n description?: string;\n priority?: string;\n values?: Record<string, string>;\n mappings?: Record<string, any>;\n [key: string]: any;\n}\n\n/** Flatten sources into a single array of source patterns, regardless of shape. */\nfunction flattenSources(sources: string[] | Record<string, string[]> | undefined): string[] {\n if (!sources) return [];\n if (Array.isArray(sources)) return sources;\n // Object form: { id: [...], name: [...], ... } — flatten all arrays\n const result: string[] = [];\n for (const arr of Object.values(sources)) {\n if (Array.isArray(arr)) {\n result.push(...arr);\n }\n }\n return result;\n}\n\nexport class AttributeMapper {\n private config: Record<string, any>;\n private mappings: Record<string, any>;\n private keepAsIs: Set<string>;\n private ignorePatterns: string[];\n private compiledIgnorePatterns: RegExp[];\n private _regexCache: Map<string, RegExp> = new Map();\n\n constructor(config?: Record<string, any>) {\n this.config = config ?? (attributeMappingConfig as Record<string, any>);\n\n this.mappings = this.config.mappings ?? {};\n // keep_as_is / ignore may live at top-level or inside mappings\n const keepAsIsAttrs =\n this.config.keep_as_is?.attributes ??\n this.mappings.keep_as_is?.attributes ??\n [];\n this.keepAsIs = new Set<string>(keepAsIsAttrs);\n this.ignorePatterns =\n this.config.ignore?.patterns ??\n this.mappings.ignore?.patterns ??\n [];\n // Pre-compile ignore patterns for performance (avoid per-call regex creation)\n this.compiledIgnorePatterns = this.ignorePatterns.map(\n (pattern) => new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$'),\n );\n }\n\n /** Check if an attribute should be ignored. */\n shouldIgnore(attrName: string): boolean {\n for (const regex of this.compiledIgnorePatterns) {\n if (regex.test(attrName)) {\n return true;\n }\n }\n return false;\n }\n\n /** Check if an attribute should be kept unchanged (OTel standard). */\n shouldKeepAsIs(attrName: string): boolean {\n return this.keepAsIs.has(attrName);\n }\n\n /** Extract and normalize span kind from multiple possible sources. */\n mapSpanKind(attributes: Record<string, any>): string {\n const spanKindConfig = this.mappings.span_kind ?? {};\n const valuesMap: Record<string, string> = spanKindConfig.values ?? {};\n const spanKindValue = resolveExplicitSpanKind(attributes);\n\n if (spanKindValue) {\n const mapped = valuesMap[spanKindValue] ?? valuesMap[spanKindValue.toUpperCase()];\n if (mapped) return mapped;\n }\n // A pre-set neatlogs kind may already be the normalized lowercase form.\n if (spanKindValue && Object.values(valuesMap).includes(spanKindValue)) {\n return spanKindValue;\n }\n\n // Infer LLM span from attributes\n const isLlmSpan = [\n 'llm.model_name',\n 'gen_ai.request.model',\n 'llm.token_count.prompt',\n 'llm.token_count.completion',\n 'gen_ai.usage.prompt_tokens',\n 'gen_ai.usage.completion_tokens',\n 'neatlogs.llm.model_name',\n 'neatlogs.llm.token_count.prompt',\n 'neatlogs.llm.token_count.completion',\n ].some((key) => key in attributes);\n\n if (isLlmSpan) {\n return 'llm';\n }\n\n return 'unknown';\n }\n\n /** Map a simple attribute from multiple sources to target. */\n mapSimpleAttribute(\n mappingConfig: MappingConfig,\n attributes: Record<string, any>,\n ): any | undefined {\n const sources = flattenSources(mappingConfig.sources);\n for (const source of sources) {\n if (source in attributes) {\n return attributes[source];\n }\n }\n return undefined;\n }\n\n /** Get or create a cached RegExp for a source pattern. */\n private _getPatternRegex(sourcePattern: string): RegExp {\n let cached = this._regexCache.get(sourcePattern);\n if (!cached) {\n let regexPattern = sourcePattern.replace(/\\{i\\}/g, '(\\\\d+)');\n regexPattern = regexPattern.replace(/\\./g, '\\\\.');\n cached = new RegExp('^' + regexPattern + '$');\n this._regexCache.set(sourcePattern, cached);\n }\n return cached;\n }\n\n /** Map indexed attributes like messages (llm.input_messages.0.role). */\n mapIndexedAttributes(\n mappingConfig: MappingConfig,\n attributes: Record<string, any>,\n targetBase: string,\n ): Record<string, any> {\n const mapped: Record<string, any> = {};\n const rawSources = mappingConfig.sources;\n\n if (Array.isArray(rawSources)) {\n // Simple array of source patterns\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n for (const sourcePattern of rawSources) {\n const match = attrName.match(this._getPatternRegex(sourcePattern));\n\n if (match) {\n const index = match[1];\n const target = targetBase.replace(/\\{i\\}/g, index);\n mapped[target] = attrValue;\n }\n }\n }\n } else if (rawSources && typeof rawSources === 'object') {\n // Object form: { field: [sourcePatterns...] }\n // e.g. { id: [\"llm.tool_calls.{i}.id\"], name: [\"llm.tool_calls.{i}.name\"] }\n for (const [field, sourcePatterns] of Object.entries(rawSources)) {\n if (!Array.isArray(sourcePatterns)) continue;\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n for (const sourcePattern of sourcePatterns) {\n const match = attrName.match(this._getPatternRegex(sourcePattern));\n\n if (match) {\n const index = match[1];\n const target = targetBase.replace(/\\{i\\}/g, index) + '.' + field;\n mapped[target] = attrValue;\n }\n }\n }\n }\n }\n\n return mapped;\n }\n\n /** Recursively map nested configuration. */\n mapNestedConfig(\n config: Record<string, any>,\n attributes: Record<string, any>,\n spanKind?: string,\n ): Record<string, any> {\n const mapped: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(config)) {\n if (['description', 'sources', 'target', 'indexed', 'priority', 'values', 'applies_to'].includes(key)) {\n continue;\n }\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n if (Array.isArray(value.applies_to) && spanKind && !value.applies_to.includes(spanKind)) {\n continue;\n }\n if ('sources' in value) {\n if (value.indexed) {\n const target = value.target ?? '';\n const indexedMapped = this.mapIndexedAttributes(value, attributes, target);\n Object.assign(mapped, indexedMapped);\n\n if ('target_content' in value) {\n const contentTarget = value.target_content;\n const contentMapped = this.mapIndexedAttributes(value, attributes, contentTarget);\n Object.assign(mapped, contentMapped);\n }\n } else {\n let target = value.target ?? '';\n if (spanKind && target.includes('{span_kind}')) {\n target = target.replace(/\\{span_kind\\}/g, spanKind);\n }\n\n const result = this.mapSimpleAttribute(value, attributes);\n if (result !== undefined) {\n mapped[target] = result;\n }\n }\n } else {\n const nestedMapped = this.mapNestedConfig(value, attributes, spanKind);\n Object.assign(mapped, nestedMapped);\n }\n }\n }\n\n return mapped;\n }\n\n /** Map all attributes from vendor-specific to neatlogs namespace. */\n mapAttributes(\n attributes: Record<string, any>,\n spanKind?: string,\n ): Record<string, any> {\n const mapped: Record<string, any> = {};\n\n if (!spanKind) {\n spanKind = this.mapSpanKind(attributes);\n }\n mapped['neatlogs.span.kind'] = spanKind;\n\n for (const [sectionName, sectionConfig] of Object.entries(this.mappings)) {\n if (sectionName === 'span_kind' || sectionName === 'keep_as_is' || sectionName === 'ignore') continue;\n\n if (typeof sectionConfig === 'object' && sectionConfig !== null) {\n // Skip sections that don't apply to this span kind\n if (Array.isArray(sectionConfig.applies_to) && spanKind && !sectionConfig.applies_to.includes(spanKind)) {\n continue;\n }\n if ('mappings' in sectionConfig) {\n // Process the explicit 'mappings' sub-key\n const nestedMapped = this.mapNestedConfig(\n sectionConfig.mappings,\n attributes,\n spanKind,\n );\n Object.assign(mapped, nestedMapped);\n // Also process sibling sub-sections (e.g. generic_io, span, tool, etc.)\n for (const [subKey, subVal] of Object.entries(sectionConfig)) {\n if (subKey === 'mappings' || subKey === 'description' || subKey === 'applies_to') continue;\n if (typeof subVal === 'object' && subVal !== null && !Array.isArray(subVal)) {\n if (Array.isArray((subVal as any).applies_to) && spanKind && !(subVal as any).applies_to.includes(spanKind)) {\n continue;\n }\n if ('sources' in subVal) {\n if ((subVal as any).indexed) {\n const target = (subVal as any).target ?? '';\n const indexedMapped = this.mapIndexedAttributes(subVal as MappingConfig, attributes, target);\n Object.assign(mapped, indexedMapped);\n } else if (Array.isArray((subVal as any).sources)) {\n let target = (subVal as any).target ?? '';\n if (spanKind && target.includes('{span_kind}')) {\n target = target.replace(/\\{span_kind\\}/g, spanKind);\n }\n const result = this.mapSimpleAttribute(subVal as MappingConfig, attributes);\n if (result !== undefined) {\n mapped[target] = result;\n }\n }\n } else {\n const subMapped = this.mapNestedConfig(subVal as Record<string, any>, attributes, spanKind);\n Object.assign(mapped, subMapped);\n }\n }\n }\n } else if ('sources' in sectionConfig) {\n let target = sectionConfig.target ?? '';\n if (target.includes('{span_kind}')) {\n target = target.replace(/\\{span_kind\\}/g, spanKind);\n }\n const result = this.mapSimpleAttribute(sectionConfig, attributes);\n if (result !== undefined) {\n mapped[target] = result;\n }\n } else {\n const nestedMapped = this.mapNestedConfig(sectionConfig, attributes, spanKind);\n Object.assign(mapped, nestedMapped);\n }\n }\n }\n\n // Keep OTel standard attributes\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n if (this.shouldKeepAsIs(attrName) && !(attrName in mapped)) {\n mapped[attrName] = attrValue;\n }\n }\n\n // Collect all mapped sources\n const mappedSources = new Set<string>();\n for (const sectionConfig of Object.values(this.mappings)) {\n if (typeof sectionConfig === 'object' && sectionConfig !== null) {\n if ('sources' in sectionConfig) {\n for (const s of flattenSources((sectionConfig as any).sources)) {\n mappedSources.add(s);\n }\n }\n if ('mappings' in sectionConfig) {\n this._collectMappedSources((sectionConfig as any).mappings, mappedSources);\n }\n // Also collect from sibling sub-sections\n for (const [subKey, subVal] of Object.entries(sectionConfig)) {\n if (subKey === 'mappings' || subKey === 'description' || subKey === 'sources') continue;\n if (typeof subVal === 'object' && subVal !== null && !Array.isArray(subVal)) {\n this._collectMappedSources(subVal as Record<string, any>, mappedSources);\n }\n }\n }\n }\n\n // Pass through unmapped, non-ignored attributes\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n if (!mappedSources.has(attrName) && !(attrName in mapped) && !this.shouldIgnore(attrName)) {\n mapped[attrName] = attrValue;\n }\n }\n\n // Remove ignored attributes from final result\n const result: Record<string, any> = {};\n for (const [k, v] of Object.entries(mapped)) {\n if (!this.shouldIgnore(k)) {\n result[k] = v;\n }\n }\n\n return result;\n }\n\n /** Recursively collect all source attribute names from nested config. */\n private _collectMappedSources(config: Record<string, any>, collected: Set<string>): void {\n for (const value of Object.values(config)) {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n if ('sources' in value) {\n for (const s of flattenSources((value as any).sources)) {\n collected.add(s);\n }\n } else {\n this._collectMappedSources(value as Record<string, any>, collected);\n }\n }\n }\n }\n\n /** Get the span kind value mapping. */\n getSpanKindValueMapping(): Record<string, string> {\n return this.mappings.span_kind?.values ?? {};\n }\n\n /** Get the target neatlogs attribute name for a source attribute. */\n getTargetAttributeName(sourceAttr: string, spanKind?: string): string | undefined {\n const searchConfig = (config: Record<string, any>, targetSpanKind?: string): string | undefined => {\n for (const value of Object.values(config)) {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n if ('sources' in value) {\n const sources = flattenSources((value as any).sources);\n if (sources.includes(sourceAttr)) {\n let target = (value as any).target ?? '';\n if (targetSpanKind && target.includes('{span_kind}')) {\n target = target.replace(/\\{span_kind\\}/g, targetSpanKind);\n }\n return target;\n }\n }\n const result = searchConfig(value as Record<string, any>, targetSpanKind);\n if (result) return result;\n }\n }\n return undefined;\n };\n\n return searchConfig(this.mappings, spanKind);\n }\n}\n\n// Singleton instance\nlet _mapperInstance: AttributeMapper | null = null;\n\n/** Get the global AttributeMapper instance. */\nexport function getMapper(): AttributeMapper {\n if (!_mapperInstance) {\n _mapperInstance = new AttributeMapper();\n }\n return _mapperInstance;\n}\n\n/** Convenience function to map attributes using the global mapper. */\nexport function mapAttributes(\n attributes: Record<string, any>,\n spanKind?: string,\n): Record<string, any> {\n return getMapper().mapAttributes(attributes, spanKind);\n}\n","/** Stable SDK-wide defaults shared by every NeatLogs entry point. */\nexport const DEFAULT_INGEST_ENDPOINT = 'https://ingest.neatlogs.com' as const;\nexport const DEFAULT_MAX_QUEUE_ITEMS = 2048;\nexport const DEFAULT_MAX_SEMANTIC_STREAM_EVENTS = 128;\nexport const DEFAULT_MAX_STREAM_CAPTURE_BYTES = 1024 * 1024;\nexport const DEFAULT_MAX_STREAM_CAPTURE_ITEMS = 1024;\n\n/** UTF-8 byte length without allocating a second buffer for hostile stream chunks. */\nexport function utf8ByteLength(\n value: string,\n limit = Number.MAX_SAFE_INTEGER,\n): number {\n let bytes = 0;\n for (let i = 0; i < value.length; i++) {\n const code = value.charCodeAt(i);\n if (code < 0x80) bytes += 1;\n else if (code < 0x800) bytes += 2;\n else if (code >= 0xd800 && code <= 0xdbff && i + 1 < value.length) {\n const next = value.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n bytes += 4;\n i += 1;\n } else bytes += 3;\n } else bytes += 3;\n if (bytes > limit) return limit + 1;\n }\n return bytes;\n}\n\nexport function exportQueueCapacity(batchSize: number): number {\n return Math.max(DEFAULT_MAX_QUEUE_ITEMS, batchSize * 4);\n}\n","/**\n * Context wrapper for manual span creation.\n *\n * Provides the `trace()` function — the TypeScript equivalent of the Python\n * `trace()` context manager. Creates an OTel span, sets prompt template/variable\n * context, and executes the user callback within the span.\n *\n * @example\n * ```typescript\n * await trace({ name: 'my-trace' }, async (span) => {\n * // user code runs here with the span active\n * });\n * ```\n */\n\nimport {\n trace as otelTrace,\n context as otelContext,\n createContextKey,\n ROOT_CONTEXT,\n SpanStatusCode,\n type Span,\n} from '@opentelemetry/api';\nimport { PromptContext, UserPromptContext, PromptTemplate, UserPromptTemplate } from '../prompt/template.js';\nimport { registerMask } from './mask.js';\nimport { applyEndUserAttributes } from './end-user.js';\nimport { applySessionAttributes } from './session.js';\nimport { currentSessionId } from './identity.js';\nimport { captureMedia } from './media.js';\nimport { bindSpanToAutoRoot, maybeOpenAutoRoot } from './auto-root.js';\nimport { NeatlogsConfigurationError } from '../errors.js';\n\nimport { getLogger } from './logger.js';\nimport { safeJsonDumps, serializeObj } from '../decorators/base.js';\nimport type { TraceOptions, MaskFunction } from '../types.js';\nimport {\n getActiveNeatlogsSpan,\n getNeatlogsActiveContext,\n getNeatlogsParentContext,\n getNeatlogsRootSpan,\n getNeatlogsTracer,\n withNeatlogsSpan,\n} from './provider.js';\n\nconst logger = getLogger();\n\n// ---------------------------------------------------------------------------\n// Module-level session config (set by init.ts via _setSessionConfig)\n// ---------------------------------------------------------------------------\n\nlet _sessionConfig: Record<string, any> = {};\n\n/**\n * Set the session configuration. Called by init() during SDK setup.\n * @internal\n */\nexport function _setSessionConfig(config: Record<string, any>): void {\n _sessionConfig = config;\n}\n\n/**\n * Get a copy of the current session configuration.\n */\nexport function getSessionConfig(): Record<string, any> {\n return { ..._sessionConfig };\n}\n\n// ---------------------------------------------------------------------------\n// OTel context keys for prompt data propagation\n// ---------------------------------------------------------------------------\n\nexport const PROMPT_VARIABLES_KEY = createContextKey('neatlogs.prompt_variables');\nexport const PROMPT_TEMPLATE_KEY = createContextKey('neatlogs.prompt_template');\nexport const PROMPT_VERSION_KEY = createContextKey('neatlogs.prompt_version');\nexport const USER_PROMPT_TEMPLATE_KEY = createContextKey('neatlogs.user_prompt_template');\nexport const USER_PROMPT_VARIABLES_KEY = createContextKey('neatlogs.user_prompt_variables');\n\n// ---------------------------------------------------------------------------\n// Known TraceOptions keys (not forwarded as extra span attributes)\n// ---------------------------------------------------------------------------\n\nconst KNOWN_OPTION_KEYS = new Set([\n 'name',\n 'kind',\n 'input',\n 'promptTemplate',\n 'promptVariables',\n 'userPromptTemplate',\n 'userPromptVariables',\n 'version',\n 'mask',\n 'attributes',\n 'sessionId',\n 'parentSessionId',\n 'sessionFeatureName',\n 'sessionEntryPoint',\n 'endUserId',\n 'endUserMetadata',\n]);\n\nfunction assertNoHttpSpanKind(\n kind: unknown,\n attributes: Record<string, any> | undefined,\n): void {\n const candidates = [\n kind,\n attributes?.['neatlogs.span.kind'],\n attributes?.['openinference.span.kind'],\n ];\n if (candidates.some((value) => String(value ?? '').trim().toUpperCase() === 'HTTP')) {\n throw new NeatlogsConfigurationError(\n 'UNSUPPORTED_SPAN_KIND',\n 'kind',\n 'HTTP spans are not supported. Trace the semantic LLM, TOOL, RETRIEVER, or other AI operation instead.',\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Set standard and extra attributes on a span.\n * @internal\n */\nexport function _setSpanAttributes(\n span: Span,\n kind: string | undefined,\n attributes: Record<string, any>,\n): void {\n // trace() is also the public API for user-visible WORKFLOW, AGENT, TOOL,\n // EMBEDDING, and other spans. Marking every trace() span as internal causes\n // those spans (and an all-internal trace) to be filtered by ingestion. Only\n // the synthetic LLM wrapper span is internal by default; callers can still\n // opt any other span into internal handling through explicit attributes.\n if (kind?.toUpperCase() === 'LLM') {\n span.setAttribute('neatlogs.internal', true);\n }\n span.setAttribute('openinference.span.kind', kind ?? 'CHAIN');\n\n for (const [key, value] of Object.entries(attributes)) {\n span.setAttribute(key, value);\n }\n}\n\n/**\n * After the user callback completes, capture prompt variables that were\n * set by PromptTemplate.compile() / UserPromptTemplate.compile() and\n * record them as span attributes.\n * @internal\n */\nexport function _finalizePromptCapture(\n span: Span,\n isPromptTemplateObj: boolean,\n isUserPromptTemplateObj: boolean,\n): void {\n if (isPromptTemplateObj) {\n const capturedVars = PromptContext.getVariables();\n if (capturedVars) {\n span.setAttribute(\n 'llm.prompt_template_variables',\n JSON.stringify(capturedVars),\n );\n logger.debug(\n `[trace] Auto-captured variables from PromptContext: ${Object.keys(capturedVars).join(', ')}`,\n );\n }\n }\n\n if (isUserPromptTemplateObj) {\n const capturedUserVars = UserPromptContext.getVariables();\n if (capturedUserVars) {\n span.setAttribute(\n 'llm.user_prompt_template_variables',\n JSON.stringify(capturedUserVars),\n );\n logger.debug(\n `[trace] Auto-captured variables from UserPromptContext: ${Object.keys(capturedUserVars).join(', ')}`,\n );\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Explicit trace-level output\n// ---------------------------------------------------------------------------\n\n/**\n * Explicitly set the trace-level \"final output\" shown for the current trace.\n *\n * By default the trace's displayed output is derived from the root span's\n * captured output. Call this to declare it instead — useful when the turn's\n * meaningful result lives in a tool call or is a status object you don't want\n * shown (e.g. an agent that suspends awaiting user input). The value is stamped\n * as `neatlogs.trace.output` on the trace ROOT span, which the backend prefers\n * over the derived output.\n *\n * No-op when called outside an active trace. Never throws.\n *\n * @param value - The value to show as the trace's final output.\n *\n * @example\n * ```typescript\n * await trace({ name: 'turn', sessionId }, async () => {\n * const plan = await proposePlan();\n * setTraceOutput(plan.title); // show the plan, not the raw status object\n * });\n * ```\n */\nexport function setTraceOutput(value: unknown): void {\n try {\n const span = getNeatlogsRootSpan() ?? getActiveNeatlogsSpan();\n if (!span) return;\n const captured = captureMedia(\n span,\n 'neatlogs.trace.output',\n serializeObj(value),\n 'output',\n );\n span.setAttribute('neatlogs.trace.output', safeJsonDumps(captured));\n } catch (err) {\n logger.warn(`[setTraceOutput] failed to set trace output: ${err}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main trace() function\n// ---------------------------------------------------------------------------\n\n/**\n * Async callback wrapper for manual span creation with prompt tracking.\n *\n * Creates an OTel span, optionally sets prompt template/variable context,\n * and executes the provided callback within the span.\n *\n * **Session-Aware Trace Creation:**\n * - If a session id is resolved (per-call `sessionId` or the request-scoped\n * `identify()` context) AND no active parent span exists, this creates a NEW\n * root trace (for multi-turn conversations).\n * - Otherwise, creates a normal child span within the existing trace.\n *\n * @param options - Trace configuration options\n * @param fn - Callback that receives the active span\n * @returns The return value of the callback\n *\n * @example\n * ```typescript\n * // Basic usage\n * await trace({ name: 'my-pipeline' }, async (span) => {\n * await step1();\n * await step2();\n * });\n *\n * // With prompt template\n * const template = new PromptTemplate('Hello {{name}}');\n * await trace({ name: 'prompt', promptTemplate: template }, async (span) => {\n * const rendered = template.compile({ name: 'world' });\n * // ...\n * });\n * ```\n */\nexport async function trace<T>(\n options: TraceOptions,\n fn: (span: Span) => T | Promise<T>,\n): Promise<T> {\n const {\n name,\n kind,\n input,\n promptTemplate,\n promptVariables,\n userPromptTemplate,\n userPromptVariables,\n version,\n mask,\n sessionId: sessionIdOption,\n parentSessionId,\n sessionFeatureName,\n sessionEntryPoint,\n endUserId,\n endUserMetadata,\n attributes: explicitAttributes,\n ...extraOptions\n } = options;\n\n assertNoHttpSpanKind(kind, explicitAttributes);\n\n // Per-call sessionId wins, else the request-scoped identify() context.\n // Session identity is NOT process-global — init() never sets it.\n const sessionId = sessionIdOption ?? currentSessionId();\n\n // Determine whether we are inside an existing trace. Delayed work can retain\n // an already-ended intermediate span in AsyncLocalStorage. Prefer a live root\n // when one is available; if the root reference is unavailable, preserve the\n // ended parent context so the delayed span keeps the original trace id instead\n // of incorrectly opening a new standalone trace.\n const currentSpan = getActiveNeatlogsSpan();\n const rootSpan = getNeatlogsRootSpan();\n const currentSpanIsRecording = currentSpan?.isRecording() === true;\n const rootSpanIsRecording = rootSpan?.isRecording() === true;\n const shouldFallbackToRoot = !currentSpanIsRecording && rootSpanIsRecording;\n const hasInheritedTraceContext =\n currentSpan !== undefined || rootSpan !== undefined;\n const shouldCreateRootTrace =\n !!sessionId && !hasInheritedTraceContext && !rootSpanIsRecording;\n\n // ---------------------------------------------------------------------------\n // Process prompt templates\n // ---------------------------------------------------------------------------\n\n let templateString: string | undefined;\n let isPromptTemplateObj = false;\n\n if (promptTemplate !== undefined) {\n if (promptTemplate instanceof PromptTemplate) {\n isPromptTemplateObj = true;\n const t = promptTemplate.template;\n templateString = typeof t === 'string' ? t : JSON.stringify(t);\n logger.debug(\n `[trace] Using PromptTemplate object with variables: ${promptTemplate.variables.join(', ')}`,\n );\n } else if (typeof promptTemplate === 'string') {\n templateString = promptTemplate;\n } else {\n const t = promptTemplate.template;\n templateString = typeof t === 'string' ? t : JSON.stringify(t);\n }\n }\n\n let userTemplateString: string | undefined;\n let isUserPromptTemplateObj = false;\n\n if (userPromptTemplate !== undefined) {\n if (userPromptTemplate instanceof UserPromptTemplate) {\n isUserPromptTemplateObj = true;\n const t = userPromptTemplate.template;\n userTemplateString = typeof t === 'string' ? t : JSON.stringify(t);\n logger.debug(\n `[trace] Using UserPromptTemplate object with variables: ${userPromptTemplate.variables.join(', ')}`,\n );\n } else if (typeof userPromptTemplate === 'string') {\n userTemplateString = userPromptTemplate;\n } else {\n const t = userPromptTemplate.template;\n userTemplateString = typeof t === 'string' ? t : JSON.stringify(t);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Build OTel context with prompt values\n // ---------------------------------------------------------------------------\n\n // Start from the Neatlogs active context (private store in isolated mode), NOT\n // otelContext.active() — the latter is the foreign co-tenant's context, whose\n // active span must never become our parent. Prompt values threaded here then\n // propagate to descendant LLM spans through the private store.\n let ctx = getNeatlogsActiveContext();\n if (shouldFallbackToRoot) {\n ctx = otelTrace.setSpan(ctx, rootSpan!);\n }\n\n const variablesJson = promptVariables ? JSON.stringify(promptVariables) : undefined;\n const userVariablesJson = userPromptVariables ? JSON.stringify(userPromptVariables) : undefined;\n\n if (variablesJson) {\n ctx = ctx.setValue(PROMPT_VARIABLES_KEY, variablesJson);\n logger.debug(`[trace] Set neatlogs.prompt_variables in context: ${variablesJson}`);\n }\n if (templateString) {\n ctx = ctx.setValue(PROMPT_TEMPLATE_KEY, templateString);\n logger.debug(`[trace] Set neatlogs.prompt_template in context: ${templateString}`);\n }\n if (userVariablesJson) {\n ctx = ctx.setValue(USER_PROMPT_VARIABLES_KEY, userVariablesJson);\n logger.debug(`[trace] Set neatlogs.user_prompt_variables in context: ${userVariablesJson}`);\n }\n if (userTemplateString) {\n ctx = ctx.setValue(USER_PROMPT_TEMPLATE_KEY, userTemplateString);\n logger.debug(`[trace] Set neatlogs.user_prompt_template in context: ${userTemplateString}`);\n }\n if (version) {\n ctx = ctx.setValue(PROMPT_VERSION_KEY, version);\n logger.debug(`[trace] Set neatlogs.prompt_version in context: ${version}`);\n }\n\n // ---------------------------------------------------------------------------\n // Collect extra attributes (non-standard option keys)\n // ---------------------------------------------------------------------------\n\n const extraAttributes: Record<string, any> = { ...(explicitAttributes ?? {}) };\n for (const [key, value] of Object.entries(extraOptions)) {\n if (!KNOWN_OPTION_KEYS.has(key)) {\n extraAttributes[key] = value;\n }\n }\n\n // End-user belongs to the trace root only. This trace() call is a root when it\n // creates a new root trace, or when it isn't nested in an already-active trace.\n const isRootTrace = shouldCreateRootTrace || !hasInheritedTraceContext;\n\n // ---------------------------------------------------------------------------\n // Create span and execute callback\n // ---------------------------------------------------------------------------\n\n const tracer = getNeatlogsTracer('neatlogs.trace');\n\n const spanCallback = async (span: Span): Promise<T> => {\n _setSpanAttributes(span, kind, extraAttributes);\n\n // Session/end-user belong to the trace root only; skipped on a non-root span.\n const spanIsRoot = isRootTrace && !autoRoot.root;\n applySessionAttributes(span, sessionId, spanIsRoot, {\n parentSessionId,\n sessionFeatureName,\n sessionEntryPoint,\n });\n applyEndUserAttributes(span, endUserId, endUserMetadata, spanIsRoot);\n\n if (input !== undefined && input !== null) {\n const capturedInput = captureMedia(\n span,\n `neatlogs.${String(kind ?? 'workflow').toLowerCase()}.input`,\n serializeObj(input),\n 'input',\n );\n span.setAttribute('input.value', safeJsonDumps(capturedInput));\n }\n\n if (mask) {\n const maskId = registerMask(mask);\n span.setAttribute('neatlogs.mask_id', maskId);\n }\n\n try {\n const result: T = await fn(span);\n\n _finalizePromptCapture(span, isPromptTemplateObj, isUserPromptTemplateObj);\n\n if (result !== undefined && result !== null) {\n const spanAttrs = (span as any).attributes ?? (span as any)._attributes;\n const hasOutput = spanAttrs && (\n 'output.value' in spanAttrs || 'neatlogs.output.value' in spanAttrs\n );\n if (!hasOutput) {\n const capturedOutput = captureMedia(\n span,\n `neatlogs.${String(kind ?? 'workflow').toLowerCase()}.output`,\n serializeObj(result),\n 'output',\n );\n span.setAttribute('output.value', safeJsonDumps(capturedOutput));\n }\n }\n\n return result;\n } catch (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n } finally {\n if (isPromptTemplateObj) {\n PromptContext.clear();\n }\n if (isUserPromptTemplateObj) {\n UserPromptContext.clear();\n }\n span.end();\n }\n };\n\n const parentContext = shouldCreateRootTrace\n ? ROOT_CONTEXT\n : getNeatlogsParentContext(ctx);\n // Seed the span kind at CREATION, not just in the callback: the span processor\n // classifies LLM spans in onStart() (which fires from startSpan, before the\n // callback runs). Without this, a trace({ kind: 'LLM', promptTemplate }) span\n // isn't recognized as LLM in time and its prompt-template attributes are dropped.\n const startAttributes = kind ? { 'openinference.span.kind': kind } : undefined;\n const autoRoot = isRootTrace\n ? maybeOpenAutoRoot(tracer, String(kind ?? 'CHAIN'), parentContext)\n : { root: undefined, ctx: parentContext };\n if (autoRoot.root) {\n applySessionAttributes(autoRoot.root, sessionId, true, {\n parentSessionId,\n sessionFeatureName,\n sessionEntryPoint,\n });\n applyEndUserAttributes(autoRoot.root, endUserId, endUserMetadata, true);\n }\n const span = bindSpanToAutoRoot(\n tracer.startSpan(\n name,\n startAttributes ? { attributes: startAttributes } : {},\n autoRoot.ctx,\n ),\n autoRoot.root,\n );\n\n if (shouldCreateRootTrace) {\n logger.debug(`[trace] Creating NEW root trace '${name}' (sessionId=${sessionId})`);\n } else {\n logger.debug(`[trace] Creating child span '${name}'`);\n }\n\n return withNeatlogsSpan(\n span,\n () => spanCallback(span),\n autoRoot.ctx,\n autoRoot.root,\n );\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport type { PromptMessage } from '../types.js';\n\n// ---------------------------------------------------------------------------\n// Async-local context for system prompts\n// ---------------------------------------------------------------------------\n\ninterface PromptContextData {\n template: string;\n variables: Record<string, any>;\n}\n\nconst _promptStorage = new AsyncLocalStorage<PromptContextData>();\n\n/**\n * Manages system prompt metadata in async-local context for automatic tracing.\n */\nexport class PromptContext {\n /**\n * Store system prompt template and variables in context.\n */\n static set(template: string, variables: Record<string, any>): void {\n // enterWith mutates the current async context in-place\n _promptStorage.enterWith({ template, variables });\n }\n\n /**\n * Retrieve system prompt template from context.\n */\n static getTemplate(): string | undefined {\n return _promptStorage.getStore()?.template;\n }\n\n /**\n * Retrieve system prompt variables from context.\n */\n static getVariables(): Record<string, any> | undefined {\n return _promptStorage.getStore()?.variables;\n }\n\n /**\n * Clear system prompt context.\n */\n static clear(): void {\n _promptStorage.enterWith(undefined as unknown as PromptContextData);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Async-local context for user prompts\n// ---------------------------------------------------------------------------\n\nconst _userPromptStorage = new AsyncLocalStorage<PromptContextData>();\n\n/**\n * Manages user/human prompt metadata in async-local context for automatic tracing.\n */\nexport class UserPromptContext {\n /**\n * Store user prompt template and variables in context.\n */\n static set(template: string, variables: Record<string, any>): void {\n _userPromptStorage.enterWith({ template, variables });\n }\n\n /**\n * Retrieve user prompt template from context.\n */\n static getTemplate(): string | undefined {\n return _userPromptStorage.getStore()?.template;\n }\n\n /**\n * Retrieve user prompt variables from context.\n */\n static getVariables(): Record<string, any> | undefined {\n return _userPromptStorage.getStore()?.variables;\n }\n\n /**\n * Clear user prompt context.\n */\n static clear(): void {\n _userPromptStorage.enterWith(undefined as unknown as PromptContextData);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shared context setter type for the base template class\n// ---------------------------------------------------------------------------\n\ninterface ContextSetter {\n set(template: string, variables: Record<string, any>): void;\n}\n\n// ---------------------------------------------------------------------------\n// BasePromptTemplate — shared logic for system and user prompts\n// ---------------------------------------------------------------------------\n\nconst VARIABLE_PATTERN = /\\{\\{(\\w+)\\}\\}/g;\n\n/**\n * Base class for prompt templates with `{{variable}}` placeholders.\n *\n * Extracts variables, compiles templates, and renders strings.\n * Subclasses only need to specify the context class and display name.\n */\nabstract class BasePromptTemplate {\n protected readonly _template: string | PromptMessage[];\n protected readonly _variables: string[];\n\n /**\n * @param template - Either a string with `{{variable}}` placeholders or\n * an array of `PromptMessage` objects whose `content` fields contain placeholders.\n */\n constructor(template: string | PromptMessage[]) {\n this._template = template;\n this._variables = this._extractVariables();\n }\n\n /** List of unique variable names found in this template. */\n get variables(): string[] {\n return this._variables;\n }\n\n /** The raw template (string or message array). */\n get template(): string | PromptMessage[] {\n return this._template;\n }\n\n /** The context class to store template/variables for automatic tracing. */\n protected abstract get _contextSetter(): ContextSetter;\n\n /** Display name for toString(). */\n protected abstract get _displayName(): string;\n\n /**\n * Compile the prompt template with the given variables.\n *\n * @param variables - Key/value pairs to substitute for `{{key}}` placeholders.\n * @returns The rendered string or rendered message array.\n * @throws {Error} If any required variables are missing.\n */\n compile(variables?: Record<string, any>): string | PromptMessage[] {\n const vars = variables ?? {};\n\n const missing = this._variables.filter((v) => !(v in vars));\n if (missing.length > 0) {\n throw new Error(\n `Missing required variables: ${missing.join(', ')}. Template requires: ${this._variables.join(', ')}`,\n );\n }\n\n this._contextSetter.set(\n typeof this._template === 'string'\n ? this._template\n : this._template.map((msg) => `${msg.role}: ${msg.content}`).join('\\n'),\n vars,\n );\n\n if (typeof this._template === 'string') {\n return this._renderString(this._template, vars);\n }\n\n return this._template.map((msg) => ({\n role: msg.role,\n content: this._renderString(msg.content, vars),\n }));\n }\n\n /**\n * Replace `{{key}}` placeholders in a string with the corresponding values.\n */\n _renderString(text: string, variables: Record<string, any>): string {\n let result = text;\n for (const [key, value] of Object.entries(variables)) {\n result = result.replaceAll(`{{${key}}}`, String(value));\n }\n return result;\n }\n\n toString(): string {\n if (typeof this._template === 'string') {\n return this._template.length > 50\n ? `${this._displayName}('${this._template.slice(0, 50)}...')`\n : `${this._displayName}('${this._template}')`;\n }\n return `${this._displayName}(${this._template.length} messages, variables=${JSON.stringify(this._variables)})`;\n }\n\n // ---- private ----\n\n private _extractVariables(): string[] {\n if (typeof this._template === 'string') {\n return [...new Set(Array.from(this._template.matchAll(VARIABLE_PATTERN), (m) => m[1]))];\n }\n\n const found: string[] = [];\n for (const msg of this._template) {\n if (msg.content) {\n for (const match of msg.content.matchAll(VARIABLE_PATTERN)) {\n found.push(match[1]);\n }\n }\n }\n return [...new Set(found)];\n }\n}\n\n// ---------------------------------------------------------------------------\n// PromptTemplate — system/AI instruction prompt\n// ---------------------------------------------------------------------------\n\n/**\n * Template for the system/AI instruction prompt with `{{variable}}` placeholders.\n */\nexport class PromptTemplate extends BasePromptTemplate {\n protected get _contextSetter(): ContextSetter {\n return PromptContext;\n }\n\n protected get _displayName(): string {\n return 'PromptTemplate';\n }\n}\n\n// ---------------------------------------------------------------------------\n// UserPromptTemplate — user/human turn prompt\n// ---------------------------------------------------------------------------\n\n/**\n * Template for the user/human turn prompt with `{{variable}}` placeholders.\n *\n * Identical to {@link PromptTemplate} but stores context in {@link UserPromptContext}.\n */\nexport class UserPromptTemplate extends BasePromptTemplate {\n protected get _contextSetter(): ContextSetter {\n return UserPromptContext;\n }\n\n protected get _displayName(): string {\n return 'UserPromptTemplate';\n }\n}\n","/**\n * PII masking support for Neatlogs spans.\n *\n * Users supply a callable that receives the full span dict and returns\n * the (possibly modified) span dict. Return null to drop the span entirely.\n */\n\nimport type { MaskFunction } from '../types.js';\nimport { getLogger } from './logger.js';\n\nconst logger = getLogger();\nexport const DEFAULT_MASK_TIMEOUT_MS = 5_000;\n\nexport interface ApplyMaskOptions {\n signalType?: 'span' | 'log';\n timeoutMs?: number;\n}\n\n/** Module-level registry: key -> mask function */\nconst _MASK_REGISTRY = new Map<string, MaskFunction>();\nconst _MASK_RESULTS = new WeakMap<object, Promise<Record<string, any> | null>>();\n\nlet _nextId = 0;\n\n/**\n * Register a mask function and return its lookup key.\n */\nexport function registerMask(fn: MaskFunction): string {\n const key = String(++_nextId);\n _MASK_REGISTRY.set(key, fn);\n return key;\n}\n\n/**\n * Apply the effective mask function to span data.\n *\n * Per-span mask (stored in attributes[\"neatlogs.mask_id\"]) takes\n * precedence over the global mask. Returns the (possibly modified) dict.\n */\nfunction effectiveMask(\n spanData: Record<string, any>,\n globalMask: MaskFunction | null | undefined,\n): MaskFunction | null {\n const maskId = spanData?.attributes?.['neatlogs.mask_id'];\n let maskFn: MaskFunction | undefined | null = null;\n\n if (maskId) {\n maskFn = _MASK_REGISTRY.get(String(maskId)) ?? null;\n }\n\n if (!maskFn) {\n maskFn = globalMask ?? null;\n }\n\n return maskFn;\n}\n\nexport async function applyMask(\n spanData: Record<string, any>,\n globalMask: MaskFunction | null | undefined,\n options: ApplyMaskOptions = {},\n): Promise<Record<string, any> | null> {\n const maskFn = effectiveMask(spanData, globalMask);\n if (!maskFn) return spanData;\n\n const signalType = options.signalType ?? 'span';\n const timeoutMs = options.timeoutMs ?? DEFAULT_MASK_TIMEOUT_MS;\n const controller = new AbortController();\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n try {\n // Run user masking outside SpanProcessor.onEnd() so a slow callback does\n // not block application request completion.\n const maskPromise = Promise.resolve().then(() =>\n maskFn(spanData, { signal: controller.signal, signalType, timeoutMs }),\n );\n const timeoutPromise = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error(`mask callback exceeded ${timeoutMs}ms`));\n }, timeoutMs);\n timer.unref?.();\n });\n const result = await Promise.race([maskPromise, timeoutPromise]);\n // null means \"drop this span entirely\"; undefined means \"keep original\"\n if (result === null) return null;\n return result !== undefined ? result : spanData;\n } catch (exc) {\n const signalName = spanData?.name ?? spanData?.signal_type ?? signalType;\n logger.error(\n `mask callable failed for ${signalType} '${signalName}': ${exc} — dropping it to prevent unmasked export.`,\n );\n return null;\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n controller.abort();\n }\n}\n\n/** Schedule and retain one masking result for the exporter that receives span. */\nexport function scheduleMask(\n span: object,\n spanData: Record<string, any>,\n globalMask: MaskFunction | null | undefined,\n): Promise<Record<string, any> | null> {\n const result = applyMask(spanData, globalMask, { signalType: 'span' });\n _MASK_RESULTS.set(span, result);\n return result;\n}\n\n/** Return the result scheduled by NeatlogsSpanProcessor for this snapshot. */\nexport function getScheduledMask(span: object): Promise<Record<string, any> | null> | undefined {\n return _MASK_RESULTS.get(span);\n}\n\n/**\n * Clear all registered masks. Used for testing.\n * @internal\n */\nexport function _clearMaskRegistry(): void {\n _MASK_REGISTRY.clear();\n _nextId = 0;\n}\n","/**\n * Request-scoped session & end-user identity.\n *\n * Session and end-user identity are PER-REQUEST, not process-global, so they are\n * never set on `init()`. The primary way to set them is at the trace root\n * (`trace({ sessionId })` / `span({ sessionId })`). For code that only uses\n * `wrap()` — where the trace root is created internally by the wrapper and the\n * caller has no root to put arguments on — use the `identify()` context:\n *\n * await neatlogs.identify(\n * { sessionId: 'chat_123', endUserId: 'user_456', endUserMetadata: { plan: 'pro' } },\n * async () => {\n * await wrappedClient.chat.completions.create(...); // auto-root reads this\n * },\n * );\n *\n * Resolution at the trace root (per field): explicit per-call argument wins, then\n * the `identify()` context, then nothing. Identity is stamped on the ROOT span\n * only; the backend rolls it up to the trace and its session.\n *\n * Backed by `AsyncLocalStorage` so it propagates across `await` boundaries (and\n * nested async tasks), exactly like OpenTelemetry's own context propagation.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\nexport interface IdentityStore {\n sessionId?: string;\n parentSessionId?: string;\n sessionFeatureName?: string;\n sessionEntryPoint?: string;\n endUserId?: string;\n endUserMetadata?: Record<string, any>;\n}\n\nexport interface IdentifyOptions {\n sessionId?: string;\n /** Optional immediate parent session. */\n parentSessionId?: string;\n /** Product feature that initiated this request. */\n sessionFeatureName?: string;\n /** Application entry point that initiated this request. */\n sessionEntryPoint?: string;\n endUserId?: string;\n endUserMetadata?: Record<string, any>;\n}\n\n// tsup bundles each entry point (index, openai, azure-openai, ...) separately,\n// so a plain module-level `new AsyncLocalStorage()` would be DUPLICATED per\n// bundle — identify() (in index) would write to a different store than a\n// provider wrapper's auto-root (in e.g. azure-openai) reads, silently losing\n// identity on the wrapper-only path. Pin a single instance on globalThis so all\n// bundled copies (ESM + CJS) resolve to the same store.\nconst _GLOBAL_KEY = Symbol.for('neatlogs.identity.storage');\ntype _GlobalWithStore = typeof globalThis & {\n [_GLOBAL_KEY]?: AsyncLocalStorage<IdentityStore>;\n};\nconst _g = globalThis as _GlobalWithStore;\nconst _storage: AsyncLocalStorage<IdentityStore> =\n _g[_GLOBAL_KEY] ?? (_g[_GLOBAL_KEY] = new AsyncLocalStorage<IdentityStore>());\n\nexport function currentSessionId(): string | undefined {\n return _storage.getStore()?.sessionId;\n}\n\nexport function currentParentSessionId(): string | undefined {\n return _storage.getStore()?.parentSessionId;\n}\n\nexport function currentSessionFeatureName(): string | undefined {\n return _storage.getStore()?.sessionFeatureName;\n}\n\nexport function currentSessionEntryPoint(): string | undefined {\n return _storage.getStore()?.sessionEntryPoint;\n}\n\nexport function currentEndUserId(): string | undefined {\n return _storage.getStore()?.endUserId;\n}\n\nexport function currentEndUserMetadata(): Record<string, any> | undefined {\n return _storage.getStore()?.endUserMetadata;\n}\n\n/**\n * Bind session / end-user identity for the duration of `fn`.\n *\n * Only defined fields are set, so a nested `identify()` overrides one field\n * without clearing the others (it merges onto the enclosing store). The previous\n * store is automatically restored when `fn` returns / rejects. Returns whatever\n * `fn` returns (sync value or Promise).\n *\n * @example\n * ```typescript\n * await neatlogs.identify({ sessionId: 'chat_123' }, async () => {\n * await wrappedClient.chat.completions.create(...);\n * });\n * ```\n */\nexport function identify<T>(opts: IdentifyOptions, fn: () => T): T {\n const prev = _storage.getStore();\n const next: IdentityStore = { ...(prev ?? {}) };\n if (opts.sessionId !== undefined) next.sessionId = opts.sessionId;\n if (opts.parentSessionId !== undefined) next.parentSessionId = opts.parentSessionId;\n if (opts.sessionFeatureName !== undefined) next.sessionFeatureName = opts.sessionFeatureName;\n if (opts.sessionEntryPoint !== undefined) next.sessionEntryPoint = opts.sessionEntryPoint;\n if (opts.endUserId !== undefined) next.endUserId = opts.endUserId;\n if (opts.endUserMetadata !== undefined) next.endUserMetadata = opts.endUserMetadata;\n return _storage.run(next, fn);\n}\n","/**\n * Neatlogs-owned tracing state.\n *\n * Spans are created by the private Neatlogs provider and their parent is carried\n * in a private context key. The process-global OpenTelemetry span is\n * deliberately left untouched so other observability SDKs cannot export or\n * become parents of Neatlogs spans.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n ROOT_CONTEXT,\n INVALID_SPAN_CONTEXT,\n createContextKey,\n trace as otelTrace,\n type Context,\n type Span,\n type SpanOptions,\n type Tracer,\n type TracerProvider,\n} from '@opentelemetry/api';\nimport { getActiveClient } from './active-client.js';\n\n// Carries the trace-ROOT span down the private context so descendants can target\n// it (e.g. setTraceOutput). getActiveNeatlogsSpan() returns the innermost span,\n// which is not the root once nested; this key preserves the root reference.\nconst NEATLOGS_ROOT_SPAN_KEY = createContextKey('neatlogs.root_span');\n\n// Entry points are bundled independently (`neatlogs`, `neatlogs/openai`,\n// `neatlogs/ai`, `neatlogs/mastra`, … each in both CJS and ESM), so every piece\n// of shared tracing state — the private span store AND the resolved provider /\n// provider — must live on `globalThis` behind a `Symbol.for` key.\n// Otherwise `init()` (run from the `neatlogs` bundle) sets `_provider` in ITS\n// module copy while a wrapper imported from `neatlogs/openai` reads a different,\n// still-null copy and silently falls back to the foreign global provider.\nconst PRIVATE_SPAN_STORAGE_KEY = Symbol.for(\n 'neatlogs.private_span_async_local_storage',\n);\nconst PRIVATE_PROVIDER_STATE_KEY = Symbol.for(\n 'neatlogs.private_provider_state',\n);\ninterface PrivateProviderState {\n provider: TracerProvider | null;\n}\ntype NeatlogsGlobal = typeof globalThis & {\n [PRIVATE_SPAN_STORAGE_KEY]?: AsyncLocalStorage<Context>;\n [PRIVATE_PROVIDER_STATE_KEY]?: PrivateProviderState;\n};\nconst neatlogsGlobal = globalThis as NeatlogsGlobal;\n// Stores the full Neatlogs Context (parent span PLUS any threaded values such as\n// trace()'s prompt-template keys), not just the span. We never\n// activate the OTel global context, so this private store is the ONLY channel\n// through which those values propagate down to descendant spans.\nconst privateContextStorage =\n neatlogsGlobal[PRIVATE_SPAN_STORAGE_KEY] ??\n (neatlogsGlobal[PRIVATE_SPAN_STORAGE_KEY] = new AsyncLocalStorage<Context>());\nconst providerState: PrivateProviderState =\n neatlogsGlobal[PRIVATE_PROVIDER_STATE_KEY] ??\n (neatlogsGlobal[PRIVATE_PROVIDER_STATE_KEY] = {\n provider: null,\n });\n// Wrappers may be constructed or accidentally invoked before init(). They must\n// never fall back to a foreign process-global provider, so pre-init calls use a\n// local no-op tracer and safely emit no exported spans.\nconst preInitTracer: Tracer = {\n startSpan(): Span {\n return otelTrace.wrapSpanContext(INVALID_SPAN_CONTEXT);\n },\n startActiveSpan<F extends (span: Span) => unknown>(\n _name: string,\n arg2?: SpanOptions | Context | F,\n arg3?: Context | F,\n arg4?: F,\n ): ReturnType<F> {\n const fn =\n typeof arg2 === 'function'\n ? arg2\n : typeof arg3 === 'function'\n ? arg3\n : arg4;\n return fn!(otelTrace.wrapSpanContext(INVALID_SPAN_CONTEXT)) as ReturnType<F>;\n },\n};\n\n/** @internal Configure the provider used by Neatlogs-created spans. */\nexport function _setNeatlogsProvider(provider: TracerProvider | null): void {\n providerState.provider = provider;\n}\n\n/** Resolve a tracer from the private provider when one is configured. */\nexport function getNeatlogsTracer(name: string): Tracer {\n const client = getActiveClient();\n if (client) return client.getTracer(name);\n return providerState.provider?.getTracer(name) ?? preInitTracer;\n}\n\n/** A reusable tracer facade that resolves the active Client on every call. */\nexport function getRoutingNeatlogsTracer(name: string): Tracer {\n return {\n startSpan(spanName: string, options?: SpanOptions, context?: Context): Span {\n return isolateTracer(getNeatlogsTracer(name)).startSpan(\n spanName,\n options,\n context,\n );\n },\n startActiveSpan: ((...args: any[]) =>\n (isolateTracer(getNeatlogsTracer(name)).startActiveSpan as (...inner: any[]) => any)(\n ...args,\n )) as Tracer['startActiveSpan'],\n };\n}\n\n/**\n * @internal The private Neatlogs provider, or null before\n * init(). Used by integrations that must repoint a self-instrumenting library's\n * captured provider onto ours.\n */\nexport function getNeatlogsProvider(): TracerProvider | null {\n const client = getActiveClient();\n if (client) return client.tracerProvider;\n return providerState.provider;\n}\n\n/** Run a Client callback without inheriting another pipeline's private span. */\nexport function runWithFreshNeatlogsContext<T>(fn: () => T): T {\n return privateContextStorage.run(ROOT_CONTEXT, fn);\n}\n\n/**\n * Wrap a tracer so that spans it creates parent from — and, for\n * `startActiveSpan`, activate on — the PRIVATE Neatlogs context instead of the\n * global one.\n *\n * We hand this to libraries that create their own spans off a tracer we give\n * them (the Vercel AI SDK's `experimental_telemetry.tracer`, which calls\n * `tracer.startActiveSpan()` internally). Without the facade the AI SDK's native\n * spans would parent from `context.active()` — the foreign co-tenant's context —\n * and `startActiveSpan` would push them onto the GLOBAL context, so a foreign\n * tracer's next span reads our native span as its parent. Both directions leak.\n *\n */\nexport function isolateTracer(tracer: Tracer): Tracer {\n const facade: Tracer = {\n startSpan(name: string, options?: SpanOptions, context?: Context): Span {\n const parent = context ?? getNeatlogsActiveContext();\n return tracer.startSpan(name, options, parent);\n },\n startActiveSpan<F extends (span: Span) => unknown>(\n name: string,\n arg2?: SpanOptions | Context | F,\n arg3?: Context | F,\n arg4?: F,\n ): ReturnType<F> {\n // Normalize the 2/3/4-arg overloads of startActiveSpan.\n let options: SpanOptions | undefined;\n let context: Context | undefined;\n let fn: F;\n if (typeof arg2 === 'function') {\n fn = arg2 as F;\n } else if (typeof arg3 === 'function') {\n options = arg2 as SpanOptions;\n fn = arg3 as F;\n } else {\n options = arg2 as SpanOptions;\n context = arg3 as Context;\n fn = arg4 as F;\n }\n const parent = context ?? getNeatlogsActiveContext();\n const span = tracer.startSpan(name, options, parent);\n return withNeatlogsSpan(span, () => fn(span), parent) as ReturnType<F>;\n },\n };\n return facade;\n}\n\n/**\n * The base context to build new Neatlogs spans and values on. NEVER contains a\n * foreign provider's span: it reads our private store, or ROOT_CONTEXT when\n * nothing is active.\n */\nexport function getNeatlogsActiveContext(): Context {\n return privateContextStorage.getStore() ?? ROOT_CONTEXT;\n}\n\n/** Return only the active Neatlogs span (never a foreign provider's span). */\nexport function getActiveNeatlogsSpan(): Span | undefined {\n return otelTrace.getSpan(getNeatlogsActiveContext());\n}\n\n/**\n * Return the trace-ROOT Neatlogs span, or undefined when no trace is active.\n *\n * Unlike {@link getActiveNeatlogsSpan} (innermost), this is the outermost span\n * of the current trace — the one the backend derives trace-level output from\n * (`parent_span_id=''`). It is stashed on the private context the first time a\n * span becomes active, so nested calls still resolve to the root.\n */\nexport function getNeatlogsRootSpan(): Span | undefined {\n return getNeatlogsActiveContext().getValue(NEATLOGS_ROOT_SPAN_KEY) as\n | Span\n | undefined;\n}\n\n/**\n * Build a parent context that cannot contain a foreign provider's span.\n *\n * The active Neatlogs context already carries the parent span AND any values\n * the caller threaded in upstream (e.g. `trace()`'s prompt-template values), so\n * those values reach the span processor via `onStart(parentContext)`. An\n * explicit `baseContext` (a caller's own value-carrying context) is honored as-is.\n */\nexport function getNeatlogsParentContext(baseContext?: Context): Context {\n return baseContext ?? getNeatlogsActiveContext();\n}\n\n/**\n * A base context for callers that thread parent linkage themselves\n * (callback/event handlers that keep their own run-id → span map: LangChain,\n * OpenAI-Agents, Claude Agent SDK).\n *\n * This is the ACTIVE Neatlogs context — the private store's\n * context if a Neatlogs `trace()`/`span()` encloses this call, else\n * ROOT_CONTEXT. So a handler's own root/entry span nests under an enclosing\n * Neatlogs trace (preserving its session + end-user id) when one exists, and\n * auto-roots cleanly when one doesn't. A foreign provider's active span can\n * never leak in as an ancestor because the global context is never read.\n */\nexport function getNeatlogsBaseContext(baseContext?: Context): Context {\n return baseContext ?? getNeatlogsActiveContext();\n}\n\n/**\n * Build an execution context for a Neatlogs span while preserving the active\n * foreign context. The span rides our private context store.\n */\nexport function getNeatlogsExecutionContext(\n span: Span,\n baseContext: Context = ROOT_CONTEXT,\n): Context {\n return otelTrace.setSpan(baseContext, span);\n}\n\n/**\n * Run a callback with a Neatlogs span active under the appropriate policy.\n *\n * The stored context is `setSpan(base, span)` — carrying the span PLUS whatever\n * values `base` holds — so threaded values (prompt templates)\n * propagate to descendant spans through our private store instead of the global\n * OTel context we deliberately never touch.\n */\nexport function withNeatlogsSpan<T>(\n span: Span,\n fn: () => T,\n baseContext?: Context,\n rootSpan?: Span,\n): T {\n const base = baseContext ?? getNeatlogsActiveContext();\n let ctx = otelTrace.setSpan(base, span);\n // The first span activated in a context with no root recorded IS the root of\n // this trace; remember it so descendants (setTraceOutput) can target it.\n if (base.getValue(NEATLOGS_ROOT_SPAN_KEY) === undefined) {\n ctx = ctx.setValue(NEATLOGS_ROOT_SPAN_KEY, rootSpan ?? span);\n }\n return privateContextStorage.run(ctx, fn);\n}\n\n/**\n * @internal Run with a private Neatlogs parent without treating that parent as\n * a locally-recording trace root. This is used for an extracted remote parent:\n * the first local recording span should remain the target for local trace-level\n * output, while still inheriting the remote trace/span IDs.\n */\nexport function withNeatlogsRemoteParent<T>(span: Span, fn: () => T): T {\n return privateContextStorage.run(otelTrace.setSpan(ROOT_CONTEXT, span), fn);\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport type { Tracer, TracerProvider } from '@opentelemetry/api';\n\nexport interface ActiveNeatlogsClient {\n readonly workflowName: string;\n readonly tracerProvider: TracerProvider;\n getTracer(scope: string): Tracer;\n getLogger(): any | null;\n}\n\nconst ACTIVE_CLIENT_STORAGE_KEY = Symbol.for(\n 'neatlogs.active_client_async_local_storage',\n);\ntype NeatlogsGlobal = typeof globalThis & {\n [ACTIVE_CLIENT_STORAGE_KEY]?: AsyncLocalStorage<ActiveNeatlogsClient>;\n};\nconst neatlogsGlobal = globalThis as NeatlogsGlobal;\nconst storage =\n neatlogsGlobal[ACTIVE_CLIENT_STORAGE_KEY] ??\n (neatlogsGlobal[ACTIVE_CLIENT_STORAGE_KEY] =\n new AsyncLocalStorage<ActiveNeatlogsClient>());\n\nexport function getActiveClient(): ActiveNeatlogsClient | undefined {\n return storage.getStore();\n}\n\nexport function runWithClient<T>(\n client: ActiveNeatlogsClient,\n fn: () => T,\n): T {\n return storage.run(client, fn);\n}\n","/**\n * End-user identity.\n *\n * The *end user* is the user of OUR CUSTOMER'S application — the person\n * interacting with the AI product our customer built. This is deliberately\n * distinct from the operator-level `userId` set in {@link init}, which identifies\n * whoever is running the SDK (a developer, a service account, a CI job).\n *\n * Model: **one end-user per trace.** Identity is declared once at a trace\n * boundary — `init()` (process-global default), `trace()` (per-request), or\n * `span()` (per root) — via new options on those existing constructs. There is\n * no separate `identify()` call and no nested per-span override: a trace belongs\n * to a single end-user.\n *\n * End-user identity belongs to the trace as a whole, so the SDK only stamps it\n * on the trace's ROOT span (any span kind, created via `trace()` / `span()`). A\n * non-root child span never carries it. The backend reads end-user from the root\n * span and rolls the value up to the trace (and its session) so\n * filtering/analytics are trace- and session-level, not per-span.\n *\n * Canonical span attributes:\n * `neatlogs.end_user.id` — the end-user identifier (string)\n * `neatlogs.end_user.metadata` — JSON object of arbitrary end-user fields\n */\n\nimport { type Span } from '@opentelemetry/api';\nimport { getLogger } from './logger.js';\nimport { currentEndUserId, currentEndUserMetadata } from './identity.js';\nimport { getActiveNeatlogsSpan } from './provider.js';\n\nconst logger = getLogger();\n\nexport const END_USER_ID_KEY = 'neatlogs.end_user.id';\nexport const END_USER_METADATA_KEY = 'neatlogs.end_user.metadata';\n\n/** Coerce end-user metadata to a JSON string. Returns undefined when empty. */\nexport function normalizeEndUserMetadata(\n metadata: string | Record<string, any> | undefined | null,\n): string | undefined {\n if (metadata === undefined || metadata === null) return undefined;\n if (typeof metadata === 'string') return metadata || undefined;\n try {\n return JSON.stringify(metadata);\n } catch {\n return JSON.stringify(String(metadata));\n }\n}\n\n/**\n * True when no recording span is currently active — i.e. a span created now\n * would be the trace root.\n */\nexport function isRootSpan(): boolean {\n // Resolve from the private span store in isolated mode (a foreign provider's\n // active span must not count as our parent), else the active OTel span.\n const current = getActiveNeatlogsSpan();\n return !(current && current.isRecording());\n}\n\n/**\n * Stamp end-user id/metadata onto a ROOT span (best-effort). When `isRoot` is\n * false the span is a child and the value is ignored — the backend reads\n * end-user from the root span and rolls it up to the trace and session.\n */\nexport function applyEndUserAttributes(\n span: Span,\n endUserId?: string,\n endUserMetadata?: string | Record<string, any> | null,\n isRoot = true,\n): void {\n // Resolution at the root (per field): explicit per-call arg wins, else the\n // identify() context (request-scoped). Non-root spans never carry identity.\n const resolvedId = isRoot ? (endUserId ?? currentEndUserId()) : endUserId;\n const resolvedMeta = isRoot\n ? (endUserMetadata ?? currentEndUserMetadata())\n : endUserMetadata;\n if (!resolvedId && !resolvedMeta) return;\n if (!isRoot) {\n logger.debug(\n '[end_user] Ignoring endUserId/endUserMetadata on a non-root span — ' +\n 'declare it on the trace root (top-level trace()/span()) or identify().',\n );\n return;\n }\n if (resolvedId) {\n span.setAttribute(END_USER_ID_KEY, String(resolvedId));\n }\n const metaJson = normalizeEndUserMetadata(resolvedMeta);\n if (metaJson) {\n span.setAttribute(END_USER_METADATA_KEY, metaJson);\n }\n}\n","/**\n * Session identity.\n *\n * A *session* is one conversation / thread / journey — it groups the multiple\n * traces of a multi-turn interaction (one turn = one trace). Identity is\n * declared once at a trace boundary — `init()` (process-global default),\n * `trace()` (per-turn), or `span()` (per root) — via the `sessionId` option on\n * those existing constructs. The SDK stamps only the trace's ROOT span; the\n * backend rolls the value up to group the traces of a session together.\n *\n * For single-turn workflows a session maps 1:1 to a trace: when no session is\n * declared the backend backfills `session_id = trace_id`.\n *\n * Canonical span attribute:\n * `neatlogs.session.id` — the session identifier (string)\n */\n\nimport { type Span } from '@opentelemetry/api';\nimport { getLogger } from './logger.js';\nimport {\n currentParentSessionId,\n currentSessionEntryPoint,\n currentSessionFeatureName,\n currentSessionId,\n} from './identity.js';\n\nconst logger = getLogger();\n\nexport const SESSION_ID_KEY = 'neatlogs.session.id';\nexport const PARENT_SESSION_ID_KEY = 'neatlogs.session.parent_id';\nexport const SESSION_FEATURE_NAME_KEY = 'neatlogs.session.feature.name';\nexport const SESSION_ENTRY_POINT_KEY = 'neatlogs.session.entry_point';\n\nexport interface SessionAttributeOptions {\n parentSessionId?: string;\n sessionFeatureName?: string;\n sessionEntryPoint?: string;\n}\n\nfunction cleanOptionalString(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const cleaned = value.trim();\n return cleaned || undefined;\n}\n\nfunction setAttributeFailOpen(span: Span, key: string, value: string): void {\n try {\n span.setAttribute(key, value);\n } catch (error) {\n logger.debug(`[session] Failed to set ${key}: ${error}`);\n }\n}\n\n/**\n * Stamp the session id onto a ROOT span (best-effort). When `isRoot` is false\n * the span is a child and the value is ignored — the backend reads session from\n * the root span and groups traces by it.\n */\nexport function applySessionAttributes(\n span: Span,\n sessionId?: string,\n isRoot = true,\n options: SessionAttributeOptions = {},\n): void {\n // Resolution at the root: explicit per-call arg wins, else the identify()\n // context (request-scoped). Non-root spans never carry session identity.\n if (!isRoot) {\n if (\n sessionId ||\n options.parentSessionId ||\n options.sessionFeatureName ||\n options.sessionEntryPoint\n ) {\n logger.debug(\n '[session] Ignoring session attributes on a non-root span — declare them on the ' +\n 'trace root (top-level trace()/span()) or identify().',\n );\n }\n return;\n }\n\n const resolvedSessionId = sessionId ?? currentSessionId();\n if (resolvedSessionId) {\n try {\n span.setAttribute(SESSION_ID_KEY, String(resolvedSessionId));\n } catch (error) {\n logger.debug(`[session] Failed to set ${SESSION_ID_KEY}: ${error}`);\n }\n }\n\n const parentSessionId = cleanOptionalString(\n options.parentSessionId ?? currentParentSessionId(),\n );\n const comparableSessionId = cleanOptionalString(resolvedSessionId);\n if (parentSessionId && parentSessionId !== comparableSessionId) {\n setAttributeFailOpen(span, PARENT_SESSION_ID_KEY, parentSessionId);\n }\n\n const sessionFeatureName = cleanOptionalString(\n options.sessionFeatureName ?? currentSessionFeatureName(),\n );\n if (sessionFeatureName) {\n setAttributeFailOpen(span, SESSION_FEATURE_NAME_KEY, sessionFeatureName);\n }\n\n const sessionEntryPoint = cleanOptionalString(\n options.sessionEntryPoint ?? currentSessionEntryPoint(),\n );\n if (sessionEntryPoint) {\n setAttributeFailOpen(span, SESSION_ENTRY_POINT_KEY, sessionEntryPoint);\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { getActiveClient } from \"./active-client.js\";\nimport type { DeliveryDiagnostics } from \"./delivery-diagnostics.js\";\nimport {\n assertReadyUploadReceipt,\n DEFAULT_MAX_TYPED_MEDIA_BYTES,\n isSupportedTypedMediaMimeType,\n TelemetryUploadError,\n type UploadAuthority,\n type UploadPayload,\n} from \"./upload-authority.js\";\n\nexport type MediaRecord = Record<string, string | number>;\n\nexport const DEFAULT_INLINE_MEDIA_BYTES = 100_000;\nexport const DEFAULT_MAX_PENDING_MEDIA_ITEMS = 32;\nexport const DEFAULT_MEDIA_EXPORT_DEADLINE_MS = 15_000;\nconst MAX_MEDIA_TRAVERSAL_DEPTH = 32;\nconst MAX_MEDIA_TRAVERSAL_NODES = 4_096;\nconst MAX_MEDIA_REPLACEMENT_KEY_CHARS = 1024 * 1024;\nconst MAX_MEDIA_REFERENCE_CHARS = 8_192;\nconst MAX_CAPTURED_MEDIA_REFERENCES = 64;\nconst MAX_ENCODED_MEDIA_CHARS = Math.ceil((DEFAULT_MAX_TYPED_MEDIA_BYTES * 4) / 3) + 8;\nconst REDACTED_MEDIA_STRUCTURE = \"[REDACTED_MEDIA_STRUCTURE]\";\nconst MEDIA_PAYLOAD_SIGNAL =\n /(?:data\\s*:|\"(?:image_url|input_audio|inline_data|inlineData|file_data|fileData|file_url|file_uri|fileUri|b64_json|mime_type|mimeType|media_type|mediaType)\"\\s*:|\"type\"\\s*:\\s*\"(?:image|audio|video|document|file|input_file|image_generation_call)\")/i;\n\ninterface DiscoveredMedia {\n record: MediaRecord;\n original?: string;\n binaryOriginal?: Uint8Array;\n bytes?: Uint8Array;\n}\n\ninterface MediaDiscoveryResult {\n items: DiscoveredMedia[];\n truncated: boolean;\n}\n\ninterface PendingMedia {\n bytes: Uint8Array;\n prefixes: string[];\n record: MediaRecord;\n token: string;\n sha256: string;\n byteLength: number;\n mimeType: string;\n}\n\ninterface PendingMediaAccount {\n bytes: number;\n items: number;\n released: boolean;\n owner: PendingMediaOwnerState;\n span: WeakRef<object>;\n}\n\ninterface PendingMediaBucket {\n items: PendingMedia[];\n account: PendingMediaAccount;\n unregisterToken: object;\n}\ninterface PendingMediaOwnerState {\n bytes: number;\n items: number;\n accounts: Set<PendingMediaAccount>;\n}\n\ninterface MediaRuntimeState {\n pendingBySpan: WeakMap<object, PendingMediaBucket>;\n pendingMediaOwners: WeakMap<object, PendingMediaOwnerState>;\n mediaCaptureAvailability: WeakMap<object, { available: boolean; reason: string }>;\n mediaCaptureOwners: WeakMap<object, object>;\n spanAliases: WeakMap<object, object>;\n defaultPendingMediaOwner: object;\n}\n\nconst MEDIA_RUNTIME_KEY = Symbol.for(\"neatlogs.media-runtime.v1\");\nconst runtimeGlobal = globalThis as typeof globalThis & Record<symbol, unknown>;\nconst mediaRuntime =\n (runtimeGlobal[MEDIA_RUNTIME_KEY] as MediaRuntimeState | undefined) ??\n ({\n pendingBySpan: new WeakMap(),\n pendingMediaOwners: new WeakMap(),\n mediaCaptureAvailability: new WeakMap(),\n mediaCaptureOwners: new WeakMap(),\n spanAliases: new WeakMap(),\n defaultPendingMediaOwner: {},\n } satisfies MediaRuntimeState);\nruntimeGlobal[MEDIA_RUNTIME_KEY] = mediaRuntime;\n\nconst {\n pendingBySpan,\n pendingMediaOwners,\n mediaCaptureAvailability,\n mediaCaptureOwners,\n spanAliases,\n defaultPendingMediaOwner,\n} = mediaRuntime;\n\nfunction canonicalSpan(span: object): object {\n return spanAliases.get(span) ?? span;\n}\n\n/** Make a transparent span facade share media state with its SDK span. */\nexport function aliasMediaCaptureSpan(alias: object, target: object): void {\n spanAliases.set(alias, canonicalSpan(target));\n}\n\n/** Bind a recording SDK span to the upload gate selected by its pipeline. */\nexport function setMediaCaptureAvailability(\n span: object,\n available: boolean,\n reason = \"telemetry_uploads_disabled\",\n owner?: object,\n): void {\n const target = canonicalSpan(span);\n mediaCaptureAvailability.set(target, {\n available,\n reason: safeUnavailableReason(reason),\n });\n if (owner) mediaCaptureOwners.set(target, owner);\n}\n\nfunction pendingOwnerState(owner: object): PendingMediaOwnerState {\n const prior = pendingMediaOwners.get(owner);\n if (prior) return prior;\n const state = {\n bytes: 0,\n items: 0,\n accounts: new Set<PendingMediaAccount>(),\n };\n pendingMediaOwners.set(owner, state);\n return state;\n}\n\nfunction releasePendingAccount(account: PendingMediaAccount): void {\n if (account.released) return;\n account.released = true;\n account.owner.bytes = Math.max(0, account.owner.bytes - account.bytes);\n account.owner.items = Math.max(0, account.owner.items - account.items);\n account.owner.accounts.delete(account);\n}\n\nconst pendingFinalizer =\n typeof FinalizationRegistry === \"undefined\"\n ? undefined\n : new FinalizationRegistry<PendingMediaAccount>(releasePendingAccount);\n\nfunction pendingBucket(span: object): PendingMediaBucket {\n span = canonicalSpan(span);\n const prior = pendingBySpan.get(span);\n if (prior) return prior;\n const owner = pendingOwnerState(\n mediaCaptureOwners.get(span) ?? getActiveClient() ?? defaultPendingMediaOwner,\n );\n const account: PendingMediaAccount = {\n bytes: 0,\n items: 0,\n released: false,\n owner,\n span: new WeakRef(span),\n };\n const unregisterToken = {};\n const bucket = { items: [], account, unregisterToken };\n owner.accounts.add(account);\n pendingBySpan.set(span, bucket);\n pendingFinalizer?.register(span, account, unregisterToken);\n return bucket;\n}\n\nfunction detachPendingBucket(span: object): PendingMediaBucket | undefined {\n const alias = span;\n span = canonicalSpan(alias);\n spanAliases.delete(alias);\n const bucket = pendingBySpan.get(span);\n if (!bucket) return undefined;\n pendingBySpan.delete(span);\n mediaCaptureAvailability.delete(span);\n mediaCaptureOwners.delete(span);\n pendingFinalizer?.unregister(bucket.unregisterToken);\n return bucket;\n}\n\nfunction uploadToken(record: MediaRecord): string {\n const material = `${record.sha256}:${record.mime_type}:${record.purpose}`;\n return `nl_pending_media_${createHash(\"sha256\").update(material).digest(\"hex\").slice(0, 24)}`;\n}\n\nfunction mediaKind(mimeType: string, declared = \"\"): string {\n const value = declared\n .toLowerCase()\n .replace(/^(?:input|output)_/, \"\")\n .replace(/_url$/, \"\");\n if (value === \"image_generation_call\") return \"image\";\n if (value === \"file\") return \"document\";\n if ([\"image\", \"audio\", \"video\", \"document\"].includes(value)) return value;\n if (mimeType.startsWith(\"image/\")) return \"image\";\n if (mimeType.startsWith(\"audio/\")) return \"audio\";\n if (mimeType.startsWith(\"video/\")) return \"video\";\n if (mimeType === \"application/pdf\" || mimeType.startsWith(\"text/\")) {\n return \"document\";\n }\n return \"media\";\n}\n\nfunction declaredMediaKind(value: string): string {\n const normalized = mediaKind(\"\", value);\n return normalized === \"media\" ? \"\" : normalized;\n}\n\nfunction canonicalMimeType(value: string): string {\n const mimeType = value.trim().split(\";\", 1)[0]?.toLowerCase() ?? \"\";\n return mimeType === \"image/jpg\"\n ? \"image/jpeg\"\n : mimeType === \"audio/mp3\"\n ? \"audio/mpeg\"\n : mimeType;\n}\n\ninterface DecodedBase64 {\n bytes?: Uint8Array;\n byteLength: number;\n sha256: string;\n}\n\nfunction rejectedMediaRecord(\n original: string,\n mimeType: string,\n declared: string,\n purpose: string,\n reason: string,\n source: \"inline\" | \"url\",\n): DiscoveredMedia {\n const fingerprint = createHash(\"sha256\")\n .update(original.slice(0, 4096))\n .update(String(original.length))\n .digest(\"hex\");\n return {\n original,\n record: {\n id: `nl_media_rejected_${fingerprint.slice(0, 24)}`,\n type: mediaKind(mimeType, declared),\n source,\n mime_type: mimeType || \"application/octet-stream\",\n purpose,\n state: \"failed\",\n safe_preview: `upload failed: validate/${reason}`,\n },\n };\n}\n\nfunction decodeBase64(value: string, retainBytes = true): DecodedBase64 | null {\n const normalized = value.replace(/\\s+/g, \"\");\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(normalized) || normalized.length % 4 === 1) {\n return null;\n }\n try {\n const padding = normalized.endsWith(\"==\") ? 2 : normalized.endsWith(\"=\") ? 1 : 0;\n const estimatedBytes = Math.floor((normalized.length * 3) / 4) - padding;\n if (retainBytes && estimatedBytes <= DEFAULT_MAX_TYPED_MEDIA_BYTES) {\n const bytes = Buffer.from(normalized, \"base64\");\n if (bytes.toString(\"base64\").replace(/=+$/, \"\") !== normalized.replace(/=+$/, \"\")) {\n return null;\n }\n return {\n bytes,\n byteLength: bytes.byteLength,\n sha256: createHash(\"sha256\").update(bytes).digest(\"hex\"),\n };\n }\n const digest = createHash(\"sha256\");\n let byteLength = 0;\n const chunkCharacters = 64 * 1024;\n for (let offset = 0; offset < normalized.length; offset += chunkCharacters) {\n const chunk = Buffer.from(normalized.slice(offset, offset + chunkCharacters), \"base64\");\n digest.update(chunk);\n byteLength += chunk.byteLength;\n }\n if (byteLength !== estimatedBytes) return null;\n return { byteLength, sha256: digest.digest(\"hex\") };\n } catch {\n return null;\n }\n}\n\nfunction inlineRecord(\n input: string | Uint8Array,\n mimeType: string,\n declared: string,\n purpose: string,\n retainBytes = true,\n): DiscoveredMedia | null {\n mimeType = canonicalMimeType(mimeType);\n let original: string | undefined;\n let binaryOriginal: Uint8Array | undefined;\n let bytes: Uint8Array | undefined;\n let byteLength: number;\n let sha256: string;\n if (typeof input === \"string\") {\n original = input;\n let encoded = input.trim();\n if (/^data:/i.test(encoded)) {\n const comma = encoded.indexOf(\",\");\n if (comma < 0) return null;\n const header = encoded.slice(5, comma);\n if (!header.toLowerCase().split(\";\").includes(\"base64\")) return null;\n mimeType = canonicalMimeType(header.split(\";\", 1)[0] || mimeType);\n encoded = encoded.slice(comma + 1);\n }\n if (encoded.length > MAX_ENCODED_MEDIA_CHARS) {\n return rejectedMediaRecord(\n original,\n mimeType,\n declared,\n purpose,\n \"payload_too_large\",\n \"inline\",\n );\n }\n const decoded = decodeBase64(encoded, retainBytes);\n if (!decoded) {\n return rejectedMediaRecord(\n original,\n mimeType,\n declared,\n purpose,\n \"invalid_inline_media\",\n \"inline\",\n );\n }\n bytes = decoded.bytes;\n byteLength = decoded.byteLength;\n sha256 = decoded.sha256;\n } else {\n binaryOriginal = input;\n byteLength = input.byteLength;\n sha256 = createHash(\"sha256\").update(input).digest(\"hex\");\n if (retainBytes && byteLength <= DEFAULT_MAX_TYPED_MEDIA_BYTES) {\n bytes = Uint8Array.from(input);\n }\n }\n const eligible =\n byteLength > DEFAULT_INLINE_MEDIA_BYTES && byteLength <= DEFAULT_MAX_TYPED_MEDIA_BYTES;\n const tooLarge = byteLength > DEFAULT_MAX_TYPED_MEDIA_BYTES;\n return {\n original,\n binaryOriginal,\n bytes,\n record: {\n id: `nl_media_${sha256.slice(0, 24)}`,\n type: mediaKind(mimeType, declared),\n source: \"inline\",\n mime_type: mimeType || \"application/octet-stream\",\n byte_length: byteLength,\n sha256,\n purpose,\n state: tooLarge ? \"failed\" : eligible ? \"pending-upload\" : \"inline\",\n ...(tooLarge\n ? { safe_preview: \"upload failed: validate/payload_too_large\" }\n : eligible\n ? { safe_preview: \"awaiting authenticated upload\" }\n : {}),\n },\n };\n}\n\nfunction referenceRecord(\n reference: string,\n mimeType: string,\n declared: string,\n purpose: string,\n): DiscoveredMedia | null {\n mimeType = canonicalMimeType(mimeType);\n if (reference.length > MAX_MEDIA_REFERENCE_CHARS) {\n return rejectedMediaRecord(\n reference,\n mimeType,\n declared,\n purpose,\n \"media_reference_too_large\",\n \"url\",\n );\n }\n let safeReference = reference;\n let isURLReference = false;\n const normalizedReference = reference.trim();\n const protocolRelative = normalizedReference.startsWith(\"//\");\n const relativeReference =\n !protocolRelative &&\n !/^[a-z][a-z\\d+.-]*:/i.test(normalizedReference) &&\n (normalizedReference.includes(\"/\") ||\n normalizedReference.includes(\"?\") ||\n normalizedReference.includes(\"#\"));\n try {\n const parsed = protocolRelative || relativeReference\n ? new URL(normalizedReference, \"https://neatlogs.invalid\")\n : new URL(normalizedReference);\n if (parsed.protocol.toLowerCase() === \"data:\") {\n return rejectedMediaRecord(\n reference,\n mimeType,\n declared,\n purpose,\n \"invalid_inline_media\",\n \"inline\",\n );\n }\n const hierarchical =\n protocolRelative ||\n relativeReference ||\n parsed.protocol === \"http:\" ||\n parsed.protocol === \"https:\" ||\n /^[a-z][a-z\\d+.-]*:\\/\\//i.test(normalizedReference) ||\n parsed.pathname.startsWith(\"/\");\n if (hierarchical) {\n isURLReference = true;\n parsed.username = \"\";\n parsed.password = \"\";\n parsed.search = \"\";\n parsed.hash = \"\";\n safeReference = protocolRelative\n ? `//${parsed.host}${parsed.pathname}`\n : relativeReference\n ? parsed.pathname\n : parsed.toString();\n } else if (parsed.protocol) {\n isURLReference = true;\n safeReference = parsed.protocol;\n }\n } catch {\n if (/^(?:\\/\\/|[a-z][a-z\\d+.-]*:)/i.test(normalizedReference)) {\n return rejectedMediaRecord(\n reference,\n mimeType,\n declared,\n purpose,\n \"invalid_media_reference\",\n \"url\",\n );\n }\n }\n const digest = createHash(\"sha256\").update(reference).digest(\"hex\");\n return {\n original: reference,\n record: {\n id: `nl_media_${digest.slice(0, 24)}`,\n type: mediaKind(mimeType, declared),\n source: isURLReference ? \"url\" : \"provider\",\n mime_type: mimeType || \"application/octet-stream\",\n reference: safeReference,\n purpose,\n state: \"available\",\n },\n };\n}\n\nfunction discoverMedia(\n value: unknown,\n purpose: string,\n retainBytes = true,\n): MediaDiscoveryResult {\n const found: DiscoveredMedia[] = [];\n const discoveredKeys = new Set<string>();\n let retainedBytes = 0;\n let truncated = false;\n const append = (item: DiscoveredMedia | null): void => {\n if (!item) return;\n if (found.length >= MAX_CAPTURED_MEDIA_REFERENCES) {\n truncated = true;\n return;\n }\n const key = `${item.record.id}:${item.record.mime_type}:${item.record.reference ?? \"\"}:${item.record.type}`;\n if (discoveredKeys.has(key)) return;\n discoveredKeys.add(key);\n if (item.bytes && item.record.state === \"pending-upload\") {\n if (retainedBytes + item.bytes.byteLength > DEFAULT_MAX_TYPED_MEDIA_BYTES) {\n item.bytes = undefined;\n item.record.state = \"failed\";\n item.record.safe_preview = \"upload failed: validate/pending_media_memory_limit\";\n } else {\n retainedBytes += item.bytes.byteLength;\n }\n }\n found.push(item);\n };\n const visited = new WeakSet<object>();\n let visitedNodes = 0;\n const visit = (node: any, inheritedDeclared = \"\", inheritedMimeType = \"\", depth = 0): void => {\n if (typeof node === \"string\" && /^\\s*data:/i.test(node)) {\n append(inlineRecord(node, inheritedMimeType, inheritedDeclared, purpose, retainBytes));\n return;\n }\n if (!node || typeof node !== \"object\") return;\n if (found.length >= MAX_CAPTURED_MEDIA_REFERENCES) {\n truncated = true;\n return;\n }\n if (depth > MAX_MEDIA_TRAVERSAL_DEPTH || visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n return;\n }\n if (visited.has(node)) return;\n visited.add(node);\n visitedNodes += 1;\n try {\n if (node instanceof Uint8Array) return;\n if (Array.isArray(node)) {\n for (const item of node) {\n if (visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) break;\n if (inheritedDeclared && (typeof item === \"string\" || item instanceof Uint8Array)) {\n const record =\n typeof item === \"string\" && /^(?:https?:|s3:|gs:|\\/\\/)/i.test(item)\n ? referenceRecord(item, inheritedMimeType, inheritedDeclared, purpose)\n : inlineRecord(item, inheritedMimeType, inheritedDeclared, purpose, retainBytes);\n append(record);\n } else {\n visit(item, inheritedDeclared, inheritedMimeType, depth + 1);\n }\n }\n return;\n }\n const entries: [string, unknown][] = Object.entries(node);\n const read = (key: string): unknown => entries.find(([name]) => name === key)?.[1];\n const declared = String(read(\"type\") ?? inheritedDeclared);\n const normalizedDeclared = declaredMediaKind(declared);\n const mediaDeclared = normalizedDeclared || declaredMediaKind(inheritedDeclared);\n let mimeType = canonicalMimeType(\n String(\n read(\"mime_type\") ??\n read(\"mimeType\") ??\n read(\"media_type\") ??\n read(\"mediaType\") ??\n inheritedMimeType,\n ),\n );\n const declaredFormat = read(\"format\") ?? read(\"output_format\") ?? read(\"outputFormat\");\n if (!mimeType && mediaDeclared && typeof declaredFormat === \"string\") {\n const format = declaredFormat.toLowerCase();\n mimeType = canonicalMimeType(\n mediaDeclared === \"document\" && format === \"pdf\"\n ? \"application/pdf\"\n : `${mediaDeclared}/${format}`,\n );\n }\n const imageUrl = read(\"image_url\");\n let image = imageUrl;\n if (imageUrl && typeof imageUrl === \"object\") {\n try {\n image = (imageUrl as Record<string, unknown>).url;\n } catch {\n image = undefined;\n }\n }\n if (typeof image === \"string\") {\n const record = /^\\s*data:/i.test(image)\n ? inlineRecord(image, mimeType, \"image\", purpose, retainBytes)\n : referenceRecord(image, mimeType, \"image\", purpose);\n append(record);\n }\n const audio = read(\"input_audio\") ?? read(\"inputAudio\");\n if (audio && typeof audio === \"object\" && typeof (audio as any).data === \"string\") {\n const format = String((audio as any).format ?? \"unknown\");\n const record = inlineRecord(\n (audio as any).data,\n mimeType || `audio/${format}`,\n \"audio\",\n purpose,\n retainBytes,\n );\n append(record);\n }\n const inline = read(\"inline_data\") ?? read(\"inlineData\");\n if (inline && typeof inline === \"object\" && typeof (inline as any).data === \"string\") {\n const record = inlineRecord(\n (inline as any).data,\n String((inline as any).mime_type ?? (inline as any).mimeType ?? mimeType),\n mediaDeclared,\n purpose,\n retainBytes,\n );\n append(record);\n }\n const fileData = read(\"file_data\") ?? read(\"fileData\");\n if (typeof fileData === \"string\") {\n const record = inlineRecord(\n fileData,\n mimeType,\n mediaDeclared || \"document\",\n purpose,\n retainBytes,\n );\n append(record);\n }\n const raw =\n read(\"data\") ??\n read(\"bytes\") ??\n read(\"b64_json\") ??\n (normalizedDeclared === \"image\" ? read(\"result\") : undefined);\n if ((typeof raw === \"string\" || raw instanceof Uint8Array) && (mediaDeclared || mimeType)) {\n const record = inlineRecord(raw, mimeType, mediaDeclared, purpose, retainBytes);\n append(record);\n }\n const reference =\n read(\"file_id\") ?? read(\"file_url\") ?? read(\"file_uri\") ?? read(\"fileUri\") ?? read(\"url\");\n if (\n typeof reference === \"string\" &&\n ([\"file\", \"url\"].includes(normalizedDeclared) || !!mediaDeclared || !!mimeType)\n ) {\n const record = /^\\s*data:/i.test(reference)\n ? inlineRecord(reference, mimeType, mediaDeclared || \"document\", purpose, retainBytes)\n : referenceRecord(reference, mimeType, mediaDeclared || \"document\", purpose);\n append(record);\n }\n for (const [key, item] of entries) {\n if (visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) break;\n const keyed = key\n .toLowerCase()\n .replace(/^input_/, \"\")\n .replace(/s$/, \"\");\n const childDeclared = declaredMediaKind(keyed) || mediaDeclared;\n let childMimeType = mimeType;\n if (!childMimeType && childDeclared && typeof declaredFormat === \"string\") {\n const format = declaredFormat.toLowerCase();\n childMimeType = canonicalMimeType(\n childDeclared === \"document\" && format === \"pdf\"\n ? \"application/pdf\"\n : `${childDeclared}/${format}`,\n );\n }\n visit(item, childDeclared, childMimeType, depth + 1);\n }\n } catch {\n return;\n }\n };\n visit(value);\n return { items: found, truncated };\n}\n\nfunction placeholder(record: MediaRecord): Record<string, unknown> {\n return {\n neatlogs_media: Object.fromEntries(\n Object.entries(record).filter(([key]) =>\n [\n \"id\",\n \"type\",\n \"source\",\n \"mime_type\",\n \"byte_length\",\n \"sha256\",\n \"purpose\",\n \"state\",\n \"reference\",\n \"content_encoding\",\n \"safe_preview\",\n \"upload_token\",\n ].includes(key),\n ),\n ),\n };\n}\n\nfunction sanitizedCopy(value: unknown, discovered: DiscoveredMedia[]): unknown {\n const replacements = new Map<string, unknown>();\n const largeReplacements: Array<[string, unknown]> = [];\n for (const item of discovered) {\n if (!item.original) continue;\n if (item.record.state === \"pending-upload\" || item.record.state === \"failed\") {\n const replacement = placeholder(item.record);\n if (item.original.length > MAX_MEDIA_REPLACEMENT_KEY_CHARS) {\n largeReplacements.push([item.original, replacement]);\n } else {\n replacements.set(item.original, replacement);\n }\n } else if (typeof item.record.reference === \"string\") {\n if (item.original.length > MAX_MEDIA_REPLACEMENT_KEY_CHARS) {\n largeReplacements.push([item.original, item.record.reference]);\n } else {\n replacements.set(item.original, item.record.reference);\n }\n }\n }\n const visited = new WeakMap<object, unknown>();\n let visitedNodes = 0;\n const clone = (node: any, depth = 0): any => {\n if (typeof node === \"string\") {\n const direct =\n node.length <= MAX_MEDIA_REPLACEMENT_KEY_CHARS ? replacements.get(node) : undefined;\n if (direct !== undefined) return direct;\n return largeReplacements.find(([original]) => original === node)?.[1] ?? node;\n }\n if (node instanceof Uint8Array) {\n const match = discovered.find(\n (item) =>\n item.binaryOriginal === node ||\n (item.bytes?.buffer === node.buffer && item.bytes.byteOffset === node.byteOffset),\n );\n return match && [\"pending-upload\", \"failed\"].includes(String(match.record.state))\n ? placeholder(match.record)\n : node;\n }\n if (!node || typeof node !== \"object\") return node;\n if (depth > MAX_MEDIA_TRAVERSAL_DEPTH || visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n return REDACTED_MEDIA_STRUCTURE;\n }\n const prior = visited.get(node);\n if (prior) return \"[CIRCULAR]\";\n visitedNodes += 1;\n if (Array.isArray(node)) {\n const result: unknown[] = [];\n visited.set(node, result);\n for (const item of node) {\n if (visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n result.push(REDACTED_MEDIA_STRUCTURE);\n break;\n }\n result.push(clone(item, depth + 1));\n }\n return result;\n }\n const result: Record<string, unknown> = {};\n visited.set(node, result);\n try {\n for (const [key, item] of Object.entries(node)) {\n if (visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n result.neatlogs_truncated = REDACTED_MEDIA_STRUCTURE;\n break;\n }\n result[key] = clone(item, depth + 1);\n }\n } catch {\n return REDACTED_MEDIA_STRUCTURE;\n }\n return result;\n };\n return clone(value);\n}\n\nexport function mediaReferences(value: unknown, purpose: string): MediaRecord[] {\n return discoverMedia(value, purpose, false).items.map(({ record }) =>\n record.state === \"pending-upload\"\n ? {\n ...record,\n state: \"failed\",\n safe_preview: \"upload unavailable: telemetry_uploads_disabled\",\n }\n : { ...record },\n );\n}\n\n/** Remove large inline bytes and URL credentials from a captured value. */\nexport function sanitizeMediaPayload(value: unknown, purpose = \"capture\"): unknown {\n try {\n const discovered = discoverMedia(value, purpose, false);\n return discovered.truncated\n ? REDACTED_MEDIA_STRUCTURE\n : sanitizedCopy(value, discovered.items);\n } catch {\n return REDACTED_MEDIA_STRUCTURE;\n }\n}\n\nexport interface CapturedMediaValue {\n value: unknown;\n count: number;\n}\n\n/** Capture typed media metadata from a stable index and return a telemetry-safe clone. */\nexport function captureMediaWithIndex(\n span: {\n setAttribute(name: string, value: string | number): unknown;\n isRecording?(): boolean;\n },\n prefix: string,\n value: unknown,\n purpose: string,\n mediaIndexOffset = 0,\n): CapturedMediaValue {\n let recording = false;\n try {\n recording = typeof span.isRecording !== \"function\" || span.isRecording();\n } catch {\n span.setAttribute(`${prefix}.media.capture_error`, \"media_capture_failed\");\n return { value: REDACTED_MEDIA_STRUCTURE, count: 0 };\n }\n const spanKey = canonicalSpan(span as object);\n const gate = mediaCaptureAvailability.get(spanKey);\n const uploadsAvailable = gate?.available ?? true;\n let discovery: MediaDiscoveryResult;\n try {\n discovery = discoverMedia(value, purpose, recording && uploadsAvailable);\n } catch {\n span.setAttribute(`${prefix}.media.capture_error`, \"media_capture_failed\");\n return { value: REDACTED_MEDIA_STRUCTURE, count: 0 };\n }\n discovery.items.forEach((item, index) => {\n const recordPrefix = `${prefix}.media.${mediaIndexOffset + index}`;\n if (item.record.state === \"pending-upload\") {\n if (!recording) {\n item.bytes = undefined;\n item.record.state = \"failed\";\n item.record.safe_preview = \"upload unavailable: span_not_recording\";\n } else if (!uploadsAvailable) {\n item.bytes = undefined;\n item.record.state = \"failed\";\n item.record.safe_preview = `upload unavailable: ${gate?.reason ?? \"telemetry_uploads_disabled\"}`;\n } else if (!item.bytes) {\n item.record.state = \"failed\";\n item.record.safe_preview = \"upload failed: validate/staged_payload_missing\";\n } else {\n const token = uploadToken(item.record);\n item.record.upload_token = token;\n const bucket = pendingBucket(spanKey);\n const duplicate = bucket.items.find(\n (candidate) =>\n candidate.sha256 === item.record.sha256 && candidate.mimeType === item.record.mime_type,\n );\n if (duplicate) {\n if (!duplicate.prefixes.includes(recordPrefix)) {\n duplicate.prefixes.push(recordPrefix);\n }\n } else if (bucket.account.owner.items >= DEFAULT_MAX_PENDING_MEDIA_ITEMS) {\n item.bytes = undefined;\n delete item.record.upload_token;\n item.record.state = \"failed\";\n item.record.safe_preview = \"upload failed: validate/pending_media_item_limit\";\n } else if (\n bucket.account.owner.bytes + item.bytes.byteLength >\n DEFAULT_MAX_TYPED_MEDIA_BYTES\n ) {\n item.bytes = undefined;\n delete item.record.upload_token;\n item.record.state = \"failed\";\n item.record.safe_preview = \"upload failed: validate/pending_media_memory_limit\";\n } else {\n bucket.account.owner.bytes += item.bytes.byteLength;\n bucket.account.owner.items += 1;\n bucket.account.bytes += item.bytes.byteLength;\n bucket.account.items += 1;\n bucket.items.push({\n bytes: item.bytes,\n prefixes: [recordPrefix],\n record: { ...item.record },\n token,\n sha256: String(item.record.sha256),\n byteLength: Number(item.record.byte_length),\n mimeType: String(item.record.mime_type),\n });\n }\n if (bucket.items.length === 0) {\n pendingBySpan.delete(span as object);\n pendingFinalizer?.unregister(bucket.unregisterToken);\n releasePendingAccount(bucket.account);\n }\n }\n }\n Object.entries(item.record).forEach(([key, field]) =>\n span.setAttribute(`${recordPrefix}.${key}`, field),\n );\n });\n return {\n value: discovery.truncated\n ? REDACTED_MEDIA_STRUCTURE\n : sanitizedCopy(value, discovery.items),\n count: discovery.items.length,\n };\n}\n\n/** Capture typed media metadata and return a telemetry-safe clone of the value. */\nexport function captureMedia(\n span: {\n setAttribute(name: string, value: string | number): unknown;\n isRecording?(): boolean;\n },\n prefix: string,\n value: unknown,\n purpose: string,\n): unknown {\n return captureMediaWithIndex(span, prefix, value, purpose).value;\n}\n\nexport function setMediaAttributes(\n span: { setAttribute(name: string, value: string | number): unknown },\n prefix: string,\n value: unknown,\n purpose: string,\n): void {\n captureMedia(span, prefix, value, purpose);\n}\n\n/** Sanitize media that reached a completed span through a generic integration. */\nexport function captureMediaInSnapshot(\n span: object,\n snapshot: Record<string, any>,\n uploadsAvailable: boolean,\n unavailableReason = \"telemetry_uploads_disabled\",\n): void {\n setMediaCaptureAvailability(span, uploadsAvailable, unavailableReason);\n const spanAttributes =\n snapshot.attributes && typeof snapshot.attributes === \"object\"\n ? snapshot.attributes\n : (snapshot.attributes = {});\n const setter = {\n isRecording: () => true,\n setAttribute(name: string, value: string | number) {\n spanAttributes[name] = value;\n },\n };\n aliasMediaCaptureSpan(setter, span);\n let mediaIndex = 0;\n\n const sanitizeAttributes = (attributes: unknown): void => {\n if (!attributes || typeof attributes !== \"object\" || Array.isArray(attributes)) return;\n for (const [key, original] of Object.entries(attributes)) {\n let value: unknown = original;\n let parsedJson = false;\n if (typeof original === \"string\") {\n if (!MEDIA_PAYLOAD_SIGNAL.test(original)) continue;\n const trimmed = original.trimStart();\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n try {\n value = JSON.parse(original);\n parsedJson = true;\n } catch {\n if (/data\\s*:\\s*(?:image|audio|video|application\\/pdf)/i.test(original)) {\n (attributes as Record<string, unknown>)[key] = REDACTED_MEDIA_STRUCTURE;\n }\n continue;\n }\n }\n }\n\n const purpose = key.includes(\"output\") ? \"output\" : \"input\";\n let safeValue: unknown;\n let count = 0;\n const sanitizeOnly = mediaIndex >= MAX_CAPTURED_MEDIA_REFERENCES;\n if (sanitizeOnly) {\n safeValue = sanitizeMediaPayload(value, purpose);\n } else {\n const captured = captureMediaWithIndex(\n setter,\n \"neatlogs.content\",\n value,\n purpose,\n mediaIndex,\n );\n safeValue = captured.value;\n count = captured.count;\n }\n mediaIndex += count;\n if (count === 0 && !sanitizeOnly) continue;\n const replacement =\n typeof original === \"string\" && (parsedJson || typeof safeValue !== \"string\")\n ? JSON.stringify(safeValue)\n : safeValue;\n if (replacement === original) continue;\n (attributes as Record<string, unknown>)[key] = replacement;\n }\n };\n\n sanitizeAttributes(spanAttributes);\n sanitizeAttributes(snapshot.resource?.attributes ?? snapshot.resource);\n if (Array.isArray(snapshot.events)) {\n for (const event of snapshot.events) sanitizeAttributes(event?.attributes);\n }\n if (Array.isArray(snapshot.links)) {\n for (const link of snapshot.links) sanitizeAttributes(link?.attributes);\n }\n}\n\nfunction safeFailure(error: unknown): { stage: string; reason: string } {\n if (!(error instanceof TelemetryUploadError)) {\n return { stage: \"upload\", reason: \"unexpected_error\" };\n }\n return {\n stage: error.stage,\n reason: /^[a-zA-Z0-9_.-]{1,64}$/.test(error.reasonCode)\n ? error.reasonCode\n : \"unsafe_reason_code\",\n };\n}\n\nfunction safeUnavailableReason(value: string): string {\n return /^[a-zA-Z0-9_.-]{1,64}$/.test(value) ? value : \"upload_authority_unavailable\";\n}\n\nfunction rewritePendingPlaceholder(\n attributes: Record<string, any>,\n item: PendingMedia,\n update: MediaRecord,\n): void {\n const matches = (value: Record<string, any>): boolean =>\n value.upload_token === item.token ||\n (value.id === item.record.id && value.sha256 === item.sha256);\n const applyUpdate = (value: Record<string, any>): Record<string, any> => {\n const after = { ...value, ...update };\n delete after.upload_token;\n if (after.state === \"available\") delete after.safe_preview;\n return after;\n };\n const seen = new WeakSet<object>();\n let visitedNodes = 0;\n const rewrite = (value: any, depth = 0): any => {\n if (typeof value === \"string\") {\n if (!value.includes(item.token) && !value.includes(String(item.record.id))) {\n return value;\n }\n if (value.length > MAX_MEDIA_REPLACEMENT_KEY_CHARS) {\n return REDACTED_MEDIA_STRUCTURE;\n }\n const trimmed = value.trimStart();\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) return value;\n try {\n const parsed = JSON.parse(value);\n const rewritten = rewrite(parsed);\n return rewritten === parsed ? value : JSON.stringify(rewritten);\n } catch {\n return value;\n }\n }\n if (!value || typeof value !== \"object\") return value;\n if (depth > MAX_MEDIA_TRAVERSAL_DEPTH || visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n return REDACTED_MEDIA_STRUCTURE;\n }\n if (seen.has(value)) return \"[CIRCULAR]\";\n seen.add(value);\n visitedNodes += 1;\n if (!Array.isArray(value) && matches(value)) return applyUpdate(value);\n let changed = false;\n const output = Array.isArray(value) ? [...value] : { ...value };\n for (const [key, child] of Object.entries(value)) {\n if (visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n return REDACTED_MEDIA_STRUCTURE;\n }\n const rewritten = rewrite(child, depth + 1);\n if (rewritten !== child) {\n (output as Record<string, any>)[key] = rewritten;\n changed = true;\n }\n }\n if (!Array.isArray(value)) {\n for (const prefix of item.prefixes) {\n const tokenKey = `${prefix}.upload_token`;\n const matchesFlat =\n value[tokenKey] === item.token ||\n (value[`${prefix}.id`] === item.record.id && value[`${prefix}.sha256`] === item.sha256);\n if (!matchesFlat) continue;\n delete (output as Record<string, any>)[tokenKey];\n for (const [field, fieldValue] of Object.entries(update)) {\n (output as Record<string, any>)[`${prefix}.${field}`] = fieldValue;\n }\n if (update.state === \"available\") {\n delete (output as Record<string, any>)[`${prefix}.safe_preview`];\n }\n changed = true;\n }\n }\n return changed ? output : value;\n };\n\n for (const [key, value] of Object.entries(attributes)) {\n attributes[key] = rewrite(value);\n }\n for (const prefix of item.prefixes) {\n const tokenKey = `${prefix}.upload_token`;\n const matchesFlat =\n attributes[tokenKey] === item.token ||\n (attributes[`${prefix}.id`] === item.record.id &&\n attributes[`${prefix}.sha256`] === item.sha256);\n if (!matchesFlat) continue;\n delete attributes[tokenKey];\n for (const [field, fieldValue] of Object.entries(update)) {\n attributes[`${prefix}.${field}`] = fieldValue;\n }\n if (update.state === \"available\") delete attributes[`${prefix}.safe_preview`];\n }\n}\n\nfunction mediaUploadTokens(value: unknown, requirePendingState: boolean): Set<string> {\n const tokens = new Set<string>();\n const seen = new WeakSet<object>();\n let visitedNodes = 0;\n const visit = (node: any, depth = 0): void => {\n if (typeof node === \"string\") {\n if (!node.includes(\"nl_pending_media_\")) return;\n if (!requirePendingState && /^nl_pending_media_[0-9a-f]{24}$/.test(node)) {\n tokens.add(node);\n }\n const trimmed = node.trimStart();\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) return;\n try {\n visit(JSON.parse(node), depth + 1);\n } catch {\n // Invalid JSON cannot authorize an out-of-band upload.\n }\n return;\n }\n if (!node || typeof node !== \"object\" || seen.has(node)) return;\n if (depth > MAX_MEDIA_TRAVERSAL_DEPTH || visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n return;\n }\n seen.add(node);\n visitedNodes += 1;\n if (\n !Array.isArray(node) &&\n (!requirePendingState || node.state === \"pending-upload\") &&\n typeof node.upload_token === \"string\"\n ) {\n tokens.add(node.upload_token);\n }\n if (!Array.isArray(node)) {\n for (const [key, token] of Object.entries(node)) {\n if (!key.endsWith(\".upload_token\") || typeof token !== \"string\") continue;\n const prefix = key.slice(0, -\".upload_token\".length);\n if (!requirePendingState || node[`${prefix}.state`] === \"pending-upload\") {\n tokens.add(token);\n }\n }\n }\n try {\n for (const child of Object.values(node)) {\n if (visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) break;\n visit(child, depth + 1);\n }\n } catch {\n return;\n }\n };\n visit(value);\n return tokens;\n}\n\nfunction scrubUploadTokens(value: unknown): unknown {\n const seen = new WeakMap<object, unknown>();\n let visitedNodes = 0;\n const rewrite = (node: any, depth = 0): any => {\n if (typeof node === \"string\") {\n if (!node.includes(\"nl_pending_media_\")) return node;\n const trimmed = node.trimStart();\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n try {\n if (node.length > MAX_MEDIA_REPLACEMENT_KEY_CHARS) {\n return REDACTED_MEDIA_STRUCTURE;\n }\n return JSON.stringify(rewrite(JSON.parse(node), depth + 1));\n } catch {\n // Fall through to remove any opaque token embedded in plain text.\n }\n }\n return node.replace(/nl_pending_media_[0-9a-f]{24}/g, \"[REDACTED_UPLOAD_TOKEN]\");\n }\n if (!node || typeof node !== \"object\") return node;\n if (depth > MAX_MEDIA_TRAVERSAL_DEPTH || visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n return REDACTED_MEDIA_STRUCTURE;\n }\n const prior = seen.get(node);\n if (prior) return \"[CIRCULAR]\";\n visitedNodes += 1;\n const output: any = Array.isArray(node) ? [] : {};\n seen.set(node, output);\n try {\n for (const [key, child] of Object.entries(node)) {\n if (visitedNodes >= MAX_MEDIA_TRAVERSAL_NODES) {\n return REDACTED_MEDIA_STRUCTURE;\n }\n if (key === \"upload_token\" || key.endsWith(\".upload_token\")) continue;\n output[key] = rewrite(child, depth + 1);\n }\n } catch {\n return REDACTED_MEDIA_STRUCTURE;\n }\n return output;\n };\n return rewrite(value);\n}\n\nasync function uploadWithinDeadline(\n authority: UploadAuthority,\n payload: UploadPayload,\n deadlineUnixMs: number,\n) {\n const remaining = deadlineUnixMs - Date.now();\n if (remaining <= 0) {\n throw new TelemetryUploadError(\"prepare\", \"media_export_deadline_exceeded\", true);\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n authority.upload(payload, { deadlineUnixMs }),\n new Promise<never>((_resolve, reject) => {\n timer = setTimeout(\n () => reject(new TelemetryUploadError(\"prepare\", \"media_export_deadline_exceeded\", true)),\n remaining,\n );\n timer.unref?.();\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\n/** Upload only media references retained by the accepted masked snapshot. */\nexport async function resolvePendingMediaUploads(\n span: object,\n attributes: Record<string, any>,\n authority: UploadAuthority,\n diagnostics?: DeliveryDiagnostics,\n): Promise<boolean> {\n const bucket = detachPendingBucket(span);\n const pending = bucket?.items ?? [];\n const deadlineUnixMs = Date.now() + DEFAULT_MEDIA_EXPORT_DEADLINE_MS;\n let failed = false;\n try {\n const retainedTokens = mediaUploadTokens(attributes, true);\n const presentTokens = mediaUploadTokens(attributes, false);\n for (const item of pending) {\n const retained = item.prefixes.filter(\n (prefix) =>\n attributes[`${prefix}.upload_token`] === item.token &&\n attributes[`${prefix}.state`] === \"pending-upload\",\n );\n const retainedCount = Math.max(retained.length, retainedTokens.has(item.token) ? 1 : 0);\n if (!retainedTokens.has(item.token)) {\n const tokenWasRetainedInInvalidState = presentTokens.has(item.token);\n if (tokenWasRetainedInInvalidState) {\n failed = true;\n diagnostics?.recordTypedMedia(\"failures\", Math.max(retainedCount, 1));\n diagnostics?.recordUploadFailure(\"validate\", \"masked_pending_state\");\n }\n rewritePendingPlaceholder(attributes, item, {\n state: \"failed\",\n safe_preview: tokenWasRetainedInInvalidState\n ? \"upload failed: validate/masked_pending_state\"\n : \"upload skipped: media reference removed by mask\",\n });\n continue;\n }\n if (!authority.available) {\n const unavailableReason = safeUnavailableReason(authority.unavailableReason);\n failed = true;\n diagnostics?.recordTypedMedia(\"unavailable\", retainedCount);\n diagnostics?.recordTypedMedia(\"failures\", retainedCount);\n diagnostics?.recordUploadFailure(\"prepare\", unavailableReason);\n const safePreview = `upload unavailable: ${unavailableReason}`;\n rewritePendingPlaceholder(attributes, item, {\n state: \"failed\",\n safe_preview: safePreview,\n });\n continue;\n }\n if (item.byteLength > Math.min(authority.maxPayloadBytes, DEFAULT_MAX_TYPED_MEDIA_BYTES)) {\n failed = true;\n diagnostics?.recordTypedMedia(\"failures\", retainedCount);\n diagnostics?.recordUploadFailure(\"validate\", \"payload_too_large\");\n const safePreview = \"upload failed: validate/payload_too_large\";\n rewritePendingPlaceholder(attributes, item, {\n state: \"failed\",\n safe_preview: safePreview,\n });\n continue;\n }\n if (!isSupportedTypedMediaMimeType(item.mimeType)) {\n failed = true;\n diagnostics?.recordTypedMedia(\"failures\", retainedCount);\n diagnostics?.recordUploadFailure(\"validate\", \"unsupported_mime_type\");\n const safePreview = \"upload failed: validate/unsupported_mime_type\";\n rewritePendingPlaceholder(attributes, item, {\n state: \"failed\",\n safe_preview: safePreview,\n });\n continue;\n }\n const payload: UploadPayload = {\n content: item.bytes,\n purpose: \"typed_media\",\n sha256: item.sha256,\n byteLength: item.byteLength,\n mimeType: item.mimeType,\n contentEncoding: \"identity\",\n idempotencyKey: `nl-ts-v1:typed_media:${item.sha256}:${item.mimeType}`,\n payloadSchema: \"neatlogs.media.v1\",\n };\n try {\n const receipt = assertReadyUploadReceipt(\n await uploadWithinDeadline(authority, payload, deadlineUnixMs),\n payload,\n );\n diagnostics?.recordTypedMedia(\"uploads\", retainedCount);\n rewritePendingPlaceholder(attributes, item, {\n id: receipt.reference.id,\n reference: receipt.reference.id,\n source: \"uploaded\",\n sha256: receipt.reference.sha256,\n byte_length: receipt.reference.byteLength,\n mime_type: receipt.reference.mimeType,\n purpose: receipt.reference.purpose,\n state: \"available\",\n content_encoding: receipt.reference.contentEncoding,\n });\n } catch (error) {\n failed = true;\n const failure = safeFailure(error);\n diagnostics?.recordTypedMedia(\"failures\", retainedCount);\n diagnostics?.recordUploadFailure(failure.stage, failure.reason);\n const safePreview = `upload failed: ${failure.stage}/${failure.reason}`;\n rewritePendingPlaceholder(attributes, item, {\n state: \"failed\",\n safe_preview: safePreview,\n });\n }\n }\n } finally {\n if (bucket) releasePendingAccount(bucket.account);\n const scrubbed = scrubUploadTokens(attributes);\n for (const key of Object.keys(attributes)) delete attributes[key];\n if (scrubbed && typeof scrubbed === \"object\" && !Array.isArray(scrubbed)) {\n Object.assign(attributes, scrubbed);\n }\n }\n return !failed;\n}\n\n/** Drop out-of-band bytes when a span is filtered or never exported. */\nexport function discardPendingMedia(span: object): void {\n const bucket = detachPendingBucket(span);\n if (bucket) releasePendingAccount(bucket.account);\n}\n\n/** Release all staged bytes owned by one SDK pipeline during shutdown. */\nexport function discardPendingMediaOwner(owner?: object): void {\n const state = pendingMediaOwners.get(owner ?? defaultPendingMediaOwner);\n if (!state) return;\n for (const account of [...state.accounts]) {\n const span = account.span.deref();\n if (span) {\n const bucket = pendingBySpan.get(span);\n if (bucket?.account === account) {\n pendingBySpan.delete(span);\n pendingFinalizer?.unregister(bucket.unregisterToken);\n }\n }\n releasePendingAccount(account);\n }\n pendingMediaOwners.delete(owner ?? defaultPendingMediaOwner);\n}\n","import { createHash } from \"node:crypto\";\n\nexport type UploadPurpose = \"typed_media\" | \"otlp_overflow\";\nexport type UploadContentEncoding = \"identity\" | \"gzip\";\nexport type UploadPayloadSchema = \"otlp.traces.v1\" | \"neatlogs.media.v1\";\n\nexport interface UploadPayload {\n content: Uint8Array;\n purpose: UploadPurpose;\n sha256: string;\n byteLength: number;\n mimeType: string;\n contentEncoding: UploadContentEncoding;\n idempotencyKey: string;\n payloadSchema?: UploadPayloadSchema;\n}\n\nexport interface UploadReference {\n id: string;\n purpose: UploadPurpose;\n sha256: string;\n byteLength: number;\n mimeType: string;\n contentEncoding: UploadContentEncoding;\n state: \"ready\";\n}\n\nexport interface UploadReceipt {\n uploadId: string;\n state: \"ready\";\n reference: UploadReference;\n}\n\nexport interface UploadRequestOptions {\n /** Absolute wall-clock deadline shared by the caller's enclosing export. */\n deadlineUnixMs?: number;\n}\n\nexport interface UploadAuthority {\n readonly available: boolean;\n readonly unavailableReason: string;\n readonly maxPayloadBytes: number;\n upload(payload: UploadPayload, options?: UploadRequestOptions): Promise<UploadReceipt>;\n}\n\nexport type UploadAuthorityOption = boolean | UploadAuthority;\n\nexport const DEFAULT_MAX_OTLP_OVERFLOW_BYTES = 20 * 1024 * 1024;\nexport const DEFAULT_MAX_TYPED_MEDIA_BYTES = 25 * 1024 * 1024;\nexport const DEFAULT_MAX_UPLOAD_BYTES = DEFAULT_MAX_TYPED_MEDIA_BYTES;\nexport const UPLOADS_DISABLED_REASON = \"telemetry_uploads_disabled\";\n\nexport class TelemetryUploadError extends Error {\n constructor(\n readonly stage: \"prepare\" | \"put\" | \"complete\" | \"validate\",\n readonly reasonCode: string,\n readonly retryable: boolean,\n ) {\n super(`telemetry upload ${stage} failed: ${reasonCode}`);\n this.name = \"TelemetryUploadError\";\n }\n}\n\nexport class DisabledUploadAuthority implements UploadAuthority {\n readonly available = false;\n readonly unavailableReason: string;\n readonly maxPayloadBytes: number;\n\n constructor(reason = UPLOADS_DISABLED_REASON, maxPayloadBytes = DEFAULT_MAX_UPLOAD_BYTES) {\n this.unavailableReason = reason;\n this.maxPayloadBytes = maxPayloadBytes;\n }\n\n async upload(_payload: UploadPayload): Promise<UploadReceipt> {\n throw new TelemetryUploadError(\"prepare\", this.unavailableReason, false);\n }\n}\n\ninterface PrepareRequest {\n version: 1;\n purpose: UploadPurpose;\n sha256: string;\n byte_length: number;\n mime_type: string;\n content_encoding: UploadContentEncoding;\n idempotency_key: string;\n payload_schema?: UploadPayloadSchema;\n}\n\ninterface WireReference {\n id: string;\n purpose: UploadPurpose;\n sha256: string;\n byte_length: number;\n mime_type: string;\n content_encoding: UploadContentEncoding;\n state: string;\n}\n\ninterface PreparedUpload {\n uploadId: string;\n state: \"prepared\";\n uploadUrl: string;\n uploadHeaders: Record<string, string>;\n reference: WireReference;\n}\n\ninterface ResumableUpload {\n uploadId: string;\n state: \"uploaded\" | \"validating\";\n reference: WireReference;\n}\n\ntype PrepareResult = PreparedUpload | ResumableUpload | UploadReceipt;\n\ninterface WireDiagnostic {\n stage: string;\n reasonCode: string;\n retryable: boolean;\n}\n\nexport interface HttpUploadAuthorityOptions {\n baseUrl: string;\n apiKey: string;\n fetch?: typeof globalThis.fetch;\n maxPayloadBytes?: number;\n deadlineMs?: number;\n attemptTimeoutMs?: number;\n maxAttempts?: number;\n}\n\nconst SHA256_PATTERN = /^[0-9a-f]{64}$/;\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst MIME_TYPE_PATTERN = /^[a-z0-9][a-z0-9!#$&^_.+-]*\\/[a-z0-9][a-z0-9!#$&^_.+-]*$/;\nconst TYPED_MEDIA_MIME_TYPES = new Set([\n \"application/pdf\",\n \"audio/flac\",\n \"audio/mpeg\",\n \"audio/ogg\",\n \"audio/wav\",\n \"image/gif\",\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n]);\nconst SAFE_REASON_PATTERN = /^[a-zA-Z0-9_.-]{1,64}$/;\nconst MAX_RESPONSE_BYTES = 64 * 1024;\nconst SENSITIVE_UPLOAD_HEADERS = new Set([\n \"authorization\",\n \"cookie\",\n \"proxy-authorization\",\n \"x-api-key\",\n]);\nconst HEADER_NAME_PATTERN = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;\n\nexport function isSupportedTypedMediaMimeType(value: string): boolean {\n return TYPED_MEDIA_MIME_TYPES.has(value);\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction requiredString(\n value: unknown,\n field: string,\n stage: TelemetryUploadError[\"stage\"],\n): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new TelemetryUploadError(stage, `invalid_${field}`, false);\n }\n return value;\n}\n\nfunction validateReference(\n value: unknown,\n payload: UploadPayload,\n expectedUploadId: string,\n expectedState: string,\n stage: TelemetryUploadError[\"stage\"],\n): WireReference {\n if (!isObject(value)) {\n throw new TelemetryUploadError(stage, \"invalid_reference\", false);\n }\n const reference: WireReference = {\n id: requiredString(value.id, \"reference_id\", stage),\n purpose: value.purpose as UploadPurpose,\n sha256: requiredString(value.sha256, \"reference_sha256\", stage),\n byte_length: value.byte_length as number,\n mime_type: requiredString(value.mime_type, \"reference_mime_type\", stage),\n content_encoding: value.content_encoding as UploadContentEncoding,\n state: requiredString(value.state, \"reference_state\", stage),\n };\n if (!UUID_PATTERN.test(reference.id)) {\n throw new TelemetryUploadError(stage, \"invalid_reference_id\", false);\n }\n if (\n reference.id !== expectedUploadId ||\n reference.purpose !== payload.purpose ||\n reference.sha256 !== payload.sha256 ||\n reference.byte_length !== payload.byteLength ||\n reference.mime_type !== payload.mimeType ||\n reference.content_encoding !== payload.contentEncoding ||\n reference.state !== expectedState\n ) {\n throw new TelemetryUploadError(stage, \"reference_mismatch\", false);\n }\n return reference;\n}\n\n/** Validate untrusted/injected authority output and return a credential-free clone. */\nexport function assertReadyUploadReceipt(value: unknown, payload: UploadPayload): UploadReceipt {\n if (!isObject(value)) {\n throw new TelemetryUploadError(\"complete\", \"invalid_receipt\", false);\n }\n const uploadId = requiredString(value.uploadId, \"upload_id\", \"complete\");\n if (!UUID_PATTERN.test(uploadId) || value.state !== \"ready\" || !isObject(value.reference)) {\n throw new TelemetryUploadError(\"complete\", \"invalid_receipt\", false);\n }\n const reference = value.reference;\n if (\n typeof reference.id !== \"string\" ||\n !UUID_PATTERN.test(reference.id) ||\n reference.id !== uploadId ||\n reference.state !== \"ready\" ||\n reference.purpose !== payload.purpose ||\n reference.sha256 !== payload.sha256 ||\n reference.byteLength !== payload.byteLength ||\n reference.mimeType !== payload.mimeType ||\n reference.contentEncoding !== payload.contentEncoding\n ) {\n throw new TelemetryUploadError(\"complete\", \"receipt_mismatch\", false);\n }\n return {\n uploadId,\n state: \"ready\",\n reference: {\n id: reference.id,\n purpose: reference.purpose as UploadPurpose,\n sha256: reference.sha256,\n byteLength: reference.byteLength,\n mimeType: reference.mimeType,\n contentEncoding: reference.contentEncoding as UploadContentEncoding,\n state: \"ready\",\n },\n };\n}\n\nfunction validatePayload(payload: UploadPayload, maxPayloadBytes: number): void {\n if (!(payload.content instanceof Uint8Array)) {\n throw new TelemetryUploadError(\"validate\", \"invalid_content\", false);\n }\n if (!SHA256_PATTERN.test(payload.sha256)) {\n throw new TelemetryUploadError(\"validate\", \"invalid_sha256\", false);\n }\n if (createHash(\"sha256\").update(payload.content).digest(\"hex\") !== payload.sha256) {\n throw new TelemetryUploadError(\"validate\", \"invalid_sha256\", false);\n }\n if (\n !Number.isSafeInteger(payload.byteLength) ||\n payload.byteLength <= 0 ||\n payload.byteLength !== payload.content.byteLength\n ) {\n throw new TelemetryUploadError(\"validate\", \"invalid_byte_length\", false);\n }\n if (!([\"typed_media\", \"otlp_overflow\"] as const).includes(payload.purpose)) {\n throw new TelemetryUploadError(\"validate\", \"invalid_purpose\", false);\n }\n const backendLimit =\n payload.purpose === \"otlp_overflow\"\n ? DEFAULT_MAX_OTLP_OVERFLOW_BYTES\n : DEFAULT_MAX_TYPED_MEDIA_BYTES;\n if (payload.byteLength > Math.min(maxPayloadBytes, backendLimit)) {\n throw new TelemetryUploadError(\"validate\", \"payload_too_large\", false);\n }\n if (!MIME_TYPE_PATTERN.test(payload.mimeType) || payload.mimeType.length > 160) {\n throw new TelemetryUploadError(\"validate\", \"invalid_mime_type\", false);\n }\n if (!([\"identity\", \"gzip\"] as const).includes(payload.contentEncoding)) {\n throw new TelemetryUploadError(\"validate\", \"invalid_content_encoding\", false);\n }\n if (!payload.idempotencyKey || payload.idempotencyKey.length > 128) {\n throw new TelemetryUploadError(\"validate\", \"invalid_idempotency_key\", false);\n }\n if (payload.purpose === \"typed_media\") {\n if (!TYPED_MEDIA_MIME_TYPES.has(payload.mimeType)) {\n throw new TelemetryUploadError(\"validate\", \"unsupported_mime_type\", false);\n }\n if (payload.contentEncoding !== \"identity\") {\n throw new TelemetryUploadError(\"validate\", \"unsupported_content_encoding\", false);\n }\n if (payload.payloadSchema && payload.payloadSchema !== \"neatlogs.media.v1\") {\n throw new TelemetryUploadError(\"validate\", \"invalid_payload_schema\", false);\n }\n } else if (\n payload.mimeType !== \"application/x-protobuf\" ||\n payload.payloadSchema !== \"otlp.traces.v1\"\n ) {\n throw new TelemetryUploadError(\"validate\", \"invalid_overflow_contract\", false);\n }\n}\n\nfunction retryableStatus(status: number): boolean {\n return status === 408 || status === 425 || status === 429 || status >= 500;\n}\n\nasync function withinDeadline<T>(\n promise: Promise<T>,\n deadline: number,\n stage: TelemetryUploadError[\"stage\"],\n cancel?: () => Promise<void>,\n): Promise<T> {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n void cancel?.().catch(() => undefined);\n throw new TelemetryUploadError(stage, \"deadline_exceeded\", true);\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_resolve, reject) => {\n timer = setTimeout(async () => {\n void cancel?.().catch(() => undefined);\n reject(new TelemetryUploadError(stage, \"deadline_exceeded\", true));\n }, remaining);\n timer.unref?.();\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\nasync function boundedJson(\n response: Response,\n deadline: number,\n stage: TelemetryUploadError[\"stage\"],\n): Promise<unknown> {\n const declared = Number(response.headers.get(\"content-length\") ?? 0);\n if (Number.isFinite(declared) && declared > MAX_RESPONSE_BYTES) {\n await response.body?.cancel().catch(() => undefined);\n throw new TelemetryUploadError(stage, \"response_too_large\", false);\n }\n const reader = response.body?.getReader();\n if (!reader) {\n const text = await withinDeadline(response.text(), deadline, stage);\n if (new TextEncoder().encode(text).byteLength > MAX_RESPONSE_BYTES) {\n throw new TelemetryUploadError(stage, \"response_too_large\", false);\n }\n try {\n return JSON.parse(text);\n } catch {\n throw new TelemetryUploadError(stage, \"invalid_json\", false);\n }\n }\n\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n while (true) {\n const { done, value } = await withinDeadline(reader.read(), deadline, stage, () =>\n reader.cancel(),\n );\n if (done) break;\n total += value.byteLength;\n if (total > MAX_RESPONSE_BYTES) {\n await reader.cancel();\n throw new TelemetryUploadError(stage, \"response_too_large\", false);\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n const bytes = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n try {\n return JSON.parse(new TextDecoder().decode(bytes));\n } catch {\n throw new TelemetryUploadError(stage, \"invalid_json\", false);\n }\n}\n\nfunction responseReason(value: unknown): string | undefined {\n return isObject(value) &&\n typeof value.reason_code === \"string\" &&\n SAFE_REASON_PATTERN.test(value.reason_code)\n ? value.reason_code\n : undefined;\n}\n\nfunction optionalDiagnostic(\n value: unknown,\n stage: TelemetryUploadError[\"stage\"],\n): WireDiagnostic | undefined {\n if (value === undefined) return undefined;\n if (\n !isObject(value) ||\n typeof value.stage !== \"string\" ||\n value.stage.length === 0 ||\n typeof value.reason_code !== \"string\" ||\n !SAFE_REASON_PATTERN.test(value.reason_code) ||\n typeof value.retryable !== \"boolean\"\n ) {\n throw new TelemetryUploadError(stage, \"invalid_diagnostic\", false);\n }\n return {\n stage: value.stage,\n reasonCode: value.reason_code,\n retryable: value.retryable,\n };\n}\n\n/** Authenticated implementation of the Phase 8 telemetry upload draft. */\nexport class HttpUploadAuthority implements UploadAuthority {\n readonly available = true;\n readonly unavailableReason = \"\";\n readonly maxPayloadBytes: number;\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly fetchImpl: typeof globalThis.fetch;\n private readonly deadlineMs: number;\n private readonly attemptTimeoutMs: number;\n private readonly maxAttempts: number;\n\n constructor(options: HttpUploadAuthorityOptions) {\n this.baseUrl = new URL(options.baseUrl).origin;\n this.apiKey = options.apiKey.trim();\n if (!this.apiKey) throw new TypeError(\"apiKey is required for upload authority\");\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== \"function\") {\n throw new TypeError(\"fetch is required for upload authority\");\n }\n this.fetchImpl = fetchImpl;\n this.maxPayloadBytes = options.maxPayloadBytes ?? DEFAULT_MAX_UPLOAD_BYTES;\n this.deadlineMs = options.deadlineMs ?? 15_000;\n this.attemptTimeoutMs = options.attemptTimeoutMs ?? 5_000;\n this.maxAttempts = options.maxAttempts ?? 2;\n if (!Number.isSafeInteger(this.maxPayloadBytes) || this.maxPayloadBytes <= 0) {\n throw new RangeError(\"maxPayloadBytes must be a positive safe integer\");\n }\n if (!Number.isFinite(this.deadlineMs) || this.deadlineMs <= 0) {\n throw new RangeError(\"deadlineMs must be positive\");\n }\n if (!Number.isFinite(this.attemptTimeoutMs) || this.attemptTimeoutMs <= 0) {\n throw new RangeError(\"attemptTimeoutMs must be positive\");\n }\n if (!Number.isSafeInteger(this.maxAttempts) || this.maxAttempts <= 0 || this.maxAttempts > 4) {\n throw new RangeError(\"maxAttempts must be an integer between 1 and 4\");\n }\n }\n\n async upload(payload: UploadPayload, options: UploadRequestOptions = {}): Promise<UploadReceipt> {\n validatePayload(payload, this.maxPayloadBytes);\n const deadline = Math.min(\n Date.now() + this.deadlineMs,\n options.deadlineUnixMs ?? Number.POSITIVE_INFINITY,\n );\n if (deadline <= Date.now()) {\n throw new TelemetryUploadError(\"prepare\", \"deadline_exceeded\", true);\n }\n const prepared = await this.prepare(payload, deadline);\n if (prepared.state === \"ready\") return prepared;\n if (prepared.state === \"prepared\") {\n await this.put(prepared, payload, deadline);\n }\n return this.complete(prepared, payload, deadline);\n }\n\n private async prepare(payload: UploadPayload, deadline: number): Promise<PrepareResult> {\n let lastError: TelemetryUploadError | undefined;\n for (let attempt = 0; attempt < this.maxAttempts; attempt += 1) {\n try {\n return await this.prepareAttempt(payload, deadline);\n } catch (error) {\n if (!(error instanceof TelemetryUploadError) || !error.retryable) throw error;\n lastError = error;\n }\n if (attempt + 1 < this.maxAttempts) {\n const delay = Math.min(100 * 2 ** attempt, Math.max(0, deadline - Date.now()));\n if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n throw lastError ?? new TelemetryUploadError(\"prepare\", \"request_failed\", true);\n }\n\n private async prepareAttempt(payload: UploadPayload, deadline: number): Promise<PrepareResult> {\n const body: PrepareRequest = {\n version: 1,\n purpose: payload.purpose,\n sha256: payload.sha256,\n byte_length: payload.byteLength,\n mime_type: payload.mimeType,\n content_encoding: payload.contentEncoding,\n idempotency_key: payload.idempotencyKey,\n ...(payload.payloadSchema ? { payload_schema: payload.payloadSchema } : {}),\n };\n const response = await this.request(\n \"prepare\",\n `${this.baseUrl}/v1/telemetry/uploads`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n body: JSON.stringify(body),\n credentials: \"omit\",\n redirect: \"error\",\n },\n deadline,\n new Set([200, 201, 202]),\n 1,\n );\n const data = await boundedJson(response, deadline, \"prepare\");\n if (!isObject(data)) {\n throw new TelemetryUploadError(\"prepare\", \"invalid_response\", false);\n }\n const diagnostic = optionalDiagnostic(data.diagnostic, \"prepare\");\n const uploadId = requiredString(data.upload_id, \"upload_id\", \"prepare\");\n if (!UUID_PATTERN.test(uploadId)) {\n throw new TelemetryUploadError(\"prepare\", \"invalid_upload_id\", false);\n }\n if (response.status === 200 && data.state === \"ready\") {\n const reference = validateReference(data.reference, payload, uploadId, \"ready\", \"prepare\");\n return {\n uploadId,\n state: \"ready\",\n reference: {\n id: reference.id,\n purpose: reference.purpose,\n sha256: reference.sha256,\n byteLength: reference.byte_length,\n mimeType: reference.mime_type,\n contentEncoding: reference.content_encoding,\n state: \"ready\",\n },\n };\n }\n if (data.state === \"uploaded\" || data.state === \"validating\") {\n if (response.status !== 200 && response.status !== 202) {\n throw new TelemetryUploadError(\"prepare\", \"invalid_response\", false);\n }\n const reference = validateReference(\n data.reference,\n payload,\n uploadId,\n String(data.state),\n \"prepare\",\n );\n return { uploadId, state: data.state, reference };\n }\n if (data.state === \"rejected\") {\n validateReference(data.reference, payload, uploadId, \"rejected\", \"prepare\");\n throw new TelemetryUploadError(\"prepare\", diagnostic?.reasonCode ?? \"upload_rejected\", false);\n }\n if (response.status !== 201 || data.state !== \"prepared\" || !isObject(data.upload)) {\n throw new TelemetryUploadError(\n \"prepare\",\n diagnostic?.reasonCode ?? \"invalid_response\",\n diagnostic?.retryable ?? false,\n );\n }\n const expiresAt = requiredString(data.expires_at, \"expires_at\", \"prepare\");\n const expires = Date.parse(expiresAt);\n if (!Number.isFinite(expires) || expires <= Date.now()) {\n throw new TelemetryUploadError(\"prepare\", \"invalid_expiry\", false);\n }\n if (data.upload.method !== \"PUT\") {\n throw new TelemetryUploadError(\"prepare\", \"invalid_upload_method\", false);\n }\n const uploadUrl = requiredString(data.upload.url, \"upload_url\", \"prepare\");\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(uploadUrl);\n } catch {\n throw new TelemetryUploadError(\"prepare\", \"invalid_upload_url\", false);\n }\n if (parsedUrl.protocol !== \"https:\" || parsedUrl.username || parsedUrl.password) {\n throw new TelemetryUploadError(\"prepare\", \"invalid_upload_url\", false);\n }\n if (!isObject(data.upload.headers)) {\n throw new TelemetryUploadError(\"prepare\", \"invalid_upload_headers\", false);\n }\n const uploadHeaders: Record<string, string> = Object.create(null);\n for (const [key, value] of Object.entries(data.upload.headers)) {\n if (\n typeof value !== \"string\" ||\n !HEADER_NAME_PATTERN.test(key) ||\n /[\\r\\n]/.test(value) ||\n SENSITIVE_UPLOAD_HEADERS.has(key.toLowerCase())\n ) {\n throw new TelemetryUploadError(\"prepare\", \"invalid_upload_headers\", false);\n }\n uploadHeaders[key] = value;\n }\n const reference = validateReference(data.reference, payload, uploadId, \"prepared\", \"prepare\");\n return { uploadId, state: \"prepared\", uploadUrl, uploadHeaders, reference };\n }\n\n private async put(\n prepared: PreparedUpload,\n payload: UploadPayload,\n deadline: number,\n ): Promise<void> {\n const response = await this.request(\n \"put\",\n prepared.uploadUrl,\n {\n method: \"PUT\",\n headers: prepared.uploadHeaders,\n body: payload.content,\n credentials: \"omit\",\n redirect: \"error\",\n },\n deadline,\n );\n try {\n void response.body?.cancel().catch(() => undefined);\n } catch {\n // A successful object PUT is authoritative; cleanup must not trigger a retry.\n }\n }\n\n private async complete(\n prepared: PreparedUpload | ResumableUpload,\n payload: UploadPayload,\n deadline: number,\n ): Promise<UploadReceipt> {\n let lastError: TelemetryUploadError | undefined;\n for (let attempt = 0; attempt < this.maxAttempts; attempt += 1) {\n try {\n return await this.completeAttempt(prepared, payload, deadline);\n } catch (error) {\n if (!(error instanceof TelemetryUploadError) || !error.retryable) throw error;\n lastError = error;\n }\n if (attempt + 1 < this.maxAttempts) {\n const delay = Math.min(100 * 2 ** attempt, Math.max(0, deadline - Date.now()));\n if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n throw lastError ?? new TelemetryUploadError(\"complete\", \"request_failed\", true);\n }\n\n private async completeAttempt(\n prepared: PreparedUpload | ResumableUpload,\n payload: UploadPayload,\n deadline: number,\n ): Promise<UploadReceipt> {\n const response = await this.request(\n \"complete\",\n `${this.baseUrl}/v1/telemetry/uploads/${encodeURIComponent(prepared.uploadId)}/complete`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n body: JSON.stringify({\n sha256: payload.sha256,\n byte_length: payload.byteLength,\n }),\n credentials: \"omit\",\n redirect: \"error\",\n },\n deadline,\n new Set([200, 202]),\n 1,\n );\n const data = await boundedJson(response, deadline, \"complete\");\n if (!isObject(data)) {\n throw new TelemetryUploadError(\"complete\", \"invalid_response\", false);\n }\n const diagnostic = optionalDiagnostic(data.diagnostic, \"complete\");\n if (data.upload_id !== prepared.uploadId) {\n throw new TelemetryUploadError(\"complete\", \"upload_id_mismatch\", false);\n }\n if (![\"ready\", \"uploaded\", \"validating\", \"rejected\"].includes(String(data.state))) {\n throw new TelemetryUploadError(\"complete\", \"invalid_state\", false);\n }\n const reference = validateReference(\n data.reference,\n payload,\n prepared.uploadId,\n String(data.state),\n \"complete\",\n );\n if (data.state !== \"ready\") {\n const reason =\n diagnostic?.reasonCode ??\n (data.state === \"uploaded\" || data.state === \"validating\"\n ? \"validation_pending\"\n : \"upload_rejected\");\n throw new TelemetryUploadError(\n \"complete\",\n reason,\n diagnostic?.retryable ?? (data.state === \"uploaded\" || data.state === \"validating\"),\n );\n }\n return {\n uploadId: prepared.uploadId,\n state: \"ready\",\n reference: {\n id: reference.id,\n purpose: reference.purpose,\n sha256: reference.sha256,\n byteLength: reference.byte_length,\n mimeType: reference.mime_type,\n contentEncoding: reference.content_encoding,\n state: \"ready\",\n },\n };\n }\n\n private async request(\n stage: \"prepare\" | \"put\" | \"complete\",\n url: string,\n init: RequestInit,\n deadline: number,\n expectedStatuses?: ReadonlySet<number>,\n attemptLimit = this.maxAttempts,\n parseErrorBody = stage !== \"put\",\n ): Promise<Response> {\n let lastError: TelemetryUploadError | undefined;\n for (let attempt = 0; attempt < attemptLimit; attempt += 1) {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n throw new TelemetryUploadError(stage, \"deadline_exceeded\", true);\n }\n const controller = new AbortController();\n const timer = setTimeout(\n () => controller.abort(),\n Math.min(remaining, this.attemptTimeoutMs),\n );\n timer.unref?.();\n try {\n const response = await this.fetchImpl(url, {\n ...init,\n signal: controller.signal,\n });\n const accepted = expectedStatuses\n ? expectedStatuses.has(response.status)\n : response.status >= 200 && response.status < 300;\n if (accepted) return response;\n let retryable = retryableStatus(response.status);\n let reason = `http_${response.status}`;\n if (parseErrorBody) {\n try {\n const errorBody = await boundedJson(response, deadline, stage);\n reason = responseReason(errorBody) ?? reason;\n if (isObject(errorBody) && typeof errorBody.retryable === \"boolean\") {\n retryable = errorBody.retryable;\n }\n } catch {\n // HTTP status remains authoritative when an error body is malformed.\n }\n } else {\n await response.body?.cancel().catch(() => undefined);\n }\n lastError = new TelemetryUploadError(stage, reason, retryable);\n if (!retryable) throw lastError;\n } catch (error) {\n if (error instanceof TelemetryUploadError && !error.retryable) throw error;\n lastError =\n error instanceof TelemetryUploadError\n ? error\n : new TelemetryUploadError(\n stage,\n controller.signal.aborted ? \"timeout\" : \"network_error\",\n true,\n );\n } finally {\n clearTimeout(timer);\n }\n if (attempt + 1 < attemptLimit) {\n const delay = Math.min(100 * 2 ** attempt, Math.max(0, deadline - Date.now()));\n if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n throw lastError ?? new TelemetryUploadError(stage, \"request_failed\", true);\n }\n}\n\nexport function isUploadAuthority(value: unknown): value is UploadAuthority {\n return (\n isObject(value) &&\n typeof value.available === \"boolean\" &&\n typeof value.unavailableReason === \"string\" &&\n Number.isSafeInteger(value.maxPayloadBytes) &&\n (value.maxPayloadBytes as number) > 0 &&\n typeof value.upload === \"function\"\n );\n}\n\nexport function uploadsEnabledFromEnv(value: string | undefined): boolean {\n return [\"true\", \"1\", \"yes\"].includes((value ?? \"\").trim().toLowerCase());\n}\n\nexport function resolveUploadAuthority(\n option: UploadAuthorityOption | undefined,\n envValue: string | undefined,\n baseUrl: string,\n apiKey: string,\n): UploadAuthority {\n if (isUploadAuthority(option)) return option;\n const enabled = typeof option === \"boolean\" ? option : uploadsEnabledFromEnv(envValue);\n return enabled ? new HttpUploadAuthority({ baseUrl, apiKey }) : new DisabledUploadAuthority();\n}\n","/**\n * Auto-root for direct-provider wrappers.\n *\n * The backend only renders a trace once it contains a *parentless* span of a\n * root-eligible kind (WORKFLOW / CHAIN / AGENT / MCP_TOOL / LLM). Direct-provider\n * wrappers may emit either a root-eligible LLM span or a non-root span\n * (EMBEDDING / TOOL). A bare non-root call still needs a workflow parent so the\n * trace can finalize.\n *\n * `getProviderTracer(name)` returns a Tracer facade used *only* by those\n * direct-provider wrappers: when `startSpan` would otherwise produce a\n * parentless, non-root span, it transparently opens a WORKFLOW root (named\n * after the configured `workflowName`) and ends it when the provider span\n * ends. Every wrapper path — non-streaming, streaming finalize, error —\n * funnels through `span.end()`, so wrapping `end()` covers them all with no\n * changes to the wrappers' streaming code.\n *\n * Framework wrappers (langchain, mastra, openai-agents, ai-sdk, ...) keep\n * using `trace.getTracer(...)` directly — they already emit their own root and\n * thread context explicitly, so auto-root must never fire for them.\n */\n\nimport {\n trace as otelTrace,\n type Tracer,\n type Span,\n type Context,\n type SpanOptions,\n} from '@opentelemetry/api';\n\nimport { getSessionConfig } from './context.js';\nimport { applySessionAttributes } from './session.js';\nimport { applyEndUserAttributes } from './end-user.js';\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n getActiveNeatlogsSpan,\n withNeatlogsSpan,\n} from './provider.js';\nimport { getActiveClient } from './active-client.js';\nimport { aliasMediaCaptureSpan } from './media.js';\n\nconst boundAutoRoots = new WeakMap<object, Span>();\n\n// A parentless span of one of these kinds already satisfies the backend's\n// root requirement, so it must NOT be wrapped in another root.\nconst ROOT_KINDS = new Set(['workflow', 'chain', 'agent', 'mcp_tool', 'llm']);\n\nfunction autoRootEnabled(): boolean {\n const val = (process.env.NEATLOGS_AUTO_ROOT ?? '').trim().toLowerCase();\n return !['false', '0', 'no', 'off'].includes(val);\n}\n\nfunction resolveRootWorkflowName(): string {\n const clientName = getActiveClient()?.workflowName;\n if (typeof clientName === 'string' && clientName.trim()) return clientName;\n try {\n const name = getSessionConfig()?.workflowName;\n if (typeof name === 'string' && name.trim()) return name;\n } catch {\n /* ignore */\n }\n return 'workflow';\n}\n\n/**\n * Stamp request-scoped identify() identity onto a freshly-created auto-root.\n * The auto-root IS the trace root, and wrapper-only code has no user-controlled\n * root to put trace()/span() args on, so identity comes purely from the\n * identify() context (passed undefined per-call values fall back to it).\n */\nfunction stampRootIdentity(root: Span): void {\n applySessionAttributes(root, undefined, true);\n applyEndUserAttributes(root, undefined, undefined, true);\n}\n\n/**\n * Wrap a provider span so that ending it also ends the auto-created WORKFLOW\n * root. A Proxy keeps this transparent across OTel versions: every property /\n * method except `end` passes straight through to the child span.\n */\nexport function bindSpanToAutoRoot(child: Span, root: Span | undefined): Span {\n if (!root) return child;\n let ended = false;\n const proxy = new Proxy(child, {\n get(target, prop, _receiver) {\n if (prop === 'end') {\n return (...args: any[]): void => {\n if (ended) return;\n ended = true;\n try {\n (target.end as (...a: any[]) => void)(...args);\n } finally {\n try {\n root.end();\n } catch {\n /* ignore */\n }\n }\n };\n }\n const value = Reflect.get(target, prop, target);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n boundAutoRoots.set(proxy, root);\n aliasMediaCaptureSpan(proxy, child);\n return proxy;\n}\n\n/**\n * Self-root helper for callback/event-driven handlers (LangChain, etc.).\n *\n * A callback handler builds its own parent context per run-id rather than going\n * through {@link AutoRootTracer}. When a run BEGINS with a non-root kind (a bare\n * `llm.invoke()` fires the LLM callback with no chain above it; a standalone\n * tool/retriever similarly), the span it creates is parentless and non-root, so\n * the backend can't anchor the trace and it never renders. Call this when there\n * is no LangChain parent: if the kind is non-root and nothing is actively\n * recording in `baseCtx`, it opens a WORKFLOW root and returns it plus the\n * child context to create the span in. The caller MUST end the returned\n * `root` after the child span ends (see {@link endAutoRoot}).\n *\n * Returns `{ root, ctx }` when a root was opened, or `{ root: undefined, ctx: baseCtx }`\n * when no auto-root is needed (root-eligible kind, already-recording parent, or\n * disabled).\n */\nexport function maybeOpenAutoRoot(\n tracer: Tracer,\n kind: string,\n baseCtx: Context,\n): { root: Span | undefined; ctx: Context } {\n const k = String(kind ?? '').toLowerCase();\n // A foreign provider's span must never count as our parent.\n const existing = getActiveNeatlogsSpan();\n if (\n !autoRootEnabled() ||\n ROOT_KINDS.has(k) ||\n (existing !== undefined && existing.isRecording())\n ) {\n return { root: undefined, ctx: baseCtx };\n }\n const root = tracer.startSpan(\n resolveRootWorkflowName(),\n { attributes: { 'neatlogs.span.kind': 'workflow', 'neatlogs.auto_root': true } },\n baseCtx,\n );\n stampRootIdentity(root);\n return { root, ctx: otelTrace.setSpan(baseCtx, root) };\n}\n\n/** End an auto-root opened by {@link maybeOpenAutoRoot}. Safe on undefined. */\nexport function endAutoRoot(root: Span | undefined): void {\n if (!root) return;\n try {\n root.end();\n } catch {\n /* ignore */\n }\n}\n\nclass AutoRootTracer implements Tracer {\n constructor(private readonly _tracer: Tracer) {}\n\n startSpan(name: string, options?: SpanOptions, context?: Context): Span {\n const kind = String(\n (options?.attributes as Record<string, unknown> | undefined)?.[\n 'neatlogs.span.kind'\n ] ?? '',\n ).toLowerCase();\n\n // Parent from our private context, never the foreign global.\n const hasExplicitContext = context !== undefined;\n const ctx = context ?? getNeatlogsParentContext();\n const parent = getActiveNeatlogsSpan();\n const isParentless =\n !hasExplicitContext && !(parent !== undefined && parent.isRecording());\n const needsRoot =\n autoRootEnabled() &&\n !ROOT_KINDS.has(kind) &&\n isParentless;\n\n if (!needsRoot) {\n const span = this._tracer.startSpan(name, options, ctx);\n if (isParentless && ROOT_KINDS.has(kind)) stampRootIdentity(span);\n return span;\n }\n\n const root = this._tracer.startSpan(\n resolveRootWorkflowName(),\n { attributes: { 'neatlogs.span.kind': 'workflow', 'neatlogs.auto_root': true } },\n ctx,\n );\n stampRootIdentity(root);\n const childCtx = otelTrace.setSpan(ctx, root);\n const child = this._tracer.startSpan(name, options, childCtx);\n return bindSpanToAutoRoot(child, root);\n }\n\n startActiveSpan = ((name: string, ...args: any[]) => {\n const callback = args.at(-1);\n if (typeof callback !== 'function') {\n throw new TypeError('startActiveSpan requires a callback');\n }\n const options = args.length >= 2 ? args[0] : undefined;\n const parentContext =\n args.length >= 3 ? args[1] : getNeatlogsParentContext();\n const span = args.length >= 3\n ? this.startSpan(name, options, parentContext)\n : this.startSpan(name, options);\n return withNeatlogsSpan(\n span,\n () => callback(span),\n parentContext,\n boundAutoRoots.get(span as object),\n );\n }) as Tracer['startActiveSpan'];\n}\n\n/**\n * Tracer for direct-provider wrappers (wrapOpenAI, wrapAnthropic, ...).\n * Identical to `trace.getTracer(name)` but adds transparent auto-root so a\n * bare `wrapOpenAI(new OpenAI())` renders a trace without a manual `span()` /\n * `trace()` wrapper. Do NOT use for framework wrappers.\n */\nexport function getProviderTracer(name: string): Tracer {\n // Resolve from the private provider.\n return new AutoRootTracer(getNeatlogsTracer(name));\n}\n","export type NeatlogsConfigurationErrorCode =\n | 'UNKNOWN_INIT_OPTION'\n | 'UNSUPPORTED_INSTRUMENTATIONS'\n | 'UNSUPPORTED_SPAN_KIND'\n | 'CONFLICTING_INIT'\n | 'INVALID_ENDPOINT';\n\n/** A caller-actionable SDK configuration failure. */\nexport class NeatlogsConfigurationError extends TypeError {\n readonly code: NeatlogsConfigurationErrorCode;\n readonly option: string;\n\n constructor(\n code: NeatlogsConfigurationErrorCode,\n option: string,\n message: string,\n ) {\n super(message);\n this.name = 'NeatlogsConfigurationError';\n this.code = code;\n this.option = option;\n }\n}\n","/**\n * Core span decoration utilities.\n * Provides the low-level wrapping logic used by span() and Span().\n */\n\nimport {\n ROOT_CONTEXT,\n SpanStatusCode,\n type Span as OtelSpan,\n} from \"@opentelemetry/api\";\nimport { getLogger } from \"../core/logger.js\";\nimport { registerMask } from \"../core/mask.js\";\nimport { applyEndUserAttributes, isRootSpan } from \"../core/end-user.js\";\nimport { applySessionAttributes } from \"../core/session.js\";\nimport {\n captureMedia,\n captureMediaWithIndex,\n sanitizeMediaPayload,\n} from \"../core/media.js\";\nimport {\n getNeatlogsTracer,\n getNeatlogsParentContext,\n withNeatlogsSpan,\n} from \"../core/provider.js\";\nimport {\n bindSpanToAutoRoot,\n maybeOpenAutoRoot,\n} from \"../core/auto-root.js\";\nimport type { SpanOptions, MaskFunction } from \"../types.js\";\nimport {\n DEFAULT_MAX_SEMANTIC_STREAM_EVENTS,\n DEFAULT_MAX_STREAM_CAPTURE_BYTES,\n utf8ByteLength,\n} from \"../constants.js\";\n\nconst logger = getLogger();\nconst TRACER_NAME = \"neatlogs\";\nconst STREAM_CAPTURE_TRUNCATED = \"[TRUNCATED_STREAM_OUTPUT]\";\n\n/** Safely serialize any value to JSON string. */\nexport function safeJsonDumps(value: any): string {\n try {\n return JSON.stringify(value, (_key, val) => {\n if (typeof val === \"bigint\") return val.toString();\n if (val instanceof Error)\n return { message: val.message, name: val.name, stack: val.stack };\n if (typeof val === \"function\")\n return `[Function: ${val.name || \"anonymous\"}]`;\n return val;\n });\n } catch {\n return String(value);\n }\n}\n\n/** Serialize an object for span attributes. Handles toJSON(), plain objects, primitives. */\nexport function serializeObj(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n // Preserve binary views until media capture can classify and sanitize them.\n // JSON.stringify retains the previous numeric-object representation for\n // ordinary, non-media Uint8Array values.\n if (obj instanceof Uint8Array) return obj;\n if (\n typeof obj === \"string\" ||\n typeof obj === \"number\" ||\n typeof obj === \"boolean\"\n )\n return obj;\n if (typeof obj.toJSON === \"function\") return obj.toJSON();\n if (Array.isArray(obj)) return obj.map(serializeObj);\n if (typeof obj === \"object\") {\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = serializeObj(value);\n }\n return result;\n }\n return String(obj);\n}\n\n/** Set common span attributes from options. */\nexport function setCommonSpanAttrs(span: OtelSpan, opts: SpanOptions): void {\n if (opts.kind) {\n span.setAttribute(\"openinference.span.kind\", opts.kind);\n }\n if (opts.internal) {\n span.setAttribute(\"neatlogs.internal\", true);\n }\n if (opts.description) {\n span.setAttribute(\"neatlogs.description\", opts.description);\n }\n if (opts.mask) {\n const maskId = registerMask(opts.mask);\n span.setAttribute(\"neatlogs.mask_id\", maskId);\n }\n}\n\nexport interface DecorateSpanOptions extends SpanOptions {\n /** Override the span name (defaults to function name). */\n spanName?: string;\n /** Post-process callback after the function returns. */\n postprocessResult?: (\n span: OtelSpan,\n result: any,\n boundInputs: Record<string, any>,\n ) => void;\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n typeof (value as { then?: unknown }).then === \"function\"\n );\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n typeof (value as { [Symbol.asyncIterator]?: unknown })[\n Symbol.asyncIterator\n ] === \"function\"\n );\n}\n\nfunction isSyncIterator(\n value: unknown,\n): value is Iterator<unknown> & Iterable<unknown> {\n return (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n typeof (value as { next?: unknown }).next === \"function\" &&\n typeof (value as { [Symbol.iterator]?: unknown })[Symbol.iterator] ===\n \"function\"\n );\n}\n\nfunction isReadableStreamLike(value: unknown): value is {\n getReader: (...args: any[]) => any;\n cancel: (...args: any[]) => Promise<unknown>;\n} {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as { getReader?: unknown }).getReader === \"function\" &&\n typeof (value as { cancel?: unknown }).cancel === \"function\"\n );\n}\n\n/**\n * Core wrapper factory that creates an instrumented version of a function.\n * This is the low-level building block used by span() and Span().\n */\nexport function decorateSpan<TArgs extends any[], TReturn>(\n opts: DecorateSpanOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n const spanName = opts.spanName ?? opts.name ?? (fn.name || \"anonymous\");\n const captureInput = opts.captureInput !== false;\n const captureOutput = opts.captureOutput !== false;\n const mediaPrefix = (direction: \"input\" | \"output\"): string => {\n const kind = String(opts.kind ?? \"span\").trim().toLowerCase() || \"span\";\n return `neatlogs.${kind}.${direction}`;\n };\n\n const wrapped = (...args: TArgs): any => {\n // Resolve the tracer at CALL time, not definition time: a decorator applied\n // before init() would otherwise capture the no-op global provider forever\n // and emit zero spans once the private provider is configured.\n const tracer = getNeatlogsTracer(TRACER_NAME);\n // End-user belongs to the trace root only. Capture root status BEFORE the\n // span is created (once it's active, it would be the \"current\" span).\n const isRoot = isRootSpan();\n // Parent from our private span store; a root decorated function anchors a\n // fresh trace under ROOT_CONTEXT.\n const parentContext = isRoot ? ROOT_CONTEXT : getNeatlogsParentContext();\n const autoRoot = maybeOpenAutoRoot(\n tracer,\n String(opts.kind ?? \"\"),\n parentContext,\n );\n if (autoRoot.root) {\n applySessionAttributes(autoRoot.root, opts.sessionId, true, {\n parentSessionId: opts.parentSessionId,\n sessionFeatureName: opts.sessionFeatureName,\n sessionEntryPoint: opts.sessionEntryPoint,\n });\n applyEndUserAttributes(\n autoRoot.root,\n opts.endUserId,\n opts.endUserMetadata,\n true,\n );\n }\n const span = bindSpanToAutoRoot(\n tracer.startSpan(spanName, {}, autoRoot.ctx),\n autoRoot.root,\n );\n return withNeatlogsSpan(span, () => {\n let finished = false;\n let streamInterrupted = false;\n const streamChunks: any[] = [];\n let totalStreamChunks = 0;\n let retainedStreamBytes = 0;\n let droppedStreamChunks = 0;\n let streamMediaCount = 0;\n\n const captureResult = (result: any): void => {\n if (captureOutput) {\n try {\n const serialized = serializeObj(result);\n const captured = captureMedia(\n span,\n mediaPrefix(\"output\"),\n serialized,\n \"output\",\n );\n span.setAttribute(\n \"output.value\",\n safeJsonDumps(captured),\n );\n } catch (err) {\n logger.debug(`Failed to capture output: ${err}`);\n }\n }\n\n if (opts.postprocessResult) {\n try {\n const boundInputs = _extractBoundInputs(fn, args);\n opts.postprocessResult(span, result, boundInputs);\n } catch (err) {\n logger.debug(`Postprocess failed: ${err}`);\n }\n }\n };\n\n const finishSuccess = (result: any): void => {\n if (finished) return;\n finished = true;\n captureResult(result);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n };\n\n const setStreamCounts = (): void => {\n span.setAttribute(\"neatlogs.stream.chunk_count\", totalStreamChunks);\n if (totalStreamChunks > DEFAULT_MAX_SEMANTIC_STREAM_EVENTS) {\n span.setAttribute(\n \"neatlogs.stream.events_dropped\",\n totalStreamChunks - DEFAULT_MAX_SEMANTIC_STREAM_EVENTS,\n );\n }\n if (droppedStreamChunks > 0) {\n span.setAttribute(\"neatlogs.stream.output_truncated\", true);\n span.setAttribute(\n \"neatlogs.stream.chunks_not_captured\",\n droppedStreamChunks,\n );\n span.setAttribute(\n \"neatlogs.stream.retained_bytes\",\n retainedStreamBytes,\n );\n }\n };\n\n const streamCaptureValue = (): any[] =>\n droppedStreamChunks > 0\n ? [\n ...streamChunks,\n {\n neatlogs_stream_capture: STREAM_CAPTURE_TRUNCATED,\n chunks_not_captured: droppedStreamChunks,\n },\n ]\n : streamChunks;\n\n const finishError = (error: any): void => {\n if (finished) return;\n finished = true;\n if (error?.name === \"AbortError\") {\n span.setAttribute(\"neatlogs.stream.cancelled\", true);\n if (totalStreamChunks > 0) {\n setStreamCounts();\n captureResult(streamCaptureValue());\n }\n span.setStatus({ code: SpanStatusCode.UNSET });\n span.end();\n return;\n }\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error?.message ?? String(error),\n });\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n span.end();\n };\n\n const recordChunk = (chunk: any): void => {\n const index = totalStreamChunks++;\n if (index >= DEFAULT_MAX_SEMANTIC_STREAM_EVENTS) {\n droppedStreamChunks += 1;\n return;\n }\n\n let serializedValue: unknown;\n let serialized: string;\n try {\n serializedValue = serializeObj(chunk);\n serialized = safeJsonDumps(\n sanitizeMediaPayload(serializedValue, \"output\"),\n );\n } catch {\n droppedStreamChunks += 1;\n return;\n }\n const encodedBytes = utf8ByteLength(\n serialized,\n DEFAULT_MAX_STREAM_CAPTURE_BYTES - retainedStreamBytes,\n );\n if (\n retainedStreamBytes + encodedBytes >\n DEFAULT_MAX_STREAM_CAPTURE_BYTES\n ) {\n droppedStreamChunks += 1;\n return;\n }\n\n const captured = captureMediaWithIndex(\n span,\n mediaPrefix(\"output\"),\n serializedValue,\n \"output\",\n streamMediaCount,\n );\n streamMediaCount += captured.count;\n streamChunks.push(captured.value);\n retainedStreamBytes += encodedBytes;\n const summary: Record<string, unknown> = {\n value_type: Array.isArray(chunk) ? \"array\" : typeof chunk,\n encoded_bytes: encodedBytes,\n };\n if (Array.isArray(chunk)) summary.items = chunk.length;\n else if (chunk && typeof chunk === \"object\")\n summary.keys = Object.keys(chunk).sort();\n span.addEvent(\"neatlogs.stream.chunk\", {\n \"neatlogs.stream.chunk.index\": index,\n \"neatlogs.stream.chunk.summary\": safeJsonDumps(summary),\n });\n };\n\n const finishStream = (cancelled = false): void => {\n setStreamCounts();\n if (!cancelled) {\n finishSuccess(streamCaptureValue());\n return;\n }\n if (finished) return;\n finished = true;\n span.setAttribute(\"neatlogs.stream.cancelled\", true);\n captureResult(streamCaptureValue());\n span.setStatus({ code: SpanStatusCode.UNSET });\n span.end();\n };\n\n const wrapAsyncIterator = (iterator: any): any => {\n let proxy: any;\n proxy = new Proxy(iterator, {\n get(target, property) {\n if (property === Symbol.asyncIterator) return () => proxy;\n if (property === \"next\") {\n return async (...nextArgs: any[]) => {\n try {\n const item = await withNeatlogsSpan(span, () =>\n target.next(...nextArgs),\n );\n if (item.done) finishStream(streamInterrupted);\n else recordChunk(item.value);\n return item;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n if (property === \"return\") {\n return async (...returnArgs: any[]) => {\n try {\n streamInterrupted = true;\n const item = target.return\n ? await withNeatlogsSpan(span, () =>\n target.return(...returnArgs),\n )\n : { done: true, value: returnArgs[0] };\n if (item.done) finishStream(true);\n return item;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n if (property === \"throw\") {\n return async (...throwArgs: any[]) => {\n try {\n const item = target.throw\n ? await withNeatlogsSpan(span, () =>\n target.throw(...throwArgs),\n )\n : Promise.reject(throwArgs[0]);\n if (item.done) finishStream();\n else recordChunk(item.value);\n return item;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n const value = Reflect.get(target, property, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n return proxy;\n };\n\n const wrapAsyncIterable = (source: AsyncIterable<unknown>): any => {\n if (typeof (source as any).next === \"function\") {\n return wrapAsyncIterator(source);\n }\n return new Proxy(source as any, {\n get(target, property) {\n if (property === Symbol.asyncIterator) {\n return () => wrapAsyncIterator(target[Symbol.asyncIterator]());\n }\n const value = Reflect.get(target, property, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n };\n\n const wrapSyncIterator = (\n iterator: Iterator<unknown> & Iterable<unknown>,\n ): any => {\n let proxy: any;\n proxy = new Proxy(iterator, {\n get(target, property) {\n if (property === Symbol.iterator) return () => proxy;\n if (property === \"next\") {\n return (...nextArgs: any[]) => {\n try {\n const item = withNeatlogsSpan(span, () =>\n (\n target.next as (\n ...args: any[]\n ) => IteratorResult<unknown>\n )(...nextArgs),\n );\n if (item.done) finishStream(streamInterrupted);\n else recordChunk(item.value);\n return item;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n if (property === \"return\") {\n return (...returnArgs: any[]) => {\n try {\n streamInterrupted = true;\n const item = target.return\n ? withNeatlogsSpan(span, () =>\n (\n target.return as (\n ...args: any[]\n ) => IteratorResult<unknown>\n )(...returnArgs),\n )\n : { done: true, value: returnArgs[0] };\n if (item.done) finishStream(true);\n return item;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n if (property === \"throw\") {\n return (...throwArgs: any[]) => {\n try {\n if (!target.throw) throw throwArgs[0];\n const item = withNeatlogsSpan(span, () =>\n (\n target.throw as (\n ...args: any[]\n ) => IteratorResult<unknown>\n )(...throwArgs),\n );\n if (item.done) finishStream(streamInterrupted);\n else recordChunk(item.value);\n return item;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n const value = Reflect.get(target, property, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n return proxy;\n };\n\n const wrapReader = (reader: any): any =>\n new Proxy(reader, {\n get(target, property) {\n if (property === \"read\") {\n return async (...readArgs: any[]) => {\n try {\n const item = await withNeatlogsSpan(span, () =>\n target.read(...readArgs),\n );\n if (item.done) finishStream();\n else recordChunk(item.value);\n return item;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n if (property === \"cancel\") {\n return async (...cancelArgs: any[]) => {\n try {\n const result = await target.cancel(...cancelArgs);\n finishStream(true);\n return result;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n if (property === \"releaseLock\") {\n return (...releaseArgs: any[]) => {\n try {\n return target.releaseLock(...releaseArgs);\n } finally {\n finishStream(true);\n }\n };\n }\n const value = Reflect.get(target, property, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n\n const wrapReadableStream = (stream: any): any =>\n new Proxy(stream, {\n get(target, property) {\n if (property === \"getReader\") {\n return (...readerArgs: any[]) =>\n wrapReader(target.getReader(...readerArgs));\n }\n if (property === Symbol.asyncIterator) {\n const iteratorFactory = target[Symbol.asyncIterator];\n if (typeof iteratorFactory === \"function\") {\n return () => wrapAsyncIterator(iteratorFactory.call(target));\n }\n }\n if (property === \"cancel\") {\n return async (...cancelArgs: any[]) => {\n try {\n const result = await target.cancel(...cancelArgs);\n finishStream(true);\n return result;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n if (property === \"pipeTo\") {\n return async (...pipeArgs: any[]) => {\n try {\n const result = await target.pipeTo(...pipeArgs);\n finishStream();\n return result;\n } catch (error) {\n finishError(error);\n throw error;\n }\n };\n }\n const value = Reflect.get(target, property, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n\n try {\n // Set common attributes\n setCommonSpanAttrs(span, opts);\n\n // Session/end-user identity (root span only; skipped on a non-root child).\n const spanIsRoot = isRoot && !autoRoot.root;\n applySessionAttributes(span, opts.sessionId, spanIsRoot, {\n parentSessionId: opts.parentSessionId,\n sessionFeatureName: opts.sessionFeatureName,\n sessionEntryPoint: opts.sessionEntryPoint,\n });\n applyEndUserAttributes(\n span,\n opts.endUserId,\n opts.endUserMetadata,\n spanIsRoot,\n );\n\n // Capture input\n if (captureInput && args.length > 0) {\n try {\n const inputValue =\n args.length === 1\n ? serializeObj(args[0])\n : args.map(serializeObj);\n span.setAttribute(\n \"input.value\",\n safeJsonDumps(\n captureMedia(\n span,\n mediaPrefix(\"input\"),\n inputValue,\n \"input\",\n ),\n ),\n );\n } catch (err) {\n logger.debug(`Failed to capture input: ${err}`);\n }\n }\n\n // Execute the function\n const result = fn(...args);\n\n const handleResult = (resolved: any): any => {\n // A promise may resolve to a stream. Classify the resolved value before\n // ending the span so async factories remain open through consumption.\n if (isReadableStreamLike(resolved))\n return wrapReadableStream(resolved);\n if (isAsyncIterable(resolved)) return wrapAsyncIterable(resolved);\n if (isSyncIterator(resolved)) return wrapSyncIterator(resolved);\n finishSuccess(resolved);\n return resolved;\n };\n\n // Handle any Promise/A+ thenable, not only native Promise instances.\n if (isPromiseLike(result)) {\n return Promise.resolve(result)\n .then(handleResult)\n .catch((error: any) => {\n finishError(error);\n throw error;\n });\n }\n\n return handleResult(result);\n } catch (error: any) {\n finishError(error);\n throw error;\n }\n }, autoRoot.ctx, autoRoot.root);\n };\n\n // Preserve function name for debugging\n Object.defineProperty(wrapped, \"name\", {\n value: spanName,\n configurable: true,\n });\n\n return wrapped as any;\n}\n\n/** Extract named arguments from function call (best-effort). */\nfunction _extractBoundInputs(fn: Function, args: any[]): Record<string, any> {\n const result: Record<string, any> = {};\n // Parse function parameter names from toString()\n const fnStr = fn.toString();\n const match = fnStr.match(/\\(([^)]*)\\)/);\n if (match) {\n const paramNames = match[1]\n .split(\",\")\n .map((p) =>\n p\n .trim()\n .replace(/\\s*[:=].*$/, \"\")\n .replace(/^\\.\\.\\./, \"\"),\n )\n .filter(Boolean);\n for (let i = 0; i < Math.min(paramNames.length, args.length); i++) {\n result[paramNames[i]] = args[i];\n }\n }\n return result;\n}\n","/**\n * High-level span() function wrapper and Span() class-method decorator.\n *\n * Primary public API for instrumenting user code.\n */\n\nimport { type Span as OtelSpan } from '@opentelemetry/api';\nimport { VALID_SPAN_KINDS } from '../span-kinds/mapping.js';\nimport { decorateSpan, safeJsonDumps, serializeObj, type DecorateSpanOptions } from './base.js';\nimport { getLogger } from '../core/logger.js';\nimport { captureMedia, mediaReferences } from '../core/media.js';\nimport type { SpanOptions, SpanKind } from '../types.js';\n\nconst logger = getLogger();\n\n/**\n * Wrap a function with OpenTelemetry span instrumentation.\n *\n * @example\n * ```typescript\n * const myWorkflow = span({ kind: 'WORKFLOW' }, async (query: string) => {\n * return await process(query);\n * });\n * await myWorkflow('What is TypeScript?');\n * ```\n */\nexport function span<TArgs extends any[], TReturn>(\n options: SpanOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n // Validate kind\n if (!VALID_SPAN_KINDS.has(options.kind)) {\n throw new Error(\n `Invalid span kind: '${options.kind}'. Must be one of: ${[...VALID_SPAN_KINDS].join(', ')}`,\n );\n }\n\n const decorateOpts: DecorateSpanOptions = { ...options };\n\n // Kind-specific attribute setup\n switch (options.kind) {\n case 'AGENT':\n decorateOpts.postprocessResult = _agentPostprocessor(options);\n break;\n case 'TOOL':\n decorateOpts.postprocessResult = _toolPostprocessor(options);\n break;\n case 'EMBEDDING':\n decorateOpts.postprocessResult = _embeddingPostprocessor(options);\n break;\n case 'RETRIEVER':\n decorateOpts.postprocessResult = retrieverPostprocessor;\n break;\n case 'MCP_TOOL':\n return _createMcpToolWrapper(options, fn);\n default:\n break;\n }\n\n return decorateSpan(decorateOpts, fn);\n}\n\n/** Agent-specific: set role and goal attributes. */\nfunction _agentPostprocessor(options: SpanOptions) {\n return (span: OtelSpan, _result: any, _boundInputs: Record<string, any>) => {\n if (options.role) {\n span.setAttribute('neatlogs.agent.role', options.role);\n }\n if (options.goal) {\n span.setAttribute('neatlogs.agent.goal', options.goal);\n }\n };\n}\n\n/** Tool-specific: set tool_name and parameters attributes. */\nfunction _toolPostprocessor(options: SpanOptions) {\n return (span: OtelSpan, _result: any, _boundInputs: Record<string, any>) => {\n if (options.toolName) {\n span.setAttribute('tool.name', options.toolName);\n }\n if (options.parameters) {\n span.setAttribute(\n 'tool.parameters',\n safeJsonDumps(\n captureMedia(\n span,\n 'neatlogs.tool.parameters',\n serializeObj(options.parameters),\n 'input',\n ),\n ),\n );\n }\n };\n}\n\n/** Embedding-specific: set model and dimension attributes. */\nfunction _embeddingPostprocessor(options: SpanOptions) {\n return (span: OtelSpan, _result: any, _boundInputs: Record<string, any>) => {\n if (options.model) {\n span.setAttribute('embedding.model_name', options.model);\n }\n if (options.dimension) {\n span.setAttribute('embedding.dimension', options.dimension);\n }\n };\n}\n\n/**\n * RETRIEVER postprocessor: extract documents from result.\n * Looks for query in 'query', 'question', 'text' keys.\n * Extracts documents from list results or dict with 'documents'/'docs'/'results' keys.\n * Sets canonical neatlogs.retriever.documents.N.* attributes for every document.\n */\nexport function retrieverPostprocessor(\n span: OtelSpan,\n result: any,\n boundInputs: Record<string, any>,\n): void {\n // Extract query\n for (const key of ['query', 'question', 'text']) {\n if (key in boundInputs && typeof boundInputs[key] === 'string') {\n span.setAttribute('neatlogs.retriever.query', boundInputs[key]);\n break;\n }\n }\n\n // Extract documents\n let docs: any[] | null = null;\n\n if (Array.isArray(result)) {\n docs = result;\n } else if (result && typeof result === 'object') {\n for (const key of ['documents', 'docs', 'results']) {\n if (Array.isArray(result[key])) {\n docs = result[key];\n break;\n }\n }\n }\n\n if (!docs) return;\n\n // Preserve every document; backend ingestion owns payload-size limits.\n for (let i = 0; i < docs.length; i++) {\n const doc = docs[i];\n const prefix = `neatlogs.retriever.documents.${i}`;\n\n if (typeof doc === 'string') {\n span.setAttribute(`${prefix}.content`, doc);\n } else if (doc && typeof doc === 'object') {\n if (doc.content || doc.page_content || doc.text) {\n span.setAttribute(`${prefix}.content`, doc.content ?? doc.page_content ?? doc.text);\n }\n if (doc.id) {\n span.setAttribute(`${prefix}.id`, String(doc.id));\n }\n if (doc.score !== undefined) {\n span.setAttribute(`${prefix}.score`, doc.score);\n }\n if (doc.metadata) {\n span.setAttribute(`${prefix}.metadata`, safeJsonDumps(doc.metadata));\n }\n }\n }\n}\n\n/**\n * MCP_TOOL special handling.\n * Checks first arg for .toJSON() / plain object.\n * Wraps string results as { result: \"...\" }.\n * Sets both mcp.* and standard attributes.\n */\nfunction _createMcpToolWrapper<TArgs extends any[], TReturn>(\n options: SpanOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => any {\n const decorateOpts: DecorateSpanOptions = {\n ...options,\n postprocessResult: (span: OtelSpan, result: any, boundInputs: Record<string, any>) => {\n // Set MCP-specific attributes\n if (options.toolName) {\n span.setAttribute('mcp.tool.name', options.toolName);\n span.setAttribute('tool.name', options.toolName);\n }\n if (options.parameters) {\n const capturedParameters = captureMedia(\n span,\n 'neatlogs.mcp_tool.parameters',\n serializeObj(options.parameters),\n 'input',\n );\n const serializedParameters = safeJsonDumps(capturedParameters);\n span.setAttribute('mcp.tool.parameters', serializedParameters);\n span.setAttribute('tool.parameters', serializedParameters);\n }\n if (options.toolJsonSchema) {\n span.setAttribute(\n 'tool.json_schema',\n safeJsonDumps(\n captureMedia(\n span,\n 'neatlogs.mcp_tool.schema',\n serializeObj(options.toolJsonSchema),\n 'input',\n ),\n ),\n );\n }\n\n // Wrap string results\n if (typeof result === 'string') {\n span.setAttribute(\n 'output.value',\n safeJsonDumps({ result: captureMcpStringResult(span, result) }),\n );\n }\n\n // Extract input from first arg if it has toJSON or is a plain object\n if (boundInputs && Object.keys(boundInputs).length > 0) {\n const firstArg = Object.values(boundInputs)[0];\n if (firstArg && typeof firstArg === 'object') {\n const serialized = typeof firstArg.toJSON === 'function'\n ? firstArg.toJSON()\n : serializeObj(firstArg);\n span.setAttribute(\n 'mcp.tool.input',\n safeJsonDumps(\n captureMedia(\n span,\n 'neatlogs.mcp_tool.input',\n serialized,\n 'input',\n ),\n ),\n );\n }\n }\n },\n };\n\n return decorateSpan(decorateOpts, fn);\n}\n\nfunction captureMcpStringResult(span: OtelSpan, result: string): unknown {\n if (/^\\s*data:/i.test(result)) {\n const captured = captureMedia(\n span,\n 'neatlogs.mcp_tool.output',\n { type: 'file', url: result },\n 'output',\n ) as { url?: unknown };\n return captured.url ?? '[REDACTED_MEDIA]';\n }\n\n try {\n const parsed = JSON.parse(result);\n if (mediaReferences(parsed, 'output').length === 0) return result;\n return safeJsonDumps(\n captureMedia(span, 'neatlogs.mcp_tool.output', parsed, 'output'),\n );\n } catch {\n return result;\n }\n}\n\n/**\n * TC39 Stage 3 class-method decorator variant.\n *\n * @example\n * ```typescript\n * class MyAgent {\n * @Span({ kind: 'AGENT', role: 'researcher' })\n * async run(query: string) { ... }\n * }\n * ```\n */\nexport function Span(options: SpanOptions) {\n return function <T extends (...args: any[]) => any>(\n target: T,\n context: ClassMethodDecoratorContext,\n ): T {\n // Validate eagerly at decoration-time (same behaviour as before this fix)\n // by building a temporary wrapper with a no-op target. span() will throw\n // here for invalid kinds before the class is instantiated.\n span(options, target);\n\n // TC39 stage-3 decorators replace the method on the prototype, so `this`\n // is the instance when the method is called normally (e.g. agent.run()).\n // `decorateSpan`'s closure calls `fn(...args)` without a receiver, which\n // loses `this` for instance methods that call other instance methods.\n // Wrap at the call site: bind `target` to the live `this` on every call\n // so that `fn(…args)` inside `decorateSpan` retains the correct receiver.\n function decoratorWrapper(this: unknown, ...args: Parameters<T>): ReturnType<T> {\n const boundTarget = target.bind(this) as T;\n const wrapped = span(options, boundTarget);\n return wrapped(...args) as ReturnType<T>;\n }\n Object.defineProperty(decoratorWrapper, 'name', { value: context.name, configurable: true });\n return decoratorWrapper as unknown as T;\n };\n}\n","import { createHash } from 'node:crypto';\nimport { TELEMETRY_SCHEMA_VERSION } from './schema-v2.js';\nimport { __version__ } from './version.js';\nimport { getCapturedEnvelope } from './core/doctor-capture.js';\nimport { _doctorRuntimeSnapshot } from './init.js';\n\nexport const DOCTOR_V2_FORMAT_VERSION = 'neatlogs.doctor/v2' as const;\n\nexport type DoctorV2Status = 'pass' | 'warn' | 'fail';\nexport type DoctorV2CheckStatus = DoctorV2Status | 'unknown';\n\nexport type DiagnosticSpan = Readonly<{\n span_id: string;\n parent_span_id: string | null;\n name: string;\n kind: string;\n status: string;\n input?: unknown;\n output?: unknown;\n choices?: readonly unknown[];\n expected_choice_count?: number;\n tool_calls?: readonly Readonly<{\n id: string;\n name?: string;\n arguments?: unknown;\n choice_index?: number;\n tool_call_index?: number;\n }>[];\n tool_call?: Readonly<{ id: string; name?: string; result?: unknown }>;\n streaming?: boolean;\n stream_fragments?: readonly unknown[];\n oversized?: boolean;\n payload_references?: readonly Readonly<{ digest: string; size: number; mime_type: string }>[];\n sampled?: boolean;\n ended?: boolean;\n start_time_ns?: number;\n duration_ns?: number;\n attributes?: Readonly<Record<string, unknown>>;\n}>;\n\nexport type DiagnosticEnvelope = Readonly<{\n trace_id: string;\n root_span_id: string;\n spans: readonly DiagnosticSpan[];\n}>;\n\nexport type DoctorV2Check = Readonly<{\n name: string;\n status: DoctorV2CheckStatus;\n reason_code: string;\n remediation_code: string;\n message: string;\n details?: Readonly<Record<string, string | number | boolean | null>>;\n}>;\n\nexport type DoctorV2Result = Readonly<{\n format_version: typeof DOCTOR_V2_FORMAT_VERSION;\n mode: 'local';\n status: DoctorV2Status;\n first_failure: string | null;\n runtime: Readonly<{\n language: 'typescript';\n sdk_version: string;\n schema_version: string;\n transport: 'otlp_http_protobuf';\n }>;\n capture?: Readonly<{\n trace_id: string;\n root_span_id: string;\n span_count: number;\n semantic_digest: string;\n }>;\n sampling: Readonly<{ effective_sampler: string; root_sample_rate: number; sampled: boolean }>;\n ownership: Readonly<{ provider: 'private' | 'ambiguous'; instrumentor_count: number }>;\n queue: Readonly<{ mode: 'batch' | 'diagnostic_capture'; pending_spans: number; dropped_spans: number; capacity: number | null }>;\n retry: Readonly<{ attempts: number; window_ms: number; exhausted: boolean }>;\n flush: Readonly<{ outcome: 'not_attempted' | 'success' | 'timeout' | 'failed'; timeout_ms: number; duration_ms: number | null }>;\n checks: readonly DoctorV2Check[];\n}>;\n\nconst TRACE_ID = /^[0-9a-f]{32}$/;\nconst SPAN_ID = /^[0-9a-f]{16}$/;\nconst DIGEST = /^sha256:[0-9a-f]{64}$/;\n\nconst remediation: Readonly<Record<string, string>> = Object.freeze({\n TRACE_ID_INVALID: 'RECREATE_TRACE',\n SPAN_ID_INVALID: 'RECREATE_SPAN',\n SPAN_ID_DUPLICATE: 'RECREATE_SPAN',\n PARENT_ID_INVALID: 'FIX_PARENT_CONTEXT',\n PARENT_MISSING: 'FIX_PARENT_CONTEXT',\n ROOT_MISSING: 'CREATE_ROOT_SPAN',\n ROOT_MULTIPLE: 'USE_SINGLE_ROOT',\n ROOT_NOT_ENDED: 'END_ROOT_SPAN',\n INPUT_JSON_INVALID: 'SERIALIZE_INPUT_JSON',\n OUTPUT_JSON_INVALID: 'SERIALIZE_OUTPUT_JSON',\n TOOL_CALL_MISSING: 'CAPTURE_TOOL_REQUEST',\n TOOL_EXECUTION_MISSING: 'CAPTURE_TOOL_EXECUTION',\n CHOICE_LOSS: 'PRESERVE_ALL_CHOICES',\n STREAM_FRAGMENT_MISSING: 'PRESERVE_STREAM_FRAGMENTS',\n PAYLOAD_ATTACHMENT_REQUIRED: 'UPLOAD_PAYLOAD_ATTACHMENT',\n SAMPLING_INCONSISTENT: 'FIX_PARENT_BASED_SAMPLING',\n FLUSH_TIMEOUT: 'INCREASE_FLUSH_BUDGET',\n PROVIDER_OWNERSHIP_AMBIGUOUS: 'USE_PRIVATE_PROVIDER',\n LATENCY_OUTLIER: 'INVESTIGATE_SLOW_OPERATION',\n RATE_LIMITED: 'RESPECT_RETRY_AFTER',\n PII_DETECTED: 'MASK_SENSITIVE_CONTENT',\n LOCAL_ENVELOPE_VALID: 'NONE',\n});\n\nfunction canonicalize(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalize);\n if (value && typeof value === 'object') {\n const output: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n const item = (value as Record<string, unknown>)[key];\n if (item !== undefined) output[key] = canonicalize(item);\n }\n return output;\n }\n if (typeof value === 'number' && !Number.isFinite(value)) throw new TypeError('Diagnostic envelope contains a non-finite number');\n return value;\n}\n\nexport function doctorSemanticDigest(envelope: DiagnosticEnvelope): string {\n const namesById = new Map(envelope.spans.map((span) => [span.span_id, span.name]));\n const stableFields = [\n 'name',\n 'kind',\n 'status',\n 'input',\n 'output',\n 'choices',\n 'expected_choice_count',\n 'tool_calls',\n 'tool_call',\n 'streaming',\n 'oversized',\n 'payload_references',\n 'sampled',\n 'ended',\n ] as const;\n const projection = {\n spans: envelope.spans\n .filter((span) => span.name !== 'neatlogs.trace.complete')\n .map((span) => {\n const item: Record<string, unknown> = {};\n for (const field of stableFields) {\n if (span[field] !== undefined) item[field] = span[field];\n }\n item.parent = span.parent_span_id === null\n ? null\n : namesById.get(span.parent_span_id) ?? null;\n return item;\n })\n .sort((left, right) => {\n const leftKey = `${String(left.name)}\\u0000${String(left.kind)}`;\n const rightKey = `${String(right.name)}\\u0000${String(right.kind)}`;\n return leftKey < rightKey ? -1 : leftKey > rightKey ? 1 : 0;\n }),\n };\n const bytes = JSON.stringify(canonicalize(projection));\n return `sha256:${createHash('sha256').update(bytes, 'utf8').digest('hex')}`;\n}\n\nfunction failure(name: string, reason_code: keyof typeof remediation, message: string, details?: Record<string, string | number | boolean | null>): DoctorV2Check {\n return Object.freeze({ name, status: 'fail', reason_code, remediation_code: remediation[reason_code], message, ...(details ? { details: Object.freeze(details) } : {}) });\n}\n\nfunction warning(name: string, reason_code: keyof typeof remediation, message: string, details?: Record<string, string | number | boolean | null>): DoctorV2Check {\n return Object.freeze({ name, status: 'warn', reason_code, remediation_code: remediation[reason_code], message, ...(details ? { details: Object.freeze(details) } : {}) });\n}\n\nfunction median(values: readonly number[]): number {\n const sorted = [...values].sort((left, right) => left - right);\n const middle = Math.floor(sorted.length / 2);\n return sorted.length % 2 === 0\n ? ((sorted[middle - 1] ?? 0) + (sorted[middle] ?? 0)) / 2\n : (sorted[middle] ?? 0);\n}\n\nfunction latencyWarnings(envelope: DiagnosticEnvelope): DoctorV2Check[] {\n const groups = new Map<string, Array<{ span: DiagnosticSpan; index: number }>>();\n envelope.spans.forEach((span, index) => {\n if (span.kind.toUpperCase() !== 'LLM' || !Number.isFinite(span.duration_ns) || (span.duration_ns ?? 0) < 0) return;\n const operation = typeof span.attributes?.['gen_ai.operation.name'] === 'string'\n ? span.attributes['gen_ai.operation.name'] as string\n : span.name;\n const group = groups.get(operation) ?? [];\n group.push({ span, index });\n groups.set(operation, group);\n });\n const checks: DoctorV2Check[] = [];\n for (const [operation, group] of groups) {\n if (group.length < 3) continue;\n const ordered = [...group].sort((left, right) =>\n (left.span.start_time_ns ?? left.index) - (right.span.start_time_ns ?? right.index));\n const baseline = median(group.map(({ span }) => span.duration_ns ?? 0));\n const threshold = Math.max(500_000_000, baseline * 3);\n for (const { span } of ordered.slice(1)) {\n if ((span.duration_ns ?? 0) > threshold) {\n checks.push(warning('latency', 'LATENCY_OUTLIER', 'LLM latency is an outlier for this operation', {\n span_id: span.span_id,\n operation,\n duration_ns: span.duration_ns ?? 0,\n median_ns: baseline,\n threshold_ns: threshold,\n }));\n }\n }\n }\n return checks;\n}\n\nconst THROTTLE_CODES = new Set([\n 'rate_limit_exceeded', 'rate_limit_error', 'resource_exhausted',\n 'throttlingexception', 'toomanyrequests', 'too_many_requests',\n]);\n\nfunction rateLimitSignal(attributes: Readonly<Record<string, unknown>> | undefined): string | null {\n if (!attributes) return null;\n for (const [rawKey, value] of Object.entries(attributes)) {\n const key = rawKey.toLowerCase();\n const normalized = String(value).toLowerCase();\n if ((key.includes('http') || key.includes('status')) && (normalized === '429' || normalized === '503')) return 'http_status';\n if (key.includes('retry-after') || key.includes('retry_after')) return 'retry_after';\n if (THROTTLE_CODES.has(normalized)) return 'provider_code';\n if (key.includes('rate_limit_remaining') || key.includes('ratelimit_remaining')) {\n const remaining = typeof value === 'number' ? value : Number(value);\n if (Number.isFinite(remaining) && remaining <= 1) return 'rate_limit_remaining';\n }\n }\n return null;\n}\n\nfunction rateLimitWarnings(envelope: DiagnosticEnvelope): DoctorV2Check[] {\n return envelope.spans.flatMap((span) => {\n const signal = rateLimitSignal(span.attributes);\n return signal\n ? [warning('rate_limit', 'RATE_LIMITED', 'Span contains a provider throttling signal', { span_id: span.span_id, signal })]\n : [];\n });\n}\n\nconst PII_PATTERNS: ReadonlyArray<readonly [string, RegExp]> = [\n ['email', /\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/i],\n ['us_phone', /\\b(?:\\+?1[-.\\s]?)?(?:\\(?\\d{3}\\)?[-.\\s]?)\\d{3}[-.\\s]?\\d{4}\\b/],\n ['us_ssn', /\\b\\d{3}-\\d{2}-\\d{4}\\b/],\n ['credit_card', /\\b(?:\\d[ -]*?){13,19}\\b/],\n];\n\nfunction piiCategories(value: unknown): Set<string> {\n const categories = new Set<string>();\n const seen = new WeakSet<object>();\n let visited = 0;\n const walk = (item: unknown, depth: number): void => {\n if (depth > 12 || visited++ > 10_000) return;\n if (typeof item === 'string') {\n for (const [category, pattern] of PII_PATTERNS) if (pattern.test(item)) categories.add(category);\n return;\n }\n if (!item || typeof item !== 'object' || seen.has(item)) return;\n seen.add(item);\n if (Array.isArray(item)) for (const child of item) walk(child, depth + 1);\n else for (const child of Object.values(item as Record<string, unknown>)) walk(child, depth + 1);\n };\n walk(value, 0);\n return categories;\n}\n\nfunction piiWarnings(envelope: DiagnosticEnvelope): DoctorV2Check[] {\n return envelope.spans.flatMap((span) => {\n const categories = piiCategories(span.attributes);\n return categories.size > 0\n ? [warning('privacy', 'PII_DETECTED', 'Span attributes contain potential sensitive data', {\n span_id: span.span_id,\n categories: [...categories].sort().join(','),\n })]\n : [];\n });\n}\n\nfunction jsonSafe(value: unknown): boolean {\n try { JSON.stringify(canonicalize(value)); return true; } catch { return false; }\n}\n\nfunction collectNestedToolRequestIds(value: unknown, output: Set<string>): void {\n if (Array.isArray(value)) {\n for (const child of value) collectNestedToolRequestIds(child, output);\n return;\n }\n if (!value || typeof value !== 'object') return;\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n if (key === 'tool_calls' && Array.isArray(child)) {\n for (const call of child) {\n if (call && typeof call === 'object' && typeof (call as Record<string, unknown>).id === 'string') {\n output.add((call as Record<string, unknown>).id as string);\n }\n }\n }\n collectNestedToolRequestIds(child, output);\n }\n}\n\n/** Validate the finished, masked, normalized envelope captured before network send. */\nexport function doctorLocalV2(\n envelope: DiagnosticEnvelope,\n options: Readonly<{ flushOutcome?: 'not_attempted' | 'success' | 'timeout' | 'failed'; flushTimeoutMs?: number; flushDurationMs?: number | null; privateProvider?: boolean; instrumentorCount?: number; checkPii?: boolean; effectiveSampler?: string; rootSampleRate?: number; queueMode?: 'batch' | 'diagnostic_capture'; queueMaxSize?: number | null; pendingSpans?: number; droppedSpans?: number; retryAttempts?: number; retryWindowMs?: number; retryExhausted?: boolean }> = {},\n): DoctorV2Result {\n const checks: DoctorV2Check[] = [];\n if (!TRACE_ID.test(envelope.trace_id)) checks.push(failure('trace_id', 'TRACE_ID_INVALID', 'Trace ID must be 32 lowercase hexadecimal characters'));\n const ids = new Set<string>();\n for (const span of envelope.spans) {\n if (!SPAN_ID.test(span.span_id)) checks.push(failure('span_id', 'SPAN_ID_INVALID', 'Span ID must be 16 lowercase hexadecimal characters', { span_name: span.name }));\n if (ids.has(span.span_id)) checks.push(failure('span_id', 'SPAN_ID_DUPLICATE', 'Span IDs must be unique', { span_id: span.span_id }));\n ids.add(span.span_id);\n }\n const roots = envelope.spans.filter((span) => span.parent_span_id === null);\n if (roots.length === 0 || !ids.has(envelope.root_span_id)) checks.push(failure('root', 'ROOT_MISSING', 'Exactly one declared root span is required'));\n else if (roots.length > 1 || roots[0]?.span_id !== envelope.root_span_id) checks.push(failure('root', 'ROOT_MULTIPLE', 'The envelope must contain one declared root span'));\n else if (roots[0].ended !== true) checks.push(failure('root', 'ROOT_NOT_ENDED', 'The root span must be ended before capture'));\n for (const span of envelope.spans) {\n if (span.parent_span_id !== null && !SPAN_ID.test(span.parent_span_id)) checks.push(failure('parent', 'PARENT_ID_INVALID', 'Parent ID must be a valid span ID', { span_id: span.span_id }));\n else if (span.parent_span_id !== null && !ids.has(span.parent_span_id)) checks.push(failure('parent', 'PARENT_MISSING', 'Parent span is absent from the envelope', { span_id: span.span_id }));\n if (span.input !== undefined && !jsonSafe(span.input)) checks.push(failure('input', 'INPUT_JSON_INVALID', 'Span input is not canonical JSON', { span_id: span.span_id }));\n if (span.output !== undefined && !jsonSafe(span.output)) checks.push(failure('output', 'OUTPUT_JSON_INVALID', 'Span output is not canonical JSON', { span_id: span.span_id }));\n if (span.expected_choice_count !== undefined && (span.choices?.length ?? 0) < span.expected_choice_count) checks.push(failure('choices', 'CHOICE_LOSS', 'The normalized response lost one or more model choices', { span_id: span.span_id }));\n if (span.streaming && (span.stream_fragments?.length ?? 0) === 0) checks.push(failure('stream', 'STREAM_FRAGMENT_MISSING', 'Streaming span has no captured fragments', { span_id: span.span_id }));\n if (span.oversized && !(span.payload_references?.some((reference) => reference.size > 0 && DIGEST.test(reference.digest) && reference.mime_type.length > 0))) checks.push(failure('payload', 'PAYLOAD_ATTACHMENT_REQUIRED', 'Oversized content requires a valid payload reference', { span_id: span.span_id }));\n }\n const requested = new Set(envelope.spans.flatMap((span) => span.tool_calls ?? []).map((call) => call.id));\n for (const span of envelope.spans) collectNestedToolRequestIds(span.choices, requested);\n const executed = new Set(envelope.spans.flatMap((span) => span.tool_call ? [span.tool_call.id] : []));\n for (const callId of requested) if (!executed.has(callId)) checks.push(failure('tools', 'TOOL_EXECUTION_MISSING', 'Assistant-requested tool call has no execution span', { call_id: callId }));\n for (const callId of executed) if (!requested.has(callId)) checks.push(failure('tools', 'TOOL_CALL_MISSING', 'Tool execution has no preserved assistant request', { call_id: callId }));\n const sampling = new Set(envelope.spans.map((span) => span.sampled).filter((value): value is boolean => value !== undefined));\n if (sampling.size > 1) checks.push(failure('sampling', 'SAMPLING_INCONSISTENT', 'All spans in a trace must share the root sampling decision'));\n if (options.privateProvider === false) checks.push(failure('ownership', 'PROVIDER_OWNERSHIP_AMBIGUOUS', 'Doctor could not prove private provider ownership'));\n const flushOutcome = options.flushOutcome ?? 'success';\n if (flushOutcome === 'timeout') checks.push(failure('flush', 'FLUSH_TIMEOUT', 'Diagnostic capture did not flush within the configured deadline'));\n checks.push(...latencyWarnings(envelope), ...rateLimitWarnings(envelope));\n if (options.checkPii === true) checks.push(...piiWarnings(envelope));\n\n if (checks.length === 0) checks.push(Object.freeze({ name: 'local_envelope', status: 'pass', reason_code: 'LOCAL_ENVELOPE_VALID', remediation_code: 'NONE', message: 'The final normalized local envelope is valid' }));\n const first = checks.find((check) => check.status === 'fail');\n const hasWarning = checks.some((check) => check.status === 'warn');\n let digest: string | undefined;\n try { digest = doctorSemanticDigest(envelope); } catch { /* an existing JSON failure is safer than emitting a partial digest */ }\n return Object.freeze({\n format_version: DOCTOR_V2_FORMAT_VERSION,\n mode: 'local',\n status: first ? 'fail' : hasWarning ? 'warn' : 'pass',\n first_failure: first?.reason_code ?? null,\n runtime: Object.freeze({ language: 'typescript', sdk_version: __version__, schema_version: String(TELEMETRY_SCHEMA_VERSION), transport: 'otlp_http_protobuf' }),\n ...(digest && TRACE_ID.test(envelope.trace_id) && SPAN_ID.test(envelope.root_span_id) ? { capture: Object.freeze({ trace_id: envelope.trace_id, root_span_id: envelope.root_span_id, span_count: envelope.spans.length, semantic_digest: digest }) } : {}),\n sampling: Object.freeze({ effective_sampler: options.effectiveSampler ?? 'parentbased_traceidratio', root_sample_rate: options.rootSampleRate ?? 1, sampled: envelope.spans.find((span) => span.sampled !== undefined)?.sampled ?? true }),\n ownership: Object.freeze({ provider: options.privateProvider === false ? 'ambiguous' : 'private', instrumentor_count: options.instrumentorCount ?? 0 }),\n queue: Object.freeze({ mode: options.queueMode ?? 'diagnostic_capture', pending_spans: options.pendingSpans ?? 0, dropped_spans: options.droppedSpans ?? 0, capacity: options.queueMaxSize ?? 2_048 }),\n retry: Object.freeze({ attempts: options.retryAttempts ?? 0, window_ms: options.retryWindowMs ?? 0, exhausted: options.retryExhausted ?? false }),\n flush: Object.freeze({ outcome: flushOutcome, timeout_ms: options.flushTimeoutMs ?? 5_000, duration_ms: options.flushDurationMs ?? null }),\n checks: Object.freeze(checks),\n });\n}\n\n/** Inspect the latest trace captured at the final masked export boundary. */\nexport function doctorCapturedLocalV2(\n options: Readonly<{ traceId?: string; flushOutcome?: 'not_attempted' | 'success' | 'timeout' | 'failed'; flushTimeoutMs?: number; flushDurationMs?: number | null; checkPii?: boolean }> = {},\n): DoctorV2Result | null {\n const envelope = getCapturedEnvelope(options.traceId);\n if (!envelope) return null;\n const runtime = _doctorRuntimeSnapshot();\n return doctorLocalV2(envelope, {\n flushOutcome: options.flushOutcome,\n flushTimeoutMs: options.flushTimeoutMs,\n flushDurationMs: options.flushDurationMs,\n privateProvider: runtime.ownsTracerProvider,\n effectiveSampler: runtime.effectiveSampler.split(':')[0],\n rootSampleRate: Number(runtime.effectiveSampler.split(':').at(-1)) || 0,\n queueMode: runtime.exportEnabled ? 'batch' : 'diagnostic_capture',\n queueMaxSize: runtime.queueMaxSize,\n droppedSpans: runtime.exportHealth?.droppedSpans ?? 0,\n checkPii: options.checkPii,\n });\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.neatlogs.com/telemetry/v2/neatlogs-telemetry.schema.json\",\n \"title\": \"NeatLogs Canonical Telemetry Span Envelope v2\",\n \"description\": \"The language-neutral canonical span representation used after capture normalization and before masking/export.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"schema_version\",\n \"trace_id\",\n \"span_id\",\n \"parent_span_id\",\n \"name\",\n \"kind\",\n \"ownership\",\n \"wrapper\",\n \"input\",\n \"output\",\n \"status\",\n \"error\",\n \"code\",\n \"provenance\",\n \"conflicts\",\n \"semantic\",\n \"attributes\"\n ],\n \"properties\": {\n \"schema_version\": {\n \"const\": 2\n },\n \"trace_id\": {\n \"$ref\": \"#/$defs/traceId\"\n },\n \"span_id\": {\n \"$ref\": \"#/$defs/spanId\"\n },\n \"parent_span_id\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/spanId\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 1024\n },\n \"kind\": {\n \"$ref\": \"#/$defs/spanKind\"\n },\n \"start_time_unix_nano\": {\n \"$ref\": \"#/$defs/uint64String\"\n },\n \"end_time_unix_nano\": {\n \"$ref\": \"#/$defs/uint64String\"\n },\n \"ownership\": {\n \"$ref\": \"#/$defs/ownership\"\n },\n \"wrapper\": {\n \"$ref\": \"#/$defs/wrapper\"\n },\n \"input\": {\n \"$ref\": \"#/$defs/typedValue\"\n },\n \"output\": {\n \"$ref\": \"#/$defs/typedValue\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/status\"\n },\n \"error\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/error\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"code\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/codeLocation\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"provenance\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/provenance\"\n }\n },\n \"conflicts\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/conflict\"\n }\n },\n \"semantic\": {\n \"$ref\": \"#/$defs/semantic\"\n },\n \"attributes\": {\n \"type\": \"object\",\n \"description\": \"Non-canonical source attributes retained for compatibility and debugging. They never override canonical fields.\",\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n }\n },\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"LLM\"\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/llmSemantic\"\n }\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"TOOL\",\n \"MCP_TOOL\"\n ]\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/toolSemantic\"\n }\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"RETRIEVER\"\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/retrieverSemantic\"\n }\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"RERANKER\"\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/rerankerSemantic\"\n }\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"EMBEDDING\"\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/embeddingSemantic\"\n }\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"VECTOR_STORE\"\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/vectorStoreSemantic\"\n }\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"MEMORY\"\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/memorySemantic\"\n }\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"GUARDRAIL\"\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/guardrailSemantic\"\n }\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"LOG\"\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"semantic\": {\n \"$ref\": \"#/$defs/logSemantic\"\n }\n }\n }\n }\n ],\n \"$defs\": {\n \"traceId\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9a-f]{32}$\"\n },\n \"spanId\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9a-f]{16}$\"\n },\n \"uint64String\": {\n \"type\": \"string\",\n \"pattern\": \"^(0|[1-9][0-9]*)$\"\n },\n \"jsonValue\": {\n \"oneOf\": [\n {\n \"type\": \"null\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n },\n {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n }\n ]\n },\n \"spanKind\": {\n \"type\": \"string\",\n \"enum\": [\n \"WORKFLOW\",\n \"AGENT\",\n \"CHAIN\",\n \"TASK\",\n \"LLM\",\n \"TOOL\",\n \"MCP_TOOL\",\n \"RETRIEVER\",\n \"RERANKER\",\n \"EMBEDDING\",\n \"VECTOR_STORE\",\n \"MEMORY\",\n \"GUARDRAIL\",\n \"EVALUATOR\",\n \"LOG\",\n \"HTTP\",\n \"UNKNOWN\"\n ]\n },\n \"ownership\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"owner\",\n \"provider_generation\",\n \"project_key_id\",\n \"propagation\"\n ],\n \"properties\": {\n \"owner\": {\n \"type\": \"string\",\n \"enum\": [\n \"neatlogs-sdk\",\n \"neatlogs-ingest-adapter\",\n \"neatlogs-backend-recovery\",\n \"external-otel\"\n ]\n },\n \"provider_generation\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"project_key_id\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"propagation\": {\n \"type\": \"string\",\n \"enum\": [\n \"local-private-context\",\n \"explicit-neatlogs-remote\",\n \"backend-projection\",\n \"external-ingest\"\n ]\n }\n }\n },\n \"wrapper\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"captured\",\n \"integration\",\n \"integration_version\",\n \"capture_fidelity\"\n ],\n \"properties\": {\n \"captured\": {\n \"type\": \"boolean\"\n },\n \"integration\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"integration_version\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"capture_fidelity\": {\n \"type\": \"string\",\n \"enum\": [\n \"native\",\n \"normalized\",\n \"flattened\",\n \"synthetic-recovery\",\n \"unknown\"\n ]\n }\n }\n },\n \"typedValue\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"value\",\n \"media\"\n ],\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"none\",\n \"text\",\n \"json\",\n \"messages\",\n \"documents\",\n \"media\",\n \"binary-reference\"\n ]\n },\n \"value\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"media\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/mediaReference\"\n }\n }\n }\n },\n \"mediaReference\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"sha256\",\n \"mime_type\",\n \"byte_length\",\n \"source\",\n \"purpose\",\n \"state\",\n \"safe_preview\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"sha256\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9a-f]{64}$\"\n },\n \"mime_type\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"byte_length\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"source\": {\n \"type\": \"string\",\n \"enum\": [\n \"inline\",\n \"url\",\n \"file\",\n \"provider\",\n \"uploaded\",\n \"generated\"\n ]\n },\n \"purpose\": {\n \"type\": \"string\",\n \"enum\": [\n \"input\",\n \"output\",\n \"tool-argument\",\n \"tool-result\",\n \"document\",\n \"raw-stream\",\n \"overflow\"\n ]\n },\n \"state\": {\n \"type\": \"string\",\n \"enum\": [\n \"inline\",\n \"pending-upload\",\n \"available\",\n \"failed\",\n \"expired\"\n ]\n },\n \"safe_preview\": {\n \"type\": [\n \"string\",\n \"null\"\n ],\n \"maxLength\": 4096\n }\n }\n },\n \"status\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"code\",\n \"message\",\n \"source\"\n ],\n \"properties\": {\n \"code\": {\n \"type\": \"string\",\n \"enum\": [\n \"UNSET\",\n \"OK\",\n \"ERROR\"\n ]\n },\n \"message\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"source\": {\n \"type\": \"string\",\n \"enum\": [\n \"application\",\n \"provider\",\n \"sdk\",\n \"backend-recovery\",\n \"unknown\"\n ]\n }\n }\n },\n \"error\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"message\",\n \"stack\",\n \"escaped\"\n ],\n \"properties\": {\n \"type\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"message\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"stack\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"escaped\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"codeLocation\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"file\",\n \"function\",\n \"line\",\n \"column\",\n \"namespace\"\n ],\n \"properties\": {\n \"file\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"function\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"line\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 1\n },\n \"column\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 1\n },\n \"namespace\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n }\n }\n },\n \"sourceDialect\": {\n \"type\": \"string\",\n \"enum\": [\n \"native-v2\",\n \"neatlogs-direct\",\n \"otel-genai\",\n \"openinference\",\n \"provider-specific\",\n \"external-legacy\",\n \"unknown-raw\"\n ]\n },\n \"provenance\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"target\",\n \"source_dialect\",\n \"source_key\",\n \"precedence\",\n \"action\"\n ],\n \"properties\": {\n \"target\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"source_dialect\": {\n \"$ref\": \"#/$defs/sourceDialect\"\n },\n \"source_key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"precedence\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 7\n },\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"accepted\",\n \"synthesized\",\n \"missing\",\n \"ignored-lower-precedence\",\n \"retained-raw\",\n \"rejected-invalid\"\n ]\n }\n }\n },\n \"conflict\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"target\",\n \"winner_source_key\",\n \"loser_source_key\",\n \"reason_code\"\n ],\n \"properties\": {\n \"target\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"winner_source_key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"loser_source_key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"reason_code\": {\n \"type\": \"string\",\n \"enum\": [\n \"LOWER_PRECEDENCE\",\n \"INVALID_TYPE\",\n \"INVALID_JSON\",\n \"EMPTY_VALUE\",\n \"DUPLICATE_SEMANTIC_VALUE\",\n \"UNSUPPORTED_SOURCE\"\n ]\n }\n }\n },\n \"message\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"role\",\n \"name\",\n \"content\",\n \"tool_calls\",\n \"tool_call_id\"\n ],\n \"properties\": {\n \"role\": {\n \"type\": \"string\",\n \"enum\": [\n \"system\",\n \"developer\",\n \"user\",\n \"assistant\",\n \"tool\"\n ]\n },\n \"name\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"content\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/contentPart\"\n }\n },\n \"tool_calls\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/toolCall\"\n }\n },\n \"tool_call_id\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n }\n }\n },\n \"contentPart\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"text\"\n ],\n \"properties\": {\n \"type\": {\n \"const\": \"text\"\n },\n \"text\": {\n \"type\": \"string\"\n }\n }\n },\n {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"reference\"\n ],\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"image\",\n \"audio\",\n \"document\",\n \"video\"\n ]\n },\n \"reference\": {\n \"$ref\": \"#/$defs/mediaReference\"\n }\n }\n },\n {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"call_id\",\n \"value\",\n \"is_error\"\n ],\n \"properties\": {\n \"type\": {\n \"const\": \"tool_result\"\n },\n \"call_id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"value\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"is_error\": {\n \"type\": \"boolean\"\n }\n }\n }\n ]\n },\n \"toolDefinition\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"name\",\n \"description\",\n \"schema\",\n \"configuration\"\n ],\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"description\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"schema\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"configuration\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n }\n },\n \"toolCall\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"id_origin\",\n \"type\",\n \"name\",\n \"arguments\",\n \"choice_index\",\n \"tool_index\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"id_origin\": {\n \"type\": \"string\",\n \"enum\": [\n \"neatlogs-direct\",\n \"provider\",\n \"deterministic-synthetic\"\n ]\n },\n \"type\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"arguments\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"choice_index\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"tool_index\": {\n \"type\": \"integer\",\n \"minimum\": 0\n }\n }\n },\n \"toolResult\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"call_id\",\n \"value\",\n \"is_error\",\n \"media\"\n ],\n \"properties\": {\n \"call_id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"value\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"is_error\": {\n \"type\": \"boolean\"\n },\n \"media\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/mediaReference\"\n }\n }\n }\n },\n \"llmParameters\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"temperature\",\n \"top_p\",\n \"top_k\",\n \"max_output_tokens\",\n \"stop\",\n \"seed\",\n \"frequency_penalty\",\n \"presence_penalty\",\n \"response_format\",\n \"reasoning\",\n \"service_tier\",\n \"provider_options\"\n ],\n \"properties\": {\n \"temperature\": {\n \"type\": [\n \"number\",\n \"null\"\n ]\n },\n \"top_p\": {\n \"type\": [\n \"number\",\n \"null\"\n ]\n },\n \"top_k\": {\n \"type\": [\n \"number\",\n \"null\"\n ]\n },\n \"max_output_tokens\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"stop\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"seed\": {\n \"type\": [\n \"integer\",\n \"null\"\n ]\n },\n \"frequency_penalty\": {\n \"type\": [\n \"number\",\n \"null\"\n ]\n },\n \"presence_penalty\": {\n \"type\": [\n \"number\",\n \"null\"\n ]\n },\n \"response_format\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"reasoning\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"service_tier\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"provider_options\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n }\n },\n \"llmRequest\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"provider\",\n \"model\",\n \"operation\",\n \"messages\",\n \"tools\",\n \"parameters\"\n ],\n \"properties\": {\n \"provider\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"model\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"operation\": {\n \"type\": \"string\",\n \"enum\": [\n \"chat\",\n \"completion\",\n \"responses\",\n \"generate\",\n \"unknown\"\n ]\n },\n \"messages\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/message\"\n }\n },\n \"tools\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/toolDefinition\"\n }\n },\n \"parameters\": {\n \"$ref\": \"#/$defs/llmParameters\"\n }\n }\n },\n \"llmChoice\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"choice_index\",\n \"message\",\n \"finish_reason\"\n ],\n \"properties\": {\n \"choice_index\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"message\": {\n \"$ref\": \"#/$defs/message\"\n },\n \"finish_reason\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n }\n }\n },\n \"llmResponse\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"model\",\n \"choices\",\n \"finish_reasons\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"model\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"choices\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/llmChoice\"\n }\n },\n \"finish_reasons\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n }\n }\n }\n },\n \"llmUsage\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"input_tokens\",\n \"output_tokens\",\n \"total_tokens\",\n \"reasoning_tokens\",\n \"cache_read_tokens\",\n \"cache_write_tokens\",\n \"cost_usd\"\n ],\n \"properties\": {\n \"input_tokens\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"output_tokens\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"total_tokens\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"reasoning_tokens\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"cache_read_tokens\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"cache_write_tokens\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"cost_usd\": {\n \"type\": [\n \"number\",\n \"null\"\n ],\n \"minimum\": 0\n }\n }\n },\n \"streamEvent\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"sequence\",\n \"time_unix_nano\",\n \"type\",\n \"choice_index\",\n \"tool_index\",\n \"value\"\n ],\n \"properties\": {\n \"sequence\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"time_unix_nano\": {\n \"$ref\": \"#/$defs/uint64String\"\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"output_text.delta\",\n \"reasoning.delta\",\n \"tool_call.delta\",\n \"choice.finish\",\n \"usage\",\n \"error\"\n ]\n },\n \"choice_index\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"tool_index\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"value\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n }\n },\n \"llmStream\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"time_to_first_token_ms\",\n \"chunk_count\",\n \"choice_count\",\n \"events\",\n \"raw_chunks\"\n ],\n \"properties\": {\n \"time_to_first_token_ms\": {\n \"type\": [\n \"number\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"chunk_count\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"choice_count\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"events\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/streamEvent\"\n }\n },\n \"raw_chunks\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/mediaReference\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n }\n },\n \"llmSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"request\",\n \"response\",\n \"usage\",\n \"stream\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"LLM\"\n },\n \"request\": {\n \"$ref\": \"#/$defs/llmRequest\"\n },\n \"response\": {\n \"$ref\": \"#/$defs/llmResponse\"\n },\n \"usage\": {\n \"$ref\": \"#/$defs/llmUsage\"\n },\n \"stream\": {\n \"$ref\": \"#/$defs/llmStream\"\n }\n }\n },\n \"toolSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"definition\",\n \"call\",\n \"result\",\n \"requesting_span_id\",\n \"transport\"\n ],\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"TOOL\",\n \"MCP_TOOL\"\n ]\n },\n \"definition\": {\n \"$ref\": \"#/$defs/toolDefinition\"\n },\n \"call\": {\n \"$ref\": \"#/$defs/toolCall\"\n },\n \"result\": {\n \"$ref\": \"#/$defs/toolResult\"\n },\n \"requesting_span_id\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/spanId\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"transport\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/mcpTransport\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n }\n },\n \"document\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"content\",\n \"score\",\n \"metadata\",\n \"media\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"content\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"score\": {\n \"type\": [\n \"number\",\n \"null\"\n ]\n },\n \"metadata\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"media\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/mediaReference\"\n }\n }\n }\n },\n \"retrieverSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"query\",\n \"documents\",\n \"top_k\",\n \"filters\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"RETRIEVER\"\n },\n \"query\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"documents\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/document\"\n }\n },\n \"top_k\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"filters\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n }\n },\n \"rerankerSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"model\",\n \"query\",\n \"input_documents\",\n \"output_documents\",\n \"top_n\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"RERANKER\"\n },\n \"model\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"query\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"input_documents\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/document\"\n }\n },\n \"output_documents\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/document\"\n }\n },\n \"top_n\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n }\n }\n },\n \"embeddingSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"provider\",\n \"model\",\n \"inputs\",\n \"vectors\",\n \"dimensions\",\n \"usage\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"EMBEDDING\"\n },\n \"provider\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"model\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"inputs\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n },\n \"vectors\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"number\"\n }\n }\n },\n \"dimensions\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"minimum\": 0\n },\n \"usage\": {\n \"$ref\": \"#/$defs/llmUsage\"\n }\n }\n },\n \"vectorStoreSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"provider\",\n \"operation\",\n \"collection\",\n \"query\",\n \"documents\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"VECTOR_STORE\"\n },\n \"provider\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"operation\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"collection\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"query\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"documents\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/document\"\n }\n }\n }\n },\n \"memorySemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"operation\",\n \"memory_id\",\n \"scope\",\n \"value\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"MEMORY\"\n },\n \"operation\": {\n \"type\": \"string\",\n \"enum\": [\n \"read\",\n \"write\",\n \"update\",\n \"delete\",\n \"search\",\n \"unknown\"\n ]\n },\n \"memory_id\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"scope\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"value\": {\n \"$ref\": \"#/$defs/jsonValue\"\n }\n }\n },\n \"guardrailSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"name\",\n \"action\",\n \"triggered\",\n \"score\",\n \"reason\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"GUARDRAIL\"\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"action\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"triggered\": {\n \"type\": \"boolean\"\n },\n \"score\": {\n \"type\": [\n \"number\",\n \"null\"\n ]\n },\n \"reason\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n }\n }\n },\n \"mcpTransport\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"transport\",\n \"server\",\n \"method\",\n \"request_id\"\n ],\n \"properties\": {\n \"transport\": {\n \"type\": \"string\",\n \"enum\": [\n \"stdio\",\n \"sse\",\n \"streamable-http\",\n \"websocket\",\n \"unknown\"\n ]\n },\n \"server\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"method\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"request_id\": {\n \"type\": [\n \"string\",\n \"number\",\n \"null\"\n ]\n }\n }\n },\n \"logSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"severity_text\",\n \"severity_number\",\n \"body\",\n \"logger_name\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"LOG\"\n },\n \"severity_text\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"severity_number\": {\n \"type\": [\n \"integer\",\n \"null\"\n ]\n },\n \"body\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"logger_name\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n }\n }\n },\n \"operationSemantic\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"operation\",\n \"role\",\n \"metadata\",\n \"recovery\"\n ],\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"WORKFLOW\",\n \"AGENT\",\n \"CHAIN\",\n \"TASK\",\n \"EVALUATOR\",\n \"HTTP\",\n \"UNKNOWN\"\n ]\n },\n \"operation\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"role\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"metadata\": {\n \"$ref\": \"#/$defs/jsonValue\"\n },\n \"recovery\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/recovery\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n }\n },\n \"recovery\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"synthetic\",\n \"reason\",\n \"recovery_span_id\",\n \"genuine_root_span_id\",\n \"reconciled\"\n ],\n \"properties\": {\n \"synthetic\": {\n \"const\": true\n },\n \"reason\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"recovery_span_id\": {\n \"$ref\": \"#/$defs/spanId\"\n },\n \"genuine_root_span_id\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/spanId\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"reconciled\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"semantic\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/llmSemantic\"\n },\n {\n \"$ref\": \"#/$defs/toolSemantic\"\n },\n {\n \"$ref\": \"#/$defs/retrieverSemantic\"\n },\n {\n \"$ref\": \"#/$defs/rerankerSemantic\"\n },\n {\n \"$ref\": \"#/$defs/embeddingSemantic\"\n },\n {\n \"$ref\": \"#/$defs/vectorStoreSemantic\"\n },\n {\n \"$ref\": \"#/$defs/memorySemantic\"\n },\n {\n \"$ref\": \"#/$defs/guardrailSemantic\"\n },\n {\n \"$ref\": \"#/$defs/logSemantic\"\n },\n {\n \"$ref\": \"#/$defs/operationSemantic\"\n }\n ]\n }\n },\n \"x-neatlogs-policy\": {\n \"contract_version\": \"2.0.0\",\n \"attribute_prefix\": \"neatlogs.v2\",\n \"conflict_precedence\": [\n \"native-v2\",\n \"neatlogs-direct\",\n \"otel-genai\",\n \"openinference\",\n \"provider-specific\",\n \"external-legacy\",\n \"unknown-raw\"\n ],\n \"tool_calls\": {\n \"assistant_requests_live_in_assistant_message\": true,\n \"execution_is_separate_tool_span\": true,\n \"id_precedence\": [\n \"neatlogs-direct\",\n \"provider\",\n \"deterministic-synthetic\"\n ],\n \"retain_unlinked_execution\": true,\n \"forbid_name_timing_merge\": true\n },\n \"root_finalization\": {\n \"launch_sdk_auto_workflow_roots\": true,\n \"launch_completion_markers\": true,\n \"stale_root_recovery_is_safety_net\": true,\n \"recovered_root_status_must_not_be_fabricated_ok\": true,\n \"preserve_late_genuine_root_identity\": true,\n \"logical_root_only_finalization\": \"deferred-post-launch\"\n },\n \"launch_scope\": {\n \"sdk_transport\": \"otlp-http-protobuf\",\n \"python_openinference_compatibility\": \"retain-where-active\",\n \"sdk_product_apis_excluded\": [\n \"datasets\",\n \"evaluations\",\n \"scoring\",\n \"experiments\",\n \"new-prompt-apis\"\n ],\n \"new_go_integrations\": false,\n \"typescript_edge_entrypoint\": false\n },\n \"compatibility\": [\n {\n \"dialect\": \"neatlogs-direct\",\n \"patterns\": [\n \"neatlogs.span.kind\",\n \"neatlogs.doctor\",\n \"neatlogs.doctor.*\",\n \"neatlogs.workflow.*\",\n \"neatlogs.agent.*\",\n \"neatlogs.llm.*\",\n \"neatlogs.tool.*\",\n \"neatlogs.retriever.*\",\n \"neatlogs.reranker.*\",\n \"neatlogs.embedding.*\",\n \"neatlogs.vector_store.*\",\n \"neatlogs.memory.*\",\n \"neatlogs.guardrail.*\",\n \"neatlogs.evaluator.*\",\n \"neatlogs.mcp.*\",\n \"neatlogs.code.*\"\n ],\n \"launch_state\": \"accepted\"\n },\n {\n \"dialect\": \"otel-genai\",\n \"patterns\": [\n \"gen_ai.*\"\n ],\n \"launch_state\": \"accepted-at-normalization-boundary\"\n },\n {\n \"dialect\": \"openinference\",\n \"patterns\": [\n \"openinference.span.kind\",\n \"input.value\",\n \"input.mime_type\",\n \"output.value\",\n \"output.mime_type\",\n \"llm.*\",\n \"tool.*\",\n \"retrieval.*\",\n \"embedding.*\"\n ],\n \"launch_state\": \"accepted-for-active-python-integrations\"\n },\n {\n \"dialect\": \"provider-specific\",\n \"patterns\": [\n \"ai.*\",\n \"openai.*\",\n \"anthropic.*\",\n \"aws.bedrock.*\",\n \"google_genai.*\",\n \"vertex_ai.*\"\n ],\n \"launch_state\": \"accepted-at-source-adapter\"\n },\n {\n \"dialect\": \"external-legacy\",\n \"patterns\": [\n \"traceloop.*\",\n \"openlit.*\"\n ],\n \"launch_state\": \"accepted-with-provenance\"\n },\n {\n \"dialect\": \"unknown-raw\",\n \"patterns\": [\n \"*\"\n ],\n \"launch_state\": \"retain-raw-never-overwrite-canonical\"\n }\n ],\n \"compatibility_removal_gate\": {\n \"minimum_releases\": 2,\n \"minimum_observation_days\": 30,\n \"requires_zero_mapping_hits\": true,\n \"requires_source_adapter_migration\": true,\n \"requires_golden_fixture_removal_review\": true\n },\n \"deferred_post_launch\": [\n \"logical-root-only-finalization\",\n \"automatic-root-removal\",\n \"completion-marker-removal\",\n \"user-defined-export-filter\",\n \"runtime-tracing-toggle\",\n \"new-go-integrations\",\n \"typescript-edge-entrypoint\",\n \"sdk-datasets-evaluations-scoring-experiments\"\n ]\n }\n}\n","import schema from './contracts/v2/neatlogs-telemetry.schema.json';\n\nexport const TELEMETRY_CONTRACT_VERSION = '2.0.0' as const;\nexport const TELEMETRY_SCHEMA_VERSION = 2 as const;\nexport const TELEMETRY_SCHEMA_SHA256 =\n 'ae79717d127e2faa761ad83c8a51a08cae6fce00a04446d46dcc6d1a371818ce' as const;\n\n/** Parsed canonical telemetry contract bundled from the public schema bytes. */\nexport const TELEMETRY_SCHEMA_V2 = Object.freeze(schema);\n\n/** The frozen source-dialect order used for canonical conflict resolution. */\nexport const TELEMETRY_CONFLICT_PRECEDENCE = Object.freeze(\n [...schema['x-neatlogs-policy'].conflict_precedence] as const,\n);\n","/**\n * SDK version. Kept in sync with package.json by the `version:sync` script\n * (runs automatically on `prebuild`). Do not edit by hand — bump package.json.\n */\nexport const __version__ = '1.1.21';\n","/**\n * Neatlogs SDK initialisation, flush, and shutdown.\n *\n * Port of Python neatlogs/init.py to TypeScript.\n *\n * `init()` sets up the OTel TracerProvider, MeterProvider, LoggerProvider,\n * span processors, and exporters.\n * `flush()` and `shutdown()` handle graceful cleanup.\n */\n\nimport * as path from \"node:path\";\nimport { createHash } from \"node:crypto\";\n\nimport { Resource } from \"@opentelemetry/resources\";\nimport { ATTR_SERVICE_NAME } from \"@opentelemetry/semantic-conventions\";\nimport { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\";\nimport {\n ParentBasedSampler,\n TraceIdRatioBasedSampler,\n type BasicTracerProvider,\n type SpanProcessor,\n type SpanExporter,\n} from \"@opentelemetry/sdk-trace-base\";\nimport { ExportResultCode } from \"@opentelemetry/core\";\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-proto\";\nimport { CompressionAlgorithm } from \"@opentelemetry/otlp-exporter-base\";\nimport { LoggerProvider } from \"@opentelemetry/sdk-logs\";\nimport { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-proto\";\n\nimport {\n CompletionMarkerSpanProcessor,\n NeatlogsSpanProcessor,\n} from \"./core/span-processor.js\";\nimport { addVerificationMarkerResourceAttribute } from \"./core/resource.js\";\nimport { getRegisteredClients } from \"./core/client-registry.js\";\nimport { FilteringExporter } from \"./core/filtering-exporter.js\";\nimport { capturePreparedSpans, clearDoctorCapture } from \"./core/doctor-capture.js\";\nimport { ByteLimitedSpanExporter } from \"./core/byte-limited-exporter.js\";\nimport { MaskingLogExporter } from \"./core/masking-log-exporter.js\";\nimport { discardPendingMediaOwner } from \"./core/media.js\";\nimport {\n DeliveryDiagnostics,\n type DeliveryDiagnosticsSnapshot,\n} from \"./core/delivery-diagnostics.js\";\nimport {\n ObservableBatchLogRecordProcessor,\n ObservableBatchSpanProcessor,\n} from \"./core/observable-batch-processors.js\";\nimport { _setOtelLogger } from \"./core/log.js\";\nimport { _setSessionConfig } from \"./core/context.js\";\nimport { _setNeatlogsProvider } from \"./core/provider.js\";\nimport { getLogger, enableDebugLogging } from \"./core/logger.js\";\nimport {\n PromptClient,\n closeSharedClient,\n setSharedClient,\n} from \"./prompt/client.js\";\nimport { _resetMastraCache } from \"./mastra.js\";\nimport { __version__ } from \"./version.js\";\nimport { NeatlogsConfigurationError } from \"./errors.js\";\nimport { DEFAULT_INGEST_ENDPOINT, exportQueueCapacity } from \"./constants.js\";\nimport { runByDeadline } from \"./core/deadline.js\";\nimport {\n DisabledUploadAuthority,\n isUploadAuthority,\n resolveUploadAuthority,\n uploadsEnabledFromEnv,\n type UploadAuthorityOption,\n} from \"./core/upload-authority.js\";\nimport type { InitOptions } from \"./types.js\";\n\nconst logger = getLogger();\n\n// ---------------------------------------------------------------------------\n// Module-level state\n// ---------------------------------------------------------------------------\n\nlet _initialized = false;\ntype LifecycleState = \"uninitialized\" | \"initializing\" | \"running\" | \"closing\";\nlet _lifecycleState: LifecycleState = \"uninitialized\";\nlet _initPromise: Promise<void> | null = null;\nlet _tracerProvider: BasicTracerProvider | null = null;\nlet _ownsTracerProvider = false;\nlet _logProvider: LoggerProvider | null = null;\nlet _spanProcessor: NeatlogsSpanProcessor | null = null;\nlet _transportSpanProcessors: SpanProcessor[] = [];\nlet _completionProcessor: CompletionMarkerSpanProcessor | null = null;\nlet _debugMode = false;\nlet _deliveryDiagnostics = new DeliveryDiagnostics();\ninterface InitIdentity {\n serialized: string;\n mask: InitOptions[\"mask\"];\n tracerProvider: InitOptions[\"tracerProvider\"];\n uploadAuthority: UploadAuthorityOption | undefined;\n doctorProbeExporter: InitOptions[\"doctorProbeExporter\"];\n}\nlet _initIdentity: InitIdentity | null = null;\nlet _effectiveSampleRate = 1;\nlet _exportEnabled = false;\nlet _queueMaxSize = 2_048;\n\n// Track signal handlers so we can remove them in shutdown()\nlet _sigHandlersRegistered = false;\nlet _signalShutdownStarted = false;\nlet _shutdownPromise: Promise<boolean> | null = null;\nconst _shutdownBeforeExit = () => {\n void shutdown(\"beforeExit\").catch((error) => {\n logger.error(`Error shutting down before exit: ${error}`);\n });\n};\nconst _shutdownOnSignal = (signal: NodeJS.Signals) => {\n if (_signalShutdownStarted) return;\n _signalShutdownStarted = true;\n // Node delivered this original signal to every registered listener. If the\n // host has one, it owns termination; re-sending would look like a second\n // signal. Only restore default signal semantics when Neatlogs was alone.\n const hostOwnsSignal = process\n .listeners(signal)\n .some((listener) => listener !== _shutdownOnSignal);\n void shutdown(signal)\n .catch((error) => {\n logger.error(`Error shutting down after ${signal}: ${error}`);\n })\n .finally(() => {\n if (hostOwnsSignal || process.listenerCount(signal) > 0) return;\n try {\n process.kill(process.pid, signal);\n } catch {\n process.exitCode = signal === \"SIGINT\" ? 130 : 143;\n }\n });\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a non-empty workflow name; derive from process.argv when omitted.\n */\nfunction _resolveWorkflowName(workflowName?: string): string {\n const provided = (workflowName ?? \"\").trim();\n if (provided) return provided;\n\n const argv1 = process.argv[1] ?? \"\";\n const base = path.basename(argv1, path.extname(argv1));\n const slug = base\n .replace(/[^a-zA-Z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .toLowerCase();\n\n if (slug && ![\"node\", \"ts-node\", \"tsx\", \"npx\", \"-e\"].includes(slug)) {\n return slug;\n }\n\n return \"neatlogs-app\";\n}\n\nconst INIT_OPTION_KEYS = new Set<keyof InitOptions>([\n \"apiKey\",\n \"workflowName\",\n \"userId\",\n \"tags\",\n \"metadata\",\n \"debug\",\n \"disableExport\",\n \"diagnosticCapture\",\n \"doctorProbe\",\n \"doctorProbeExporter\",\n \"doctorProbeTimeoutMillis\",\n \"tracerProvider\",\n \"registerShutdownHandlers\",\n \"mask\",\n \"sampleRate\",\n \"captureLogs\",\n \"pii\",\n \"version\",\n \"endpoint\",\n \"batchSize\",\n \"flushInterval\",\n \"piiEnabled\",\n \"piiSpanTypes\",\n \"uploadAuthority\",\n]);\n\n/** Explicit `endpoint` wins, then NEATLOGS_ENDPOINT, then the prod default. */\nexport function resolveInitEndpoint(endpoint: string | undefined): string {\n const explicit = (endpoint ?? \"\").trim();\n if (explicit) return explicit;\n const fromEnv = (process.env.NEATLOGS_ENDPOINT ?? \"\").trim();\n return fromEnv || DEFAULT_INGEST_ENDPOINT;\n}\n\n/**\n * Parse a resolved ingest endpoint down to its base origin. The endpoint must\n * be a bare base URL or an OTLP traces URL ending in /v1/traces. Any other\n * path would be silently dropped by origin parsing and misroute telemetry, so\n * it is rejected instead (same contract as the python SDK).\n */\nexport function resolveIngestBaseUrl(endpoint: string): string {\n const parsed = new URL(endpoint.trim());\n const path = parsed.pathname.replace(/\\/+$/, \"\");\n if (path !== \"\" && path !== \"/v1/traces\") {\n throw new NeatlogsConfigurationError(\n \"INVALID_ENDPOINT\",\n \"endpoint\",\n \"endpoint must be a base URL or an OTLP traces URL ending in /v1/traces.\",\n );\n }\n return parsed.origin;\n}\n\nfunction validateInitOptions(options: InitOptions): void {\n const raw = options as Record<string, unknown>;\n if (Object.prototype.hasOwnProperty.call(raw, \"instrumentations\")) {\n throw new NeatlogsConfigurationError(\n \"UNSUPPORTED_INSTRUMENTATIONS\",\n \"instrumentations\",\n \"The instrumentations option was removed. Use an explicit Neatlogs wrapper, handler, hook, processor, or plugin for the library instance.\",\n );\n }\n const unknown = Object.keys(raw).find(\n (key) => !INIT_OPTION_KEYS.has(key as keyof InitOptions),\n );\n if (unknown) {\n throw new NeatlogsConfigurationError(\n \"UNKNOWN_INIT_OPTION\",\n unknown,\n `Unknown Neatlogs init option: ${unknown}`,\n );\n }\n if (\n options.sampleRate !== undefined &&\n (!Number.isFinite(options.sampleRate) ||\n options.sampleRate < 0 ||\n options.sampleRate > 1)\n ) {\n throw new RangeError(\"sampleRate must be a finite number between 0 and 1.\");\n }\n if (\n options.uploadAuthority !== undefined &&\n typeof options.uploadAuthority !== \"boolean\" &&\n !isUploadAuthority(options.uploadAuthority)\n ) {\n throw new TypeError(\n \"uploadAuthority must be a boolean or an UploadAuthority implementation\",\n );\n }\n if (options.doctorProbeExporter !== undefined && options.doctorProbe !== true) {\n throw new TypeError(\"doctorProbeExporter requires doctorProbe: true\");\n }\n if (options.doctorProbeTimeoutMillis !== undefined && options.doctorProbe !== true) {\n throw new TypeError(\"doctorProbeTimeoutMillis requires doctorProbe: true\");\n }\n if (\n options.doctorProbeTimeoutMillis !== undefined &&\n (!Number.isFinite(options.doctorProbeTimeoutMillis) || options.doctorProbeTimeoutMillis <= 0)\n ) {\n throw new RangeError(\"doctorProbeTimeoutMillis must be a positive finite number\");\n }\n if (options.doctorProbe === true && options.diagnosticCapture !== true) {\n throw new TypeError(\"doctorProbe requires diagnosticCapture: true\");\n }\n if (\n options.diagnosticCapture === true &&\n options.disableExport !== true &&\n options.doctorProbe !== true\n ) {\n throw new TypeError(\n \"diagnosticCapture requires disableExport: true or doctorProbe: true\",\n );\n }\n}\n\nfunction stableValue(\n value: unknown,\n ancestors = new WeakSet<object>(),\n location = \"init options\",\n): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"string\") return `string:${JSON.stringify(value)}`;\n if (typeof value === \"boolean\") return `boolean:${value}`;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new TypeError(`${location} must contain only finite numbers`);\n }\n return `number:${Object.is(value, -0) ? \"-0\" : String(value)}`;\n }\n if (typeof value !== \"object\") {\n throw new TypeError(\n `${location} contains unsupported value type ${typeof value}`,\n );\n }\n if (ancestors.has(value)) {\n throw new TypeError(`${location} contains a circular reference`);\n }\n\n ancestors.add(value);\n try {\n if (Array.isArray(value)) {\n return `array:[${value\n .map((item, index) => stableValue(item, ancestors, `${location}[${index}]`))\n .join(\",\")}]`;\n }\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new TypeError(\n `${location} contains unsupported value ${prototype?.constructor?.name ?? \"object\"}`,\n );\n }\n const record = value as Record<string, unknown>;\n return `object:{${Object.keys(record)\n .sort((left, right) => left.localeCompare(right))\n .map(\n (key) =>\n `${JSON.stringify(key)}:${stableValue(record[key], ancestors, `${location}.${key}`)}`,\n )\n .join(\",\")}}`;\n } finally {\n ancestors.delete(value);\n }\n}\n\n/** Explicit non-empty `apiKey` wins, then NEATLOGS_API_KEY. */\nexport function resolveApiKey(apiKey: string | undefined): string {\n const explicit = (apiKey ?? \"\").trim();\n if (explicit) return explicit;\n return (process.env.NEATLOGS_API_KEY ?? \"\").trim();\n}\n\nfunction initIdentity(options: InitOptions): InitIdentity {\n const apiKey = resolveApiKey(options.apiKey);\n const apiKeyDigest = createHash(\"sha256\").update(apiKey).digest(\"hex\");\n const serialized = stableValue({\n apiKeyDigest,\n workflowName: _resolveWorkflowName(options.workflowName),\n userId: options.userId ?? null,\n tags: options.tags ?? [],\n metadata: options.metadata ?? {},\n debug: options.debug ?? false,\n disableExport:\n !!options.disableExport ||\n [\"true\", \"1\", \"yes\"].includes(\n (process.env.NEATLOGS_DISABLE_EXPORT ?? \"\").toLowerCase(),\n ),\n diagnosticCapture: options.diagnosticCapture ?? false,\n doctorProbe: options.doctorProbe ?? false,\n doctorProbeTimeoutMillis: options.doctorProbeTimeoutMillis ?? null,\n registerShutdownHandlers: options.registerShutdownHandlers ?? null,\n sampleRate: options.sampleRate ?? 1,\n captureLogs: options.captureLogs ?? false,\n pii: options.pii ?? null,\n version: options.version ?? null,\n endpoint: resolveInitEndpoint(options.endpoint),\n batchSize: options.batchSize ?? 100,\n flushInterval: options.flushInterval ?? 5,\n piiEnabled: options.piiEnabled ?? null,\n piiSpanTypes: options.piiSpanTypes ?? [],\n uploadsEnabled:\n typeof options.uploadAuthority === \"boolean\"\n ? options.uploadAuthority\n : isUploadAuthority(options.uploadAuthority)\n ? options.uploadAuthority.available\n : uploadsEnabledFromEnv(process.env.NEATLOGS_UPLOADS_ENABLED),\n });\n return {\n serialized,\n mask: options.mask,\n tracerProvider: options.tracerProvider,\n uploadAuthority: isUploadAuthority(options.uploadAuthority)\n ? options.uploadAuthority\n : undefined,\n doctorProbeExporter: options.doctorProbeExporter,\n };\n}\n\nfunction sameInitIdentity(\n left: InitIdentity | null,\n right: InitIdentity,\n): boolean {\n return (\n left !== null &&\n left.serialized === right.serialized &&\n left.mask === right.mask &&\n left.tracerProvider === right.tracerProvider &&\n left.uploadAuthority === right.uploadAuthority &&\n left.doctorProbeExporter === right.doctorProbeExporter\n );\n}\n\nfunction conflictingInit(): Promise<void> {\n return Promise.reject(\n new NeatlogsConfigurationError(\n \"CONFLICTING_INIT\",\n \"init\",\n \"Neatlogs is already initializing or running with different configuration. Shut it down before reinitializing.\",\n ),\n );\n}\n\n// ---------------------------------------------------------------------------\n// init()\n// ---------------------------------------------------------------------------\n\n/**\n * Initialise the Neatlogs SDK.\n *\n * Sets up OTel TracerProvider, MeterProvider, LoggerProvider, span processors,\n * and exporters. It returns a Promise so initialization remains lifecycle-safe\n * across concurrent callers and future asynchronous transports.\n */\nexport function init(options: InitOptions = {}): Promise<void> {\n let identity: InitIdentity;\n try {\n validateInitOptions(options);\n identity = initIdentity(options);\n } catch (error) {\n return Promise.reject(error);\n }\n if (_lifecycleState === \"initializing\" && _initPromise) {\n return sameInitIdentity(_initIdentity, identity)\n ? _initPromise\n : conflictingInit();\n }\n if (_lifecycleState === \"closing\" && _shutdownPromise) {\n return _shutdownPromise.then(() => init(options));\n }\n if (_lifecycleState === \"running\" || _initialized) {\n if (sameInitIdentity(_initIdentity, identity)) {\n logger.warn(\"Neatlogs already initialized with the same configuration\");\n return Promise.resolve();\n }\n return conflictingInit();\n }\n\n _lifecycleState = \"initializing\";\n _initIdentity = identity;\n const current = Promise.resolve().then(() => _performInit(options));\n _initPromise = current;\n void current.then(\n () => {\n if (_initPromise === current) _initPromise = null;\n if (_lifecycleState === \"initializing\") _lifecycleState = \"running\";\n },\n () => {\n if (_initPromise === current) _initPromise = null;\n if (_lifecycleState === \"initializing\") {\n closeSharedClient();\n _lifecycleState = \"uninitialized\";\n _initIdentity = null;\n }\n },\n );\n return current;\n}\n\nasync function _performInit(options: InitOptions): Promise<void> {\n // A new runtime must not diagnose envelopes from a previous initialization.\n clearDoctorCapture();\n const sampleRate = options.sampleRate ?? 1.0;\n if (!Number.isFinite(sampleRate) || sampleRate < 0 || sampleRate > 1) {\n throw new RangeError(\"sampleRate must be a finite number between 0 and 1.\");\n }\n if (options.tracerProvider && options.sampleRate !== undefined) {\n throw new Error(\n \"sampleRate cannot configure a caller-owned tracerProvider; configure its sampler directly.\",\n );\n }\n _deliveryDiagnostics = new DeliveryDiagnostics();\n\n // 2. Resolve API key\n let resolvedKey = resolveApiKey(options.apiKey);\n\n // 3. Resolve disableExport\n let disableExportResolved =\n !!options.disableExport ||\n [\"true\", \"1\", \"yes\"].includes(\n (process.env.NEATLOGS_DISABLE_EXPORT ?? \"\").toLowerCase(),\n );\n\n if (!resolvedKey) {\n disableExportResolved = true;\n resolvedKey = \"disabled\";\n if (options.debug) {\n logger.warn(\n \"No NEATLOGS_API_KEY set; HTTP export disabled. \" +\n \"Set NEATLOGS_API_KEY (or pass apiKey) to send spans to the backend.\",\n );\n }\n }\n _effectiveSampleRate = sampleRate;\n _exportEnabled = !disableExportResolved;\n _queueMaxSize = 2_048;\n\n // 4. Debug mode\n if (options.debug) {\n enableDebugLogging();\n }\n _debugMode = options.debug ?? false;\n\n // 5. Resolve workflow name\n const resolvedWorkflowName = _resolveWorkflowName(options.workflowName);\n\n // 6. Parse base URL from endpoint\n const endpoint = resolveInitEndpoint(options.endpoint);\n const baseUrl = resolveIngestBaseUrl(endpoint);\n const uploadAuthority = disableExportResolved\n ? new DisabledUploadAuthority(\"export_disabled\")\n : resolveUploadAuthority(\n options.uploadAuthority,\n process.env.NEATLOGS_UPLOADS_ENABLED,\n baseUrl,\n resolvedKey,\n );\n _deliveryDiagnostics.configureUploadAuthority(\n uploadAuthority.available,\n uploadAuthority.unavailableReason,\n );\n\n // 7. Set session config. Session & end-user identity are PER-REQUEST (set via\n // trace()/span() or identify()), never on init() — only the operator userId\n // and workflow/transport config live here.\n _setSessionConfig({\n userId: options.userId,\n workflowName: resolvedWorkflowName,\n _apiKey: resolvedKey,\n _baseUrl: baseUrl,\n });\n\n // 8b. Initialize shared PromptClient so module-level helpers work after init()\n if (resolvedKey && resolvedKey !== \"disabled\") {\n setSharedClient(new PromptClient({ baseUrl, apiKey: resolvedKey }));\n }\n\n // 9. Build OTel Resource\n const resourceAttrs: Record<string, string | number | boolean> = {\n [ATTR_SERVICE_NAME]: options.workflowName || \"neatlogs-app\",\n \"service.version\": __version__,\n \"neatlogs.workflow_name\": resolvedWorkflowName,\n };\n if (options.doctorProbe) {\n resourceAttrs['neatlogs.doctor'] = true;\n resourceAttrs['neatlogs.doctor.version'] = 'v1';\n resourceAttrs['telemetry.sdk.language'] = 'typescript';\n resourceAttrs['telemetry.sdk.version'] = __version__;\n }\n addVerificationMarkerResourceAttribute(resourceAttrs);\n // Operator identity only — whoever RUNS the SDK. Session & end-user identity\n // are per-request (trace()/span()/identify()), never resource attributes.\n if (options.userId) resourceAttrs[\"user.id\"] = options.userId;\n\n const tags = options.tags;\n if (tags !== undefined) {\n if (!Array.isArray(tags) || !tags.every((t) => typeof t === \"string\")) {\n throw new Error(\"tags must be a list of strings\");\n }\n resourceAttrs[\"neatlogs.tags\"] = tags.join(\",\");\n }\n\n if (options.pii !== undefined) {\n resourceAttrs[\"neatlogs.pii.enabled\"] =\n options.pii === false ? \"false\" : \"true\";\n }\n\n if (options.piiSpanTypes !== undefined) {\n resourceAttrs[\"neatlogs.pii.span_types\"] = options.piiSpanTypes.join(\",\");\n }\n\n const resource = new Resource(resourceAttrs);\n\n // 10. Create or adopt a PRIVATE TracerProvider. Neatlogs never reads,\n // registers onto, or shuts down a foreign global provider, so Datadog,\n // Braintrust, and other co-tenants can neither export nor parent our spans\n // (and vice versa).\n const provider =\n options.tracerProvider ??\n new NodeTracerProvider({\n resource,\n spanLimits: { attributeCountLimit: 10_000 },\n sampler: new ParentBasedSampler({\n root: new TraceIdRatioBasedSampler(sampleRate),\n }),\n });\n _ownsTracerProvider = options.tracerProvider === undefined;\n\n // 11. Add NeatlogsSpanProcessor\n _spanProcessor = new NeatlogsSpanProcessor({\n debug: options.debug ?? false,\n mask: options.mask,\n emitCompletionMarkers: false,\n ownAllSpans: _ownsTracerProvider,\n mediaUploadsAvailable: uploadAuthority.available,\n mediaUploadsUnavailableReason: uploadAuthority.unavailableReason,\n });\n provider.addSpanProcessor(_spanProcessor);\n\n // 12. Add BatchSpanProcessor + exporter. Local Doctor uses the exact same\n // final masking/filtering boundary with a successful in-memory sink, so it\n // can inspect export-ready bytes without credentials or network access.\n if (!disableExportResolved || options.diagnosticCapture) {\n const tracesEndpoint = endpoint.endsWith(\"/v1/traces\")\n ? endpoint\n : `${baseUrl}/v1/traces`;\n\n const diagnosticSink: SpanExporter = {\n export(_spans, resultCallback) {\n resultCallback({ code: ExportResultCode.SUCCESS });\n },\n async shutdown() {},\n async forceFlush() {},\n };\n\n const transportExporter = disableExportResolved\n ? diagnosticSink\n : (options.doctorProbeExporter ?? new ByteLimitedSpanExporter(\n new OTLPTraceExporter({\n url: tracesEndpoint,\n ...(options.doctorProbeTimeoutMillis !== undefined\n ? { timeoutMillis: options.doctorProbeTimeoutMillis }\n : {}),\n headers: {\n \"x-api-key\": resolvedKey,\n ...(options.doctorProbe ? { \"x-neatlogs-doctor\": \"v1\" } : {}),\n },\n compression: CompressionAlgorithm.GZIP,\n }),\n undefined,\n _deliveryDiagnostics,\n uploadAuthority,\n ));\n const otlpExporter = new FilteringExporter(\n transportExporter,\n _deliveryDiagnostics,\n uploadAuthority,\n options.diagnosticCapture ? capturePreparedSpans : undefined,\n );\n\n const batchSize = options.batchSize ?? 100;\n const batchProcessor = new ObservableBatchSpanProcessor(\n otlpExporter,\n {\n maxExportBatchSize: batchSize,\n maxQueueSize: exportQueueCapacity(batchSize),\n scheduledDelayMillis: (options.flushInterval ?? 5) * 1000,\n },\n _deliveryDiagnostics,\n );\n const completionProcessor = new CompletionMarkerSpanProcessor(\n _spanProcessor,\n provider.getTracer(\"neatlogs.internal\"),\n );\n provider.addSpanProcessor(batchProcessor);\n provider.addSpanProcessor(completionProcessor);\n _transportSpanProcessors = [batchProcessor, completionProcessor];\n _completionProcessor = completionProcessor;\n\n if (options.debug && !options.diagnosticCapture) {\n logger.debug(`OTLP trace exporter configured: ${tracesEndpoint}`);\n } else if (options.debug) {\n logger.debug('Local Doctor diagnostic capture configured (network disabled)');\n }\n } else if (options.debug) {\n logger.debug(\"Export disabled — spans will not be sent to backend\");\n }\n\n // 13. Store privately. Neatlogs never registers an OTel provider globally.\n _tracerProvider = provider;\n _setNeatlogsProvider(provider);\n\n if (options.debug) {\n logger.debug(\"Neatlogs tracer provider initialized\");\n }\n\n // 14. Never replace the process-global meter provider.\n if (options.debug) {\n logger.debug(\"Global meter provider left unchanged\");\n }\n\n // 15. Set up LoggerProvider (if captureLogs)\n const captureLogs = options.captureLogs ?? false;\n if (captureLogs) {\n const logRecordProcessors: ObservableBatchLogRecordProcessor[] = [];\n\n // OTLP log export to /v1/logs (same pattern as Python SDK)\n if (!disableExportResolved) {\n const logsEndpoint = endpoint.endsWith(\"/v1/logs\")\n ? endpoint\n : `${baseUrl}/v1/logs`;\n const otlpLogExporter = new OTLPLogExporter({\n url: logsEndpoint,\n headers: resolvedKey ? { \"x-api-key\": resolvedKey } : undefined,\n compression: CompressionAlgorithm.GZIP,\n });\n const batchSize = options.batchSize ?? 100;\n logRecordProcessors.push(\n new ObservableBatchLogRecordProcessor(\n new MaskingLogExporter(\n otlpLogExporter,\n options.mask,\n undefined,\n _deliveryDiagnostics,\n ),\n {\n maxExportBatchSize: batchSize,\n maxQueueSize: exportQueueCapacity(batchSize),\n scheduledDelayMillis: (options.flushInterval ?? 5) * 1000,\n },\n _deliveryDiagnostics,\n ),\n );\n if (options.debug) {\n logger.debug(`OTLP log exporter configured: ${logsEndpoint}`);\n }\n }\n\n // sdk-logs >= 0.200 configures processors in the constructor and removed\n // addLogRecordProcessor(). Retain the older path so Neatlogs stays\n // compatible with applications that still resolve sdk-logs 0.57.\n const supportsDynamicProcessors =\n typeof LoggerProvider.prototype.addLogRecordProcessor === \"function\";\n _logProvider = supportsDynamicProcessors\n ? new LoggerProvider({ resource })\n : new LoggerProvider({\n resource,\n processors: logRecordProcessors,\n } as ConstructorParameters<typeof LoggerProvider>[0]);\n if (supportsDynamicProcessors) {\n for (const processor of logRecordProcessors) {\n _logProvider.addLogRecordProcessor(processor);\n }\n }\n\n // Wire the OTel logger for neatlogs.log() function\n const otelLogger = _logProvider.getLogger(\"neatlogs\");\n _setOtelLogger(otelLogger, options.debug ?? false);\n\n if (options.debug) {\n logger.debug(\n `Neatlogs log capture enabled (endpoint: ${baseUrl}/v1/logs)`,\n );\n }\n } else if (options.debug) {\n logger.debug(\"Log capture disabled (pass captureLogs: true to enable)\");\n }\n\n // 16. Register shutdown handlers. Default to flushing on exit whenever we own\n // the private provider so standalone scripts drain their spans;\n // only a caller-supplied provider defaults off (its owner controls shutdown).\n const registerShutdownHandlers =\n options.registerShutdownHandlers ?? _ownsTracerProvider;\n if (registerShutdownHandlers && !_sigHandlersRegistered) {\n process.on('beforeExit', _shutdownBeforeExit);\n // Run before pre-existing one-shot host listeners so ownership is observed\n // before EventEmitter removes them for their invocation.\n process.prependListener('SIGTERM', _shutdownOnSignal);\n process.prependListener('SIGINT', _shutdownOnSignal);\n _sigHandlersRegistered = true;\n }\n\n // 17. Mark as initialised\n _initialized = true;\n\n if (options.debug) {\n logger.info(\"Neatlogs SDK initialized successfully\");\n logger.info(`Endpoint: ${endpoint}`);\n logger.info(`Workflow: ${resolvedWorkflowName}`);\n logger.info(`User: ${options.userId ?? \"(none)\"}`);\n logger.info(`Tags: ${tags ?? []}`);\n logger.info(`Sample Rate: ${sampleRate}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// flush()\n// ---------------------------------------------------------------------------\n\n/**\n * Flush all pending spans, metrics, and log records.\n *\n * @returns true if all providers flushed successfully\n */\nexport async function flush(): Promise<boolean> {\n let success = true;\n\n // Flush regardless of ownership: our processors are attached to the provider\n // (owned or caller-supplied), so draining them is always ours to do. Shutdown\n // is what's ownership-gated — we never shut down a provider we didn't create.\n // Logs must drain before spans: the trace flush can export the root and its\n // completion marker, which may make the backend finalize the trace.\n if (_logProvider) {\n try {\n logger.debug(\"Flushing log provider...\");\n await _logProvider.forceFlush();\n logger.debug(\"Log provider flushed successfully\");\n } catch (e) {\n logger.error(`Error flushing logs: ${e}`);\n success = false;\n }\n }\n\n try {\n await _spanProcessor?.forceFlush();\n await _completionProcessor?.forceFlush();\n } catch (e) {\n logger.error(`Error completing span masking/finalization: ${e}`);\n success = false;\n }\n\n if (_tracerProvider) {\n try {\n logger.debug(\"Flushing tracer provider...\");\n await _tracerProvider.forceFlush();\n logger.debug(\"Tracer provider flushed successfully\");\n } catch (e) {\n logger.error(`Error flushing spans: ${e}`);\n success = false;\n }\n }\n\n return success;\n}\n\n/**\n * Flush the module-level SDK pipeline and every live Neatlogs `Client` in this\n * process. Foreign OpenTelemetry providers are never discovered or flushed.\n */\nexport interface FlushOutcome {\n pipeline: string;\n success: boolean;\n timedOut: boolean;\n error?: string;\n}\n\nexport interface FlushAllResult {\n success: boolean;\n outcomes: FlushOutcome[];\n}\n\nexport async function flushAllDetailed(\n timeoutMs = 30_000,\n): Promise<FlushAllResult> {\n const deadline = Date.now() + Math.max(0, timeoutMs);\n const clients = getRegisteredClients();\n const operations: Array<{ pipeline: string; run: () => Promise<boolean> }> =\n [];\n if (_initialized) operations.push({ pipeline: \"default\", run: flush });\n clients.forEach((client, index) =>\n operations.push({\n pipeline: `client:${client.workflowName ?? \"anonymous\"}:${index}`,\n run: () => client.flush(),\n }),\n );\n\n const outcomes = await Promise.all(\n operations.map(async ({ pipeline, run }): Promise<FlushOutcome> => {\n const remaining = Math.max(0, deadline - Date.now());\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n const timedOut = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(\n () => reject(new Error(\"NEATLOGS_FLUSH_TIMEOUT\")),\n remaining,\n );\n });\n const success = await Promise.race([\n Promise.resolve().then(run),\n timedOut,\n ]);\n return { pipeline, success: success === true, timedOut: false };\n } catch (error) {\n const timedOut =\n error instanceof Error && error.message === \"NEATLOGS_FLUSH_TIMEOUT\";\n return {\n pipeline,\n success: false,\n timedOut,\n error: timedOut\n ? \"timeout\"\n : error instanceof Error\n ? error.name\n : \"Error\",\n };\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n }),\n );\n return { success: outcomes.every((outcome) => outcome.success), outcomes };\n}\n\n/** Preserve the original aggregate boolean contract for shutdown callers. */\nexport async function flushAll(timeoutMs = 30_000): Promise<boolean> {\n return (await flushAllDetailed(timeoutMs)).success;\n}\n\n/** Snapshot bounded-queue, masking, and final-export loss counters. */\nexport function getDeliveryDiagnostics(): DeliveryDiagnosticsSnapshot {\n return _deliveryDiagnostics.snapshot();\n}\n\n// ---------------------------------------------------------------------------\n// shutdown()\n// ---------------------------------------------------------------------------\n\n/**\n * Shutdown the SDK and flush all pending spans, metrics, and log records.\n *\n * Resets all module-level state so `init()` can be called again.\n *\n * @returns true if all providers shut down successfully\n */\nexport function shutdown(\n terminationReason = \"shutdown\",\n timeoutMs = 30_000,\n): Promise<boolean> {\n if (_shutdownPromise) return _shutdownPromise;\n\n const initialization =\n _lifecycleState === \"initializing\" ? _initPromise : null;\n _lifecycleState = \"closing\";\n _completionProcessor?.beginShutdown();\n _spanProcessor?.beginShutdown(terminationReason);\n _setOtelLogger(null, false);\n\n // Defer all shutdown work until the shared promise has been installed.\n // endActiveSpans() synchronously invokes onEnd(), and a host processor may\n // re-enter shutdown() from there.\n const currentShutdown = Promise.resolve().then(async () => {\n if (initialization) {\n try {\n await initialization;\n } catch {\n // Teardown any partial state left by a failed initialization.\n }\n }\n return _performShutdown(terminationReason, timeoutMs);\n });\n _shutdownPromise = currentShutdown;\n const clearCurrentShutdown = () => {\n if (_shutdownPromise === currentShutdown) {\n _shutdownPromise = null;\n _lifecycleState = \"uninitialized\";\n }\n };\n void currentShutdown.then(clearCurrentShutdown, clearCurrentShutdown);\n return currentShutdown;\n}\n\nasync function _performShutdown(\n terminationReason: string,\n timeoutMs: number,\n): Promise<boolean> {\n // Remove signal handlers\n if (_sigHandlersRegistered) {\n process.removeListener(\"beforeExit\", _shutdownBeforeExit);\n process.removeListener(\"SIGTERM\", _shutdownOnSignal);\n process.removeListener(\"SIGINT\", _shutdownOnSignal);\n _sigHandlersRegistered = false;\n }\n\n let success = true;\n const deadline = Date.now() + Math.max(0, timeoutMs);\n const logProvider = _logProvider;\n const spanProcessor = _spanProcessor;\n const completionProcessor = _completionProcessor;\n const tracerProvider = _tracerProvider;\n const ownsTracerProvider = _ownsTracerProvider;\n const transportSpanProcessors = [..._transportSpanProcessors];\n\n const attempt = async (\n label: string,\n operation: () => unknown | PromiseLike<unknown>,\n ): Promise<void> => {\n const outcome = await runByDeadline(operation, deadline);\n if (!outcome.completed) {\n logger.error(\n `${label} failed or exceeded the Neatlogs shutdown deadline`,\n );\n success = false;\n }\n };\n\n // Clear the Mastra bridge cache so a subsequent init() rebinds to the fresh\n // provider instead of a stale one.\n _resetMastraCache();\n\n // Prompt CRUD has an independent transport and must never affect telemetry\n // flush success. Closing it here only aborts its own refreshes and cache.\n closeSharedClient();\n\n // LOG records must drain before trace completion. The trace provider carries\n // neatlogs.trace.complete, which can trigger server-side finalization.\n if (logProvider) {\n logger.debug(\"Shutting down log provider...\");\n await attempt(\"Log provider shutdown\", () => logProvider.shutdown());\n }\n\n // Ending the root creates the trace-completion marker. Do this only after\n // buffered logs have drained so finalization cannot overtake them.\n if (spanProcessor) {\n const ended = spanProcessor.endActiveSpans(terminationReason);\n if (ended > 0) {\n logger.info(\n `Ended ${ended} active Neatlogs span(s) during ${terminationReason}`,\n );\n }\n }\n completionProcessor?.emitDeferred();\n if (spanProcessor) {\n await attempt(\"Span masking/finalization\", () =>\n spanProcessor.forceFlush(),\n );\n }\n if (completionProcessor) {\n await attempt(\"Completion processor flush\", () =>\n completionProcessor.forceFlush(),\n );\n }\n\n // Only shut down a provider we created. A caller-supplied provider is flushed\n // (above / in flush()) but never shut down — its owner controls its lifecycle,\n // per the tracerProvider contract in InitOptions. Flush it here so a caller\n // that shuts down right after us doesn't lose our still-buffered spans.\n if (tracerProvider && ownsTracerProvider) {\n logger.debug(\"Shutting down tracer provider...\");\n await attempt(\"Tracer provider shutdown\", () => tracerProvider.shutdown());\n } else if (tracerProvider) {\n logger.debug(\n \"Flushing caller-owned tracer provider (not shutting down)...\",\n );\n await attempt(\"Caller-owned tracer provider flush\", () =>\n tracerProvider.forceFlush(),\n );\n // The provider is caller-owned, but these processors/exporters are ours.\n // SDKs cannot detach processors in OTel JS 1.x; shut every instance down\n // independently so one exporter failure cannot leave another active.\n for (const processor of transportSpanProcessors.reverse()) {\n await attempt(\"Neatlogs transport shutdown\", () => processor.shutdown());\n }\n if (spanProcessor) {\n await attempt(\"Neatlogs span processor shutdown\", () =>\n spanProcessor.shutdown(),\n );\n }\n }\n\n // Reset all module-level state\n _initialized = false;\n _tracerProvider = null;\n _ownsTracerProvider = false;\n _setNeatlogsProvider(null);\n discardPendingMediaOwner();\n _logProvider = null;\n _spanProcessor = null;\n _transportSpanProcessors = [];\n _completionProcessor = null;\n _debugMode = false;\n _effectiveSampleRate = 1;\n _exportEnabled = false;\n _queueMaxSize = 2_048;\n _signalShutdownStarted = false;\n _initIdentity = null;\n clearDoctorCapture();\n\n // Reset session config\n _setSessionConfig({});\n\n logger.info(\"Neatlogs SDK shutdown complete\");\n return success;\n}\n\n// ---------------------------------------------------------------------------\n// getTracerProvider()\n// ---------------------------------------------------------------------------\n\n/**\n * Return the active TracerProvider. Throws if init() has not been called.\n */\nexport function getTracerProvider(): BasicTracerProvider {\n if (!_tracerProvider) {\n throw new Error(\n \"Neatlogs is not initialized. Call init() before accessing the TracerProvider.\",\n );\n }\n return _tracerProvider;\n}\n\n// ---------------------------------------------------------------------------\n// isDebugEnabled()\n// ---------------------------------------------------------------------------\n\n/**\n * Return true if neatlogs was initialised with `debug: true`.\n */\nexport function isDebugEnabled(): boolean {\n return _debugMode;\n}\n\n// ---------------------------------------------------------------------------\n// Re-export getSessionConfig from context\n// ---------------------------------------------------------------------------\n\nexport { getSessionConfig } from \"./core/context.js\";\n\n/** @internal Immutable, credential-free state used by the read-only doctor. */\nexport function _doctorRuntimeSnapshot(): Readonly<{\n state: LifecycleState;\n initialized: boolean;\n ownsTracerProvider: boolean;\n exportHealth: { droppedSpans: number; exportFailures: number } | null;\n effectiveSampler: string;\n exportEnabled: boolean;\n queueMaxSize: number;\n}> {\n return {\n state: _lifecycleState,\n initialized: _initialized,\n ownsTracerProvider: _ownsTracerProvider,\n exportHealth: {\n droppedSpans:\n _deliveryDiagnostics.snapshot().spanQueueDrops +\n _deliveryDiagnostics.snapshot().frameworkSpanDrops +\n _deliveryDiagnostics.snapshot().maskedSpanDrops,\n exportFailures: _deliveryDiagnostics.snapshot().spanExportFailures,\n },\n effectiveSampler: `parentbased_traceidratio:${_effectiveSampleRate}`,\n exportEnabled: _exportEnabled,\n queueMaxSize: _queueMaxSize,\n };\n}\n","/**\n * NeatlogsSpanProcessor — attribute normalization and file logging.\n *\n * Port of Python neatlogs/core/span_processor.py\n *\n * Sits between span creation and export, normalizing attributes and handling\n * file logging. The downstream BatchSpanProcessor + OTLPSpanExporter handles\n * actual transport.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { performance } from 'node:perf_hooks';\n\nimport { ROOT_CONTEXT, trace as otelTrace, TraceFlags, SpanStatusCode } from '@opentelemetry/api';\nimport type { Context, HrTime, SpanContext, Tracer } from '@opentelemetry/api';\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport type { Span as SdkSpan, SpanProcessor } from '@opentelemetry/sdk-trace-base';\n\nimport { UnifiedAttributeProcessor } from './attribute-processor.js';\nimport type { SpanDict } from './attribute-processor.js';\nimport { getScheduledMask, scheduleMask } from './mask.js';\nimport { getLogger } from './logger.js';\nimport { applySessionAttributes } from './session.js';\nimport { applyEndUserAttributes } from './end-user.js';\nimport { PromptContext, UserPromptContext } from '../prompt/template.js';\nimport {\n PROMPT_VARIABLES_KEY,\n PROMPT_TEMPLATE_KEY,\n PROMPT_VERSION_KEY,\n USER_PROMPT_TEMPLATE_KEY,\n USER_PROMPT_VARIABLES_KEY,\n} from './context.js';\nimport { popEntry } from './crewai-task-registry.js';\nimport type { MaskFunction } from '../types.js';\nimport { AttributeMapper } from '../config/attribute-mapper.js';\nimport { getNeatlogsTracer } from './provider.js';\nimport { verificationMarkerFromEnv } from './resource.js';\nimport { setMediaCaptureAvailability } from './media.js';\nimport { isHttpSpan } from './http-span.js';\n\nconst logger = getLogger();\n\nfunction resolveLogFilePath(configuredPath: string): string {\n return path.isAbsolute(configuredPath)\n ? configuredPath\n : path.join(process.cwd(), configuredPath);\n}\n\nfunction createLogStream(configuredPath: string): fs.WriteStream | null {\n const logPath = resolveLogFilePath(configuredPath);\n let fd: number | null = null;\n\n try {\n fs.mkdirSync(path.dirname(logPath), { recursive: true });\n fd = fs.openSync(logPath, 'a');\n const stream = fs.createWriteStream(logPath, { fd, autoClose: true });\n fd = null;\n stream.on('error', (error) => {\n logger.warn(`Failed to write span log file ${logPath}: ${error}`);\n stream.destroy();\n });\n return stream;\n } catch (error) {\n if (fd !== null) {\n try {\n fs.closeSync(fd);\n } catch {\n // ignore cleanup failure; the open error below is the actionable one.\n }\n }\n logger.warn(`Failed to open span log file ${logPath}: ${error}`);\n return null;\n }\n}\n\nconst CLOSE_STREAM_TIMEOUT_MS = 5_000;\n\nasync function closeLogStream(stream: fs.WriteStream | null, description: string): Promise<void> {\n if (!stream || stream.destroyed || stream.writableEnded) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n let settled = false;\n const settle = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n stream.off('close', closeHandler);\n stream.off('error', errorHandler);\n resolve();\n };\n\n const closeHandler = settle;\n const errorHandler = (error: Error) => {\n logger.warn(`Failed to close ${description} log file handle: ${error}`);\n settle();\n };\n const timer = setTimeout(() => {\n logger.warn(`Timed out waiting for ${description} log stream to close; destroying`);\n stream.destroy();\n settle();\n }, CLOSE_STREAM_TIMEOUT_MS);\n\n stream.once('close', closeHandler);\n stream.once('error', errorHandler);\n\n try {\n stream.end();\n } catch (error) {\n logger.warn(`Failed to close ${description} log file handle: ${error}`);\n settle();\n }\n });\n}\n\n// ────────────────────────────────────────────────────────\n// LLM span detection patterns\n// ────────────────────────────────────────────────────────\n\nconst LLM_NAME_PATTERNS = /chat|completion|generate|embedding/i;\n\n// ────────────────────────────────────────────────────────\n// Performance stats\n// ────────────────────────────────────────────────────────\n\ninterface PerfStats {\n onStartTime: number;\n onEndTime: number;\n spansProcessed: number;\n spansExported: number;\n}\n\n// ────────────────────────────────────────────────────────\n// Helper: convert HrTime ([seconds, nanoseconds]) to ns\n// ────────────────────────────────────────────────────────\n\nfunction hrTimeToNanos(hr: HrTime): number {\n return hr[0] * 1_000_000_000 + hr[1];\n}\n\n// ────────────────────────────────────────────────────────\n// Helper: convert ReadableSpan to JSON-serializable dict\n//\n// When includeScope=true, includes instrumentation_scope\n// and uses `status.message` (for the UnifiedAttributeProcessor).\n// When false (default), uses `status.description` for\n// backward-compatible raw logging.\n// ────────────────────────────────────────────────────────\n\nexport function spanToDict(\n span: ReadableSpan,\n options?: { includeScope?: boolean },\n): Record<string, any> {\n const ctx = span.spanContext();\n const includeScope = options?.includeScope ?? false;\n\n const dict: Record<string, any> = {\n trace_id: ctx.traceId,\n span_id: ctx.spanId,\n parent_span_id: span.parentSpanId ?? null,\n name: span.name,\n kind: span.kind,\n start_time: hrTimeToNanos(span.startTime),\n end_time: hrTimeToNanos(span.endTime),\n attributes: { ...span.attributes },\n resource: span.resource?.attributes ? { ...span.resource.attributes } : {},\n status: includeScope\n ? { code: span.status.code, message: span.status.message ?? undefined }\n : { code: span.status.code, description: span.status.message ?? null },\n events: span.events\n ? span.events.map((e) => ({\n name: e.name,\n timestamp: hrTimeToNanos(e.time),\n attributes: e.attributes ? { ...e.attributes } : {},\n }))\n : [],\n };\n\n if (includeScope) {\n dict.instrumentation_scope = span.instrumentationLibrary\n ? {\n name: span.instrumentationLibrary.name,\n version: span.instrumentationLibrary.version,\n }\n : null;\n }\n\n return dict;\n}\n\n// ────────────────────────────────────────────────────────\n// Constructor options\n// ────────────────────────────────────────────────────────\n\nexport interface NeatlogsSpanProcessorOptions {\n debug?: boolean;\n mask?: MaskFunction;\n /** Pre-built AttributeMapper. If not supplied, a default mapper is created. */\n mapper?: AttributeMapper;\n emitCompletionMarkers?: boolean;\n /** Treat every span on this processor's private provider as SDK-owned. */\n ownAllSpans?: boolean;\n /** Gate raw typed-media staging for this processor's export pipeline. */\n mediaUploadsAvailable?: boolean;\n mediaUploadsUnavailableReason?: string;\n mediaOwner?: object;\n}\n\n// ────────────────────────────────────────────────────────\n// NeatlogsSpanProcessor\n// ────────────────────────────────────────────────────────\n\nexport class NeatlogsSpanProcessor implements SpanProcessor {\n private readonly debug: boolean;\n private readonly mask: MaskFunction | undefined;\n private readonly unifiedProcessor: UnifiedAttributeProcessor;\n private readonly emitCompletionMarkers: boolean;\n private readonly ownAllSpans: boolean;\n private readonly mediaUploadsAvailable: boolean;\n private readonly mediaUploadsUnavailableReason: string;\n private readonly mediaOwner: object | undefined;\n\n private perfStats: PerfStats;\n private _retrieversToSuppress: Set<string>;\n private _activeSpans: Map<string, SdkSpan>;\n private _closingReason: string | null;\n private _closed: boolean;\n private _completionEligibleRoots: WeakSet<object>;\n private _pendingMasks: Set<Promise<unknown>>;\n\n // File logging\n private _logRawSpansEnabled: boolean;\n private _logProcessedSpansEnabled: boolean;\n private _rawLogStream: fs.WriteStream | null;\n private _processedLogStream: fs.WriteStream | null;\n\n constructor(opts: NeatlogsSpanProcessorOptions = {}) {\n this.debug = opts.debug ?? false;\n this.mask = opts.mask;\n this.emitCompletionMarkers = opts.emitCompletionMarkers ?? true;\n this.ownAllSpans = opts.ownAllSpans ?? false;\n this.mediaUploadsAvailable = opts.mediaUploadsAvailable ?? false;\n this.mediaUploadsUnavailableReason =\n opts.mediaUploadsUnavailableReason ?? 'telemetry_uploads_disabled';\n this.mediaOwner = opts.mediaOwner;\n\n this.unifiedProcessor = new UnifiedAttributeProcessor(\n opts.mapper ?? new AttributeMapper(),\n this.debug,\n );\n\n this._logRawSpansEnabled = false;\n this._logProcessedSpansEnabled = false;\n this._rawLogStream = null;\n this._processedLogStream = null;\n\n this._initFileLogging();\n\n this.perfStats = {\n onStartTime: 0,\n onEndTime: 0,\n spansProcessed: 0,\n spansExported: 0,\n };\n\n this._retrieversToSuppress = new Set<string>();\n this._activeSpans = new Map<string, SdkSpan>();\n this._closingReason = null;\n this._closed = false;\n this._completionEligibleRoots = new WeakSet<object>();\n this._pendingMasks = new Set<Promise<unknown>>();\n }\n\n // ── File logging init ─────────────────────────────────\n\n private _initFileLogging(): void {\n // Raw OTel span JSON (before attribute normalization)\n this._logRawSpansEnabled =\n this.debug ||\n ['true', '1', 'yes'].includes((process.env.NEATLOGS_LOG_RAW_SPANS ?? '').toLowerCase());\n\n if (this._logRawSpansEnabled && this.mask) {\n logger.warn(\n 'Raw span logging is disabled while a mask is configured because raw files bypass redaction.',\n );\n this._logRawSpansEnabled = false;\n }\n\n if (this._logRawSpansEnabled) {\n const rawPath = process.env.NEATLOGS_LOG_RAW_SPANS_FILE ?? 'spans_raw_optimized.log';\n this._rawLogStream = createLogStream(rawPath);\n if (this._rawLogStream) {\n logger.info(`Raw span logging enabled: ${resolveLogFilePath(rawPath)}`);\n }\n }\n\n // Processed span dict (after normalization)\n this._logProcessedSpansEnabled = ['true', '1', 'yes'].includes(\n (process.env.NEATLOGS_LOG_SPANS ?? '').toLowerCase(),\n );\n\n if (this._logProcessedSpansEnabled) {\n const processedPath = process.env.NEATLOGS_LOG_SPANS_FILE ?? 'spans_optimized.log';\n this._processedLogStream = createLogStream(processedPath);\n if (this._processedLogStream) {\n logger.info(`Processed span logging enabled: ${resolveLogFilePath(processedPath)}`);\n }\n }\n }\n\n // ── SpanProcessor.onStart ─────────────────────────────\n\n onStart(span: SdkSpan, parentContext: Context): void {\n if (this._closed) return;\n const startTime = performance.now();\n try {\n const scopeName = span.instrumentationLibrary?.name ?? '';\n const isCompletionMarker = span.name === 'neatlogs.trace.complete';\n // Auto-instrumented framework children retain their own scope name. An\n // active Neatlogs parent makes them part of the SDK-owned trace, while a\n // foreign root on a caller-supplied provider remains untouched.\n const sdkOwned =\n this.ownAllSpans ||\n scopeName.startsWith('neatlogs') ||\n (span.parentSpanId !== undefined && this._activeSpans.has(span.parentSpanId));\n if (sdkOwned && !isCompletionMarker) {\n setMediaCaptureAvailability(\n span as object,\n this.mediaUploadsAvailable,\n this.mediaUploadsUnavailableReason,\n this.mediaOwner,\n );\n this._activeSpans.set(span.spanContext().spanId, span);\n const verificationMarker = verificationMarkerFromEnv();\n if (verificationMarker) {\n span.setAttribute('neatlogs.verification.marker', verificationMarker);\n }\n }\n if (sdkOwned && !isCompletionMarker && this._closingReason) {\n this._markInterrupted(span, this._closingReason);\n span.end();\n return;\n }\n\n // Stamp request-scoped identity (identify()) onto ANY root span as a\n // fallback. trace()/span() set it explicitly (overriding this); direct\n // wrappers' auto-roots stamp it themselves. This catch-all is what lets\n // identify() reach FRAMEWORK roots (openai-agents/strands/pi-agent) that\n // open their own root without stamping identity. No-ops when identify() is\n // inactive; child spans are skipped.\n if (!span.parentSpanId) {\n applySessionAttributes(span, undefined, true);\n applyEndUserAttributes(span, undefined, undefined, true);\n }\n\n const attrs = (span as any).attributes ?? {};\n const spanKind = attrs['openinference.span.kind'] as string | undefined;\n const spanName: string = typeof (span as any).name === 'string' ? (span as any).name : '';\n\n const isLlmSpan = spanKind === 'LLM' || LLM_NAME_PATTERNS.test(spanName);\n\n if (!isLlmSpan) return;\n\n // Read context values only from the span's OWN parentContext. The global\n // OTel context belongs to another SDK and must never be consulted.\n const getFrom = (ctx: Context | undefined, key: symbol): string | undefined =>\n typeof ctx?.getValue === 'function' ? (ctx.getValue(key) as string | undefined) : undefined;\n const readValue = (key: symbol): string | undefined => getFrom(parentContext, key);\n let variablesJson = readValue(PROMPT_VARIABLES_KEY);\n let template = readValue(PROMPT_TEMPLATE_KEY);\n const versionVal = readValue(PROMPT_VERSION_KEY);\n let userTemplate = readValue(USER_PROMPT_TEMPLATE_KEY);\n let userVariablesJson = readValue(USER_PROMPT_VARIABLES_KEY);\n\n // Fall back to PromptContext / UserPromptContext\n if (!variablesJson) {\n const captured = PromptContext.getVariables();\n if (captured) {\n variablesJson = JSON.stringify(captured);\n }\n }\n\n if (!template) {\n const captured = PromptContext.getTemplate();\n if (captured) {\n template = captured;\n }\n }\n\n if (!userTemplate) {\n const captured = UserPromptContext.getTemplate();\n if (captured) {\n userTemplate = captured;\n }\n }\n\n if (!userVariablesJson) {\n const captured = UserPromptContext.getVariables();\n if (captured) {\n userVariablesJson = JSON.stringify(captured);\n }\n }\n\n if (this.debug) {\n logger.debug(`[SpanProcessor.onStart] LLM span '${spanName}' starting`);\n logger.debug(` variables_json from context: ${variablesJson}`);\n logger.debug(` template from context: ${template}`);\n logger.debug(` version from context: ${versionVal}`);\n logger.debug(` user_template from context: ${userTemplate}`);\n logger.debug(` user_variables_json from context: ${userVariablesJson}`);\n }\n\n if (variablesJson) {\n span.setAttribute('llm.prompt_template_variables', variablesJson);\n }\n if (template) {\n span.setAttribute('llm.prompt_template', template);\n }\n if (versionVal) {\n span.setAttribute('llm.prompt_template.version', versionVal);\n }\n if (userTemplate) {\n span.setAttribute('llm.user_prompt_template', userTemplate);\n }\n if (userVariablesJson) {\n span.setAttribute('llm.user_prompt_template_variables', userVariablesJson);\n }\n } finally {\n this.perfStats.onStartTime += performance.now() - startTime;\n }\n }\n\n // ── SpanProcessor.onEnd ───────────────────────────────\n\n onEnd(span: ReadableSpan): void {\n this._activeSpans.delete(span.spanContext().spanId);\n if (this._closed) return;\n\n // Transport spans are never part of NeatLogs telemetry. Suppress them\n // before logging, normalization, root I/O backfill, masking, or markers.\n if (isHttpSpan(span)) return;\n\n // Completion markers skip normalization but still cross the same global\n // masking boundary: they carry root identity and metadata.\n if (span.name === 'neatlogs.trace.complete') {\n const markerData = spanToDict(span, { includeScope: true });\n markerData.resource = { attributes: markerData.resource };\n const maskResult = scheduleMask(span as object, markerData, this.mask ?? null);\n const pending = maskResult.finally(() => {\n this._pendingMasks.delete(pending);\n });\n this._pendingMasks.add(pending);\n return;\n }\n\n const startTime = performance.now();\n this.perfStats.spansProcessed += 1;\n\n try {\n if (this.debug) {\n logger.debug(`[SpanProcessor.onEnd] Span ending: ${span.name}`);\n }\n\n // 1. Log raw OTel span (before any processing)\n if (this._rawLogStream && !this._rawLogStream.destroyed) {\n try {\n this._rawLogStream.write(JSON.stringify(spanToDict(span)) + '\\n');\n } catch (e) {\n logger.warn(`Failed to write span to raw log file: ${e}`);\n }\n }\n\n // 2. Process and normalize attributes\n const spanDict = spanToDict(span, { includeScope: true }) as SpanDict;\n const unifiedAttrs = this.unifiedProcessor.normalize(spanDict);\n\n // 3. Filter large tokenized arrays for EMBEDDING/VECTOR_STORE spans\n let nlKind = unifiedAttrs['neatlogs.span.kind'] as string | undefined;\n if (nlKind === 'embedding' || nlKind === 'vector_store') {\n const skipOutput = unifiedAttrs['neatlogs._skip_output_value'] === true;\n const keysToRemove: string[] = [];\n\n for (const key of Object.keys(unifiedAttrs)) {\n if (\n key.includes('input_messages') ||\n key.includes('output_messages') ||\n key.includes('gen_ai.prompt') ||\n key.includes('gen_ai.completion') ||\n key.includes('.content')\n ) {\n keysToRemove.push(key);\n } else if (\n key === 'neatlogs.embedding.output' ||\n (skipOutput && key === 'neatlogs.embedding.input')\n ) {\n keysToRemove.push(key);\n }\n }\n\n for (const key of keysToRemove) {\n delete unifiedAttrs[key];\n }\n\n if (this.debug && keysToRemove.length > 0) {\n logger.debug(\n `[EMBEDDING Filter] Removed ${keysToRemove.length} large attribute keys ` +\n `from ${nlKind} span (skip_output=${skipOutput})`,\n );\n }\n }\n\n // 4. Filter prompt template keys for non-LLM spans\n nlKind = unifiedAttrs['neatlogs.span.kind'] as string | undefined;\n if (\n nlKind !== 'llm' &&\n nlKind !== 'embedding' &&\n nlKind !== 'crewai_task' &&\n span.name !== 'PromptTemplate'\n ) {\n delete unifiedAttrs['neatlogs.llm.prompt_template'];\n delete unifiedAttrs['neatlogs.llm.prompt_template_variables'];\n delete unifiedAttrs['neatlogs.llm.prompt_template.version'];\n }\n\n // PromptTemplate spans → internal\n if (span.name === 'PromptTemplate') {\n if (unifiedAttrs['neatlogs.internal'] === undefined) {\n unifiedAttrs['neatlogs.internal'] = true;\n }\n unifiedAttrs['neatlogs.span.kind'] = 'Neatlogs.INTERNAL';\n }\n\n // 4b. Retriever span dedup\n if (nlKind === 'retriever') {\n const isInternal = unifiedAttrs['neatlogs.internal'] === true;\n if (isInternal && span.parentSpanId) {\n this._retrieversToSuppress.add(span.parentSpanId);\n }\n const spanId = span.spanContext().spanId;\n if (this._retrieversToSuppress.has(spanId)) {\n this._retrieversToSuppress.delete(spanId);\n unifiedAttrs['neatlogs.internal'] = true;\n if (this.debug) {\n logger.debug(\n `[Retriever Merge] Marked OI retriever '${span.name}' as internal ` +\n `(had neatlogs retriever child)`,\n );\n }\n }\n }\n\n // 5. Build resource attributes\n const resourceAttrs: Record<string, any> = {};\n if (span.resource?.attributes) {\n for (const [key, value] of Object.entries(span.resource.attributes)) {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n resourceAttrs[key] = value;\n } else if (Array.isArray(value)) {\n resourceAttrs[key] = [...value];\n } else {\n resourceAttrs[key] = String(value);\n }\n }\n\n if (this.debug && 'neatlogs.tags' in resourceAttrs) {\n logger.debug(\n `[Tags] Span ${span.name}: resource.neatlogs.tags = ${resourceAttrs['neatlogs.tags']}`,\n );\n }\n }\n\n // Format IDs — JS OTel SDK already provides hex strings\n const traceId = span.spanContext().traceId;\n const spanId = span.spanContext().spanId;\n let parentSpanId: string | null = span.parentSpanId ?? null;\n\n // Detect self-parenting\n if (parentSpanId === spanId) {\n if (this.debug) {\n logger.warn(\n `[SpanProcessor] Detected self-parenting span. ` +\n `trace_id=${traceId} span_id=${spanId} name=${span.name}. ` +\n `Setting parent_span_id=None.`,\n );\n }\n parentSpanId = null;\n }\n\n // 6. Build span_data dict\n const kindValue = (unifiedAttrs['neatlogs.span.kind'] as string) ?? 'UNKNOWN';\n const startTimeNs = hrTimeToNanos(span.startTime);\n const endTimeNs = hrTimeToNanos(span.endTime);\n\n let spanData: Record<string, any> = {\n trace_id: traceId,\n span_id: spanId,\n parent_span_id: parentSpanId,\n name: span.name,\n kind: kindValue || 'UNKNOWN',\n start_time: startTimeNs,\n end_time: endTimeNs,\n duration_ns: endTimeNs > 0 ? endTimeNs - startTimeNs : null,\n attributes: unifiedAttrs,\n resource: { attributes: resourceAttrs },\n status: {\n code: SpanStatusCode[span.status.code] ?? String(span.status.code),\n description: span.status.message ?? null,\n },\n links: span.links.map((link) => ({\n trace_id: link.context.traceId,\n span_id: link.context.spanId,\n trace_flags: link.context.traceFlags,\n trace_state: link.context.traceState?.serialize(),\n attributes: link.attributes ? { ...link.attributes } : {},\n })),\n events: span.events\n ? span.events.map((e) => ({\n name: e.name,\n timestamp: hrTimeToNanos(e.time),\n attributes: e.attributes ? { ...e.attributes } : {},\n }))\n : [],\n };\n\n // 7. Post-processing: framework span name normalization, CrewAI tasks, model resolution\n let results = this._normalizeFrameworkSpanNames([spanData]);\n spanData = results[0] ?? spanData;\n results = this._injectCrewaiTaskTemplates([spanData]);\n spanData = results[0] ?? spanData;\n this._resolveActualModelName(spanData);\n\n // 7b. Write normalized neatlogs.* attributes back before the downstream\n // BatchSpanProcessor snapshots the span. Masking is applied later to an\n // exporter-owned clone, so async user callbacks never block onEnd().\n const finalAttrs = (spanData.attributes ?? {}) as Record<string, any>;\n try {\n const spanAttrs = (span as any).attributes ?? (span as any)._attributes;\n if (spanAttrs != null) {\n for (const [k, v] of Object.entries(finalAttrs)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n spanAttrs[k] = v;\n } else if (\n Array.isArray(v) &&\n v.every(\n (i: any) =>\n typeof i === 'string' || typeof i === 'number' || typeof i === 'boolean',\n )\n ) {\n spanAttrs[k] = [...v];\n }\n }\n }\n } catch (wbExc) {\n if (this.debug) {\n logger.debug(`[SpanProcessor] Attr write-back failed: ${wbExc}`);\n }\n }\n\n // 7c. Mask asynchronously. FilteringExporter awaits this exact promise\n // and exports a clone built only from the accepted result. Exceptions are\n // fail-closed in scheduleMask/applyMask.\n const maskResult = scheduleMask(span as object, spanData, this.mask ?? null);\n const pending = maskResult\n .then((maskedSpanData) => {\n if (maskedSpanData === null) return;\n if (isHttpSpan(span, maskedSpanData.attributes ?? {})) return;\n\n // Processed diagnostic logs follow the same masking boundary as OTLP.\n if (this._processedLogStream && !this._processedLogStream.destroyed) {\n try {\n this._processedLogStream.write(JSON.stringify(maskedSpanData) + '\\n');\n } catch (e) {\n logger.warn(`Failed to write span to processed log file: ${e}`);\n }\n }\n\n this.perfStats.spansExported += 1;\n if (!span.parentSpanId) {\n this._completionEligibleRoots.add(span as object);\n if (this.emitCompletionMarkers) {\n this.emitCompletionMarker(span, traceId, resourceAttrs);\n }\n }\n })\n .finally(() => {\n this._pendingMasks.delete(pending);\n });\n this._pendingMasks.add(pending);\n } finally {\n this.perfStats.onEndTime += performance.now() - startTime;\n }\n }\n\n /**\n * End active Neatlogs-owned spans child-first before provider shutdown.\n * Ending the actual root through the normal lifecycle emits the completion\n * marker; interruption attributes keep the termination explicit.\n */\n endActiveSpans(reason = 'shutdown'): number {\n // Claim the current registry synchronously before ending anything. Span\n // end calls onEnd synchronously, and shutdown can be entered again from a\n // host callback; swapping the map first makes those paths idempotent.\n const cleanReason = this.beginShutdown(reason);\n const activeById = this._activeSpans;\n this._activeSpans = new Map<string, SdkSpan>();\n const active = [...activeById.values()];\n if (active.length === 0) return 0;\n\n const activeIds = new Set(active.map((span) => span.spanContext().spanId));\n const depth = (span: SdkSpan): number => {\n let current: SdkSpan | undefined = span;\n const seen = new Set<string>();\n let value = 0;\n while (current?.parentSpanId && activeIds.has(current.parentSpanId)) {\n const parentId = current.parentSpanId;\n if (seen.has(parentId)) break;\n seen.add(parentId);\n value += 1;\n current = activeById.get(parentId);\n }\n return value;\n };\n\n let ended = 0;\n for (const span of active.sort((a, b) => depth(b) - depth(a))) {\n try {\n if (!span.isRecording()) continue;\n this._markInterrupted(span, cleanReason);\n span.end();\n ended += 1;\n } catch (error) {\n logger.warn(`Failed to end active span during ${cleanReason}: ${error}`);\n }\n }\n return ended;\n }\n\n beginShutdown(reason = 'shutdown'): string {\n const cleanReason = sanitizeTerminationReason(reason);\n this._closingReason ??= cleanReason;\n return this._closingReason;\n }\n\n ownsSpan(span: ReadableSpan): boolean {\n return this.ownAllSpans || (span.instrumentationLibrary?.name ?? '').startsWith('neatlogs');\n }\n\n isCompletionEligible(span: ReadableSpan): boolean {\n return !this._closed && this._completionEligibleRoots.has(span as object);\n }\n\n async whenMaskComplete(span: ReadableSpan): Promise<boolean> {\n const result = getScheduledMask(span as object);\n if (!result) return false;\n return (await result) !== null && !this._closed;\n }\n\n private _markInterrupted(span: SdkSpan, cleanReason: string): void {\n span.setAttribute('neatlogs.trace.interrupted', true);\n span.setAttribute('neatlogs.trace.termination.reason', cleanReason);\n // Preserve an explicit OK set by application/framework code. An interrupted\n // span that never reached a terminal status is an OTel ERROR; a completed\n // span remains OK and carries the interruption metadata/event separately.\n if (span.status.code === SpanStatusCode.UNSET) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: `Interrupted during ${cleanReason}`,\n });\n }\n span.addEvent('neatlogs.trace.interrupted', {\n 'neatlogs.trace.termination.reason': cleanReason,\n });\n }\n\n // ── Completion marker ─────────────────────────────────\n\n emitCompletionMarker(\n rootSpan: ReadableSpan,\n traceId: string,\n resourceAttrs: Record<string, any>,\n markerTracer: Tracer = getNeatlogsTracer('neatlogs.internal'),\n ): void {\n try {\n const spanCtx: SpanContext = {\n traceId: rootSpan.spanContext().traceId,\n spanId: rootSpan.spanContext().spanId,\n isRemote: false,\n traceFlags: TraceFlags.SAMPLED,\n };\n\n // Use wrapSpanContext to create a non-recording span from context\n const wrappedSpan = otelTrace.wrapSpanContext(spanCtx);\n const ctx = otelTrace.setSpan(ROOT_CONTEXT, wrappedSpan);\n\n const marker = markerTracer.startSpan('neatlogs.trace.complete', undefined, ctx);\n marker.setAttribute('neatlogs.trace.complete', true);\n marker.setAttribute('neatlogs.internal', true);\n marker.setAttribute('neatlogs.span.kind', 'Neatlogs.INTERNAL');\n\n // The completion marker may be exported in a batch without the root span.\n // Carry the root-owned identity so ingestion can finalize the trace under\n // the correct conversation and end-user without depending on batch order.\n for (const key of [\n 'neatlogs.session.id',\n 'neatlogs.session.parent_id',\n 'neatlogs.session.feature.name',\n 'neatlogs.session.entry_point',\n 'neatlogs.end_user.id',\n 'neatlogs.end_user.metadata',\n ]) {\n const value = rootSpan.attributes[key];\n if (value !== undefined) {\n marker.setAttribute(key, value);\n }\n }\n\n // Copy resource tags\n if (resourceAttrs['neatlogs.tags']) {\n marker.setAttribute('neatlogs.tags', resourceAttrs['neatlogs.tags']);\n }\n\n marker.end();\n\n if (this.debug) {\n logger.debug(`[SpanProcessor] Emitted completion marker for trace ${traceId}`);\n }\n } catch (e) {\n logger.warn(`[SpanProcessor] Failed to emit completion marker: ${e}`);\n }\n }\n\n // ── Framework span name normalization ─────────────────\n\n private _normalizeFrameworkSpanNames(spans: Record<string, any>[]): Record<string, any>[] {\n for (const s of spans) {\n const name: string = s.name ?? '';\n const kind: string = s.kind ?? s.attributes?.['neatlogs.span.kind'] ?? '';\n\n if (kind !== 'task' || !name.endsWith('.task')) {\n continue;\n }\n\n const attrs: Record<string, any> = s.attributes ?? {};\n if (!Object.keys(attrs).some((k) => k.startsWith('neatlogs.crewai.'))) {\n continue;\n }\n\n let desc = name.slice(0, -'.task'.length).trimEnd();\n while (desc.endsWith('.')) {\n desc = desc.slice(0, -1).trimEnd();\n }\n\n if (desc) {\n if (attrs['neatlogs.task.description'] === undefined) {\n attrs['neatlogs.task.description'] = desc;\n }\n }\n\n s.name = 'crewai.task';\n s.attributes = attrs;\n }\n\n return spans;\n }\n\n // ── CrewAI task template injection ────────────────────\n\n private _injectCrewaiTaskTemplates(spans: Record<string, any>[]): Record<string, any>[] {\n for (const s of spans) {\n const attrs: Record<string, any> = s.attributes ?? {};\n const taskId = attrs['neatlogs.task.id'];\n if (!taskId) continue;\n\n const entry = popEntry(String(taskId));\n if (!entry) continue;\n\n const [tplStr, varsJson] = entry;\n attrs['neatlogs.task.user_prompt_template'] = tplStr;\n if (varsJson) {\n attrs['neatlogs.task.user_prompt_template_variables'] = varsJson;\n }\n attrs['neatlogs.span.kind'] = 'crewai_task';\n s.attributes = attrs;\n }\n\n return spans;\n }\n\n // ── Resolve actual model name from LLM output ────────\n // LangChain/Azure spans report deployment names (e.g., \"gpt-3.5-turbo\") as\n // the model name. The actual resolved model (e.g., \"gpt-5-nano-2025-08-07\")\n // is buried in the LLM output JSON at response_metadata.model_name.\n\n private _resolveActualModelName(spanData: Record<string, any>): void {\n const attrs: Record<string, any> = spanData.attributes ?? {};\n const kind = attrs['neatlogs.span.kind'];\n if (kind !== 'llm') return;\n\n const currentModel = attrs['neatlogs.llm.model_name'] as string | undefined;\n if (!currentModel) return;\n\n const llmOutput = attrs['neatlogs.llm.output'] as string | undefined;\n if (!llmOutput) return;\n\n // Plenty of integrations put plain assistant text here — there is no model\n // name to recover from that, so don't try to parse it as JSON.\n const trimmed = llmOutput.trimStart();\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) return;\n\n try {\n const output = JSON.parse(llmOutput);\n\n // LangChain format: generations[0][0].message.kwargs.response_metadata.model_name\n const generations = output?.generations;\n if (Array.isArray(generations) && generations[0]?.[0]) {\n const respMeta = generations[0][0]?.message?.kwargs?.response_metadata;\n if (respMeta?.model_name && respMeta.model_name !== currentModel) {\n attrs['neatlogs.llm.model_name'] = respMeta.model_name;\n if (this.debug) {\n logger.debug(`[ModelResolve] LangChain span: ${currentModel} → ${respMeta.model_name}`);\n }\n return;\n }\n }\n\n // Vercel AI SDK / direct OpenAI format: model field at top level of response\n if (output?.model && output.model !== currentModel) {\n attrs['neatlogs.llm.model_name'] = output.model;\n if (this.debug) {\n logger.debug(`[ModelResolve] Direct response: ${currentModel} → ${output.model}`);\n }\n }\n } catch (e: unknown) {\n // Best-effort enrichment only — never worth warning the user about.\n if (this.debug) {\n logger.debug(`[ModelResolve] Failed to parse LLM output for model extraction: ${e}`);\n }\n }\n }\n\n // ── forceFlush / shutdown ─────────────────────────────\n\n async forceFlush(): Promise<void> {\n // Mask completion may create a trace-completion marker, so drain until no\n // newly-created masking work remains before transport processors flush.\n while (this._pendingMasks.size > 0) {\n await Promise.allSettled([...this._pendingMasks]);\n }\n }\n\n async shutdown(): Promise<void> {\n await this.forceFlush();\n this._closed = true;\n this._logPerformanceStats();\n\n await closeLogStream(this._rawLogStream, 'raw');\n this._rawLogStream = null;\n\n await closeLogStream(this._processedLogStream, 'processed');\n this._processedLogStream = null;\n }\n\n // ── Performance stats ─────────────────────────────────\n\n private _logPerformanceStats(): void {\n if (!this.debug) return;\n\n const stats = this.perfStats;\n if (stats.spansProcessed === 0) return;\n\n const totalTime = stats.onStartTime + stats.onEndTime;\n const avgMs = totalTime / stats.spansProcessed;\n\n try {\n logger.info(\n `Neatlogs overhead: ${totalTime.toFixed(2)}ms total, ${avgMs.toFixed(3)}ms/span ` +\n `(${stats.spansProcessed} spans processed, ` +\n `${stats.spansExported} spans logged)`,\n );\n } catch {\n // ignore\n }\n }\n\n // ── Accessors for testing ─────────────────────────────\n\n /** @internal — exposed for testing */\n get _perfStats(): PerfStats {\n return this.perfStats;\n }\n\n /** @internal — exposed for testing */\n get _suppressedRetrievers(): Set<string> {\n return this._retrieversToSuppress;\n }\n}\n\nexport function sanitizeTerminationReason(reason: unknown): string {\n const printable = String(reason || 'shutdown')\n .replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n return (printable || 'shutdown').slice(0, 256);\n}\n\nexport class CompletionMarkerSpanProcessor implements SpanProcessor {\n private closed = false;\n private deferring = false;\n private readonly deferredRoots: ReadableSpan[] = [];\n private readonly pending = new Set<Promise<void>>();\n\n constructor(\n private readonly source: NeatlogsSpanProcessor,\n private readonly tracer: Tracer,\n ) {}\n\n onStart(_span: SdkSpan, _parentContext: Context): void {}\n\n onEnd(span: ReadableSpan): void {\n if (\n this.closed ||\n span.name === 'neatlogs.trace.complete' ||\n span.parentSpanId ||\n isHttpSpan(span)\n )\n return;\n if (!this.source.ownsSpan(span)) return;\n const task = this.source\n .whenMaskComplete(span)\n .then((eligible) => {\n if (!eligible || this.closed) return;\n if (this.deferring) this.deferredRoots.push(span);\n else this.emit(span);\n })\n .finally(() => {\n this.pending.delete(task);\n });\n this.pending.add(task);\n }\n\n beginShutdown(): void {\n this.deferring = true;\n }\n\n emitDeferred(): void {\n const roots = this.deferredRoots.splice(0);\n // The log-drain boundary has passed. Roots ending after this point must\n // emit immediately rather than being stranded in a second deferred batch.\n this.deferring = false;\n for (const span of roots) this.emit(span);\n }\n\n private emit(span: ReadableSpan): void {\n const resourceAttrs = { ...span.resource.attributes };\n this.source.emitCompletionMarker(span, span.spanContext().traceId, resourceAttrs, this.tracer);\n }\n\n async forceFlush(): Promise<void> {\n while (this.pending.size > 0) {\n await Promise.allSettled([...this.pending]);\n }\n this.emitDeferred();\n }\n async shutdown(): Promise<void> {\n await this.forceFlush();\n this.closed = true;\n this.deferredRoots.splice(0);\n }\n}\n","/**\n * Framework and platform detection from instrumentation scope.\n *\n * Parses OpenTelemetry instrumentation_scope.name to extract:\n * - Provider: LLM provider (openai, anthropic, google, etc.)\n * - Framework: Orchestration framework (langchain, llamaindex, crewai, etc.)\n * - Platform: Cloud platform (bedrock, vertex_ai, azure_openai, etc.)\n *\n * Port of Python neatlogs/core/instrumentation_scope_parser.py\n */\n\n// ────────────────────────────────────────────────────────\n// Types\n// ────────────────────────────────────────────────────────\n\nexport interface ScopeInfo {\n provider?: string;\n framework?: string;\n platform?: string;\n}\n\n// ────────────────────────────────────────────────────────\n// Scope-name → provider / framework / platform tables\n// ────────────────────────────────────────────────────────\n\nconst SCOPE_PATTERNS: Record<string, ScopeInfo> = {\n // Neatlogs custom instrumentations\n '@neatlogs/instrumentation-google-genai': { provider: 'google', framework: 'google_genai' },\n '@neatlogs/instrumentation-mastra': { framework: 'mastra' },\n '@neatlogs/instrumentation-ai-sdk': { framework: 'vercel_ai_sdk' },\n\n // Vercel AI SDK native scope (the `ai` package emits this directly)\n ai: { framework: 'vercel_ai_sdk' },\n\n // OpenInference instrumentations (npm @arizeai scope names)\n '@arizeai/openinference-instrumentation-openai': { provider: 'openai', framework: 'openai' },\n '@arizeai/openinference-instrumentation-anthropic': { provider: 'anthropic', framework: 'anthropic' },\n '@arizeai/openinference-instrumentation-langchain': { framework: 'langchain' },\n '@arizeai/openinference-instrumentation-bedrock': { provider: 'bedrock', platform: 'bedrock', framework: 'bedrock' },\n '@arizeai/openinference-instrumentation-vertexai': { provider: 'vertex_ai', platform: 'vertex_ai', framework: 'vertex_ai' },\n '@arizeai/openinference-instrumentation-mistralai': { provider: 'mistral', framework: 'mistral' },\n '@arizeai/openinference-instrumentation-cohere': { provider: 'cohere', framework: 'cohere' },\n '@arizeai/openinference-instrumentation-groq': { provider: 'groq', framework: 'groq' },\n '@arizeai/openinference-instrumentation-llama-index': { framework: 'llamaindex' },\n '@arizeai/openinference-instrumentation-llamaindex': { framework: 'llamaindex' },\n '@arizeai/openinference-instrumentation-crewai': { framework: 'crewai' },\n '@arizeai/openinference-instrumentation-haystack': { framework: 'haystack' },\n '@arizeai/openinference-instrumentation-dspy': { framework: 'dspy' },\n '@arizeai/openinference-instrumentation-beeai': { framework: 'beeai' },\n '@arizeai/openinference-instrumentation-mcp': { framework: 'mcp' },\n '@arizeai/openinference-instrumentation-claude-agent-sdk': { framework: 'claude_agent_sdk' },\n\n // OpenInference instrumentations (Python-style scope names)\n 'openinference.instrumentation.openai': { provider: 'openai', framework: 'openai' },\n 'openinference.instrumentation.anthropic': { provider: 'anthropic', framework: 'anthropic' },\n 'openinference.instrumentation.google_genai': { provider: 'google', framework: 'google_genai' },\n 'openinference.instrumentation.bedrock': { provider: 'bedrock', platform: 'bedrock', framework: 'bedrock' },\n 'openinference.instrumentation.vertexai': { provider: 'vertex_ai', platform: 'vertex_ai', framework: 'vertex_ai' },\n 'openinference.instrumentation.mistralai': { provider: 'mistral', framework: 'mistral' },\n 'openinference.instrumentation.cohere': { provider: 'cohere', framework: 'cohere' },\n 'openinference.instrumentation.groq': { provider: 'groq', framework: 'groq' },\n\n // OpenInference frameworks (Python-style scope names)\n 'openinference.instrumentation.mastra': { framework: 'mastra' },\n 'openinference.instrumentation.langchain': { framework: 'langchain' },\n 'openinference.instrumentation.llama_index': { framework: 'llamaindex' },\n 'openinference.instrumentation.llamaindex': { framework: 'llamaindex' },\n 'openinference.instrumentation.crewai': { framework: 'crewai' },\n 'openinference.instrumentation.haystack': { framework: 'haystack' },\n 'openinference.instrumentation.dspy': { framework: 'dspy' },\n\n // OpenLLMetry (Traceloop) instrumentations\n 'opentelemetry.instrumentation.openai': { provider: 'openai', framework: 'openai' },\n 'opentelemetry.instrumentation.anthropic': { provider: 'anthropic', framework: 'anthropic' },\n 'opentelemetry.instrumentation.google_generativeai': { provider: 'google', framework: 'google_genai' },\n 'opentelemetry.instrumentation.bedrock': { provider: 'bedrock', platform: 'bedrock', framework: 'bedrock' },\n 'opentelemetry.instrumentation.vertexai': { provider: 'vertex_ai', platform: 'vertex_ai', framework: 'vertex_ai' },\n 'opentelemetry.instrumentation.cohere': { provider: 'cohere', framework: 'cohere' },\n 'opentelemetry.instrumentation.mistralai': { provider: 'mistral', framework: 'mistral' },\n\n // OpenLLMetry frameworks\n 'opentelemetry.instrumentation.langchain': { framework: 'langchain' },\n 'opentelemetry.instrumentation.llamaindex': { framework: 'llamaindex' },\n 'opentelemetry.instrumentation.crewai': { framework: 'crewai' },\n 'opentelemetry.instrumentation.haystack': { framework: 'haystack' },\n\n // Native framework telemetry\n 'haystack.telemetry': { framework: 'haystack' },\n crewai: { framework: 'crewai' },\n langchain: { framework: 'langchain' },\n llama_index: { framework: 'llamaindex' },\n};\n\n// gen_ai.system → neatlogs.provider mapping\nconst GEN_AI_SYSTEM_TO_PROVIDER: Record<string, string> = {\n openai: 'openai',\n anthropic: 'anthropic',\n google: 'google',\n vertex_ai: 'vertex_ai',\n bedrock: 'bedrock',\n azure_openai: 'openai', // Azure OpenAI uses OpenAI provider\n cohere: 'cohere',\n mistral: 'mistral',\n groq: 'groq',\n};\n\n// ────────────────────────────────────────────────────────\n// Public API\n// ────────────────────────────────────────────────────────\n\n/**\n * Parse instrumentation scope name to extract provider/framework/platform.\n *\n * @param scopeName - The instrumentation_scope.name from the span\n * @returns Dictionary with detected: provider, framework, platform (if found)\n *\n * @example\n * parseInstrumentationScope('openinference.instrumentation.openai')\n * // → { provider: 'openai' }\n *\n * parseInstrumentationScope('openinference.instrumentation.langchain')\n * // → { framework: 'langchain' }\n *\n * parseInstrumentationScope('opentelemetry.instrumentation.bedrock')\n * // → { provider: 'bedrock', platform: 'bedrock' }\n */\nexport function parseInstrumentationScope(scopeName: string | null | undefined): ScopeInfo {\n if (!scopeName) return {};\n\n const scopeLower = scopeName.toLowerCase();\n\n // Direct exact match\n if (scopeLower in SCOPE_PATTERNS) {\n return { ...SCOPE_PATTERNS[scopeLower] };\n }\n\n // Prefix match (handles versioned scopes like \"openinference.instrumentation.openai.v1\")\n for (const [pattern, info] of Object.entries(SCOPE_PATTERNS)) {\n if (scopeLower.startsWith(pattern)) {\n return { ...info };\n }\n }\n\n // Fuzzy extraction as fallback\n const result: ScopeInfo = {};\n\n // Check for framework indicators\n if (scopeLower.includes('langchain')) {\n result.framework = 'langchain';\n } else if (scopeLower.includes('llama') || scopeLower.includes('llamaindex')) {\n result.framework = 'llamaindex';\n } else if (scopeLower.includes('crewai') || scopeLower.includes('crew')) {\n result.framework = 'crewai';\n } else if (scopeLower.includes('haystack')) {\n result.framework = 'haystack';\n } else if (scopeLower.includes('dspy')) {\n result.framework = 'dspy';\n } else if (scopeLower.includes('vercel-ai') || scopeLower.includes('ai-sdk')) {\n result.framework = 'vercel_ai_sdk';\n }\n\n // Check for provider indicators\n if (scopeLower.includes('openai')) {\n result.provider = 'openai';\n if (scopeLower.includes('azure')) {\n result.platform = 'azure_openai';\n }\n } else if (scopeLower.includes('anthropic') || scopeLower.includes('claude')) {\n result.provider = 'anthropic';\n } else if (\n scopeLower.includes('google') ||\n scopeLower.includes('gemini') ||\n scopeLower.includes('genai')\n ) {\n result.provider = 'google';\n } else if (scopeLower.includes('bedrock')) {\n result.provider = 'bedrock';\n result.platform = 'bedrock';\n } else if (scopeLower.includes('vertex')) {\n result.platform = 'vertex_ai';\n // Vertex can host multiple providers, default to google\n if (!result.provider) {\n result.provider = 'vertex_ai';\n }\n } else if (scopeLower.includes('mistral')) {\n result.provider = 'mistral';\n } else if (scopeLower.includes('cohere')) {\n result.provider = 'cohere';\n } else if (scopeLower.includes('groq')) {\n result.provider = 'groq';\n }\n\n return result;\n}\n\n/**\n * Enrich attributes with framework/platform/provider detected from instrumentation scope.\n *\n * Modifies attrs **in-place** by adding:\n * - neatlogs.instrumentation.name\n * - neatlogs.provider\n * - neatlogs.framework\n * - neatlogs.platform\n *\n * Logic:\n * 1. Parse current span's scope → gives provider/platform\n * 2. Parse parent span's scope (if provided) → gives orchestrating framework\n * 3. Only set attributes if not already present (explicit attrs take precedence)\n * 4. Cross-reference with gen_ai.system / model name patterns\n */\nexport function enrichWithScopeDetection(\n attrs: Record<string, any>,\n scopeName: string | null | undefined,\n parentScopeName: string | null | undefined = null,\n): void {\n // Store original instrumentation scope info\n if (scopeName) {\n if (!('neatlogs.instrumentation.name' in attrs)) {\n attrs['neatlogs.instrumentation.name'] = scopeName;\n }\n }\n\n // Parse current span's scope\n const currentInfo = parseInstrumentationScope(scopeName);\n\n // Set provider (from current span's scope)\n if (currentInfo.provider && !('neatlogs.provider' in attrs)) {\n attrs['neatlogs.provider'] = currentInfo.provider;\n }\n\n // Set platform (from current span's scope)\n if (currentInfo.platform && !('neatlogs.platform' in attrs)) {\n attrs['neatlogs.platform'] = currentInfo.platform;\n }\n\n // Set framework — prioritize parent scope, fallback to current scope\n if (parentScopeName) {\n const parentInfo = parseInstrumentationScope(parentScopeName);\n if (parentInfo.framework && !('neatlogs.framework' in attrs)) {\n attrs['neatlogs.framework'] = parentInfo.framework;\n }\n }\n\n // If no framework from parent, check current scope\n if (!('neatlogs.framework' in attrs) && currentInfo.framework) {\n attrs['neatlogs.framework'] = currentInfo.framework;\n }\n\n // Cross-reference with gen_ai.system if available\n const genAiSystem = (attrs['gen_ai.system'] ?? '').toLowerCase();\n if (genAiSystem && !('neatlogs.provider' in attrs)) {\n const mapped = GEN_AI_SYSTEM_TO_PROVIDER[genAiSystem];\n if (mapped) {\n attrs['neatlogs.provider'] = mapped;\n }\n }\n\n // Detect platform from model name patterns (e.g., \"anthropic.claude-3-5-sonnet-v1:0\" → Bedrock)\n const llmModel: string = attrs['llm.model_name'] ?? '';\n if (llmModel && !('neatlogs.platform' in attrs)) {\n if (\n llmModel.startsWith('anthropic.') ||\n llmModel.startsWith('meta.') ||\n llmModel.startsWith('amazon.')\n ) {\n attrs['neatlogs.platform'] = 'bedrock';\n } else if (llmModel.toLowerCase().includes('azure')) {\n attrs['neatlogs.platform'] = 'azure_openai';\n }\n }\n}\n\n/**\n * Get the effective provider to use for pricing lookups.\n *\n * Logic:\n * 1. Use neatlogs.platform if it's set (bedrock/vertex_ai/azure_openai)\n * 2. Otherwise use neatlogs.provider\n * 3. Fallback to gen_ai.system or llm.system\n */\nexport function getEffectiveProviderForPricing(attrs: Record<string, any>): string {\n // Platform takes precedence for pricing (different pricing on cloud platforms)\n const platform = (attrs['neatlogs.platform'] ?? '').toLowerCase();\n if (platform) {\n const platformPricingMap: Record<string, string> = {\n bedrock: 'bedrock',\n vertex_ai: 'vertex_ai',\n azure_openai: 'azure_openai',\n };\n if (platform in platformPricingMap) {\n return platformPricingMap[platform];\n }\n }\n\n // Use detected provider\n const provider = (attrs['neatlogs.provider'] ?? '').toLowerCase();\n if (provider) {\n return provider;\n }\n\n // Fallback to gen_ai.system or llm.system\n return (attrs['gen_ai.system'] ?? attrs['llm.system'] ?? '').toLowerCase();\n}\n\n/**\n * Get the effective provider to use for defaults lookups.\n *\n * Currently uses the same logic as pricing. Exported as a separate\n * name so callers express intent (defaults vs pricing) even though\n * the implementation is shared.\n */\nexport const getEffectiveProviderForDefaults = getEffectiveProviderForPricing;\n","{\n \"openai\": {\n \"chat.completions\": {\n \"gpt-5.2\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-5.1\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-5\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-5-mini\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0\n },\n \"gpt-5-nano\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0\n },\n \"gpt-4.1\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-4.1-mini\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0\n },\n \"gpt-4o\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false,\n \"n\": 1\n },\n \"gpt-4o-mini\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0\n },\n \"o4-mini\": {\n \"max_completion_tokens\": null\n },\n \"o3\": {\n \"max_completion_tokens\": null\n },\n \"o3-mini\": {\n \"max_completion_tokens\": null\n },\n \"o1\": {\n \"max_completion_tokens\": null\n },\n \"o1-mini\": {\n \"max_completion_tokens\": null\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"stream\": false\n }\n },\n \"embeddings\": {\n \"_default\": {\n \"encoding_format\": \"float\",\n \"dimensions\": null\n }\n }\n },\n \"anthropic\": {\n \"messages\": {\n \"claude-opus-4-6\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-opus-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-opus-4-1\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"claude-opus-4\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"claude-sonnet-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-sonnet-4\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-haiku-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"claude-3-5-sonnet\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false,\n \"stop_sequences\": null\n },\n \"claude-3-5-haiku\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"claude-3-opus\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"claude-3-haiku\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": 4096,\n \"stream\": false\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"stream\": false\n }\n }\n },\n \"cohere\": {\n \"chat\": {\n \"_default\": {\n \"temperature\": 0.3,\n \"p\": 0.75,\n \"k\": 0,\n \"max_tokens\": null,\n \"safety_mode\": \"CONTEXTUAL\"\n }\n },\n \"generate\": {\n \"_default\": {\n \"temperature\": 0.9,\n \"p\": null,\n \"k\": 0,\n \"max_tokens\": null,\n \"safety_mode\": \"CONTEXTUAL\"\n }\n }\n },\n \"google\": {\n \"generateContent\": {\n \"gemini-2.5-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.5-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.0-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.0-flash-lite\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.0-flash-thinking\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 64,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.5-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.94,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"stop_sequences\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.5-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.0-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n }\n }\n },\n \"vertex_ai\": {\n \"generateContent\": {\n \"gemini-2.5-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.5-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-2.0-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.5-pro\": {\n \"temperature\": 1.0,\n \"top_p\": 0.94,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"gemini-1.5-flash\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"max_output_tokens\": null,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 0.95,\n \"top_k\": 40,\n \"safety_settings\": [\n {\"category\": \"HARM_CATEGORY_HARASSMENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_HATE_SPEECH\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"},\n {\"category\": \"HARM_CATEGORY_DANGEROUS_CONTENT\", \"threshold\": \"BLOCK_MEDIUM_AND_ABOVE\"}\n ]\n }\n }\n },\n \"bedrock\": {\n \"_note\": \"Claude Sonnet 4.5 and Haiku 4.5 on Bedrock: Use EITHER temperature OR top_p, not both\",\n \"messages\": {\n \"anthropic.claude-sonnet-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-haiku-4-5\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-3-5-sonnet-20241022\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-3-5-sonnet-20240620\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null,\n \"stop_sequences\": null\n },\n \"anthropic.claude-3-5-haiku-20241022\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-3-opus\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"anthropic.claude-3-haiku\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"top_k\": null,\n \"max_tokens\": null\n },\n \"meta.llama3\": {\n \"temperature\": 0.5,\n \"top_p\": 0.9,\n \"max_gen_len\": null\n },\n \"mistral.mistral-7b-instruct\": {\n \"temperature\": 0.5,\n \"top_p\": 0.9,\n \"top_k\": 50,\n \"max_tokens\": null\n },\n \"amazon.titan-text\": {\n \"temperature\": 0.7,\n \"topP\": 0.9,\n \"maxTokenCount\": null\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0\n }\n }\n },\n \"groq\": {\n \"chat.completions\": {\n \"llama-3.3-70b-versatile\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 1024,\n \"stream\": false\n },\n \"llama-3.1-70b-versatile\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 1024,\n \"stream\": false\n },\n \"mixtral-8x7b-32768\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 1024,\n \"stream\": false\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 1024,\n \"stream\": false\n }\n }\n },\n \"deepseek\": {\n \"chat.completions\": {\n \"deepseek-chat\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 4096,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"stream\": false\n },\n \"deepseek-reasoner\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"max_tokens\": 8192,\n \"stream\": false\n },\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"stream\": false\n }\n }\n },\n \"mistral\": {\n \"chat\": {\n \"mistral-large-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null,\n \"safe_prompt\": false\n },\n \"mistral-small-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"pixtral-large-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"pixtral-12b-2409\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"codestral-latest\": {\n \"temperature\": 0.0,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"ministral-8b-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"ministral-3b-latest\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": null\n },\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0\n }\n }\n },\n \"ollama\": {\n \"generate\": {\n \"_default\": {\n \"temperature\": 0.8,\n \"top_k\": 40,\n \"top_p\": 0.9,\n \"num_predict\": -1,\n \"repeat_penalty\": 1.1,\n \"stream\": false\n }\n },\n \"chat\": {\n \"_default\": {\n \"temperature\": 0.8,\n \"top_k\": 40,\n \"top_p\": 0.9,\n \"num_predict\": -1,\n \"stream\": false\n }\n }\n },\n \"together\": {\n \"chat.completions\": {\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 0.7,\n \"top_k\": 50,\n \"max_tokens\": 512,\n \"stream\": false\n }\n },\n \"completions\": {\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 0.7,\n \"top_k\": 50,\n \"max_tokens\": 128\n }\n }\n },\n \"replicate\": {\n \"predictions\": {\n \"meta/llama-2\": {\n \"temperature\": 0.75,\n \"top_p\": 0.9,\n \"max_new_tokens\": 500\n },\n \"meta/llama-3\": {\n \"temperature\": 0.75,\n \"top_p\": 0.9,\n \"max_new_tokens\": 500\n },\n \"_default\": {\n \"temperature\": 0.75,\n \"top_p\": 0.9\n }\n }\n },\n \"huggingface\": {\n \"text_generation\": {\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_new_tokens\": null,\n \"do_sample\": true\n }\n },\n \"conversational\": {\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": null,\n \"top_k\": null,\n \"max_length\": null\n }\n }\n },\n \"azure_openai\": {\n \"chat.completions\": {\n \"_default\": {\n \"temperature\": 1.0,\n \"top_p\": 1.0,\n \"frequency_penalty\": 0,\n \"presence_penalty\": 0,\n \"max_tokens\": null,\n \"stream\": false\n }\n }\n },\n \"aleph_alpha\": {\n \"completion\": {\n \"_default\": {\n \"temperature\": 0.0,\n \"top_p\": 0.0,\n \"top_k\": 0,\n \"maximum_tokens\": 64\n }\n }\n },\n \"watsonx\": {\n \"generate\": {\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"top_k\": 50,\n \"max_new_tokens\": 200\n }\n }\n },\n \"writer\": {\n \"completion\": {\n \"_default\": {\n \"temperature\": 0.7,\n \"top_p\": 1.0,\n \"max_tokens\": 1024\n }\n }\n }\n}\n","/**\n * Model defaults enricher for invocation parameters.\n *\n * Loads defaults from config/model_defaults.json and intelligently merges\n * them with explicitly set parameters.\n */\n\nimport { getLogger } from '../core/logger.js';\nimport modelDefaultsConfig from './model_defaults.json';\n\nconst logger = getLogger();\n\n/**\n * Get default parameters for a specific provider/operation/model.\n */\nexport function getDefaults(\n provider: string,\n operation: string,\n model: string,\n): Record<string, any> {\n const defaultsData = modelDefaultsConfig as Record<string, any>;\n\n const providerData = defaultsData[provider.toLowerCase()] ?? {};\n const operationData = providerData[operation] ?? {};\n\n if (Object.keys(operationData).length === 0) {\n return {};\n }\n\n // Exact match\n if (model in operationData) {\n return { ...operationData[model] };\n }\n\n // Prefix match\n for (const [modelKey, defaults] of Object.entries(operationData)) {\n if (modelKey !== '_default' && model.startsWith(modelKey)) {\n logger.debug(`Matched model '${model}' to defaults for '${modelKey}'`);\n return { ...(defaults as Record<string, any>) };\n }\n }\n\n // Default fallback\n if ('_default' in operationData) {\n logger.debug(`Using _default for ${provider}/${operation}/${model}`);\n return { ...operationData._default };\n }\n\n return {};\n}\n\n/**\n * Enrich invocation parameters with model defaults.\n *\n * Merges default parameters from model_defaults.json with explicitly captured\n * parameters. Explicit parameters always take precedence.\n *\n * Modifies mergedAttrs in-place.\n */\nexport function enrichInvocationParameters(\n mergedAttrs: Record<string, any>,\n enableEnrichment = true,\n): void {\n if (!enableEnrichment) return;\n\n const spanKind = mergedAttrs['openinference.span.kind'];\n if (spanKind !== 'LLM' && spanKind !== 'EMBEDDING') return;\n\n const provider = (mergedAttrs['llm.system'] ?? '').toLowerCase();\n const model =\n spanKind === 'EMBEDDING'\n ? mergedAttrs['embedding.model_name'] ?? ''\n : mergedAttrs['llm.model_name'] ?? '';\n\n if (!provider || !model) return;\n\n let operation: string | undefined;\n if (spanKind === 'LLM') {\n operation = provider === 'openai' ? 'chat.completions' : 'messages';\n } else if (spanKind === 'EMBEDDING') {\n operation = 'embeddings';\n }\n\n if (!operation) return;\n\n const defaults = getDefaults(provider, operation, model);\n if (Object.keys(defaults).length === 0) {\n logger.debug(`No defaults found for ${provider}/${operation}/${model}`);\n return;\n }\n\n const existingParamsStr = mergedAttrs['llm.invocation_parameters'] ?? '{}';\n let existingParams: Record<string, any>;\n try {\n existingParams =\n typeof existingParamsStr === 'string'\n ? JSON.parse(existingParamsStr)\n : existingParamsStr;\n } catch {\n existingParams = {};\n }\n\n const enrichedParams = { ...defaults, ...existingParams };\n mergedAttrs['llm.invocation_parameters'] = JSON.stringify(enrichedParams);\n\n logger.debug(\n `Enriched params for ${provider}/${model}: added ${Object.keys(defaults).length} defaults`,\n );\n}\n","/**\n * Unified Attribute Processor — the core normalization pipeline.\n *\n * Port of Python neatlogs/core/attribute_processor.py\n *\n * Receives a span dict (already serialized from an OTel ReadableSpan) and\n * produces a normalized dict with neatlogs.* attributes.\n *\n * The processor handles three conventions:\n * - OpenInference (llm.*, embedding.*, openinference.*)\n * - OpenLLMetry (gen_ai.*, traceloop.*)\n * - Raw OTel (http.*, db.*, etc.)\n */\n\nimport { getLogger } from './logger.js';\nimport { enrichWithScopeDetection } from './instrumentation-scope-parser.js';\nimport { inferSpanKindFromName } from '../span-kinds/mapping.js';\nimport { enrichInvocationParameters } from '../config/defaults-enricher.js';\nimport { VECTOR_DB_SYSTEMS, RETRIEVAL_OPS, WRITE_OPS } from '../span-kinds/constants.js';\nimport type { AttributeMapper } from '../config/attribute-mapper.js';\n\nconst logger = getLogger();\n\n// ────────────────────────────────────────────────────────\n// Regular expressions\n// ────────────────────────────────────────────────────────\n\n/** Matches Python object repr strings like `<function BaseTool.<lambda> at 0x110107be0>` */\nconst PYTHON_REPR_RE = /^<[A-Za-z_].*?\\bat\\s+0x[0-9a-fA-F]+>$/;\n\n// Tool-call extraction from OpenInference output messages\nconst OI_TOOL_RE =\n /^llm\\.output_messages\\.(\\d+)\\.message\\.tool_calls\\.(\\d+)\\.tool_call\\.function\\.(name|arguments)$/;\nconst OI_TOOL_ID_RE =\n /^llm\\.output_messages\\.(\\d+)\\.message\\.tool_calls\\.(\\d+)\\.tool_call\\.id$/;\n\n// Tool definitions\nconst OI_SCHEMA_RE = /^llm\\.tools\\.(\\d+)\\.tool\\.json_schema$/;\nconst OL_FN_RE = /^llm\\.request\\.functions\\.(\\d+)\\.(name|description|input_schema)$/;\n\n// Input message tool fields\nconst INPUT_MSG_TOOL_RE = /^llm\\.input_messages\\.(\\d+)\\.message\\.(tool_call_id|name)$/;\n\n// Maps neatlogs.provider → neatlogs.llm.system\nconst PROVIDER_TO_SYSTEM: Record<string, string> = {\n openai: 'openai',\n azure: 'openai',\n azure_openai: 'openai',\n anthropic: 'anthropic',\n cohere: 'cohere',\n mistral: 'mistralai',\n mistralai: 'mistralai',\n google: 'google',\n vertex_ai: 'vertexai',\n groq: 'groq',\n xai: 'xai',\n deepseek: 'deepseek',\n};\n\n// ────────────────────────────────────────────────────────\n// Helpers\n// ────────────────────────────────────────────────────────\n\nfunction isPythonRepr(s: string): boolean {\n return PYTHON_REPR_RE.test(s.trim());\n}\n\n/** Recursively remove Python object repr strings from a parsed JSON structure. */\nfunction cleanPythonReprs(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n\n if (Array.isArray(obj)) {\n return obj\n .filter((item) => !(typeof item === 'string' && isPythonRepr(item)))\n .map((item) => cleanPythonReprs(item));\n }\n\n if (typeof obj === 'object') {\n const cleaned: Record<string, any> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (typeof v === 'string' && isPythonRepr(v)) continue;\n cleaned[k] = cleanPythonReprs(v);\n }\n return cleaned;\n }\n\n return obj;\n}\n\nfunction safeParse(val: string): any {\n try {\n return JSON.parse(val);\n } catch {\n return undefined;\n }\n}\n\nfunction safeStringify(val: any): string {\n try {\n return JSON.stringify(val);\n } catch {\n return String(val);\n }\n}\n\n// ────────────────────────────────────────────────────────\n// Span dict shape\n// ────────────────────────────────────────────────────────\n\nexport interface SpanDict {\n name: string;\n kind: number | string;\n trace_id: string;\n span_id: string;\n parent_span_id?: string | null;\n start_time: number | string;\n end_time: number | string;\n status?: { code?: number | string; message?: string };\n attributes: Record<string, any>;\n resource?: Record<string, any>;\n instrumentation_scope?: { name?: string; version?: string } | null;\n events?: Array<{\n name: string;\n timestamp: number | string;\n attributes: Record<string, any>;\n }>;\n}\n\n// ────────────────────────────────────────────────────────\n// UnifiedAttributeProcessor\n// ────────────────────────────────────────────────────────\n\nexport class UnifiedAttributeProcessor {\n private mapper: AttributeMapper;\n private debug: boolean;\n\n constructor(mapper: AttributeMapper, debug = false) {\n this.mapper = mapper;\n this.debug = debug;\n }\n\n // ── Public entry point ──────────────────────────────\n\n /**\n * Normalize a raw span dict into the neatlogs.* namespace.\n *\n * Steps:\n * 1. Merge resource + span attributes\n * 2. Detect framework/provider/platform from instrumentation scope\n * 3. Normalize vendor conventions (tool calls, tool defs, MCP, vector DB, etc.)\n * 4. Extract operational metrics (duration, TTFT)\n * 5. Upcycle events (retriever docs, embedding dimensions)\n * 6. Enrich invocation parameters with model defaults\n * 7. Apply namespace mapping via AttributeMapper\n * 8. Fill provider / system gaps\n * 9. Add intermediate ReAct steps\n * 10. Filter embedding vectors if applicable\n */\n normalize(spanDict: SpanDict): Record<string, any> {\n // 1. Merge resource + span attributes\n const resAttrs = spanDict.resource ?? {};\n const attrs: Record<string, any> = { ...resAttrs, ...spanDict.attributes };\n\n // Add span name for downstream processing\n attrs['_span_name'] = spanDict.name;\n\n // 2. Detect framework/provider/platform from instrumentation scope\n const scopeName = spanDict.instrumentation_scope?.name ?? null;\n enrichWithScopeDetection(attrs, scopeName, null);\n\n if (this.debug) {\n logger.debug(\n `[ScopeDetection] trace_id=${spanDict.trace_id} span_id=${spanDict.span_id} ` +\n `span_name=${spanDict.name} scope=${scopeName} ` +\n `framework=${attrs['neatlogs.framework'] ?? ''} ` +\n `provider=${attrs['neatlogs.provider'] ?? ''} ` +\n `platform=${attrs['neatlogs.platform'] ?? ''}`,\n );\n }\n\n // 3. Normalize vendor conventions\n this.normalizeConventions(spanDict, attrs);\n\n // 4. Extract operational metrics\n const computedMetrics = this.extractOperationalMetrics(spanDict, attrs);\n Object.assign(attrs, computedMetrics);\n\n // 5. Upcycle events\n const eventAttrs = this.upcycleEvents(spanDict);\n Object.assign(attrs, eventAttrs);\n\n // 6. Enrich invocation parameters\n try {\n enrichInvocationParameters(attrs, true);\n } catch (e: any) {\n logger.warn(`Failed to enrich invocation parameters: ${e?.message ?? e}`);\n }\n\n // 7. Apply namespace mapping\n const unified = this.applyNamespaceMapping(attrs);\n\n // 8. Add intermediate ReAct steps\n this.addIntermediateSteps(unified);\n\n // 9. Filter embedding vectors\n const spanKind = (unified['neatlogs.span.kind'] ?? '').toLowerCase();\n if (spanKind === 'embedding' || spanKind === 'vector_store') {\n return this.filterEmbeddingVectors(unified);\n }\n\n return unified;\n }\n\n // ── Convention normalization ────────────────────────\n\n private normalizeConventions(spanDict: SpanDict, attrs: Record<string, any>): void {\n // Detect HTTP spans\n if (this.isHttpLikeSpanKind(spanDict.kind) && this.looksLikeHttp(attrs)) {\n attrs['openinference.span.kind'] = 'HTTP';\n }\n\n // CrewAI fallback: if no span kind and has crewai.crew.* attrs → CHAIN\n if (\n !('openinference.span.kind' in attrs) &&\n Object.keys(attrs).some((k) => k.startsWith('crewai.crew.'))\n ) {\n attrs['openinference.span.kind'] = 'CHAIN';\n }\n\n // CrewAI token usage fallback\n this.addCrewaiTokenUsageFallback(attrs);\n\n // Reasoning tokens from output.value\n this.addReasoningTokensFromOutputValue(attrs);\n\n // CrewAI kickoff telemetry\n this.addCrewaiKickoffTelemetry(attrs);\n\n // Vercel AI SDK ai.* normalization MUST run before extractToolCalls so\n // the exploded llm.output_messages.0.message.tool_calls.* keys get\n // collapsed into the canonical llm.tool_calls.{i}.* shape that\n // attribute-mapping.json understands.\n this.extractVercelAiSdkAttrs(attrs);\n\n // Extract tool calls from output messages (OpenInference format)\n this.extractToolCalls(attrs);\n\n // Extract tool_call_id and name from input messages (tool response messages)\n for (const [k, v] of Object.entries(attrs)) {\n const m = INPUT_MSG_TOOL_RE.exec(k);\n if (m) {\n const [, msgIdx, field] = m;\n attrs[`llm.input_messages.${msgIdx}.${field}`] = v;\n }\n }\n\n // Extract invalid_tool_calls from output\n this.extractInvalidToolCalls(attrs);\n\n // Extract tool_call_id from tool output (for TOOL kind spans)\n this.extractToolCallIdFromOutput(attrs);\n\n // Extract tool definitions\n this.extractToolDefinitions(attrs);\n\n // Detect vector DB span kind from db.system\n this.detectVectorDbSpanKind(attrs);\n\n // Parse traceloop.entity.input for MCP signals\n this.parseMcpFromTraceloop(attrs);\n\n // Process MCP-specific signals\n this.processMcpSignals(attrs);\n\n // Handle EMBEDDING spans\n this.handleEmbeddingSpans(attrs);\n\n // Handle vector DB doc attributes\n this.handleVectorDbDocAttributes(attrs);\n\n // Extract LangChain metadata (ls_*) into standard positions\n this.extractLangchainMetadata(attrs);\n }\n\n private extractToolCalls(attrs: Record<string, any>): void {\n const toolCalls: Record<number, Record<string, any>> = {};\n const keysToRemove: string[] = [];\n\n for (const [k, v] of Object.entries(attrs)) {\n let m = OI_TOOL_RE.exec(k);\n if (m) {\n const [, , callIdxStr, field] = m;\n const idx = parseInt(callIdxStr, 10);\n if (!toolCalls[idx]) toolCalls[idx] = {};\n toolCalls[idx][field] = v;\n keysToRemove.push(k);\n continue;\n }\n\n m = OI_TOOL_ID_RE.exec(k);\n if (m) {\n const [, , callIdxStr] = m;\n const idx = parseInt(callIdxStr, 10);\n if (!toolCalls[idx]) toolCalls[idx] = {};\n toolCalls[idx]['id'] = v;\n keysToRemove.push(k);\n continue;\n }\n }\n\n for (const idx of Object.keys(toolCalls).map(Number).sort((a, b) => a - b)) {\n const tc = toolCalls[idx];\n if (tc.id !== undefined) attrs[`llm.tool_calls.${idx}.id`] = tc.id;\n if (tc.name !== undefined) attrs[`llm.tool_calls.${idx}.name`] = tc.name;\n if (tc.arguments !== undefined) attrs[`llm.tool_calls.${idx}.arguments`] = tc.arguments;\n }\n\n for (const k of keysToRemove) {\n delete attrs[k];\n }\n }\n\n private extractInvalidToolCalls(attrs: Record<string, any>): void {\n const llmOutput = attrs['llm.output'] ?? attrs['output.value'];\n if (!llmOutput || typeof llmOutput !== 'string') return;\n\n try {\n const outputData = JSON.parse(llmOutput);\n if (typeof outputData === 'object' && outputData !== null && !Array.isArray(outputData)) {\n const generations = outputData.generations;\n if (\n Array.isArray(generations) &&\n generations.length > 0 &&\n Array.isArray(generations[0]) &&\n generations[0].length > 0\n ) {\n const message = generations[0][0]?.message;\n const invalidCalls = message?.invalid_tool_calls;\n if (Array.isArray(invalidCalls) && invalidCalls.length > 0) {\n attrs['llm.invalid_tool_calls'] = JSON.stringify(invalidCalls);\n }\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n private extractToolCallIdFromOutput(attrs: Record<string, any>): void {\n const toolOutput = attrs['tool.output'] ?? attrs['output.value'];\n if (!toolOutput || typeof toolOutput !== 'string') return;\n\n try {\n const outputData = JSON.parse(toolOutput);\n if (typeof outputData === 'object' && outputData !== null && !Array.isArray(outputData)) {\n const toolCallId = outputData.tool_call_id ?? outputData.toolCallId;\n if (toolCallId) {\n attrs['tool_call_id'] = toolCallId;\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n private extractToolDefinitions(attrs: Record<string, any>): void {\n const toolDefs: Record<number, Record<string, any>> = {};\n const keysToRemove: string[] = [];\n\n for (const [k, v] of Object.entries(attrs)) {\n let m = OL_FN_RE.exec(k);\n if (m) {\n const [, idxStr, field] = m;\n const idx = parseInt(idxStr, 10);\n if (!toolDefs[idx]) toolDefs[idx] = {};\n toolDefs[idx][field] = v;\n keysToRemove.push(k);\n continue;\n }\n\n m = OI_SCHEMA_RE.exec(k);\n if (m) {\n const idx = parseInt(m[1], 10);\n let schema = v;\n if (typeof schema === 'string') {\n schema = safeParse(schema) ?? null;\n }\n if (typeof schema === 'object' && schema !== null) {\n if (!toolDefs[idx]) toolDefs[idx] = {};\n const td = toolDefs[idx];\n if (!td.name) td.name = schema.name;\n if (!td.description) td.description = schema.description;\n if (!td.input_schema) td.input_schema = schema.input_schema ?? schema.parameters;\n }\n keysToRemove.push(k);\n }\n }\n\n for (const idx of Object.keys(toolDefs).map(Number).sort((a, b) => a - b)) {\n const td = toolDefs[idx];\n if (td.name !== undefined && td.name !== null) {\n if (!('llm.tools.' + idx + '.name' in attrs)) {\n attrs[`llm.tools.${idx}.name`] = td.name;\n }\n }\n if (td.description !== undefined && td.description !== null) {\n if (!('llm.tools.' + idx + '.description' in attrs)) {\n attrs[`llm.tools.${idx}.description`] = td.description;\n }\n }\n if (td.input_schema !== undefined && td.input_schema !== null) {\n let val = td.input_schema;\n if (typeof val !== 'string') {\n val = safeStringify(val);\n }\n if (!('llm.tools.' + idx + '.input_schema' in attrs)) {\n attrs[`llm.tools.${idx}.input_schema`] = val;\n }\n }\n }\n\n for (const k of keysToRemove) {\n delete attrs[k];\n }\n }\n\n private detectVectorDbSpanKind(attrs: Record<string, any>): void {\n if ('openinference.span.kind' in attrs) return;\n\n const dbSystem = attrs['db.system'];\n if (typeof dbSystem !== 'string') return;\n\n if (!VECTOR_DB_SYSTEMS.has(dbSystem.toLowerCase())) return;\n\n const dbOperation = (attrs['db.operation'] ?? '').toLowerCase();\n const spanName = (attrs['_span_name'] ?? '').toLowerCase();\n\n let isRetrieval = false;\n if (dbOperation) {\n isRetrieval = RETRIEVAL_OPS.some((op) => dbOperation.includes(op));\n } else {\n isRetrieval = RETRIEVAL_OPS.some((op) => spanName.includes(op));\n }\n\n attrs['openinference.span.kind'] = isRetrieval ? 'RETRIEVER' : 'VECTOR_STORE';\n }\n\n private parseMcpFromTraceloop(attrs: Record<string, any>): void {\n const rawInput = attrs['traceloop.entity.input'];\n if (rawInput === undefined || rawInput === null) return;\n\n try {\n const entityInput = typeof rawInput === 'string' ? JSON.parse(rawInput) : rawInput;\n if (typeof entityInput !== 'object' || entityInput === null || Array.isArray(entityInput))\n return;\n\n if ('method' in entityInput) {\n attrs['mcp.method.name'] = entityInput.method;\n }\n if ('params' in entityInput) {\n attrs['mcp.request.argument'] = JSON.stringify(entityInput.params);\n }\n if ('tool_name' in entityInput) {\n attrs['mcp.tool.name'] = entityInput.tool_name;\n if (\n 'arguments' in entityInput &&\n typeof entityInput.arguments === 'object' &&\n entityInput.arguments !== null\n ) {\n attrs['mcp.tool.arguments'] = JSON.stringify(entityInput.arguments);\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n private processMcpSignals(attrs: Record<string, any>): void {\n const hasMcpSignal =\n (typeof attrs['mcp.method.name'] === 'string' && !!attrs['mcp.method.name']) ||\n (typeof attrs['mcp.tool.name'] === 'string' && !!attrs['mcp.tool.name']) ||\n 'mcp.request.argument' in attrs ||\n 'mcp.tool.arguments' in attrs;\n\n if (hasMcpSignal && 'traceloop.entity.output' in attrs && !('mcp.response.value' in attrs)) {\n attrs['mcp.response.value'] = attrs['traceloop.entity.output'];\n }\n\n // MCP initialize response\n if (attrs['mcp.method.name'] === 'initialize' && 'traceloop.entity.output' in attrs) {\n try {\n const output =\n typeof attrs['traceloop.entity.output'] === 'string'\n ? JSON.parse(attrs['traceloop.entity.output'])\n : attrs['traceloop.entity.output'];\n\n if (output && typeof output === 'object') {\n if ('protocolVersion' in output) {\n attrs['mcp.protocol_version'] = output.protocolVersion;\n }\n if ('serverInfo' in output && typeof output.serverInfo === 'object') {\n const info = output.serverInfo;\n attrs['mcp.server.name'] = info.name ?? '';\n attrs['mcp.server.version'] = info.version ?? '';\n }\n if ('capabilities' in output) {\n attrs['mcp.server.capabilities'] = JSON.stringify(output.capabilities);\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n // MCP tools/list response\n if (attrs['mcp.method.name'] === 'tools/list' && 'traceloop.entity.output' in attrs) {\n try {\n const output =\n typeof attrs['traceloop.entity.output'] === 'string'\n ? JSON.parse(attrs['traceloop.entity.output'])\n : attrs['traceloop.entity.output'];\n\n if (output && typeof output === 'object' && Array.isArray(output.tools)) {\n const tools: any[] = output.tools;\n attrs['mcp.tools.count'] = tools.length;\n const toolNames = tools.filter((t) => 'name' in t).map((t) => t.name);\n attrs['mcp.tools.names'] = JSON.stringify(toolNames);\n }\n } catch {\n // ignore parse errors\n }\n }\n }\n\n private handleEmbeddingSpans(attrs: Record<string, any>): void {\n const spanKind = (attrs['openinference.span.kind'] ?? '').toUpperCase();\n if (spanKind !== 'EMBEDDING') return;\n\n const embeddings: Array<{ index: number; text: any }> = [];\n for (const [key, value] of Object.entries(attrs)) {\n if (key.startsWith('embedding.embeddings.') && key.endsWith('.embedding.text')) {\n const parts = key.split('.');\n if (parts.length >= 3) {\n const index = parseInt(parts[2], 10);\n if (!isNaN(index)) {\n embeddings.push({ index, text: value });\n }\n }\n }\n }\n\n if (embeddings.length > 0) {\n embeddings.sort((a, b) => a.index - b.index);\n attrs['embeddings_data'] = JSON.stringify(embeddings);\n }\n\n // Only skip output if it's a REAL embedding operation from OpenLLMetry\n const hasEmbeddingAttrs = Object.keys(attrs).some(\n (k) => k.startsWith('embedding.') || k.startsWith('gen_ai.embedding'),\n );\n if (hasEmbeddingAttrs) {\n attrs['neatlogs._skip_output_value'] = true;\n }\n }\n\n /**\n * Extract vendor-specific keys from attrs into a plain object,\n * mapping each source key to a short target name.\n */\n private _extractKeys(\n attrs: Record<string, any>,\n keyMap: Record<string, string>,\n ): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [srcKey, tgtName] of Object.entries(keyMap)) {\n if (srcKey in attrs) {\n result[tgtName] = attrs[srcKey];\n }\n }\n return result;\n }\n\n private handleVectorDbDocAttributes(attrs: Record<string, any>): void {\n const dbSystem = (attrs['db.system'] ?? '').toLowerCase();\n\n if (dbSystem === 'chroma') {\n const docKeyMap: Record<string, string> = {\n 'db.chroma.add.ids_count': 'ids_count',\n 'db.chroma.add.embeddings_count': 'embeddings_count',\n 'db.chroma.add.metadatas_count': 'metadatas_count',\n 'db.chroma.add.documents_count': 'documents_count',\n 'db.chroma.upsert.ids_count': 'ids_count',\n 'db.chroma.upsert.embeddings_count': 'embeddings_count',\n 'db.chroma.upsert.metadatas_count': 'metadatas_count',\n 'db.chroma.upsert.documents_count': 'documents_count',\n 'db.chroma.query.n_results': 'requested_top_k',\n 'db.chroma.query.include': 'include',\n };\n const docAttrs = this._extractKeys(attrs, docKeyMap);\n if (Object.keys(docAttrs).length > 0) {\n attrs['document_attributes'] = JSON.stringify(docAttrs);\n }\n } else if (dbSystem === 'marqo') {\n const inputKeyMap: Record<string, string> = {\n 'marqo.limit': 'limit',\n 'marqo.hits_count': 'hits_count',\n 'marqo.filter': 'filter',\n };\n const inputParams = this._extractKeys(attrs, inputKeyMap);\n if (Object.keys(inputParams).length > 0) {\n attrs['retrieval_input_params'] = JSON.stringify(inputParams);\n }\n const docKeyMap: Record<string, string> = {\n 'marqo.document_count': 'document_count',\n 'marqo.items_processed': 'items_processed',\n };\n const docAttrs = this._extractKeys(attrs, docKeyMap);\n if (Object.keys(docAttrs).length > 0) {\n attrs['document_attributes'] = JSON.stringify(docAttrs);\n }\n } else if (dbSystem === 'qdrant') {\n const docKeyMap: Record<string, string> = {\n 'qdrant.upsert.points_count': 'points_count',\n };\n const docAttrs = this._extractKeys(attrs, docKeyMap);\n if (Object.keys(docAttrs).length > 0) {\n attrs['document_attributes'] = JSON.stringify(docAttrs);\n }\n } else if (dbSystem === 'milvus') {\n const docKeyMap: Record<string, string> = {\n 'db.milvus.insert.data_count': 'insert.data_count',\n 'db.milvus.search.data_count': 'search.data_count',\n 'db.milvus.search.limit': 'search.limit',\n 'db.milvus.search.output_fields_count': 'search.output_fields_count',\n 'db.milvus.search.result_count': 'search.result_count',\n 'db.milvus.search.filter': 'search.filter',\n };\n const docAttrs = this._extractKeys(attrs, docKeyMap);\n if (Object.keys(docAttrs).length > 0) {\n attrs['document_attributes'] = JSON.stringify(docAttrs);\n }\n }\n }\n\n // ── LangChain metadata extraction ───────────────────\n\n /**\n * LangChain instrumentation puts model info in `metadata` as a JSON string\n * with `ls_provider`, `ls_model_name`, `ls_temperature`, `ls_max_tokens`.\n * Extract these into standard positions when the standard attributes are missing.\n */\n private extractLangchainMetadata(attrs: Record<string, any>): void {\n const raw = attrs['metadata'];\n if (!raw || typeof raw !== 'string') return;\n\n let meta: Record<string, any>;\n try {\n meta = JSON.parse(raw);\n } catch {\n return;\n }\n if (typeof meta !== 'object' || meta === null) return;\n\n // ls_model_name → llm.model_name\n if (meta.ls_model_name && !attrs['llm.model_name']) {\n attrs['llm.model_name'] = meta.ls_model_name;\n }\n\n // ls_provider → llm.system (used by defaults enricher and provider detection)\n if (meta.ls_provider && !attrs['llm.system']) {\n const providerMap: Record<string, string> = {\n google_genai: 'google',\n openai: 'openai',\n anthropic: 'anthropic',\n };\n attrs['llm.system'] = providerMap[meta.ls_provider] ?? meta.ls_provider;\n }\n\n // ls_temperature / ls_max_tokens → merge into invocation_parameters\n const hasTemp = meta.ls_temperature !== undefined;\n const hasMaxTokens = meta.ls_max_tokens !== undefined;\n if (hasTemp || hasMaxTokens) {\n let existing: Record<string, any> = {};\n try {\n existing = JSON.parse(attrs['llm.invocation_parameters'] ?? '{}');\n } catch {\n existing = {};\n }\n if (hasTemp && !('temperature' in existing)) {\n existing['temperature'] = meta.ls_temperature;\n }\n if (hasMaxTokens && !('max_tokens' in existing)) {\n existing['max_tokens'] = meta.ls_max_tokens;\n }\n // Also inject model if missing\n if (meta.ls_model_name && !('model' in existing)) {\n existing['model'] = meta.ls_model_name;\n }\n attrs['llm.invocation_parameters'] = JSON.stringify(existing);\n }\n }\n\n // ── Vercel AI SDK extraction ───────────────────────\n\n /**\n * The Vercel AI SDK emits its own `ai.*` namespace alongside `gen_ai.*`. Map\n * the AI-SDK-specific keys onto the canonical `llm.*` / `gen_ai.*` / `tool.*`\n * keys that the existing pipeline already understands. Span-kind inference\n * runs first so downstream `applyNamespaceMapping` resolves it correctly.\n */\n private extractVercelAiSdkAttrs(attrs: Record<string, any>): void {\n const spanName: string = attrs['_span_name'] ?? '';\n const isAiSdkSpan =\n spanName.startsWith('ai.') ||\n 'ai.model.id' in attrs ||\n 'ai.toolCall.name' in attrs;\n\n if (!isAiSdkSpan) return;\n\n // Span-kind inference (only when not already set)\n if (!('openinference.span.kind' in attrs)) {\n if (spanName === 'ai.toolCall') {\n attrs['openinference.span.kind'] = 'TOOL';\n } else if (spanName.startsWith('ai.embed')) {\n attrs['openinference.span.kind'] = 'EMBEDDING';\n } else if (spanName.startsWith('ai.rerank')) {\n attrs['openinference.span.kind'] = 'RERANKER';\n } else if (spanName.endsWith('.doStream') || spanName.endsWith('.doGenerate') || spanName.endsWith('.doRerank') || spanName.endsWith('.doEmbed')) {\n // Actual provider API calls (ai.streamText.doStream, ai.generateText.doGenerate, etc.)\n if (spanName.includes('embed')) {\n attrs['openinference.span.kind'] = 'EMBEDDING';\n } else if (spanName.includes('rerank')) {\n attrs['openinference.span.kind'] = 'RERANKER';\n } else {\n attrs['openinference.span.kind'] = 'LLM';\n }\n } else if (spanName === 'ai.generateText' || spanName === 'ai.streamText' || spanName === 'ai.generateObject' || spanName === 'ai.streamObject') {\n // Top-level AI SDK orchestration spans (multi-step loops)\n attrs['openinference.span.kind'] = 'CHAIN';\n }\n }\n\n // Model id / provider\n if ('ai.model.id' in attrs && !('llm.model_name' in attrs)) {\n attrs['llm.model_name'] = attrs['ai.model.id'];\n }\n if ('ai.model.provider' in attrs && !('llm.provider' in attrs)) {\n // ai.model.provider is e.g. \"openai.chat\" — take the leading segment\n const raw = String(attrs['ai.model.provider']);\n attrs['llm.provider'] = raw.split('.')[0];\n }\n\n // Token usage\n if ('ai.usage.promptTokens' in attrs && !('llm.token_count.prompt' in attrs)) {\n attrs['llm.token_count.prompt'] = attrs['ai.usage.promptTokens'];\n }\n if ('ai.usage.completionTokens' in attrs && !('llm.token_count.completion' in attrs)) {\n attrs['llm.token_count.completion'] = attrs['ai.usage.completionTokens'];\n }\n if ('ai.usage.totalTokens' in attrs && !('llm.token_count.total' in attrs)) {\n attrs['llm.token_count.total'] = attrs['ai.usage.totalTokens'];\n }\n\n // Settings → gen_ai.request.*\n const settingMap: Record<string, string> = {\n 'ai.settings.temperature': 'gen_ai.request.temperature',\n 'ai.settings.maxTokens': 'gen_ai.request.max_tokens',\n 'ai.settings.topP': 'gen_ai.request.top_p',\n 'ai.settings.topK': 'gen_ai.request.top_k',\n 'ai.settings.frequencyPenalty': 'gen_ai.request.frequency_penalty',\n 'ai.settings.presencePenalty': 'gen_ai.request.presence_penalty',\n 'ai.settings.stopSequences': 'gen_ai.request.stop_sequences',\n };\n for (const [src, tgt] of Object.entries(settingMap)) {\n if (src in attrs && !(tgt in attrs)) {\n attrs[tgt] = attrs[src];\n }\n }\n\n // Build llm.invocation_parameters from gen_ai.request.* if not already set\n if (!('llm.invocation_parameters' in attrs)) {\n const params: Record<string, any> = {};\n if ('gen_ai.request.temperature' in attrs) params.temperature = attrs['gen_ai.request.temperature'];\n if ('gen_ai.request.max_tokens' in attrs) params.max_tokens = attrs['gen_ai.request.max_tokens'];\n if ('gen_ai.request.top_p' in attrs) params.top_p = attrs['gen_ai.request.top_p'];\n if ('gen_ai.request.top_k' in attrs) params.top_k = attrs['gen_ai.request.top_k'];\n if ('gen_ai.request.frequency_penalty' in attrs) params.frequency_penalty = attrs['gen_ai.request.frequency_penalty'];\n if ('gen_ai.request.presence_penalty' in attrs) params.presence_penalty = attrs['gen_ai.request.presence_penalty'];\n if ('gen_ai.request.stop_sequences' in attrs) params.stop_sequences = attrs['gen_ai.request.stop_sequences'];\n if (Object.keys(params).length > 0) {\n attrs['llm.invocation_parameters'] = JSON.stringify(params);\n }\n }\n\n // Operation id → gen_ai.operation.name (helps RERANKER detection)\n if ('ai.operationId' in attrs && !('gen_ai.operation.name' in attrs)) {\n attrs['gen_ai.operation.name'] = attrs['ai.operationId'];\n }\n\n // Response text → output message 0\n if (\n 'ai.response.text' in attrs &&\n !('llm.output_messages.0.message.content' in attrs)\n ) {\n attrs['llm.output_messages.0.message.role'] = 'assistant';\n attrs['llm.output_messages.0.message.content'] = attrs['ai.response.text'];\n }\n\n // generateObject/streamObject emit ai.response.object (structured), not\n // ai.response.text — build the same output message from it so the doGenerate\n // LLM child shows the object instead of a blank output.\n if (\n 'ai.response.object' in attrs &&\n !('llm.output_messages.0.message.content' in attrs)\n ) {\n const obj = attrs['ai.response.object'];\n attrs['llm.output_messages.0.message.role'] = 'assistant';\n attrs['llm.output_messages.0.message.content'] =\n typeof obj === 'string' ? obj : JSON.stringify(obj);\n }\n\n // Response finish reason / id\n if ('ai.response.finishReason' in attrs && !('llm.response.finish_reason' in attrs)) {\n attrs['llm.response.finish_reason'] = attrs['ai.response.finishReason'];\n }\n if ('ai.response.id' in attrs && !('gen_ai.response.id' in attrs)) {\n attrs['gen_ai.response.id'] = attrs['ai.response.id'];\n }\n\n // Prompt messages → exploded indexed keys\n const rawMessages = attrs['ai.prompt.messages'];\n if (typeof rawMessages === 'string') {\n try {\n const parsed = JSON.parse(rawMessages);\n if (Array.isArray(parsed)) {\n parsed.forEach((msg, i) => {\n if (msg && typeof msg === 'object') {\n if (typeof msg.role === 'string') {\n attrs[`llm.input_messages.${i}.message.role`] = msg.role;\n }\n if (typeof msg.content === 'string') {\n attrs[`llm.input_messages.${i}.message.content`] = msg.content;\n } else if (msg.content !== undefined) {\n attrs[`llm.input_messages.${i}.message.content`] = JSON.stringify(msg.content);\n }\n }\n });\n }\n } catch {\n // Leave the raw string in place if parse fails\n }\n }\n\n // Response toolCalls → exploded under output message 0\n const rawToolCalls = attrs['ai.response.toolCalls'];\n if (typeof rawToolCalls === 'string') {\n try {\n const parsed = JSON.parse(rawToolCalls);\n if (Array.isArray(parsed)) {\n parsed.forEach((tc, i) => {\n if (tc && typeof tc === 'object') {\n if (tc.toolName !== undefined) {\n attrs[`llm.output_messages.0.message.tool_calls.${i}.tool_call.function.name`] = tc.toolName;\n }\n if (tc.args !== undefined) {\n const argStr =\n typeof tc.args === 'string' ? tc.args : JSON.stringify(tc.args);\n attrs[`llm.output_messages.0.message.tool_calls.${i}.tool_call.function.arguments`] = argStr;\n }\n if (tc.toolCallId !== undefined) {\n attrs[`llm.output_messages.0.message.tool_calls.${i}.tool_call.id`] = tc.toolCallId;\n }\n }\n });\n }\n } catch {\n // Ignore parse failure\n }\n }\n\n // Embedding input: Vercel AI SDK JSON.stringify()s each value for OTel transport — unwrap\n if ('ai.value' in attrs && typeof attrs['ai.value'] === 'string') {\n try { attrs['ai.value'] = JSON.parse(attrs['ai.value']); } catch {}\n }\n if ('ai.values' in attrs && Array.isArray(attrs['ai.values'])) {\n attrs['ai.values'] = JSON.stringify(attrs['ai.values'].map((v: unknown) => {\n if (typeof v === 'string') { try { return JSON.parse(v); } catch {} }\n return v;\n }));\n }\n\n // Tool span attributes\n if (spanName === 'ai.toolCall') {\n if ('ai.toolCall.name' in attrs && !('tool.name' in attrs)) {\n attrs['tool.name'] = attrs['ai.toolCall.name'];\n }\n // Normalize args/result to JSON strings so downstream parsers\n // (e.g. extractToolCallIdFromOutput) can JSON.parse them safely.\n if ('ai.toolCall.args' in attrs && !('input.value' in attrs)) {\n const raw = attrs['ai.toolCall.args'];\n attrs['input.value'] = typeof raw === 'string' ? raw : JSON.stringify(raw);\n }\n if ('ai.toolCall.result' in attrs && !('output.value' in attrs)) {\n const raw = attrs['ai.toolCall.result'];\n attrs['output.value'] = typeof raw === 'string' ? raw : JSON.stringify(raw);\n }\n }\n }\n\n // ── CrewAI-specific ─────────────────────────────────\n\n private addCrewaiTokenUsageFallback(attrs: Record<string, any>): void {\n const usage = attrs['neatlogs.crew.token_usage'];\n if (typeof usage !== 'string' || !usage) return;\n\n if (\n 'llm.token_count.prompt' in attrs ||\n 'llm.token_count.completion' in attrs ||\n 'llm.token_count.total' in attrs\n ) {\n return;\n }\n\n const parsed: Record<string, number> = {};\n const re = /([a-zA-Z_]+)=(\\d+)/g;\n let match: RegExpExecArray | null;\n while ((match = re.exec(usage)) !== null) {\n parsed[match[1]] = parseInt(match[2], 10);\n }\n\n if ('prompt_tokens' in parsed) {\n attrs['llm.token_count.prompt'] = parsed['prompt_tokens'];\n }\n if ('completion_tokens' in parsed) {\n attrs['llm.token_count.completion'] = parsed['completion_tokens'];\n }\n if ('total_tokens' in parsed) {\n attrs['llm.token_count.total'] = parsed['total_tokens'];\n }\n if ('cached_prompt_tokens' in parsed) {\n attrs['llm.token_count.prompt_details.cache_read'] = parsed['cached_prompt_tokens'];\n }\n }\n\n private addReasoningTokensFromOutputValue(attrs: Record<string, any>): void {\n if ('llm.token_count.completion_details.reasoning' in attrs) return;\n if ('llm.usage.reasoning_tokens' in attrs) return;\n\n const outputValue = attrs['output.value'];\n if (typeof outputValue !== 'string') return;\n\n try {\n const parsed = JSON.parse(outputValue);\n const usage = parsed?.usage ?? {};\n const details = usage.completion_tokens_details ?? {};\n const reasoning = details.reasoning_tokens;\n if (reasoning && reasoning > 0) {\n attrs['llm.token_count.completion_details.reasoning'] = reasoning;\n }\n } catch {\n // ignore\n }\n }\n\n private addCrewaiKickoffTelemetry(attrs: Record<string, any>): void {\n const spanName = String(attrs['_span_name'] ?? '');\n if (!(spanName.startsWith('Crew_') && spanName.endsWith('.kickoff'))) return;\n\n if (!('crew_number_of_tasks' in attrs)) {\n const count = this.coerceCollectionCount(attrs['crew_tasks']);\n if (count !== null) {\n attrs['crew_number_of_tasks'] = count;\n }\n }\n\n if (!('crew_number_of_agents' in attrs)) {\n const count = this.coerceCollectionCount(attrs['crew_agents']);\n if (count !== null) {\n attrs['crew_number_of_agents'] = count;\n }\n }\n }\n\n private coerceCollectionCount(value: any): number | null {\n if (value === null || value === undefined) return null;\n\n if (typeof value === 'boolean') return value ? 1 : 0;\n if (typeof value === 'number') {\n return Number.isFinite(value) ? Math.floor(value) : null;\n }\n if (Array.isArray(value)) return value.length;\n if (typeof value === 'object' && value !== null) return Object.keys(value).length;\n\n if (typeof value === 'string') {\n const s = value.trim();\n if (!s) return null;\n\n // Direct integer string\n if (/^\\d+$/.test(s)) {\n return parseInt(s, 10);\n }\n\n // Try JSON parse\n try {\n const parsed = JSON.parse(s);\n if (Array.isArray(parsed)) return parsed.length;\n if (typeof parsed === 'object' && parsed !== null) return Object.keys(parsed).length;\n } catch {\n // ignore\n }\n }\n\n return null;\n }\n\n // ── Operational metrics ─────────────────────────────\n\n private extractOperationalMetrics(\n spanDict: SpanDict,\n attrs: Record<string, any>,\n ): Record<string, any> {\n const computed: Record<string, any> = {};\n\n const startTime =\n typeof spanDict.start_time === 'number' ? spanDict.start_time : Number(spanDict.start_time);\n const endTime =\n typeof spanDict.end_time === 'number' ? spanDict.end_time : Number(spanDict.end_time);\n\n const durationNs = endTime - startTime;\n computed['neatlogs.metrics.duration_ms'] = durationNs / 1_000_000;\n\n // Skip event-based TTFT computation if already set live by streaming patch\n if (attrs['neatlogs.llm.metrics.ttft_ms'] !== undefined) {\n return computed;\n }\n\n // Google GenAI emits \"gen_ai.content.chunk\" on every text chunk — use for TTFT\n const chunkTimestamps: number[] = [];\n if (spanDict.events) {\n for (const event of spanDict.events) {\n if (event.name === 'gen_ai.content.chunk') {\n const ts =\n typeof event.timestamp === 'number' ? event.timestamp : Number(event.timestamp);\n chunkTimestamps.push(ts);\n }\n }\n }\n\n if (chunkTimestamps.length > 0) {\n const firstNs = chunkTimestamps[0];\n const ttftMs = Math.round(((firstNs - startTime) / 1_000_000) * 1000) / 1000;\n computed['neatlogs.llm.metrics.ttft_ms'] = ttftMs;\n\n if (chunkTimestamps.length >= 2) {\n const lastNs = chunkTimestamps[chunkTimestamps.length - 1];\n const stgMs = Math.round(((lastNs - firstNs) / 1_000_000) * 1000) / 1000;\n computed['neatlogs.llm.metrics.streaming_time_to_generate_ms'] = stgMs;\n }\n }\n\n return computed;\n }\n\n // ── Event upcycling ─────────────────────────────────\n\n private upcycleEvents(spanDict: SpanDict): Record<string, any> {\n const upcycled: Record<string, any> = {};\n const retrieverDocs: Array<Record<string, any>> = [];\n\n if (!spanDict.events) return upcycled;\n\n for (const event of spanDict.events) {\n const eAttrs = event.attributes ?? {};\n\n if (event.name === 'db.query.result') {\n const doc: Record<string, any> = {\n timestamp: String(event.timestamp),\n };\n if ('db.query.result.id' in eAttrs) doc['id'] = eAttrs['db.query.result.id'];\n if ('db.query.result.distance' in eAttrs)\n doc['distance'] = eAttrs['db.query.result.distance'];\n if ('db.query.result.document' in eAttrs)\n doc['document'] = eAttrs['db.query.result.document'];\n if ('db.query.result.metadata' in eAttrs) {\n const metadata = eAttrs['db.query.result.metadata'];\n if (typeof metadata === 'string') {\n doc['metadata'] = safeParse(metadata) ?? String(metadata);\n } else {\n doc['metadata'] = metadata;\n }\n }\n for (const field of ['_id', 'title', 'text', 'category', '_score']) {\n if (field in eAttrs) doc[field] = eAttrs[field];\n }\n retrieverDocs.push(doc);\n } else if (event.name === 'db.search.result') {\n const doc: Record<string, any> = {\n timestamp: String(event.timestamp),\n };\n if ('db.search.query.id' in eAttrs) doc['query_id'] = eAttrs['db.search.query.id'];\n if ('db.search.result.id' in eAttrs) doc['result_id'] = eAttrs['db.search.result.id'];\n if ('db.search.result.distance' in eAttrs)\n doc['distance'] = eAttrs['db.search.result.distance'];\n if ('db.search.result.entity' in eAttrs)\n doc['entity'] = eAttrs['db.search.result.entity'];\n retrieverDocs.push(doc);\n } else if (event.name === 'db.query.embeddings') {\n const vector =\n eAttrs['db.query.embeddings.vector'] ?? eAttrs['vector'];\n if (vector && (Array.isArray(vector) || ArrayBuffer.isView(vector))) {\n upcycled['neatlogs.db.query.embeddings.dimension'] = (vector as any).length;\n if (this.debug) {\n logger.debug(`Calculated embedding dimension: ${(vector as any).length}`);\n }\n }\n }\n }\n\n if (retrieverDocs.length > 0) {\n upcycled['retrieval_documents'] = JSON.stringify(retrieverDocs);\n }\n\n return upcycled;\n }\n\n // ── Namespace mapping ───────────────────────────────\n\n private applyNamespaceMapping(attrs: Record<string, any>): Record<string, any> {\n // Use the AttributeMapper for the heavy lifting\n const unified = this.mapper.mapAttributes(attrs);\n\n // Ensure neatlogs.span.kind is meaningful (not 'unknown')\n const currentKind = unified['neatlogs.span.kind'];\n if (!currentKind || currentKind === 'unknown') {\n const oiKind = attrs['openinference.span.kind'];\n if (oiKind) {\n unified['neatlogs.span.kind'] = String(oiKind).toLowerCase();\n } else {\n // Fallback: infer from span name — skip for framework-internal spans (e.g. next.js routes)\n const scopeName = attrs['neatlogs.instrumentation.name'] ?? '';\n const spanName = attrs['_span_name'] ?? '';\n if (spanName && scopeName !== 'next.js') {\n const inferred = inferSpanKindFromName(spanName).toLowerCase();\n unified['neatlogs.span.kind'] = inferred;\n }\n }\n }\n\n // Detect RERANKER operations (only infer if kind wasn't explicitly set)\n const llmRequestType = (attrs['llm.request.type'] ?? '').toLowerCase();\n const genAiOperation = (attrs['gen_ai.operation.name'] ?? '').toLowerCase();\n const spanNameLower = (attrs['_span_name'] ?? '').toLowerCase();\n const hasExplicitKind = 'openinference.span.kind' in attrs || 'traceloop.span.kind' in attrs;\n\n if (\n !hasExplicitKind && (\n llmRequestType === 'rerank' ||\n genAiOperation === 'rerank' ||\n spanNameLower.includes('rerank')\n )\n ) {\n unified['neatlogs.span.kind'] = 'reranker';\n }\n\n // Remove vectordb.embedding_model for non-vector span kinds\n const spanKind = (\n attrs['neatlogs.span.kind'] ?? attrs['openinference.span.kind'] ?? ''\n ).toLowerCase();\n if (!['embedding', 'retriever', 'vector_store'].includes(spanKind)) {\n delete unified['neatlogs.vectordb.embedding_model'];\n }\n\n if (this.debug) {\n logger.debug(\n `[ScopeDetectionFinal] span_name=${attrs['_span_name']} ` +\n `scope=${attrs['neatlogs.instrumentation.name']} ` +\n `framework=${unified['neatlogs.framework']}`,\n );\n }\n\n // Fill provider/system gaps\n this.fillProviderGaps(attrs, unified);\n\n return unified;\n }\n\n // ── Provider/system gap filling ─────────────────────\n\n private fillProviderGaps(attrs: Record<string, any>, unified: Record<string, any>): void {\n // --- neatlogs.llm.provider ---\n if (!unified['neatlogs.llm.provider']) {\n const scopeProvider = unified['neatlogs.provider'] ?? attrs['neatlogs.provider'] ?? '';\n if (scopeProvider) {\n unified['neatlogs.llm.provider'] = scopeProvider;\n } else {\n const model = String(\n attrs['llm.model_name'] ??\n attrs['gen_ai.request.model'] ??\n attrs['llm.model'] ??\n '',\n );\n const inferred = this.inferProviderFromModel(model);\n if (inferred) {\n unified['neatlogs.llm.provider'] = inferred;\n }\n }\n }\n\n // --- neatlogs.llm.system ---\n if (!unified['neatlogs.llm.system']) {\n const provider = (\n unified['neatlogs.llm.provider'] ??\n unified['neatlogs.provider'] ??\n ''\n ).toLowerCase();\n const system = PROVIDER_TO_SYSTEM[provider] ?? '';\n if (system) {\n unified['neatlogs.llm.system'] = system;\n }\n }\n }\n\n private inferProviderFromModel(model: string): string {\n if (!model) return '';\n const m = model.toLowerCase();\n\n // OpenAI model families\n if (/^(gpt-|o1-|o3-|o4-|text-embedding-|text-davinci-)/.test(m)) return 'openai';\n // Anthropic\n if (m.startsWith('claude-')) return 'anthropic';\n // Google\n if (m.startsWith('gemini-') || m.startsWith('gemma-')) return 'google';\n // Mistral\n if (m.startsWith('mistral-') || m.startsWith('mixtral-')) return 'mistralai';\n // Cohere\n if (m.startsWith('command-') || m.startsWith('embed-english') || m.startsWith('embed-multilingual'))\n return 'cohere';\n // Bedrock model IDs\n if (\n m.startsWith('anthropic.') ||\n m.startsWith('meta.') ||\n m.startsWith('amazon.') ||\n m.startsWith('nova-') ||\n m.startsWith('titan-')\n )\n return 'aws';\n // xAI\n if (m.startsWith('grok-')) return 'xai';\n // DeepSeek\n if (m.startsWith('deepseek-')) return 'deepseek';\n\n return '';\n }\n\n // ── Intermediate ReAct steps ────────────────────────\n\n private addIntermediateSteps(unified: Record<string, any>): void {\n if ('neatlogs.llm.intermediate_steps' in unified) return;\n if (String(unified['neatlogs.span.kind'] ?? '').toLowerCase() !== 'llm') return;\n\n const steps = this.extractReactStepsFromMessages(unified);\n if (steps.length === 0) return;\n\n unified['neatlogs.llm.intermediate_steps'] = JSON.stringify(steps);\n }\n\n private extractReactStepsFromMessages(unified: Record<string, any>): Array<Record<string, string>> {\n // Try output messages first\n const outputTexts = this.collectRoleTexts(\n unified,\n 'neatlogs.llm.output_messages',\n 'assistant',\n );\n const steps = this.parseReactSteps(outputTexts);\n if (steps.length > 0) return steps;\n\n // Fallback to input messages\n const inputTexts = this.collectRoleTexts(\n unified,\n 'neatlogs.llm.input_messages',\n 'assistant',\n );\n return this.parseReactSteps(inputTexts);\n }\n\n private collectRoleTexts(\n unified: Record<string, any>,\n prefix: string,\n role: string,\n ): string[] {\n const idxRe = new RegExp(`^${escapeRegExp(prefix)}\\\\.(\\\\d+)\\\\.content$`);\n const idxs = new Set<number>();\n for (const k of Object.keys(unified)) {\n const m = idxRe.exec(k);\n if (m) {\n idxs.add(parseInt(m[1], 10));\n }\n }\n\n const texts: string[] = [];\n for (const i of [...idxs].sort((a, b) => a - b)) {\n const r = unified[`${prefix}.${i}.role`];\n if (typeof r !== 'string' || r.toLowerCase() !== role) continue;\n const c = unified[`${prefix}.${i}.content`];\n if (typeof c === 'string' && c.toLowerCase().includes('thought:')) {\n texts.push(c);\n }\n }\n return texts;\n }\n\n private parseReactSteps(texts: string[]): Array<Record<string, string>> {\n if (texts.length === 0) return [];\n\n const markerRe = /(?:^|\\n)\\s*(Thought|Context|Action|Action Input|Observation|Final Answer)\\s*:\\s*/gim;\n\n const allSteps: Array<Record<string, string>> = [];\n\n for (const text of texts) {\n const matches: Array<{ label: string; start: number; matchStart: number }> = [];\n let m: RegExpExecArray | null;\n // Reset lastIndex for global regex\n markerRe.lastIndex = 0;\n while ((m = markerRe.exec(text)) !== null) {\n matches.push({\n label: m[1].trim().toLowerCase(),\n start: m.index + m[0].length,\n matchStart: m.index,\n });\n }\n\n if (matches.length === 0) continue;\n\n let cur: Record<string, string> = {};\n\n const commit = () => {\n if (Object.keys(cur).length === 0) return;\n if (!Object.values(cur).some((v) => v)) {\n cur = {};\n return;\n }\n if (allSteps.length > 0) {\n const last = allSteps[allSteps.length - 1];\n if (JSON.stringify(last) === JSON.stringify(cur)) {\n cur = {};\n return;\n }\n }\n allSteps.push(cur);\n cur = {};\n };\n\n for (let idx = 0; idx < matches.length; idx++) {\n const { label, start: contentStart } = matches[idx];\n const contentEnd = idx + 1 < matches.length ? matches[idx + 1].matchStart : text.length;\n const value = text.slice(contentStart, contentEnd).trim();\n\n if (label === 'thought' && Object.keys(cur).length > 0) {\n commit();\n }\n\n if (label === 'thought') {\n cur['thought'] = truncate(value, 600);\n } else if (label === 'context') {\n cur['context'] = truncate(value, 500);\n } else if (label === 'action') {\n cur['action'] = truncate(value, 200);\n } else if (label === 'action input') {\n cur['action_input'] = truncate(value, 1000);\n } else if (label === 'observation') {\n cur['observation'] = truncate(value, 500);\n } else if (label === 'final answer') {\n cur['final_answer'] = truncate(value, 1200);\n }\n }\n\n commit();\n }\n\n return allSteps;\n }\n\n // ── I/O sanitization ────────────────────────────────\n\n /**\n * Remove Python object reprs from input.value / output.value JSON strings.\n * Also drops the top-level \"self\" key that CrewAI injects.\n */\n sanitizeIoValue(val: any): any {\n if (typeof val !== 'string') return val;\n\n try {\n const parsed = JSON.parse(val);\n const cleaned = cleanPythonReprs(parsed);\n if (typeof cleaned === 'object' && cleaned !== null && !Array.isArray(cleaned)) {\n delete cleaned['self'];\n }\n if (JSON.stringify(cleaned) !== JSON.stringify(parsed)) {\n return JSON.stringify(cleaned);\n }\n } catch {\n // not JSON, return as-is\n }\n return val;\n }\n\n // ── Embedding vector filter ─────────────────────────\n\n private filterEmbeddingVectors(attrs: Record<string, any>): Record<string, any> {\n const filtered: Record<string, any> = {};\n for (const [key, value] of Object.entries(attrs)) {\n // Skip embedding vector keys\n if (key.includes('.embedding.vector') || key.includes('.embeddings.') || key === 'ai.embeddings' || key === 'ai.embedding') {\n if (this.debug) {\n logger.debug(`[FILTER] Dropped embedding vector key: ${key}`);\n }\n continue;\n }\n\n // Skip large arrays (likely embedding vectors)\n if ((Array.isArray(value) || ArrayBuffer.isView(value)) && (value as any).length > 1000) {\n if (this.debug) {\n logger.debug(`[FILTER] Dropped large array (${(value as any).length} elements): ${key}`);\n }\n continue;\n }\n\n filtered[key] = value;\n }\n return filtered;\n }\n\n // ── Helpers ─────────────────────────────────────────\n\n private looksLikeHttp(attrs: Record<string, any>): boolean {\n for (const k of ['http.method', 'http.url', 'http.status_code', 'http.route']) {\n if (k in attrs) return true;\n }\n return Object.keys(attrs).some((key) => key.startsWith('http.'));\n }\n\n /**\n * Check if the raw span kind indicates CLIENT (OTel SpanKind.CLIENT = 3).\n */\n private isHttpLikeSpanKind(kind: number | string): boolean {\n if (typeof kind === 'number') return kind === 3; // SpanKind.CLIENT = 3\n return String(kind).toUpperCase() === 'CLIENT';\n }\n}\n\n// ────────────────────────────────────────────────────────\n// Utility functions\n// ────────────────────────────────────────────────────────\n\nfunction truncate(val: string, maxLen: number): string {\n val = (val ?? '').trim();\n if (val.length <= maxLen) return val;\n return val.slice(0, maxLen) + `...(truncated,len=${val.length})`;\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","/**\n * Registry for CrewAI task template bindings.\n *\n * Call registerCrewaiTask(task, userTpl, vars) in your task setup after creating\n * each Task. The span processor reads and clears the entry when the corresponding\n * AGENT span ends, stamping the template onto that span.\n */\n\nimport { getLogger } from './logger.js';\n\nconst logger = getLogger();\n\n/** Registry: taskId -> [templateStr, varsJson] */\nconst _registry = new Map<string, [string, string | null]>();\n\n/**\n * Register a user prompt template for a CrewAI task.\n *\n * @param task - A CrewAI Task instance (must have an .id property)\n * @param userTpl - A neatlogs UserPromptTemplate describing the task prompt\n * @param vars - Variable values passed to userTpl at task-creation time\n */\nexport function registerCrewaiTask(\n task: { id: string | number },\n userTpl: { template: string | any },\n vars?: Record<string, any>,\n): void {\n const taskId = String(task.id);\n const tplStr = String(userTpl.template);\n const varsJson =\n vars && Object.keys(vars).length > 0\n ? JSON.stringify(vars, (_key, val) => (typeof val === 'undefined' ? null : val))\n : null;\n\n _registry.set(taskId, [tplStr, varsJson]);\n logger.debug(`Registered CrewAI task ${taskId}`);\n}\n\n/**\n * Remove and return the registry entry for taskId, or undefined if absent.\n */\nexport function popEntry(taskId: string): [string, string | null] | undefined {\n const entry = _registry.get(taskId);\n if (entry) {\n _registry.delete(taskId);\n }\n return entry;\n}\n\n/**\n * Clear all registered tasks. Used for testing.\n * @internal\n */\nexport function _clearTaskRegistry(): void {\n _registry.clear();\n}\n","const VERIFICATION_MARKER_KEY = 'neatlogs.verification.marker';\nconst MAX_VERIFICATION_MARKER_LENGTH = 128;\n\nfunction decodeResourceComponent(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\n/** Read only the temporary Wizard correlation marker from OTel resource env. */\nexport function verificationMarkerFromEnv(\n value = process.env.OTEL_RESOURCE_ATTRIBUTES ?? '',\n): string | undefined {\n for (const entry of value.split(',')) {\n const separator = entry.indexOf('=');\n if (separator < 1) continue;\n const key = decodeResourceComponent(entry.slice(0, separator).trim());\n if (key !== VERIFICATION_MARKER_KEY) continue;\n const marker = decodeResourceComponent(entry.slice(separator + 1).trim());\n if (!marker || marker.length > MAX_VERIFICATION_MARKER_LENGTH) return undefined;\n return marker;\n }\n return undefined;\n}\n\nexport function addVerificationMarkerResourceAttribute(\n attributes: Record<string, string | number | boolean>,\n): void {\n const marker = verificationMarkerFromEnv();\n if (marker) attributes[VERIFICATION_MARKER_KEY] = marker;\n}\n\n","import { SpanKind, type Attributes } from '@opentelemetry/api';\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport { resolveExplicitSpanKind } from '../span-kinds/mapping.js';\n\nconst HTTP_SCOPE_PREFIXES = [\n '@opentelemetry/instrumentation-http',\n '@opentelemetry/instrumentation-fetch',\n '@opentelemetry/instrumentation-undici',\n];\n\nconst HTTP_ATTRIBUTE_KEYS = [\n 'http.method',\n 'http.request.method',\n 'http.url',\n 'http.route',\n 'url.full',\n];\n\nconst SEMANTIC_AI_KINDS = new Set([\n 'WORKFLOW',\n 'AGENT',\n 'CHAIN',\n 'TOOL',\n 'RETRIEVER',\n 'EMBEDDING',\n 'GUARDRAIL',\n 'LLM',\n 'RERANKER',\n 'VECTOR_STORE',\n 'TASK',\n 'EVALUATOR',\n 'LOG',\n 'MEMORY',\n 'MCP_TOOL',\n]);\n\n/** True only for transport HTTP spans, not semantic AI spans carrying HTTP metadata. */\nexport function isHttpSpan(\n span: ReadableSpan,\n attributes: Attributes = span.attributes ?? {},\n): boolean {\n const resolvedKind = resolveExplicitSpanKind(attributes).toUpperCase();\n if (resolvedKind === 'HTTP') return true;\n if (SEMANTIC_AI_KINDS.has(resolvedKind)) return false;\n\n const scopeName = span.instrumentationLibrary.name ?? '';\n if (HTTP_SCOPE_PREFIXES.some((prefix) => scopeName.startsWith(prefix))) return true;\n\n return span.kind === SpanKind.CLIENT && HTTP_ATTRIBUTE_KEYS.some((key) => key in attributes);\n}\n","/**\n * A SpanExporter wrapper that filters out spans marked as dropped by the mask system.\n *\n * When NeatlogsSpanProcessor's onEnd() determines a mask returned null (meaning\n * \"drop this span\"), it sets `neatlogs.dropped = true` on the OTel span's attributes.\n * This exporter wrapper checks for that attribute and excludes those spans before\n * delegating to the real exporter.\n */\nimport { SpanStatusCode, type Attributes, type HrTime } from '@opentelemetry/api';\nimport { ExportResultCode, type ExportResult } from '@opentelemetry/core';\nimport { Resource } from '@opentelemetry/resources';\nimport type { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport { getScheduledMask } from './mask.js';\nimport type { DeliveryDiagnostics } from './delivery-diagnostics.js';\nimport {\n captureMediaInSnapshot,\n discardPendingMedia,\n resolvePendingMediaUploads,\n} from './media.js';\nimport { DisabledUploadAuthority, type UploadAuthority } from './upload-authority.js';\nimport { isHttpSpan } from './http-span.js';\n\nconst MEDIA_RESOLUTION_CONCURRENCY = 4;\n\nasync function mapWithConcurrency<T, R>(\n values: readonly T[],\n concurrency: number,\n worker: (value: T) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(values.length);\n let cursor = 0;\n const workers = Array.from({ length: Math.min(concurrency, values.length) }, async () => {\n while (cursor < values.length) {\n const index = cursor;\n cursor += 1;\n results[index] = await worker(values[index]);\n }\n });\n await Promise.all(workers);\n return results;\n}\n\nfunction toHrTime(nanos: unknown, fallback: HrTime): HrTime {\n if (typeof nanos !== 'number' || !Number.isFinite(nanos)) return fallback;\n const seconds = Math.floor(nanos / 1_000_000_000);\n return [seconds, Math.max(0, Math.floor(nanos - seconds * 1_000_000_000))];\n}\n\nfunction toAttributes(value: unknown): Attributes {\n if (!value || typeof value !== 'object') return {};\n const result: Attributes = {};\n for (const [key, item] of Object.entries(value)) {\n if (\n typeof item === 'string' ||\n typeof item === 'number' ||\n typeof item === 'boolean' ||\n (Array.isArray(item) &&\n item.every(\n (entry) =>\n entry === null ||\n typeof entry === 'string' ||\n typeof entry === 'number' ||\n typeof entry === 'boolean',\n ))\n ) {\n result[key] = item as any;\n } else if (item !== undefined) {\n result[key] = JSON.stringify(item);\n }\n }\n return result;\n}\n\nfunction statusCode(value: unknown, fallback: SpanStatusCode): SpanStatusCode {\n if (typeof value === 'number') return value as SpanStatusCode;\n if (typeof value === 'string') {\n const resolved = SpanStatusCode[value as keyof typeof SpanStatusCode];\n if (typeof resolved === 'number') return resolved;\n }\n return fallback;\n}\n\nfunction maskedReadableSpan(span: ReadableSpan, data: Record<string, any>): ReadableSpan {\n const resourceData = data.resource?.attributes ?? data.resource;\n const eventData = Array.isArray(data.events) ? data.events : [];\n const linkData = Array.isArray(data.links) ? data.links : [];\n const status = data.status ?? {};\n\n return {\n name: typeof data.name === 'string' ? data.name : span.name,\n kind: span.kind,\n spanContext: () => span.spanContext(),\n parentSpanId:\n data.parent_span_id === null\n ? undefined\n : typeof data.parent_span_id === 'string'\n ? data.parent_span_id\n : span.parentSpanId,\n startTime: span.startTime,\n endTime: span.endTime,\n duration: span.duration,\n ended: span.ended,\n status: {\n code: statusCode(status.code, span.status.code),\n message:\n typeof status.message === 'string'\n ? status.message\n : typeof status.description === 'string'\n ? status.description\n : span.status.message,\n },\n attributes: toAttributes(data.attributes),\n events: eventData.map((event: any, index: number) => ({\n name: typeof event?.name === 'string' ? event.name : (span.events[index]?.name ?? 'event'),\n time: toHrTime(event?.timestamp, span.events[index]?.time ?? span.endTime),\n attributes: toAttributes(event?.attributes),\n droppedAttributesCount: span.events[index]?.droppedAttributesCount ?? 0,\n })),\n links: linkData.map((link: any, index: number) => {\n const original = span.links[index];\n return {\n context: {\n traceId:\n typeof link?.trace_id === 'string'\n ? link.trace_id\n : (original?.context.traceId ?? span.spanContext().traceId),\n spanId:\n typeof link?.span_id === 'string'\n ? link.span_id\n : (original?.context.spanId ?? span.spanContext().spanId),\n traceFlags:\n typeof link?.trace_flags === 'number'\n ? link.trace_flags\n : (original?.context.traceFlags ?? 0),\n traceState: original?.context.traceState,\n isRemote: original?.context.isRemote,\n },\n attributes: toAttributes(link?.attributes),\n droppedAttributesCount: original?.droppedAttributesCount ?? 0,\n };\n }),\n resource: new Resource(toAttributes(resourceData)),\n instrumentationLibrary: span.instrumentationLibrary,\n droppedAttributesCount: span.droppedAttributesCount,\n droppedEventsCount: span.droppedEventsCount,\n droppedLinksCount: span.droppedLinksCount,\n };\n}\n\nexport class FilteringExporter implements SpanExporter {\n constructor(\n private readonly _delegate: SpanExporter,\n private readonly diagnostics?: DeliveryDiagnostics,\n private readonly uploadAuthority: UploadAuthority = new DisabledUploadAuthority(),\n private readonly _onPrepared?: (spans: readonly ReadableSpan[]) => void,\n ) {}\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n void mapWithConcurrency(spans, MEDIA_RESOLUTION_CONCURRENCY, async (span) => {\n if (isHttpSpan(span)) {\n discardPendingMedia(span as object);\n return { span: null, mediaReady: true };\n }\n if (span.instrumentationLibrary.name === 'next.js') {\n discardPendingMedia(span as object);\n this.diagnostics?.recordFrameworkSpanDrop();\n return { span: null, mediaReady: true };\n }\n const scheduled = getScheduledMask(span as object);\n if (!scheduled) {\n discardPendingMedia(span as object);\n return { span, mediaReady: true };\n }\n const masked = await scheduled;\n if (masked === null) {\n discardPendingMedia(span as object);\n this.diagnostics?.recordMaskedDrop('span');\n return { span: null, mediaReady: true };\n }\n const attributes = {\n ...(masked.attributes && typeof masked.attributes === 'object' ? masked.attributes : {}),\n };\n const maskedData = { ...masked, attributes };\n const maskedSpan = maskedReadableSpan(span, maskedData);\n if (isHttpSpan(maskedSpan)) {\n discardPendingMedia(span as object);\n return { span: null, mediaReady: true };\n }\n captureMediaInSnapshot(\n span as object,\n maskedData,\n this.uploadAuthority.available,\n this.uploadAuthority.unavailableReason,\n );\n const mediaReady = await resolvePendingMediaUploads(\n span as object,\n maskedData,\n this.uploadAuthority,\n this.diagnostics,\n );\n return {\n span: maskedReadableSpan(span, maskedData),\n mediaReady,\n };\n }).then(\n (prepared) => {\n const filtered = prepared\n .map((item) => item.span)\n .filter((span): span is ReadableSpan => span !== null);\n const mediaFailures = prepared.filter(\n (item) => item.span !== null && !item.mediaReady,\n ).length;\n try {\n this._onPrepared?.(Object.freeze([...filtered]));\n } catch {\n // Diagnostics must never affect application telemetry delivery.\n }\n if (filtered.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS });\n return;\n }\n try {\n this._delegate.export(filtered, (result) => {\n if (result.code === ExportResultCode.SUCCESS && mediaFailures > 0) {\n this.diagnostics?.recordExportFailure('span', mediaFailures);\n resultCallback({\n code: ExportResultCode.FAILED,\n error: new Error('one or more typed media uploads failed'),\n });\n return;\n }\n resultCallback(result);\n });\n } catch {\n this.diagnostics?.recordExportFailure('span', filtered.length);\n resultCallback({\n code: ExportResultCode.FAILED,\n error: new Error('span exporter failed synchronously'),\n });\n }\n },\n () => {\n this.diagnostics?.recordExportFailure('span', spans.length);\n resultCallback({\n code: ExportResultCode.FAILED,\n error: new Error('span preparation failed'),\n });\n },\n );\n }\n\n async shutdown(): Promise<void> {\n return this._delegate.shutdown();\n }\n\n async forceFlush?(): Promise<void> {\n return this._delegate.forceFlush?.();\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { ExportResultCode, type ExportResult } from \"@opentelemetry/core\";\nimport { ProtobufTraceSerializer } from \"@opentelemetry/otlp-transformer\";\nimport type { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\nimport type { DeliveryDiagnostics } from \"./delivery-diagnostics.js\";\nimport { getLogger } from \"./logger.js\";\nimport {\n assertReadyUploadReceipt,\n DisabledUploadAuthority,\n DEFAULT_MAX_OTLP_OVERFLOW_BYTES,\n TelemetryUploadError,\n type UploadAuthority,\n type UploadPayload,\n} from \"./upload-authority.js\";\n\nexport const DEFAULT_MAX_EXPORT_BYTES = 4 * 1024 * 1024;\nexport const DEFAULT_OVERFLOW_EXPORT_DEADLINE_MS = 15_000;\n\nconst logger = getLogger();\n\ntype ExportAction =\n | { type: \"batch\"; spans: ReadableSpan[] }\n | { type: \"overflow\"; span: ReadableSpan };\n\n/** Split batches by encoded size and route a single oversized span by claim-check. */\nexport class ByteLimitedSpanExporter implements SpanExporter {\n constructor(\n private readonly delegate: SpanExporter,\n private readonly maxExportBytes = DEFAULT_MAX_EXPORT_BYTES,\n private readonly diagnostics?: DeliveryDiagnostics,\n private readonly uploadAuthority: UploadAuthority = new DisabledUploadAuthority(),\n private readonly overflowExportDeadlineMs = DEFAULT_OVERFLOW_EXPORT_DEADLINE_MS,\n ) {\n if (!Number.isSafeInteger(maxExportBytes) || maxExportBytes <= 0) {\n throw new RangeError(\"maxExportBytes must be a positive safe integer\");\n }\n if (!Number.isFinite(overflowExportDeadlineMs) || overflowExportDeadlineMs <= 0) {\n throw new RangeError(\"overflowExportDeadlineMs must be positive\");\n }\n diagnostics?.configureUploadAuthority(\n uploadAuthority.available,\n uploadAuthority.unavailableReason,\n );\n }\n\n static encoded(span: ReadableSpan): Uint8Array {\n const encoded = ProtobufTraceSerializer.serializeRequest([span]);\n if (!encoded) throw new Error(\"failed to encode OTLP trace request\");\n return encoded;\n }\n\n static encodedUpperBound(span: ReadableSpan): number {\n return ProtobufTraceSerializer.serializeRequest([span])?.byteLength ?? Number.MAX_SAFE_INTEGER;\n }\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n const deadlineUnixMs = Date.now() + this.overflowExportDeadlineMs;\n let actions: ExportAction[];\n try {\n actions = this.actions(spans);\n } catch (error) {\n this.diagnostics?.recordExportFailure(\"span\", spans.length);\n resultCallback({\n code: ExportResultCode.FAILED,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n return;\n }\n void this.exportSequentially(actions, deadlineUnixMs).then(resultCallback, (error) => {\n resultCallback({\n code: ExportResultCode.FAILED,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n });\n }\n\n private actions(spans: ReadableSpan[]): ExportAction[] {\n const actions: ExportAction[] = [];\n let current: ReadableSpan[] = [];\n let currentBytes = 0;\n for (const span of spans) {\n // Classify one span at a time. Do not retain every oversized encoded\n // request in the action list: a full batch may contain many large spans.\n const spanBytes = ByteLimitedSpanExporter.encodedUpperBound(span);\n if (spanBytes > this.maxExportBytes) {\n if (current.length > 0) actions.push({ type: \"batch\", spans: current });\n current = [];\n currentBytes = 0;\n actions.push({\n type: \"overflow\",\n span,\n });\n continue;\n }\n if (current.length > 0 && currentBytes + spanBytes > this.maxExportBytes) {\n actions.push({ type: \"batch\", spans: current });\n current = [];\n currentBytes = 0;\n }\n current.push(span);\n currentBytes += spanBytes;\n }\n if (current.length > 0) actions.push({ type: \"batch\", spans: current });\n return actions;\n }\n\n private async exportSequentially(\n actions: ExportAction[],\n deadlineUnixMs: number,\n ): Promise<ExportResult> {\n let overflowFailed = false;\n for (let index = 0; index < actions.length; index += 1) {\n const action = actions[index];\n if (action.type === \"overflow\") {\n const success = await this.exportOverflow(action.span, deadlineUnixMs);\n if (!success) overflowFailed = true;\n continue;\n }\n let result: ExportResult;\n try {\n result = await new Promise<ExportResult>((resolve) => {\n this.delegate.export(action.spans, resolve);\n });\n } catch (error) {\n this.recordUnsent(actions, index);\n throw error;\n }\n if (result.code !== ExportResultCode.SUCCESS) {\n this.recordUnsent(actions, index);\n return result;\n }\n }\n return {\n code: overflowFailed ? ExportResultCode.FAILED : ExportResultCode.SUCCESS,\n ...(overflowFailed\n ? { error: new Error(\"one or more oversized spans failed authenticated upload\") }\n : {}),\n };\n }\n\n private async exportOverflow(\n span: ReadableSpan,\n deadlineUnixMs: number,\n ): Promise<boolean> {\n if (deadlineUnixMs <= Date.now()) {\n this.recordOverflowFailure(\"prepare\", \"overflow_export_deadline_exceeded\");\n return false;\n }\n if (!this.uploadAuthority.available) {\n const unavailableReason = /^[a-zA-Z0-9_.-]{1,64}$/.test(\n this.uploadAuthority.unavailableReason,\n )\n ? this.uploadAuthority.unavailableReason\n : \"upload_authority_unavailable\";\n this.diagnostics?.recordOverflow(\"span\", \"unavailable\");\n this.diagnostics?.recordOverflow(\"span\", \"failures\");\n this.diagnostics?.recordExportFailure(\"span\", 1);\n this.diagnostics?.recordUploadFailure(\"prepare\", unavailableReason);\n logger.error(\n `oversized span rejected: limit=${this.maxExportBytes} reason=${unavailableReason}`,\n );\n return false;\n }\n const content = ByteLimitedSpanExporter.encoded(span);\n if (deadlineUnixMs <= Date.now()) {\n this.recordOverflowFailure(\"prepare\", \"overflow_export_deadline_exceeded\");\n return false;\n }\n const uploadLimit = Math.min(\n this.uploadAuthority.maxPayloadBytes,\n DEFAULT_MAX_OTLP_OVERFLOW_BYTES,\n );\n if (content.byteLength > uploadLimit) {\n this.diagnostics?.recordOverflow(\"span\", \"failures\");\n this.diagnostics?.recordExportFailure(\"span\", 1);\n this.diagnostics?.recordUploadFailure(\"validate\", \"payload_too_large\");\n logger.error(\n `oversized span upload rejected locally: bytes=${content.byteLength} upload_limit=${uploadLimit}`,\n );\n return false;\n }\n const sha256 = createHash(\"sha256\").update(content).digest(\"hex\");\n if (deadlineUnixMs <= Date.now()) {\n this.recordOverflowFailure(\"prepare\", \"overflow_export_deadline_exceeded\");\n return false;\n }\n const payload: UploadPayload = {\n content,\n purpose: \"otlp_overflow\",\n sha256,\n byteLength: content.byteLength,\n mimeType: \"application/x-protobuf\",\n contentEncoding: \"identity\",\n idempotencyKey: `nl-ts-v1:otlp_overflow:${sha256}`,\n payloadSchema: \"otlp.traces.v1\",\n };\n try {\n assertReadyUploadReceipt(\n await this.uploadWithinDeadline(payload, deadlineUnixMs),\n payload,\n );\n this.diagnostics?.recordOverflow(\"span\", \"uploads\");\n return true;\n } catch (error) {\n const stage = error instanceof TelemetryUploadError ? error.stage : \"upload\";\n const rawReason =\n error instanceof TelemetryUploadError ? error.reasonCode : \"unexpected_error\";\n const reason = /^[a-zA-Z0-9_.-]{1,64}$/.test(rawReason)\n ? rawReason\n : \"unsafe_reason_code\";\n this.diagnostics?.recordOverflow(\"span\", \"failures\");\n this.diagnostics?.recordExportFailure(\"span\", 1);\n this.diagnostics?.recordUploadFailure(stage, reason);\n logger.error(`oversized span upload failed: ${stage}/${reason}`);\n return false;\n }\n }\n\n private async uploadWithinDeadline(\n payload: UploadPayload,\n deadlineUnixMs: number,\n ) {\n const remaining = deadlineUnixMs - Date.now();\n if (remaining <= 0) {\n throw new TelemetryUploadError(\n \"prepare\",\n \"overflow_export_deadline_exceeded\",\n true,\n );\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n this.uploadAuthority.upload(payload, { deadlineUnixMs }),\n new Promise<never>((_resolve, reject) => {\n timer = setTimeout(\n () =>\n reject(\n new TelemetryUploadError(\n \"prepare\",\n \"overflow_export_deadline_exceeded\",\n true,\n ),\n ),\n remaining,\n );\n timer.unref?.();\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n\n private recordOverflowFailure(stage: string, reason: string): void {\n this.diagnostics?.recordOverflow(\"span\", \"failures\");\n this.diagnostics?.recordExportFailure(\"span\", 1);\n this.diagnostics?.recordUploadFailure(stage, reason);\n logger.error(`oversized span upload failed: ${stage}/${reason}`);\n }\n\n private recordUnsent(actions: ExportAction[], failedIndex: number): void {\n const count = actions.slice(failedIndex).reduce(\n (total, action) => total + (action.type === \"batch\" ? action.spans.length : 1),\n 0,\n );\n this.diagnostics?.recordExportFailure(\"span\", count);\n }\n\n async shutdown(): Promise<void> {\n await this.delegate.shutdown();\n }\n\n async forceFlush(): Promise<void> {\n await this.delegate.forceFlush?.();\n }\n}\n","import type { Attributes } from '@opentelemetry/api';\nimport type { LogAttributes, LogBody, SeverityNumber } from '@opentelemetry/api-logs';\nimport { ExportResultCode, type ExportResult } from '@opentelemetry/core';\nimport { Resource } from '@opentelemetry/resources';\nimport type {\n LogRecordExporter,\n ReadableLogRecord,\n} from '@opentelemetry/sdk-logs';\nimport type { MaskFunction } from '../types.js';\nimport type { DeliveryDiagnostics } from './delivery-diagnostics.js';\nimport { applyMask, DEFAULT_MASK_TIMEOUT_MS } from './mask.js';\n\nfunction cloneValue<T>(value: T): T {\n if (value === undefined || value === null) return value;\n try {\n return structuredClone(value);\n } catch {\n return value;\n }\n}\n\nfunction resourceAttributes(value: unknown): Attributes {\n if (!value || typeof value !== 'object') return {};\n const result: Attributes = {};\n for (const [key, item] of Object.entries(value)) {\n if (\n typeof item === 'string' ||\n typeof item === 'number' ||\n typeof item === 'boolean' ||\n (Array.isArray(item) &&\n item.every(\n (entry) =>\n entry === null ||\n typeof entry === 'string' ||\n typeof entry === 'number' ||\n typeof entry === 'boolean',\n ))\n ) {\n result[key] = item as any;\n } else if (item !== undefined) {\n result[key] = JSON.stringify(item);\n }\n }\n return result;\n}\n\nfunction snapshot(log: ReadableLogRecord): Record<string, any> {\n return {\n signal_type: 'log',\n body: cloneValue(log.body),\n attributes: cloneValue(log.attributes),\n resource: { attributes: cloneValue(log.resource.attributes) },\n severity_text: log.severityText,\n severity_number: log.severityNumber,\n trace_id: log.spanContext?.traceId,\n span_id: log.spanContext?.spanId,\n };\n}\n\nfunction maskedReadableLogRecord(\n log: ReadableLogRecord,\n data: Record<string, any>,\n): ReadableLogRecord {\n const resourceData = data.resource?.attributes ?? data.resource;\n return {\n hrTime: log.hrTime,\n hrTimeObserved: log.hrTimeObserved,\n spanContext: log.spanContext,\n severityText:\n typeof data.severity_text === 'string' ? data.severity_text : log.severityText,\n severityNumber:\n typeof data.severity_number === 'number'\n ? (data.severity_number as SeverityNumber)\n : log.severityNumber,\n body: data.body as LogBody,\n resource: new Resource(resourceAttributes(resourceData)),\n instrumentationScope: log.instrumentationScope,\n attributes: (data.attributes && typeof data.attributes === 'object'\n ? data.attributes\n : {}) as LogAttributes,\n droppedAttributesCount: log.droppedAttributesCount,\n };\n}\n\n/** Applies the global fail-closed mask to immutable log snapshots at export. */\nexport class MaskingLogExporter implements LogRecordExporter {\n constructor(\n private readonly delegate: LogRecordExporter,\n private readonly mask: MaskFunction | null | undefined,\n private readonly timeoutMs = DEFAULT_MASK_TIMEOUT_MS,\n private readonly diagnostics?: DeliveryDiagnostics,\n ) {}\n\n export(logs: ReadableLogRecord[], resultCallback: (result: ExportResult) => void): void {\n if (!this.mask) {\n this.delegate.export(logs, (result) => {\n if (result.code !== ExportResultCode.SUCCESS) {\n this.diagnostics?.recordExportFailure('log', logs.length);\n }\n resultCallback(result);\n });\n return;\n }\n\n void Promise.all(\n logs.map(async (log) => {\n const masked = await applyMask(snapshot(log), this.mask, {\n signalType: 'log',\n timeoutMs: this.timeoutMs,\n });\n if (masked === null) this.diagnostics?.recordMaskedDrop('log');\n return masked === null ? null : maskedReadableLogRecord(log, masked);\n }),\n ).then(\n (prepared) => {\n const retained = prepared.filter((log): log is ReadableLogRecord => log !== null);\n if (retained.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS });\n return;\n }\n this.delegate.export(retained, (result) => {\n if (result.code !== ExportResultCode.SUCCESS) {\n this.diagnostics?.recordExportFailure('log', retained.length);\n }\n resultCallback(result);\n });\n },\n (error) => resultCallback({ code: ExportResultCode.FAILED, error }),\n );\n }\n\n async shutdown(): Promise<void> {\n return this.delegate.shutdown();\n }\n}\n","export type DeliverySignal = 'span' | 'log';\n\nexport interface DeliveryDiagnosticsSnapshot {\n spanQueueDrops: number;\n logQueueDrops: number;\n spanExportFailures: number;\n logExportFailures: number;\n frameworkSpanDrops: number;\n maskedSpanDrops: number;\n maskedLogDrops: number;\n typedMediaUploads: number;\n typedMediaFailures: number;\n typedMediaUnavailable: number;\n spanOverflowUploads: number;\n spanOverflowFailures: number;\n spanOverflowUnavailable: number;\n logOverflowUploads: number;\n logOverflowFailures: number;\n logOverflowUnavailable: number;\n uploadAuthorityAvailable: boolean;\n uploadAuthorityReason: string;\n lastUploadFailureStage?: string;\n lastUploadFailureReason?: string;\n}\n\n/** Per-pipeline loss counters retained for launch diagnostics and doctor. */\nexport class DeliveryDiagnostics {\n private readonly counters: DeliveryDiagnosticsSnapshot = {\n spanQueueDrops: 0,\n logQueueDrops: 0,\n spanExportFailures: 0,\n logExportFailures: 0,\n frameworkSpanDrops: 0,\n maskedSpanDrops: 0,\n maskedLogDrops: 0,\n typedMediaUploads: 0,\n typedMediaFailures: 0,\n typedMediaUnavailable: 0,\n spanOverflowUploads: 0,\n spanOverflowFailures: 0,\n spanOverflowUnavailable: 0,\n logOverflowUploads: 0,\n logOverflowFailures: 0,\n logOverflowUnavailable: 0,\n uploadAuthorityAvailable: false,\n uploadAuthorityReason: \"telemetry_uploads_disabled\",\n };\n\n recordQueueDrop(signal: DeliverySignal, count = 1): void {\n if (signal === 'span') this.counters.spanQueueDrops += count;\n else this.counters.logQueueDrops += count;\n }\n\n recordExportFailure(signal: DeliverySignal, count: number): void {\n if (signal === 'span') this.counters.spanExportFailures += count;\n else this.counters.logExportFailures += count;\n }\n\n recordMaskedDrop(signal: DeliverySignal, count = 1): void {\n if (signal === 'span') this.counters.maskedSpanDrops += count;\n else this.counters.maskedLogDrops += count;\n }\n\n recordFrameworkSpanDrop(count = 1): void {\n this.counters.frameworkSpanDrops += count;\n }\n\n configureUploadAuthority(available: boolean, reason: string): void {\n this.counters.uploadAuthorityAvailable = available;\n this.counters.uploadAuthorityReason =\n available && reason.length === 0\n ? \"\"\n : /^[a-zA-Z0-9_.-]{1,64}$/.test(reason)\n ? reason\n : \"upload_authority_unavailable\";\n }\n\n recordTypedMedia(outcome: \"uploads\" | \"failures\" | \"unavailable\", count = 1): void {\n if (outcome === \"uploads\") this.counters.typedMediaUploads += count;\n else if (outcome === \"failures\") this.counters.typedMediaFailures += count;\n else this.counters.typedMediaUnavailable += count;\n }\n\n recordOverflow(\n signal: DeliverySignal,\n outcome: \"uploads\" | \"failures\" | \"unavailable\",\n count = 1,\n ): void {\n const prefix = signal === \"span\" ? \"spanOverflow\" : \"logOverflow\";\n const suffix =\n outcome === \"uploads\"\n ? \"Uploads\"\n : outcome === \"failures\"\n ? \"Failures\"\n : \"Unavailable\";\n const key = `${prefix}${suffix}` as keyof DeliveryDiagnosticsSnapshot;\n (this.counters[key] as number) += count;\n }\n\n recordUploadFailure(stage: string, reason: string): void {\n this.counters.lastUploadFailureStage = /^[a-zA-Z0-9_.-]{1,64}$/.test(stage)\n ? stage\n : \"upload\";\n this.counters.lastUploadFailureReason = /^[a-zA-Z0-9_.-]{1,64}$/.test(reason)\n ? reason\n : \"unsafe_reason_code\";\n }\n\n snapshot(): DeliveryDiagnosticsSnapshot {\n return { ...this.counters };\n }\n}\n","import { TraceFlags } from '@opentelemetry/api';\nimport {\n BatchSpanProcessor,\n type BufferConfig as SpanBufferConfig,\n type ReadableSpan,\n type SpanExporter,\n} from '@opentelemetry/sdk-trace-base';\nimport {\n BatchLogRecordProcessor,\n type BufferConfig as LogBufferConfig,\n type LogRecord,\n type LogRecordExporter,\n} from '@opentelemetry/sdk-logs';\nimport { DeliveryDiagnostics } from './delivery-diagnostics.js';\nimport { discardPendingMedia } from './media.js';\n\ninterface SpanQueueState {\n _finishedSpans: ReadableSpan[];\n _maxQueueSize: number;\n}\ninterface LogQueueState {\n _finishedLogRecords: LogRecord[];\n _maxQueueSize: number;\n}\n\n/** Adds stable Neatlogs loss counters to OTel's bounded span processor. */\nexport class ObservableBatchSpanProcessor extends BatchSpanProcessor {\n constructor(\n exporter: SpanExporter,\n config: SpanBufferConfig,\n private readonly diagnostics: DeliveryDiagnostics,\n ) {\n super(exporter, config);\n }\n\n override onEnd(span: ReadableSpan): void {\n const state = this as unknown as SpanQueueState;\n if (\n (span.spanContext().traceFlags & TraceFlags.SAMPLED) !== 0 &&\n state._finishedSpans.length >= state._maxQueueSize\n ) {\n discardPendingMedia(span as object);\n this.diagnostics.recordQueueDrop('span');\n }\n super.onEnd(span);\n }\n}\n\n/** Adds stable Neatlogs loss counters to OTel's bounded log processor. */\nexport class ObservableBatchLogRecordProcessor extends BatchLogRecordProcessor {\n constructor(\n exporter: LogRecordExporter,\n config: LogBufferConfig,\n private readonly diagnostics: DeliveryDiagnostics,\n ) {\n super(exporter, config);\n }\n\n override onEmit(logRecord: LogRecord): void {\n const state = this as unknown as LogQueueState;\n if (state._finishedLogRecords.length >= state._maxQueueSize) {\n this.diagnostics.recordQueueDrop('log');\n }\n super.onEmit(logRecord);\n }\n}\n","/**\n * Structured logging for Neatlogs traces.\n *\n * The log() function captures timestamped steps within a trace,\n * emitting OTel LogRecords that are associated with the active span.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { getLogger } from './logger.js';\nimport {\n getActiveNeatlogsSpan,\n getNeatlogsActiveContext,\n} from './provider.js';\nimport { getActiveClient } from './active-client.js';\n\nconst logger = getLogger();\n\n// Module-level reference to the OTel Logger, set during init()\nlet _otelLogger: any = null;\nlet _debugMode = false;\nconst stdoutCaptureContext = new AsyncLocalStorage<boolean>();\nlet stdoutCaptureDepth = 0;\nlet originalConsoleLog: typeof console.log | null = null;\nlet captureConsoleLog: typeof console.log | null = null;\n\nfunction resolveOtelLogger(): any | null {\n const client = getActiveClient();\n // An active Client owns the whole context. `null` means logging is disabled\n // for that Client; it must never fall through to the process-global project.\n return client ? client.getLogger() : _otelLogger;\n}\n\n/**\n * Set the OTel logger instance. Called by init().\n * @internal\n */\nexport function _setOtelLogger(otelLogger: any, debug: boolean): void {\n _otelLogger = otelLogger;\n _debugMode = debug;\n}\n\n/**\n * Capture a timestamped log step within the current trace.\n *\n * @param msgTemplate - Message template with {key} placeholders\n * @param options - Optional key-value pairs for template rendering and attributes\n *\n * @example\n * ```typescript\n * log('Processing query: {query}', { query: 'What is TypeScript?', level: 'info' });\n * ```\n */\nexport function log(\n msgTemplate: string,\n options?: Record<string, any>,\n): void {\n const { level = 'info', ...variables } = options ?? {};\n\n // Render template\n let rendered = msgTemplate;\n for (const [key, value] of Object.entries(variables)) {\n rendered = rendered.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), String(value));\n }\n\n // Echo to console in debug mode\n if (_debugMode) {\n console.log(`[neatlogs:log] ${rendered}`);\n }\n\n // Emit OTel LogRecord if logger is available\n const otelLogger = resolveOtelLogger();\n if (otelLogger) {\n // Correlate to the active NEATLOGS span, not the global active span: in\n // isolated mode the latter is the foreign co-tenant's (Datadog/Braintrust)\n // span, which would either mis-correlate the log or attach a foreign context.\n const activeSpan = getActiveNeatlogsSpan();\n const activeContext = activeSpan ? getNeatlogsActiveContext() : undefined;\n\n const attributes: Record<string, any> = {\n 'log.template': msgTemplate,\n 'log.level': level,\n };\n\n // Add template variables as log.{key} attributes\n for (const [key, value] of Object.entries(variables)) {\n attributes[`log.${key}`] = String(value);\n }\n\n try {\n otelLogger.emit({\n body: rendered,\n attributes,\n // The OTel Logs API accepts a Context, not a raw SpanContext. Passing\n // `spanContext` is silently ignored by sdk-logs, producing a log with\n // no trace id that the Neatlogs ingest route correctly discards.\n ...(activeContext ? { context: activeContext } : {}),\n });\n } catch (err) {\n logger.warn(`Failed to emit log record: ${err}`);\n }\n }\n}\n\n/**\n * Capture stdout (console.log) within a callback and route to OTel logger.\n *\n * @param fn - The function to execute while capturing stdout\n * @returns The return value of fn\n */\nexport async function captureStdout<T>(fn: () => T | Promise<T>): Promise<T> {\n if (!resolveOtelLogger()) {\n return fn();\n }\n\n if (stdoutCaptureDepth === 0) {\n originalConsoleLog = console.log;\n captureConsoleLog = (...args: any[]) => {\n originalConsoleLog?.apply(console, args);\n if (!stdoutCaptureContext.getStore()) return;\n const otelLogger = resolveOtelLogger();\n if (!otelLogger) return;\n const activeSpan = getActiveNeatlogsSpan();\n const activeContext = activeSpan ? getNeatlogsActiveContext() : undefined;\n const message = args\n .map((a) => (typeof a === 'string' ? a : JSON.stringify(a)))\n .join(' ');\n try {\n otelLogger.emit({\n body: message,\n attributes: {\n 'log.source': 'stdout',\n 'log.level': 'info',\n },\n ...(activeContext ? { context: activeContext } : {}),\n });\n } catch {\n // Ignore errors in log capture\n }\n };\n console.log = captureConsoleLog;\n }\n stdoutCaptureDepth += 1;\n\n try {\n return await stdoutCaptureContext.run(true, fn);\n } finally {\n stdoutCaptureDepth -= 1;\n if (stdoutCaptureDepth === 0) {\n if (captureConsoleLog && console.log === captureConsoleLog && originalConsoleLog) {\n console.log = originalConsoleLog;\n }\n originalConsoleLog = null;\n captureConsoleLog = null;\n }\n }\n}\n","import { context } from '@opentelemetry/api';\nimport { suppressTracing } from '@opentelemetry/core';\nimport type { CachedPrompt, PromptMessage } from '../types.js';\n\n// ---------------------------------------------------------------------------\n// Error classes\n// ---------------------------------------------------------------------------\n\n/** Base exception for prompt client failures. */\nexport class PromptClientError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'PromptClientError';\n }\n}\n\n/** Raised when the backend returns an API error. */\nexport class PromptApiError extends PromptClientError {\n readonly method?: string;\n readonly path?: string;\n readonly status?: number;\n readonly requestId?: string;\n\n constructor(\n message: string,\n details?: { method?: string; path?: string; status?: number; requestId?: string },\n ) {\n super(message);\n this.name = 'PromptApiError';\n this.method = details?.method;\n this.path = details?.path;\n this.status = details?.status;\n this.requestId = details?.requestId;\n }\n}\n\n/** Raised when a prompt/label/version is not found. */\nexport class PromptNotFoundError extends PromptClientError {\n constructor(message: string) {\n super(message);\n this.name = 'PromptNotFoundError';\n }\n}\n\n/** Raised when a prompt request exceeds its configured deadline. */\nexport class PromptRequestTimeoutError extends PromptApiError {\n constructor(message: string) {\n super(message);\n this.name = 'PromptRequestTimeoutError';\n }\n}\n\n/** Raised when work is attempted after the prompt client has been closed. */\nexport class PromptClientClosedError extends PromptClientError {\n constructor(message = 'PromptClient is closed.') {\n super(message);\n this.name = 'PromptClientClosedError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Template rendering helper\n// ---------------------------------------------------------------------------\n\nconst PLACEHOLDER_PATTERN = /\\{\\{\\s*([A-Za-z0-9_.-]+)\\s*\\}\\}/g;\n\n/**\n * Replace `{{key}}` placeholders in a template string with the corresponding\n * values from the provided variables map. Unknown placeholders are left as-is.\n */\nexport function renderTemplate(template: string, variables: Record<string, any>): string {\n return template.replace(PLACEHOLDER_PATTERN, (full, key: string) => {\n return key in variables ? String(variables[key]) : full;\n });\n}\n\n// ---------------------------------------------------------------------------\n// Normalize raw API response → CachedPrompt\n// ---------------------------------------------------------------------------\n\nconst MAX_PROMPT_JSON_DEPTH = 32;\nconst MAX_PROMPT_JSON_NODES = 10_000;\nconst MAX_PROMPT_MESSAGES = 10_000;\n\ninterface PromptJsonCloneState {\n nodes: number;\n ancestors: Set<object>;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction clonePromptJson(value: unknown, depth: number, state: PromptJsonCloneState): unknown {\n state.nodes += 1;\n if (state.nodes > MAX_PROMPT_JSON_NODES || depth > MAX_PROMPT_JSON_DEPTH) {\n throw new Error('Prompt JSON exceeds defensive copy limits.');\n }\n\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return value;\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) throw new Error('Prompt JSON contains a non-finite number.');\n return value;\n }\n if (typeof value !== 'object') throw new Error('Prompt config is not JSON-compatible.');\n if (state.ancestors.has(value)) throw new Error('Prompt config contains a cycle.');\n\n state.ancestors.add(value);\n try {\n if (Array.isArray(value)) {\n if (\n Object.getOwnPropertySymbols(value).length > 0 ||\n Object.keys(value).some((key, index) => key !== String(index))\n ) {\n throw new Error('Prompt config contains a non-JSON array.');\n }\n const result: unknown[] = [];\n for (let index = 0; index < value.length; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n if (!descriptor || !descriptor.enumerable || !('value' in descriptor)) {\n throw new Error('Prompt config contains an accessor or sparse array.');\n }\n result.push(clonePromptJson(descriptor.value, depth + 1, state));\n }\n return result;\n }\n if (!isPlainRecord(value) || Object.getOwnPropertySymbols(value).length > 0) {\n throw new Error('Prompt config contains a non-JSON object.');\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(value))) {\n if (!descriptor.enumerable || !('value' in descriptor)) {\n throw new Error('Prompt config contains an accessor or non-enumerable value.');\n }\n Object.defineProperty(result, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value: clonePromptJson(descriptor.value, depth + 1, state),\n });\n }\n return result;\n } finally {\n state.ancestors.delete(value);\n }\n}\n\nfunction clonePromptConfig(value: unknown): Record<string, any> {\n try {\n if (!isPlainRecord(value)) return {};\n const cloned = clonePromptJson(value, 0, { nodes: 0, ancestors: new Set() });\n return isPlainRecord(cloned) ? cloned : {};\n } catch {\n // Prompt configuration is untrusted product data. Unsupported, cyclic, or\n // excessively deep structures are discarded instead of retained by cache.\n return {};\n }\n}\n\nfunction clonePromptMessages(messages: PromptMessage[] | null): PromptMessage[] | null {\n if (messages !== null && messages.length > MAX_PROMPT_MESSAGES) return null;\n return messages?.map((message) => ({ role: message.role, content: message.content })) ?? null;\n}\n\n/** Normalize a raw API response object into a well-typed {@link CachedPrompt}. */\nexport function normalizePromptObject(raw: Record<string, any>): CachedPrompt {\n // Messages\n let messages: PromptMessage[] | null = null;\n const rawMessages = raw['messages'];\n if (Array.isArray(rawMessages) && rawMessages.length <= MAX_PROMPT_MESSAGES) {\n const messageList: PromptMessage[] = [];\n for (const item of rawMessages) {\n if (item && typeof item === 'object') {\n messageList.push({\n role: String(item['role'] ?? 'system'),\n content: String(item['content'] ?? ''),\n });\n }\n }\n if (messageList.length > 0) {\n messages = messageList;\n }\n }\n\n // Labels\n let labels: string[] = [];\n const rawLabels = raw['labels'];\n if (Array.isArray(rawLabels)) {\n labels = rawLabels.filter((l) => String(l).trim()).map(String);\n }\n\n // Config\n const config = clonePromptConfig(raw['config']);\n\n // Scalar fields\n const content: string | null = typeof raw['content'] === 'string' ? raw['content'] : null;\n const id: string = typeof raw['id'] === 'string' ? raw['id'] : '';\n const name: string = typeof raw['name'] === 'string' ? raw['name'] : '';\n\n let version = 0;\n try {\n if (raw['version'] != null) {\n version = Number(raw['version']) || 0;\n }\n } catch {\n version = 0;\n }\n\n let updatedAt: string = '';\n if (typeof raw['updatedAt'] === 'string') {\n updatedAt = raw['updatedAt'];\n } else if (typeof raw['updated_at'] === 'string') {\n updatedAt = raw['updated_at'];\n }\n\n let type: 'text' | 'chat' = 'text';\n if (messages !== null || raw['type'] === 'chat') {\n type = 'chat';\n }\n\n return {\n id,\n name,\n version,\n content,\n messages,\n config,\n labels,\n updatedAt,\n type,\n };\n}\n\n// ---------------------------------------------------------------------------\n// PromptHandle\n// ---------------------------------------------------------------------------\n\n/**\n * Compiled prompt handle returned by {@link PromptClient.getPrompt}.\n */\nexport class PromptHandle {\n private readonly _prompt: CachedPrompt;\n\n constructor(prompt: CachedPrompt) {\n this._prompt = {\n id: prompt.id,\n name: prompt.name,\n version: prompt.version,\n content: prompt.content,\n messages: clonePromptMessages(prompt.messages),\n config: clonePromptConfig(prompt.config),\n labels: [...prompt.labels],\n updatedAt: prompt.updatedAt,\n type: prompt.type,\n };\n }\n\n get id(): string {\n return this._prompt.id;\n }\n get name(): string {\n return this._prompt.name;\n }\n get version(): number {\n return this._prompt.version;\n }\n get content(): string | null {\n return this._prompt.content;\n }\n get messages(): PromptMessage[] | null {\n return clonePromptMessages(this._prompt.messages);\n }\n get config(): Record<string, any> {\n return clonePromptConfig(this._prompt.config);\n }\n get labels(): string[] {\n return [...this._prompt.labels];\n }\n get updatedAt(): string {\n return this._prompt.updatedAt;\n }\n get type(): string {\n return this._prompt.type;\n }\n\n /**\n * Compile string content with `{{variable}}` replacement.\n *\n * If the prompt has `content`, renders it directly.\n * If it only has `messages`, renders and joins all message contents.\n */\n compile(variables?: Record<string, any>): string {\n const vars = variables ?? {};\n\n if (this._prompt.content) {\n return renderTemplate(this._prompt.content, vars);\n }\n\n if (this._prompt.messages) {\n const rendered = this._prompt.messages\n .map((msg) => renderTemplate(msg.content ?? '', vars))\n .filter(Boolean);\n return rendered.join('\\n\\n');\n }\n\n return '';\n }\n\n /**\n * Compile message list with `{{variable}}` replacement.\n *\n * If no messages exist, returns a single synthetic system message from content.\n */\n compileMessages(variables?: Record<string, any>): PromptMessage[] {\n const vars = variables ?? {};\n\n if (this._prompt.messages) {\n return this._prompt.messages.map((msg) => ({\n role: String(msg.role ?? 'system'),\n content: renderTemplate(String(msg.content ?? ''), vars),\n }));\n }\n\n return [\n {\n role: 'system',\n content: renderTemplate(this._prompt.content ?? '', vars),\n },\n ];\n }\n}\n\n// ---------------------------------------------------------------------------\n// PromptClient\n// ---------------------------------------------------------------------------\n\nexport interface PromptClientOptions {\n baseUrl: string;\n apiKey: string;\n /** How long an unpinned cache entry is fresh. Defaults to 60 seconds. */\n cacheTtlMs?: number;\n /** How long an expired unpinned entry may be served during refresh. Defaults to 5 minutes. */\n staleWhileRevalidateMs?: number;\n /** Deadline for each backend request. Defaults to 10 seconds. */\n requestTimeoutMs?: number;\n /** Maximum cached prompt selectors. Least-recently-used entries are evicted. Defaults to 100. */\n maxCacheEntries?: number;\n}\n\nexport interface GetPromptOptions {\n version?: number;\n label?: string;\n /** Override the client's cache lifetime for this prompt lookup. */\n cacheTtlMs?: number;\n /** Override the client's stale-while-revalidate window for this prompt lookup. */\n staleWhileRevalidateMs?: number;\n}\n\n/** Select one immutable prompt version for a mutation. Defaults to the latest version. */\nexport interface PromptMutationSelector {\n promptId?: string;\n version?: number;\n label?: string;\n}\n\nexport interface PromptWriteMetadata {\n config?: Record<string, any>;\n labels?: string[];\n tags?: string[];\n commitMessage?: string;\n}\n\nexport interface PromptWriteInput extends PromptWriteMetadata {\n content?: string;\n messages?: PromptMessage[];\n}\n\nexport interface CreatePromptInput extends PromptWriteInput {\n name: string;\n}\n\nexport type SavePromptVersionOptions = PromptWriteMetadata &\n (\n | { content: string; messages?: PromptMessage[] }\n | { content?: string; messages: PromptMessage[] }\n ) & {\n /** @deprecated Use `labels: [label]`; retained as a source-compatible alias. */\n label?: string;\n };\n\n/** @deprecated A label alone cannot create a backend prompt version. */\nexport interface LegacySavePromptVersionOptions {\n label?: string;\n}\n\nconst DEFAULT_PROMPT_CACHE_TTL_MS = 60_000;\nconst DEFAULT_PROMPT_STALE_WHILE_REVALIDATE_MS = 300_000;\nconst DEFAULT_PROMPT_REQUEST_TIMEOUT_MS = 10_000;\nconst DEFAULT_PROMPT_MAX_CACHE_ENTRIES = 100;\nconst PROMPT_LIST_PAGE_SIZE = 500;\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\ninterface PromptCacheEntry {\n prompt: CachedPrompt;\n fetchedAtMs: number;\n ttlMs: number;\n staleWhileRevalidateMs: number;\n pinned: boolean;\n}\n\ninterface PromptCachePolicy {\n ttlMs: number;\n staleWhileRevalidateMs: number;\n}\n\n/**\n * Prompt client for Neatlogs managed prompts.\n *\n * Fetches prompts on-demand from the backend.\n * Uses an in-memory cache to avoid redundant HTTP calls.\n */\nexport class PromptClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly cacheTtlMs: number;\n private readonly staleWhileRevalidateMs: number;\n private readonly requestTimeoutMs: number;\n private readonly maxCacheEntries: number;\n private readonly _cache: Map<string, PromptCacheEntry> = new Map();\n private readonly _inflight: Map<string, Promise<PromptHandle>> = new Map();\n private readonly _inflightPromptNames: Map<string, { name: string; pinned: boolean }> = new Map();\n private readonly _requestControllers = new Set<AbortController>();\n private _cacheEpoch = 0;\n private _mutationEpoch = 0;\n private _closed = false;\n\n constructor(options: PromptClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.apiKey = options.apiKey;\n this.cacheTtlMs = PromptClient.validateCacheTtl(\n options.cacheTtlMs ?? DEFAULT_PROMPT_CACHE_TTL_MS,\n );\n this.staleWhileRevalidateMs = PromptClient.validateCacheDuration(\n 'staleWhileRevalidateMs',\n options.staleWhileRevalidateMs ?? DEFAULT_PROMPT_STALE_WHILE_REVALIDATE_MS,\n );\n this.requestTimeoutMs = PromptClient.validatePositiveDuration(\n 'requestTimeoutMs',\n options.requestTimeoutMs ?? DEFAULT_PROMPT_REQUEST_TIMEOUT_MS,\n );\n this.maxCacheEntries = PromptClient.validateMaxCacheEntries(\n options.maxCacheEntries ?? DEFAULT_PROMPT_MAX_CACHE_ENTRIES,\n );\n }\n\n // ---- public API ----------------------------------------------------------\n\n /**\n * Get a prompt by name, optionally pinned to a version or label.\n * Results are cached in memory by cache key.\n */\n async getPrompt(name: string, options?: GetPromptOptions): Promise<PromptHandle> {\n this.assertOpen();\n const version = options?.version;\n const label = options?.label;\n\n if (label != null && version != null) {\n throw new PromptClientError('Cannot specify both label and version.');\n }\n\n const cacheKey = JSON.stringify([name, label ?? null, version ?? null]);\n const cached = this._cache.get(cacheKey);\n if (cached) {\n const policy = this.resolveCachePolicy(options, cached);\n cached.ttlMs = policy.ttlMs;\n cached.staleWhileRevalidateMs = policy.staleWhileRevalidateMs;\n this.touchCacheEntry(cacheKey, cached);\n\n if (cached.pinned) {\n return new PromptHandle(cached.prompt);\n }\n\n const ageMs = Math.max(0, Date.now() - cached.fetchedAtMs);\n if (ageMs < policy.ttlMs) return new PromptHandle(cached.prompt);\n\n if (ageMs < policy.ttlMs + policy.staleWhileRevalidateMs) {\n // Temporary backend failures cannot take down a caller while the\n // explicitly bounded stale window remains open.\n this.revalidatePrompt(cacheKey, name, { version, label }, policy);\n return new PromptHandle(cached.prompt);\n }\n }\n\n const policy = this.resolveCachePolicy(options, cached);\n return this.fetchAndCache(cacheKey, name, { version, label }, policy);\n }\n\n private static validateCacheTtl(ttlMs: number): number {\n return PromptClient.validateCacheDuration('cacheTtlMs', ttlMs);\n }\n\n private static validateCacheDuration(name: string, durationMs: number): number {\n if (!Number.isFinite(durationMs) || durationMs < 0) {\n throw new PromptClientError(`${name} must be a finite number greater than or equal to 0.`);\n }\n return durationMs;\n }\n\n private static validatePositiveDuration(name: string, durationMs: number): number {\n if (!Number.isFinite(durationMs) || durationMs <= 0) {\n throw new PromptClientError(`${name} must be a finite number greater than 0.`);\n }\n return durationMs;\n }\n\n private static validateMaxCacheEntries(value: number): number {\n if (!Number.isInteger(value) || value <= 0) {\n throw new PromptClientError('maxCacheEntries must be a positive integer.');\n }\n return value;\n }\n\n private assertOpen(): void {\n if (this._closed) throw new PromptClientClosedError();\n }\n\n private resolveCachePolicy(\n options: GetPromptOptions | undefined,\n cached?: PromptCacheEntry,\n ): PromptCachePolicy {\n return {\n ttlMs: PromptClient.validateCacheTtl(\n options?.cacheTtlMs ?? cached?.ttlMs ?? this.cacheTtlMs,\n ),\n staleWhileRevalidateMs: PromptClient.validateCacheDuration(\n 'staleWhileRevalidateMs',\n options?.staleWhileRevalidateMs ??\n cached?.staleWhileRevalidateMs ??\n this.staleWhileRevalidateMs,\n ),\n };\n }\n\n private snapshotPrompt(handle: PromptHandle): CachedPrompt {\n return {\n id: handle.id,\n name: handle.name,\n version: handle.version,\n content: handle.content,\n messages: handle.messages,\n config: handle.config,\n labels: handle.labels,\n updatedAt: handle.updatedAt,\n type: handle.type as 'text' | 'chat',\n };\n }\n\n private cachePrompt(\n cacheKey: string,\n handle: PromptHandle,\n policy: PromptCachePolicy,\n pinned: boolean,\n ): void {\n this._cache.delete(cacheKey);\n this._cache.set(cacheKey, {\n prompt: this.snapshotPrompt(handle),\n fetchedAtMs: Date.now(),\n ttlMs: policy.ttlMs,\n staleWhileRevalidateMs: policy.staleWhileRevalidateMs,\n pinned,\n });\n this.evictCacheEntries();\n }\n\n private touchCacheEntry(cacheKey: string, entry: PromptCacheEntry): void {\n this._cache.delete(cacheKey);\n this._cache.set(cacheKey, entry);\n }\n\n private evictCacheEntries(): void {\n while (this._cache.size > this.maxCacheEntries) {\n const oldestKey = this._cache.keys().next().value as string | undefined;\n if (oldestKey === undefined) return;\n this._cache.delete(oldestKey);\n }\n }\n\n private fetchAndCache(\n cacheKey: string,\n name: string,\n options: { version?: number; label?: string },\n policy: PromptCachePolicy,\n ): Promise<PromptHandle> {\n this.assertOpen();\n const existing = this._inflight.get(cacheKey);\n if (existing) return existing;\n\n const mutationEpoch = this._mutationEpoch;\n const cacheEpoch = this._cacheEpoch;\n const pinned = options.version != null;\n const request = this.fetchPrompt(name, options)\n .then((handle) => {\n if (\n !this._closed &&\n this._cacheEpoch === cacheEpoch &&\n this._mutationEpoch === mutationEpoch\n ) {\n this.cachePrompt(cacheKey, handle, policy, pinned);\n }\n return handle;\n })\n .finally(() => {\n if (this._inflight.get(cacheKey) === request) {\n this._inflight.delete(cacheKey);\n this._inflightPromptNames.delete(cacheKey);\n }\n });\n this._inflight.set(cacheKey, request);\n this._inflightPromptNames.set(cacheKey, { name, pinned });\n return request;\n }\n\n private revalidatePrompt(\n cacheKey: string,\n name: string,\n options: { version?: number; label?: string },\n policy: PromptCachePolicy,\n ): void {\n if (this._inflight.has(cacheKey)) return;\n void this.fetchAndCache(cacheKey, name, options, policy).catch(() => {\n // Stale-while-revalidate deliberately preserves the last known prompt.\n // The in-flight entry is cleared in finally so a later lookup retries.\n });\n }\n\n private invalidatePrompt(name: string, includePinned = false): void {\n // A single process-wide epoch prevents an in-flight read from repopulating\n // stale data without retaining one generation counter per mutated name.\n this._mutationEpoch += 1;\n for (const [cacheKey, entry] of this._cache) {\n if (entry.prompt.name === name && (includePinned || !entry.pinned)) {\n this._cache.delete(cacheKey);\n }\n }\n for (const [cacheKey, request] of this._inflightPromptNames) {\n if (request.name !== name || (!includePinned && request.pinned)) continue;\n this._inflight.delete(cacheKey);\n this._inflightPromptNames.delete(cacheKey);\n }\n }\n\n /** Clear cached values without changing or shutting down the telemetry SDK. */\n clearCache(): void {\n this.assertOpen();\n this._cacheEpoch += 1;\n this._cache.clear();\n }\n\n /** Abort prompt requests, release the cache, and permanently close this client. */\n close(): void {\n if (this._closed) return;\n this._closed = true;\n this._cacheEpoch += 1;\n for (const controller of this._requestControllers) controller.abort();\n this._requestControllers.clear();\n this._cache.clear();\n this._inflight.clear();\n this._inflightPromptNames.clear();\n }\n\n /**\n * Always fetch from the API (bypasses cache).\n */\n async fetchPrompt(\n name: string,\n options?: { version?: number; label?: string },\n ): Promise<PromptHandle> {\n this.assertOpen();\n const version = options?.version;\n const label = options?.label;\n\n if (label != null && version != null) {\n throw new PromptClientError('Cannot specify both label and version.');\n }\n\n if (label != null) {\n const path = `/api/v1/prompts/${encodeURIComponent(name)}/fetch`;\n const url = `${path}?label=${encodeURIComponent(label)}`;\n const payload = await this._request(url);\n return new PromptHandle(normalizePromptObject(payload));\n }\n\n const items = await this.listPromptRecords(\n name,\n version == null\n ? (page) => page.length > 0\n : (page) => page.some((item) => Number(item['version']) === version),\n );\n\n if (items.length === 0) {\n throw new PromptNotFoundError('Managed prompt not found');\n }\n\n if (version != null) {\n const match = items.find((item) => Number(item['version']) === version);\n if (!match) {\n throw new PromptNotFoundError(`Managed prompt version ${version} not found`);\n }\n return new PromptHandle(normalizePromptObject(match));\n }\n\n // The backend orders a name-filtered listing by descending version.\n return new PromptHandle(normalizePromptObject(items[0]));\n }\n\n /**\n * List all prompts.\n */\n async listPrompts(): Promise<PromptHandle[]> {\n this.assertOpen();\n const items = await this.listPromptRecords();\n return items.map((item) => new PromptHandle(normalizePromptObject(item)));\n }\n\n /**\n * Create a new prompt.\n */\n async createPrompt(data: CreatePromptInput): Promise<PromptHandle> {\n this.assertOpen();\n this.assertPromptWrite(data, 'createPrompt');\n const body: Record<string, any> = { name: data.name };\n if (data.content !== undefined) body['content'] = data.content;\n if (data.messages !== undefined) body['messages'] = data.messages;\n if (data.config !== undefined) body['config'] = data.config;\n if (data.labels !== undefined) body['labels'] = data.labels;\n if (data.tags !== undefined) body['tags'] = data.tags;\n if (data.commitMessage !== undefined) body['commit_message'] = data.commitMessage;\n\n const payload = await this._request('/api/managed-prompts', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n const promptData = payload['prompt'] ?? payload;\n this.invalidatePrompt(data.name);\n return new PromptHandle(normalizePromptObject(promptData));\n }\n\n /**\n * Save changed content as a new immutable version.\n *\n * @deprecated Managed prompts are immutable. Prefer {@link saveAsVersion}.\n */\n async updatePrompt(\n name: string,\n data: PromptWriteInput,\n ): Promise<PromptHandle> {\n this.assertOpen();\n this.assertPromptWrite(data, 'updatePrompt');\n return this.saveAsVersion(name, data as SavePromptVersionOptions);\n }\n\n /**\n * Delete one immutable prompt version. A name-only call resolves the latest\n * version first for compatibility; pass a version, label, or promptId when\n * the target must be explicit.\n */\n async deletePrompt(name: string, selector?: PromptMutationSelector): Promise<void> {\n this.assertOpen();\n const promptId = await this.resolvePromptId(name, selector);\n await this._request(`/api/managed-prompts/${encodeURIComponent(promptId)}`, {\n method: 'DELETE',\n });\n this.invalidatePrompt(name, true);\n }\n\n /**\n * Assign a label to one immutable prompt version.\n */\n async setLabel(\n name: string,\n label: string,\n selector?: PromptMutationSelector,\n ): Promise<void> {\n this.assertOpen();\n this.assertLabel(label, 'setLabel');\n const promptId = await this.resolvePromptId(name, selector);\n await this._request(`/api/managed-prompts/${encodeURIComponent(promptId)}/labels`, {\n method: 'POST',\n body: JSON.stringify({ label }),\n });\n this.invalidatePrompt(name);\n }\n\n /**\n * Add a tag to one immutable prompt version.\n */\n async addTag(name: string, tag: string, selector?: PromptMutationSelector): Promise<void> {\n this.assertOpen();\n this.assertTag(tag, 'addTag');\n const promptId = await this.resolvePromptId(name, selector);\n await this._request(`/api/managed-prompts/${encodeURIComponent(promptId)}/tags`, {\n method: 'POST',\n body: JSON.stringify({ tag }),\n });\n this.invalidatePrompt(name);\n }\n\n /** Remove a tag from one immutable prompt version. */\n async removeTag(name: string, tag: string, selector?: PromptMutationSelector): Promise<void> {\n this.assertOpen();\n this.assertTag(tag, 'removeTag');\n const promptId = await this.resolvePromptId(name, selector);\n await this._request(`/api/managed-prompts/${encodeURIComponent(promptId)}/tags`, {\n method: 'DELETE',\n body: JSON.stringify({ tag }),\n });\n this.invalidatePrompt(name);\n }\n\n /** Save supplied content or messages as a new immutable version. */\n async saveAsVersion(\n name: string,\n options: SavePromptVersionOptions,\n ): Promise<PromptHandle>;\n /** @deprecated Pass non-empty `content` or `messages`; label-only saves are rejected. */\n async saveAsVersion(\n name: string,\n options?: LegacySavePromptVersionOptions,\n ): Promise<PromptHandle>;\n async saveAsVersion(\n name: string,\n options?: SavePromptVersionOptions | LegacySavePromptVersionOptions,\n ): Promise<PromptHandle> {\n this.assertOpen();\n const writeOptions = options ?? {};\n this.assertPromptWrite(writeOptions, 'saveAsVersion');\n const write = writeOptions as SavePromptVersionOptions;\n const body: Record<string, any> = { promptName: name };\n if (write.content !== undefined) body['content'] = write.content;\n if (write.messages !== undefined) body['messages'] = write.messages;\n if (write.config !== undefined) body['config'] = write.config;\n const labels = this.resolveWriteLabels(write, 'saveAsVersion');\n if (labels.length > 0) body['labels'] = labels;\n if (write.tags !== undefined) body['tags'] = write.tags;\n if (write.commitMessage !== undefined) body['commitMessage'] = write.commitMessage;\n\n const payload = await this._request('/api/prompt-playground/save-as-version', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n const promptData = payload['prompt'] ?? payload;\n this.invalidatePrompt(name);\n return new PromptHandle(normalizePromptObject(promptData));\n }\n\n // ---- internal ------------------------------------------------------------\n\n private assertPromptWrite(\n data: PromptWriteInput | LegacySavePromptVersionOptions,\n operation: string,\n ): void {\n const content = 'content' in data ? data.content : undefined;\n const messages = 'messages' in data ? data.messages : undefined;\n const hasContent = typeof content === 'string' && content.trim().length > 0;\n const hasMessages = Array.isArray(messages) && messages.length > 0;\n if (!hasContent && !hasMessages) {\n throw new PromptClientError(`${operation} requires non-empty content or messages.`);\n }\n this.resolveWriteLabels(data, operation);\n for (const tag of (data as PromptWriteInput).tags ?? []) this.assertTag(tag, operation);\n }\n\n private resolveWriteLabels(\n data: PromptWriteInput | LegacySavePromptVersionOptions,\n operation: string,\n ): string[] {\n const write = data as PromptWriteInput & { label?: string };\n const labels = [...(write.labels ?? [])];\n if (write.label !== undefined && !labels.includes(write.label)) labels.unshift(write.label);\n if (labels.length > 1) {\n throw new PromptClientError(`${operation} accepts at most one label per prompt version.`);\n }\n for (const label of labels) this.assertLabel(label, operation);\n return labels;\n }\n\n private assertLabel(label: string, operation: string): void {\n if (typeof label !== 'string' || !/^[A-Za-z0-9_-]{1,50}$/.test(label)) {\n throw new PromptClientError(\n `${operation} labels must contain 1-50 letters, numbers, underscores, or hyphens.`,\n );\n }\n }\n\n private assertTag(tag: string, operation: string): void {\n if (\n typeof tag !== 'string' ||\n tag !== tag.trim() ||\n tag.length < 1 ||\n tag.length > 64 ||\n /[\\r\\n]/.test(tag)\n ) {\n throw new PromptClientError(\n `${operation} tags must contain 1-64 characters without surrounding whitespace or newlines.`,\n );\n }\n }\n\n private validateMutationSelector(selector?: PromptMutationSelector): void {\n const selected = [selector?.promptId, selector?.version, selector?.label].filter(\n (value) => value != null,\n );\n if (selected.length > 1) {\n throw new PromptClientError('Specify only one of promptId, version, or label.');\n }\n if (selector?.promptId != null && !UUID_PATTERN.test(selector.promptId)) {\n throw new PromptClientError('promptId must be a UUID.');\n }\n if (\n selector?.version != null &&\n (!Number.isInteger(selector.version) || selector.version <= 0)\n ) {\n throw new PromptClientError('version must be a positive integer.');\n }\n if (selector?.label != null) this.assertLabel(selector.label, 'selector');\n }\n\n private async resolvePromptId(\n name: string,\n selector?: PromptMutationSelector,\n ): Promise<string> {\n this.validateMutationSelector(selector);\n if (selector?.promptId != null) return selector.promptId;\n const handle = await this.fetchPrompt(name, {\n version: selector?.version,\n label: selector?.label,\n });\n if (!handle.id) {\n throw new PromptNotFoundError('Managed prompt response did not include a version id');\n }\n return handle.id;\n }\n\n private async listPromptRecords(\n name?: string,\n stopWhen?: (page: Record<string, any>[]) => boolean,\n ): Promise<Record<string, any>[]> {\n const records: Record<string, any>[] = [];\n let offset = 0;\n\n for (;;) {\n const nameQuery = name == null ? '' : `name=${encodeURIComponent(name)}&`;\n const payload = await this._request(\n `/api/managed-prompts?${nameQuery}limit=${PROMPT_LIST_PAGE_SIZE}&offset=${offset}`,\n );\n const page = Array.isArray(payload?.['items'])\n ? (payload['items'] as Record<string, any>[])\n : [];\n records.push(...page);\n offset += page.length;\n\n if (stopWhen?.(page)) return records;\n\n const rawTotal = Number(payload?.['total']);\n const total = Number.isFinite(rawTotal) && rawTotal >= 0 ? rawTotal : undefined;\n if (\n page.length === 0 ||\n page.length < PROMPT_LIST_PAGE_SIZE ||\n (total !== undefined && offset >= total)\n ) {\n return records;\n }\n }\n }\n\n /**\n * Internal fetch wrapper with auth headers and OTel suppression.\n */\n async _request(path: string, options?: RequestInit): Promise<any> {\n this.assertOpen();\n const url = `${this.baseUrl}${path}`;\n const safePath = PromptClient.safeErrorPath(path);\n const headers: Record<string, string> = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n 'x-api-key': this.apiKey,\n ...(options?.headers as Record<string, string> | undefined),\n };\n\n const fetchOptions: RequestInit = {\n method: options?.method ?? 'GET',\n headers,\n body: options?.body,\n };\n\n const controller = new AbortController();\n this._requestControllers.add(controller);\n let timedOut = false;\n const timeout = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, this.requestTimeoutMs);\n (timeout as ReturnType<typeof setTimeout> & { unref?: () => void }).unref?.();\n fetchOptions.signal = controller.signal;\n\n let transportPromise: Promise<Response> | undefined;\n const startTransport = (): Promise<Response> => {\n if (transportPromise) return transportPromise;\n\n try {\n transportPromise = fetch(url, fetchOptions);\n } catch (error) {\n transportPromise = Promise.reject(error);\n }\n return transportPromise;\n };\n\n let contextResult: Promise<Response> | undefined;\n try {\n try {\n // Suppress OTel instrumentation on our own HTTP calls so prompt CRUD\n // never becomes a child span of user telemetry.\n const suppressedContext = suppressTracing(context.active());\n contextResult = context.with(suppressedContext, startTransport);\n } catch {\n // A started transport remains authoritative; setup failures fall through.\n }\n\n if (contextResult && contextResult !== transportPromise) {\n void Promise.resolve(contextResult).catch(() => undefined);\n }\n\n const response = await (transportPromise ?? startTransport());\n const requestId = PromptClient.safeRequestId(response.headers?.get?.('x-request-id'));\n const requestIdSuffix = requestId ? `; request_id=${requestId}` : '';\n\n if (!response.ok) {\n await response.body?.cancel().catch(() => undefined);\n throw new PromptApiError(\n `${fetchOptions.method} ${safePath} failed (${response.status})${requestIdSuffix}`,\n {\n method: fetchOptions.method,\n path: safePath,\n status: response.status,\n requestId,\n },\n );\n }\n\n try {\n return await response.json();\n } catch {\n throw new PromptApiError(\n `${fetchOptions.method} ${safePath} returned non-JSON response (${response.status})${requestIdSuffix}`,\n { method: fetchOptions.method, path: safePath, status: response.status, requestId },\n );\n }\n } catch (error) {\n if (error instanceof PromptClientError) throw error;\n if (timedOut) {\n throw new PromptRequestTimeoutError(\n `${fetchOptions.method} ${safePath} exceeded ${this.requestTimeoutMs}ms`,\n );\n }\n if (this._closed) throw new PromptClientClosedError();\n throw new PromptApiError(`${fetchOptions.method} ${safePath} request failed`, {\n method: fetchOptions.method,\n path: safePath,\n });\n } finally {\n clearTimeout(timeout);\n this._requestControllers.delete(controller);\n }\n }\n\n private static safeRequestId(value: string | null | undefined): string | undefined {\n if (value == null) return undefined;\n const trimmed = value.trim();\n return /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$/.test(trimmed) ? trimmed : undefined;\n }\n\n private static safeErrorPath(path: string): string {\n const route = path.split('?', 1)[0];\n if (/^\\/api\\/v1\\/prompts\\/[^/]+\\/fetch$/.test(route)) {\n return '/api/v1/prompts/:name/fetch';\n }\n return route.replace(\n /^\\/api\\/managed-prompts\\/[^/]+(?=\\/|$)/,\n '/api/managed-prompts/:promptId',\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Module-level shared client (set by init())\n// ---------------------------------------------------------------------------\n\nlet _sharedClient: PromptClient | null = null;\n\n/** Set the module-level shared prompt client (called by init()). */\nexport function setSharedClient(client: PromptClient): void {\n if (_sharedClient && _sharedClient !== client) _sharedClient.close();\n _sharedClient = client;\n}\n\n/** Close and forget the module-level prompt client without affecting telemetry flush status. */\nexport function closeSharedClient(): void {\n const client = _sharedClient;\n _sharedClient = null;\n client?.close();\n}\n\n/** Get the module-level shared prompt client. Throws if not initialized. */\nexport function getSharedClient(): PromptClient {\n if (!_sharedClient) {\n throw new PromptClientError(\n 'No prompt client available. Call neatlogs.init(apiKey: ...) or setSharedClient() first.',\n );\n }\n return _sharedClient;\n}\n\n// ---------------------------------------------------------------------------\n// Module-level convenience functions that delegate to shared client\n// ---------------------------------------------------------------------------\n\nexport async function getPrompt(name: string, options?: GetPromptOptions): Promise<PromptHandle> {\n return getSharedClient().getPrompt(name, options);\n}\n\nexport async function fetchPrompt(\n name: string,\n options?: { version?: number; label?: string },\n): Promise<PromptHandle> {\n return getSharedClient().fetchPrompt(name, options);\n}\n\nexport async function listPrompts(): Promise<PromptHandle[]> {\n return getSharedClient().listPrompts();\n}\n\nexport async function createPrompt(data: CreatePromptInput): Promise<PromptHandle> {\n return getSharedClient().createPrompt(data);\n}\n\nexport async function updatePrompt(\n name: string,\n data: PromptWriteInput,\n): Promise<PromptHandle> {\n return getSharedClient().updatePrompt(name, data);\n}\n\nexport async function saveAsVersion(\n name: string,\n options: SavePromptVersionOptions,\n): Promise<PromptHandle>;\n/** @deprecated Pass non-empty `content` or `messages`; label-only saves are rejected. */\nexport async function saveAsVersion(\n name: string,\n options?: LegacySavePromptVersionOptions,\n): Promise<PromptHandle>;\nexport async function saveAsVersion(\n name: string,\n options?: SavePromptVersionOptions | LegacySavePromptVersionOptions,\n): Promise<PromptHandle> {\n return getSharedClient().saveAsVersion(name, options);\n}\n\nexport async function deletePrompt(\n name: string,\n selector?: PromptMutationSelector,\n): Promise<void> {\n return getSharedClient().deletePrompt(name, selector);\n}\n\nexport async function setLabel(\n name: string,\n label: string,\n selector?: PromptMutationSelector,\n): Promise<void> {\n return getSharedClient().setLabel(name, label, selector);\n}\n\nexport async function addTag(\n name: string,\n tag: string,\n selector?: PromptMutationSelector,\n): Promise<void> {\n return getSharedClient().addTag(name, tag, selector);\n}\n\nexport async function removeTag(\n name: string,\n tag: string,\n selector?: PromptMutationSelector,\n): Promise<void> {\n return getSharedClient().removeTag(name, tag, selector);\n}\n","/**\n * @deprecated Use `wrapMastra()` from `neatlogs/mastra`.\n *\n * The current `@neatlogs/instrumentation-mastra`\n * bridge activates its spans on the GLOBAL OpenTelemetry context\n * (`context.active()` / `context.with()`), so a foreign co-tenant (Datadog, …)\n * can still parent or be parented by Mastra's spans in both directions — the\n * private provider alone cannot isolate that. Until the bridge is redesigned to\n * accept the injected Neatlogs private-context runtime, use the explicit\n * `wrapMastra()` wrapper instead.\n */\nexport async function getMastraObservability(): Promise<any> {\n throw new Error(\n 'getMastraObservability() is not supported because the ' +\n '@neatlogs/instrumentation-mastra bridge activates spans on the global ' +\n 'OpenTelemetry context, which cannot be isolated from other tracing SDKs ' +\n '(Datadog, etc.).\\n\\n' +\n \"Use wrapMastra() from 'neatlogs/mastra' instead.\",\n );\n}\n\n/** @internal Legacy lifecycle hook retained until this export is removed. */\nexport function _resetMastraCache(): void {\n // Kept as an internal lifecycle hook until the legacy bridge export is\n // removed in the next major release.\n}\n","export interface DeadlineOutcome<T> {\n completed: boolean;\n value?: T;\n error?: unknown;\n}\n\n/** Bound a third-party exporter/lifecycle promise by one absolute deadline. */\nexport async function runByDeadline<T>(\n operation: () => T | PromiseLike<T>,\n deadlineMs: number,\n): Promise<DeadlineOutcome<T>> {\n const remaining = Math.max(0, deadlineMs - Date.now());\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(\n () => reject(new Error(\"NEATLOGS_DEADLINE_EXCEEDED\")),\n remaining,\n );\n });\n try {\n const value = await Promise.race([\n Promise.resolve().then(operation),\n timeout,\n ]);\n return { completed: true, value };\n } catch (error) {\n return { completed: false, error };\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n}\n","#!/usr/bin/env node\nimport { runDoctorCli } from './doctor-cli.js';\n\nvoid runDoctorCli(process.argv.slice(2)).then((code) => { process.exitCode = code; });\n"],"mappings":"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","names":["import_api","result","span","context","trace","import_api","logger","span","import_node_async_hooks","import_node_async_hooks","import_api","import_node_async_hooks","neatlogsGlobal","otelTrace","context","context","span","otelTrace","span","otelTrace","logger","span","logger","span","import_node_crypto","reference","init","span","result","span","snapshot","failure","import_api","otelTrace","import_api","logger","span","encodedBytes","logger","span","otelTrace","logger","span","import_node_crypto","path","import_node_crypto","import_resources","import_sdk_trace_base","import_core","import_sdk_logs","import_api","logger","logger","mapper","usage","durationNs","logger","import_api","span","logger","span","spanId","otelTrace","import_api","span","import_node_crypto","import_core","logger","span","import_core","import_resources","import_api","span","import_node_async_hooks","logger","import_api","import_core","result","UUID_PATTERN","policy","path","logger","_debugMode","path","logger","_debugMode","span","first","check","canonicalize","result","failure","boundedJson","local"]}