@tracehatch/sdk 0.3.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context.ts","../../shared/src/wire-runtime.ts","../src/clock.ts","../src/config.ts","../../shared/src/capture-routes.ts","../../shared/src/capture-sse.ts","../../shared/src/capture-hash.ts","../../shared/src/capture-generation.ts","../../shared/src/capture-bodies.ts","../../shared/src/capture-conversation.ts","../src/env.ts","../../shared/src/ids.ts","../src/ids.ts","../../shared/src/redaction.ts","../src/serialize.ts","../src/span.ts","../src/capture/auto-runs.ts","../src/capture/fetch.ts","../src/capture/server.ts","../src/capture/signals.ts","../src/capture/install.ts","../src/logger.ts","../src/exporter/batcher.ts","../src/exporter/queue.ts","../src/exporter/retry.ts","../src/exporter/transport.ts","../src/exporter/exporter.ts","../src/identity.ts","../src/init.ts","../src/trace.ts"],"names":["stateKey","globals","state","AsyncLocalStorage","currentContext","WIRE_LIMITS","ATTR","COUNT_ATTRIBUTES","ID_BODY","SPAN_ID_PATTERN","SCORE_ID_PATTERN","codecs","wall","mono","performance","timestamp","SDK_VERSION","DEFAULT_BASE_URL","sdkConfig","URLConstructor","KNOWN_HOSTS","providerSystem","url","host","test","system","RESPONSE_ID","OPENAI_ROUTES","matchProviderRoute","method","options","parsed","verb","path","routeMethod","pattern","operation","match","SseParser","text","messages","newline","line","delimiter","message","trailing","colon","field","value","K","encoder","sha256Hex","input","bitLength","paddedLength","padded","view","h","w","offset","i","w15","w2","s0","rotr","s1","a","b","c","d","e","f","g","hh","ch","t1","maj","t2","hex","word","bits","record","list","assign","attributes","key","boundedJson","json","parseJson","requestAttributes","request","responseAttributes","api","response","usage","cached","creation","serverToolUsage","item","type","count","reasons","choice","reason","toolCalls","extractToolCalls","calls","push","id","name","args","block","entry","call","fn","isCancellation","error","classifyFailure","info","status","failure","failureFromHttp","body","describeGeneration","route","MAX_CAPTURE_CHARACTERS","MAX_CAPTURE_PARTS","MAX_TRACKED_CHOICES","MAX_TOOL_CALLS","GenerationAccumulator","cancelled","retained","initial","existing","part","delta","output","chunk","index","tool","toolIndex","tracked","elapsed","pending","result","providerInput","candidates","blocks","providerOutput","texts","child","FINGERPRINT_TEXT_LIMIT","textOf","content","fingerprintOf","first","opening","chatSignals","firstUser","last","toolResults","callId","signals","fingerprint","responsesSignals","instructions","items","isUserMessage","conversation","anthropicSignals","blocksOf","isToolResults","userId","conversationSignals","autoSessionId","DEFAULTS","MAX_RESPONSE_IDS","ConversationLinker","startedAt","run","sessionId","continues","known","completion","final","oldest","traceId","setting","environmentDefaults","apiBaseUrl","isServerlessRuntime","env","ALPHABET","DECODE","encodeCrockford","bytes","byte","length","chars","newId","prefix","randomBytes","SECRET_KEY","MARKER","isCard","digits","sum","double","digit","BUILT_INS","redact","counts","ancestors","nodes","builtIns","rules","rule","flags","replacement","visit","depth","descriptors","originalLength","descriptor","safeKey","own","clean","Buffer","buffer","limit","end","suffix","start","boundedText","maxBytes","encoded","marker","remaining","head","fallback","safe","truncated","serializeIdentifier","domain","digest","createHash","identityPolicy","serializeAttributes","source","rawKey","rawValue","candidate","metadata","serializeEvents","event","ts","level","serializeSpan","span","stack","original","sizeField","truncatedField","previousSize","knownSize","serializeScore","spanField","scoreValue","spanId","comment","serializeTrace","trace","identities","previous","policy","samePolicy","rawSessionId","user","rawUserId","email","tags","tag","scores","raw","score","RecordingSpan","kind","parent","rootId","internal","toolCallId","signal","abort","attempt","errorDetails","startSpan","context","handle","noopSpan","retries","backoff","resolve","AutoRuns","linker","client","model","link","TraceHandle","recorded","timer","outcome","endedAt","open","scheduleFlush","flush","installFetchCapture","capture","current","patched","init","capturedFetch","uninstallFetchCapture","autoRuns","MAX_PENDING","settling","failures","decoder","waitForToolMetadata","observations","bound","headerValue","headerLookup","headers","wanted","plan","requestText","toError","rememberFailure","attemptFor","withUsage","readStream","accumulator","reader","parser","streamDecoder","consume","done","finish","fail","holdPending","responseId","observe","clone","observePoll","planned","held","requestKey","auto","toolPairing","at","promise","spanOptions","observation","originals","SESSION_HEADER","USER_HEADER","single","trimmed","pathOf","requestTrace","finishRequest","installServerCapture","Server","http","https","prototype","uninstallServerCapture","SIGNALS","listeners","listener","installSignalHooks","uninstallSignalHooks","installCapture","uninstallCapture","Logger","enabled","now","makeBatch","entries","redacted","droppedSpans","traces","sdk","snapshotEntry","spanJson","traceJson","SpanQueue","dropped","shouldRetry","retryDelay","retryAfter","seconds","jitter","waitForRetry","ms","compress","promisify","gzip","safeProblemCodes","sendBatch","shutdownSignal","controller","onShutdown","onAbort","_","reject","compressed","randomUUID","payload","rate","Exporter","timeoutMs","pendingSpans","age","batch","remainingSpans","settle","task","lastError","middle","MAX_DIRECTORY_DEPTH","dirname","readText","readFileSync","detectAgent","cwd","directory","join","basename","RELEASE_VARIABLES","SHA","detectRelease","ref","direct","sha","allowed","validate","Tracehatch","baseUrl","hash","char","awaitPendingEnds","disabledFlushResult","defaults","apiKey","resolved","getClient","flushWithResult","timeout","settled","shutdown","pendingEnds","startTrace","noopTrace","setUser","setSession","addTags","setMetadata"],"mappings":"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","file":"chunk-U5REKR34.cjs","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\"\n\nimport type { AutoRuns } from \"./capture/auto-runs.js\"\nimport type { Tracehatch } from \"./init.js\"\nimport type { RecordingSpan } from \"./span.js\"\nimport type { TraceHandle } from \"./trace.js\"\n\nexport interface RunContext {\n trace: TraceHandle\n span: RecordingSpan\n}\n\ninterface State {\n storage: AsyncLocalStorage<RunContext>\n client?: Tracehatch\n missingKeyWarned?: boolean\n /** Trusted snapshot identities, shared by ESM/CJS without retaining raw IDs. */\n serializedTraceIdentities?: WeakMap<\n object,\n {\n policy: unknown\n sessionId?: string\n userId?: string\n }\n >\n /** Runs created for model calls outside any trace (capture/auto-runs.ts). */\n autoRuns?: AutoRuns\n /** Run ends waiting for provider responses still being read; `flush()` awaits them. */\n pendingEnds: Set<Promise<void>>\n /** Provider observations can still enqueue spans before a run starts ending. */\n pendingCaptures?: Set<Promise<unknown>>\n /** Process-wide hooks; installed once even when ESM and CJS copies coexist. */\n capture?: {\n originalFetch?: typeof globalThis.fetch\n patchedFetch?: typeof globalThis.fetch\n serverPatched?: boolean\n signalsInstalled?: boolean\n }\n}\n\nconst stateKey = Symbol.for(\"tracehatch.sdk.v1.state\")\nconst globals = globalThis as typeof globalThis & {\n [key: symbol]: State | undefined\n}\nexport const state: State = (globals[stateKey] ??= {\n storage: new AsyncLocalStorage<RunContext>(),\n pendingEnds: new Set(),\n})\n\nexport function currentContext(): RunContext | undefined {\n return state.storage.getStore()\n}\n\nexport function isTracing(): boolean {\n const context = currentContext()\n return Boolean(context?.trace.isRecording)\n}\n","/**\n * Schema-free runtime exports, re-exported through the public wire entry.\n * Wire v1 uses Tracehatch attribute names alongside standard semantic keys.\n */\nexport const WIRE_VERSION = 1 as const\n\n/** Limits both ends enforce; `ingest.config.ts` and the SDK config mirror these. */\nexport const WIRE_LIMITS = {\n /** Counts and duration columns use signed PostgreSQL integers. */\n maxCount: 2_147_483_647,\n maxSpansPerBatch: 1_000,\n maxTracesPerBatch: 1_000,\n maxNameLength: 256,\n maxAgentLength: 128,\n maxSessionIdLength: 128,\n maxUserIdLength: 128,\n maxUserNameLength: 256,\n maxReleaseLength: 128,\n maxTagsPerTrace: 32,\n maxTagLength: 64,\n maxScoresPerTrace: 100,\n maxScoreNameLength: 128,\n maxScoreValueLength: 256,\n maxScoreCommentLength: 2_048,\n maxMetadataBytes: 16_384,\n maxAttributesPerSpan: 64,\n maxAttributeKeyLength: 256,\n /** Size of the `attributes` object after column mapping. */\n maxAttributesObjectBytes: 8_192,\n maxErrorTypeLength: 128,\n maxErrorMessageBytes: 2_048,\n maxStackBytes: 65_536,\n maxEventsPerSpan: 100,\n /** Per body (`input`, `output`, `messages`), before truncation. */\n maxAttributeBytes: 1_048_576,\n bodyHeadBytes: 786_432,\n bodyTailBytes: 262_144,\n /** Trace-level `input` and `output`. */\n traceBodyBytes: 65_536,\n} as const\n\n/** OpenTelemetry GenAI attribute names plus our own, so OTLP maps one to one. */\nexport const ATTR = {\n system: \"gen_ai.system\",\n requestModel: \"gen_ai.request.model\",\n responseModel: \"gen_ai.response.model\",\n temperature: \"gen_ai.request.temperature\",\n maxTokens: \"gen_ai.request.max_tokens\",\n topP: \"gen_ai.request.top_p\",\n inputTokens: \"gen_ai.usage.input_tokens\",\n outputTokens: \"gen_ai.usage.output_tokens\",\n cachedInputTokens: \"gen_ai.usage.cached_input_tokens\",\n cacheCreationInputTokens: \"gen_ai.usage.cache_creation_input_tokens\",\n cacheCreation5mInputTokens: \"gen_ai.usage.cache_creation_5m_input_tokens\",\n cacheCreation1hInputTokens: \"gen_ai.usage.cache_creation_1h_input_tokens\",\n pricingIncomplete: \"tracehatch.pricing.incomplete\",\n reasoningTokens: \"gen_ai.usage.reasoning_tokens\",\n finishReasons: \"gen_ai.response.finish_reasons\",\n responseStatus: \"gen_ai.response.status\",\n timeToFirstTokenMs: \"gen_ai.response.time_to_first_token_ms\",\n tokensPerSecond: \"gen_ai.usage.tokens_per_second\",\n requestTools: \"gen_ai.request.tools\",\n responseToolCalls: \"gen_ai.response.tool_calls\",\n toolName: \"tool.name\",\n toolCallId: \"tool.call_id\",\n errorType: \"error.type\",\n errorStatus: \"error.status\",\n httpStatus: \"http.response.status_code\",\n retrievalQuery: \"retrieval.query\",\n retrievalDocumentCount: \"retrieval.document_count\",\n agent: \"tracehatch.agent\",\n release: \"tracehatch.release\",\n sessionId: \"session.id\",\n userId: \"user.id\",\n sdkName: \"tracehatch.sdk.name\",\n sdkVersion: \"tracehatch.sdk.version\",\n clockSkewMs: \"tracehatch.clock_skew_ms\",\n attributesTruncated: \"tracehatch.attributes_truncated\",\n} as const\n\n/** Numeric attributes mapped to bounded PostgreSQL count/duration columns. */\nexport const COUNT_ATTRIBUTES: readonly string[] = [\n ATTR.inputTokens,\n ATTR.outputTokens,\n ATTR.cachedInputTokens,\n ATTR.cacheCreationInputTokens,\n ATTR.cacheCreation5mInputTokens,\n ATTR.cacheCreation1hInputTokens,\n ATTR.timeToFirstTokenMs,\n]\n\nexport const SPAN_EVENT_LEVEL = [\"debug\", \"info\", \"warn\", \"error\"] as const\nexport type SpanEventLevel = (typeof SPAN_EVENT_LEVEL)[number]\n\n/** Span statuses accepted on the wire: spans are sent when they end. */\nexport const WIRE_SPAN_STATUS = [\"ok\", \"error\", \"cancelled\"] as const\n\nconst ID_BODY = \"[0-7][0-9a-hjkmnp-tv-z]{25}\"\nexport const TRACE_ID_PATTERN = new RegExp(`^run_${ID_BODY}$`)\nexport const SPAN_ID_PATTERN = new RegExp(`^span_${ID_BODY}$`)\nexport const SCORE_ID_PATTERN = new RegExp(`^scr_${ID_BODY}$`)\n\ninterface TextCodecs {\n TextEncoder: new () => { encode(input: string): Uint8Array }\n TextDecoder: new () => { decode(input: Uint8Array): string }\n}\n\n// Web APIs exist in browsers, Node and edge runtimes; the package ships no DOM types.\nconst codecs = globalThis as unknown as TextCodecs\nconst encoder = new codecs.TextEncoder()\nconst decoder = new codecs.TextDecoder()\n\n/** UTF-8 size of a body as it would be stored (`JSON.stringify` for non-strings). */\nexport function bodyBytes(value: unknown): number {\n if (value === undefined || value === null) return 0\n const text = typeof value === \"string\" ? value : JSON.stringify(value)\n return text === undefined ? 0 : encoder.encode(text).length\n}\n\nexport interface TruncatedBody {\n /** The original value, or the truncated text when over the limit. */\n value: unknown\n /** Bytes of the original. */\n bytes: number\n truncated: boolean\n}\n\nexport interface TruncateLimits {\n maxBytes: number\n headBytes: number\n tailBytes: number\n}\n\nexport const BODY_TRUNCATE_LIMITS: TruncateLimits = {\n maxBytes: WIRE_LIMITS.maxAttributeBytes,\n headBytes: WIRE_LIMITS.bodyHeadBytes,\n tailBytes: WIRE_LIMITS.bodyTailBytes,\n}\n\n/**\n * Head-and-tail truncation with a marker (ADR-005): a body over `maxBytes`\n * keeps its first `headBytes` and last `tailBytes` as text. Truncated JSON is\n * stored as a string and never re-parsed. The SDK and the server call the\n * same function so both sides agree on what leaves the process.\n */\nexport function truncateBody(\n value: unknown,\n limits: TruncateLimits = BODY_TRUNCATE_LIMITS\n): TruncatedBody {\n if (value === undefined || value === null) {\n return { value, bytes: 0, truncated: false }\n }\n const text = typeof value === \"string\" ? value : JSON.stringify(value)\n if (text === undefined) return { value: null, bytes: 0, truncated: false }\n const encoded = encoder.encode(text)\n if (encoded.length <= limits.maxBytes) {\n return { value, bytes: encoded.length, truncated: false }\n }\n const head = decoder.decode(encoded.subarray(0, limits.headBytes))\n const tail = decoder.decode(\n encoded.subarray(encoded.length - limits.tailBytes)\n )\n return {\n value: `${head}…[truncated ${formatBytes(encoded.length)}]…${tail}`,\n bytes: encoded.length,\n truncated: true,\n }\n}\n\n/** `3.2 MB`, `768.0 KB`, `512 B` for truncation markers. */\nexport function formatBytes(bytes: number): string {\n if (bytes >= 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n if (bytes >= 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${bytes} B`\n}\n","import { performance } from \"node:perf_hooks\"\n\nconst wall = Date.now()\nconst mono = performance.now()\n\nexport function timestamp(): string {\n return new Date(wall + performance.now() - mono).toISOString()\n}\n\nexport { performance }\n","export const SDK_VERSION = \"0.3.0\"\n\n/** Hosted API the SDK sends to unless `TRACEHATCH_BASE_URL` or `baseUrl` says otherwise. */\nexport const DEFAULT_BASE_URL = \"https://api.tracehatch.com\"\n\n/** Deployment-independent limits; wire mirrors are checked against the API. */\nexport const sdkConfig = {\n wireVersion: 1,\n batchMaxSpans: 100,\n batchMaxBytes: 5 * 1024 * 1024,\n batchMaxDelayMs: 2_000,\n maxQueueBytes: 10 * 1024 * 1024,\n maxInFlightBatches: 4,\n requestTimeoutMs: 10_000,\n flushTimeoutMs: 5_000,\n retryAttempts: 5,\n retryBaseMs: 1_000,\n retryMaxMs: 30_000,\n retryAfterMaxMs: 60_000,\n retryJitter: 0.25,\n gzipMinBytes: 1_024,\n warnIntervalMs: 60_000,\n configRefreshMs: 300_000,\n maxAttributeBytes: 1_048_576,\n bodyHeadBytes: 786_432,\n bodyTailBytes: 262_144,\n traceBodyBytes: 65_536,\n maxTagsPerTrace: 32,\n maxAttributesPerSpan: 64,\n maxNameLength: 256,\n maxStackBytes: 8_192,\n /** Provider request bodies larger than this are forwarded without capture. */\n maxCapturedRequestBytes: 8 * 1024 * 1024,\n /** Non-streaming provider responses larger than this are recorded by size only. */\n maxCapturedResponseBytes: 8 * 1024 * 1024,\n /** An automatic run waiting for tool results this long is ended as cancelled. */\n autoRunIdleMs: 10 * 60_000,\n /** A run waits this long for provider responses still being read before ending. */\n captureSettleMs: 120_000,\n /** A repeated provider request within this window after a failure is a retry attempt. */\n retryWindowMs: 60_000,\n maxRememberedFailures: 256,\n /** Capture-only grace for chained tool metadata; never delays the provider request. */\n toolMetadataSettleMs: 25,\n /** Bound on exit flushing when the process receives a termination signal. */\n signalFlushMs: 2_000,\n} as const\n","/**\n * Provider route recognition (architecture 09 → HTTP-boundary capture;\n * ADR-015). Both the SDK's `fetch` capture and the API gateway decide what an\n * HTTP request is by its method, path and a few headers, never by the client\n * library that produced it. Nothing here may import Node-only modules.\n */\n\nexport type ProviderApi = \"openai\" | \"anthropic\"\n\nexport type ProviderOperation =\n | \"chat.completions\"\n | \"responses\"\n | \"responses.retrieve\"\n | \"responses.cancel\"\n | \"embeddings\"\n | \"messages\"\n\nexport interface ProviderRoute {\n /** Request/response shape the bodies follow. */\n api: ProviderApi\n /** `gen_ai.system`: the canonical provider, a known compatible host, or the hostname. */\n system: string\n operation: ProviderOperation\n /** Response id for `responses.retrieve` and `responses.cancel`. */\n responseId?: string\n}\n\n/** The parts of a WHATWG URL the matcher reads; the package ships no DOM or Node types. */\nexport interface UrlParts {\n protocol: string\n hostname: string\n port: string\n pathname: string\n}\n\nconst URLConstructor = (\n globalThis as unknown as { URL: new (input: string) => UrlParts }\n).URL\n\nexport interface MatchOptions {\n /** Case-insensitive header lookup; used to recognise Anthropic on other hosts. */\n header?: (name: string) => string | null | undefined\n /** Force the API shape, for the gateway whose path prefix already names it. */\n api?: ProviderApi\n}\n\n/** Hosts whose OpenAI-compatible or Anthropic-compatible endpoints are known by name. */\nconst KNOWN_HOSTS: ReadonlyArray<readonly [test: RegExp, system: string]> = [\n [/^api\\.openai\\.com$/, \"openai\"],\n [/^api\\.anthropic\\.com$/, \"anthropic\"],\n [/\\.openai\\.azure\\.com$/, \"azure_openai\"],\n [/^api\\.groq\\.com$/, \"groq\"],\n [/^api\\.mistral\\.ai$/, \"mistral\"],\n [/^api\\.together\\.xyz$/, \"together\"],\n [/^openrouter\\.ai$/, \"openrouter\"],\n [/^api\\.deepseek\\.com$/, \"deepseek\"],\n [/^api\\.x\\.ai$/, \"xai\"],\n [/^api\\.perplexity\\.ai$/, \"perplexity\"],\n [/^api\\.fireworks\\.ai$/, \"fireworks\"],\n [/^api\\.cerebras\\.ai$/, \"cerebras\"],\n [/^generativelanguage\\.googleapis\\.com$/, \"gemini\"],\n]\n\n/** `gen_ai.system` for a host; unknown hosts keep their hostname so pricing can fall back by model. */\nexport function providerSystem(url: UrlParts): string {\n const host = url.hostname.toLowerCase()\n for (const [test, system] of KNOWN_HOSTS) if (test.test(host)) return system\n if ((host === \"localhost\" || host === \"127.0.0.1\") && url.port === \"11434\")\n return \"ollama\"\n return host\n}\n\nconst RESPONSE_ID = \"[A-Za-z0-9_-]+\"\nconst OPENAI_ROUTES: ReadonlyArray<\n readonly [method: string, pattern: RegExp, operation: ProviderOperation]\n> = [\n [\"POST\", /\\/chat\\/completions$/, \"chat.completions\"],\n [\"POST\", /\\/embeddings$/, \"embeddings\"],\n [\"POST\", /\\/responses$/, \"responses\"],\n [\n \"POST\",\n new RegExp(`/responses/(${RESPONSE_ID})/cancel$`),\n \"responses.cancel\",\n ],\n [\"GET\", new RegExp(`/responses/(${RESPONSE_ID})$`), \"responses.retrieve\"],\n]\n\n/**\n * Recognise a model call. Anthropic's `/messages` is only matched on its own\n * host, with its version header, or when the caller names the API, so an\n * application's unrelated `/messages` endpoint is never captured.\n */\nexport function matchProviderRoute(\n method: string,\n url: string | UrlParts,\n options: MatchOptions = {}\n): ProviderRoute | undefined {\n let parsed: UrlParts\n try {\n parsed = typeof url === \"string\" ? new URLConstructor(url) : url\n } catch {\n return undefined\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\")\n return undefined\n const verb = method.toUpperCase()\n const path = parsed.pathname.replace(/\\/+$/, \"\")\n if (options.api !== \"anthropic\") {\n for (const [routeMethod, pattern, operation] of OPENAI_ROUTES) {\n if (verb !== routeMethod) continue\n const match = pattern.exec(path)\n if (!match) continue\n return {\n api: \"openai\",\n system: providerSystem(parsed),\n operation,\n ...(match[1] ? { responseId: match[1] } : {}),\n }\n }\n }\n if (options.api === \"openai\") return undefined\n if (verb === \"POST\" && /\\/messages$/.test(path)) {\n const anthropic =\n options.api === \"anthropic\" ||\n parsed.hostname.toLowerCase() === \"api.anthropic.com\" ||\n Boolean(options.header?.(\"anthropic-version\"))\n if (anthropic) {\n return {\n api: \"anthropic\",\n system: providerSystem(parsed),\n operation: \"messages\",\n }\n }\n }\n return undefined\n}\n","/**\n * Incremental server-sent-events parser (WHATWG EventSource framing) for\n * provider streams. `push()` accepts decoded text in any chunking and returns\n * the messages completed so far; `end()` returns a trailing message that had\n * no final blank line. Runs in browsers, Node and edge runtimes.\n */\n\nexport interface SseMessage {\n event?: string\n data: string\n}\n\nexport class SseParser {\n private buffer = \"\"\n private event: string | undefined\n private data: string[] = []\n\n push(text: string): SseMessage[] {\n this.buffer += text\n const messages: SseMessage[] = []\n for (;;) {\n const newline = this.buffer.search(/\\r\\n|\\n|\\r/)\n if (newline === -1) break\n const line = this.buffer.slice(0, newline)\n const delimiter = this.buffer.startsWith(\"\\r\\n\", newline) ? 2 : 1\n this.buffer = this.buffer.slice(newline + delimiter)\n const message = this.line(line)\n if (message) messages.push(message)\n }\n return messages\n }\n\n end(): SseMessage[] {\n const messages: SseMessage[] = []\n if (this.buffer.length > 0) {\n const message = this.line(this.buffer)\n this.buffer = \"\"\n if (message) messages.push(message)\n }\n const trailing = this.dispatch()\n if (trailing) messages.push(trailing)\n return messages\n }\n\n private line(line: string): SseMessage | undefined {\n if (line === \"\") return this.dispatch()\n if (line.startsWith(\":\")) return undefined\n const colon = line.indexOf(\":\")\n const field = colon === -1 ? line : line.slice(0, colon)\n let value = colon === -1 ? \"\" : line.slice(colon + 1)\n if (value.startsWith(\" \")) value = value.slice(1)\n if (field === \"data\") this.data.push(value)\n else if (field === \"event\") this.event = value\n return undefined\n }\n\n private dispatch(): SseMessage | undefined {\n if (this.data.length === 0) {\n this.event = undefined\n return undefined\n }\n const message: SseMessage = { data: this.data.join(\"\\n\") }\n if (this.event !== undefined) message.event = this.event\n this.event = undefined\n this.data = []\n return message\n }\n}\n","/**\n * SHA-256 over UTF-8 text, synchronous and runtime-independent, for the\n * conversation fingerprints that give a session the same id in the SDK, the\n * gateway and the log endpoint. Not for secrets: `crypto` modules stay in\n * the API for those.\n */\n\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,\n 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n])\n\nconst encoder = new (\n globalThis as unknown as {\n TextEncoder: new () => { encode(input: string): Uint8Array }\n }\n).TextEncoder()\n\nexport function sha256Hex(text: string): string {\n const input = encoder.encode(text)\n const bitLength = input.length * 8\n const paddedLength = Math.ceil((input.length + 9) / 64) * 64\n const padded = new Uint8Array(paddedLength)\n padded.set(input)\n padded[input.length] = 0x80\n const view = new DataView(padded.buffer)\n view.setUint32(paddedLength - 8, Math.floor(bitLength / 0x100000000))\n view.setUint32(paddedLength - 4, bitLength >>> 0)\n\n const h = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c,\n 0x1f83d9ab, 0x5be0cd19,\n ])\n const w = new Uint32Array(64)\n for (let offset = 0; offset < paddedLength; offset += 64) {\n for (let i = 0; i < 16; i++) w[i] = view.getUint32(offset + i * 4)\n for (let i = 16; i < 64; i++) {\n const w15 = w[i - 15]!\n const w2 = w[i - 2]!\n const s0 = rotr(w15, 7) ^ rotr(w15, 18) ^ (w15 >>> 3)\n const s1 = rotr(w2, 17) ^ rotr(w2, 19) ^ (w2 >>> 10)\n w[i] = (w[i - 16]! + s0 + w[i - 7]! + s1) >>> 0\n }\n let [a, b, c, d, e, f, g, hh] = h as unknown as [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n ]\n for (let i = 0; i < 64; i++) {\n const s1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25)\n const ch = (e & f) ^ (~e & g)\n const t1 = (hh + s1 + ch + K[i]! + w[i]!) >>> 0\n const s0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)\n const maj = (a & b) ^ (a & c) ^ (b & c)\n const t2 = (s0 + maj) >>> 0\n hh = g\n g = f\n f = e\n e = (d + t1) >>> 0\n d = c\n c = b\n b = a\n a = (t1 + t2) >>> 0\n }\n h[0] = (h[0]! + a) >>> 0\n h[1] = (h[1]! + b) >>> 0\n h[2] = (h[2]! + c) >>> 0\n h[3] = (h[3]! + d) >>> 0\n h[4] = (h[4]! + e) >>> 0\n h[5] = (h[5]! + f) >>> 0\n h[6] = (h[6]! + g) >>> 0\n h[7] = (h[7]! + hh) >>> 0\n }\n let hex = \"\"\n for (const word of h) hex += word.toString(16).padStart(8, \"0\")\n return hex\n}\n\nfunction rotr(value: number, bits: number): number {\n return (value >>> bits) | (value << (32 - bits))\n}\n","/**\n * Turns provider request and response bodies into generation span data\n * (architecture 09 → HTTP-boundary capture; ADR-015). The accumulator is\n * span-agnostic so the SDK (in-process `fetch`) and the gateway (proxy) share\n * one interpretation of OpenAI-shaped and Anthropic-shaped traffic, including\n * streams. Bounded: it never retains more than `MAX_CAPTURE_CHARACTERS` of\n * generated text and never throws on an unexpected shape.\n */\n\nimport type { ProviderOperation, ProviderRoute } from \"./capture-routes.js\"\nimport { ATTR } from \"./wire-runtime.js\"\nimport type { Attributes } from \"./wire.js\"\n\nexport type UnknownRecord = Record<string, unknown>\n\nexport function record(value: unknown): UnknownRecord {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as UnknownRecord)\n : {}\n}\n\nexport function list(value: unknown): unknown[] {\n return Array.isArray(value) ? value : []\n}\n\nfunction assign(attributes: Attributes, key: string, value: unknown): void {\n if (typeof value === \"string\") attributes[key] = value\n if (typeof value === \"number\" && Number.isFinite(value))\n attributes[key] = value\n}\n\nfunction boundedJson(value: unknown): string | undefined {\n try {\n const json = JSON.stringify(value)\n return json === undefined ? undefined : json.slice(0, 2_048)\n } catch {\n return undefined\n }\n}\n\nfunction parseJson(value: unknown): unknown {\n if (typeof value !== \"string\") return value\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n}\n\nexport function requestAttributes(\n system: string,\n request: UnknownRecord\n): Attributes {\n const attributes: Attributes = { [ATTR.system]: system }\n assign(attributes, ATTR.requestModel, request.model)\n assign(attributes, ATTR.temperature, request.temperature)\n assign(attributes, ATTR.topP, request.top_p)\n assign(\n attributes,\n ATTR.maxTokens,\n request.max_completion_tokens ??\n request.max_output_tokens ??\n request.max_tokens\n )\n if (Array.isArray(request.tools))\n attributes[ATTR.requestTools] = request.tools.length\n return attributes\n}\n\nexport function responseAttributes(\n api: ProviderRoute[\"api\"],\n response: UnknownRecord\n): Attributes {\n const attributes: Attributes = {}\n const usage = record(response.usage)\n assign(attributes, ATTR.responseModel, response.model)\n const cached =\n usage.cache_read_input_tokens ??\n record(usage.prompt_tokens_details).cached_tokens ??\n record(usage.input_tokens_details).cached_tokens\n // Anthropic reports uncached, cache-read and cache-write input separately.\n const input = usage.input_tokens ?? usage.prompt_tokens\n assign(\n attributes,\n ATTR.inputTokens,\n api === \"anthropic\" && typeof input === \"number\"\n ? input +\n Number(cached ?? 0) +\n Number(usage.cache_creation_input_tokens ?? 0)\n : input\n )\n assign(\n attributes,\n ATTR.outputTokens,\n usage.output_tokens ?? usage.completion_tokens\n )\n assign(attributes, ATTR.cachedInputTokens, cached)\n if (api === \"anthropic\") {\n assign(\n attributes,\n ATTR.cacheCreationInputTokens,\n usage.cache_creation_input_tokens\n )\n const creation = record(usage.cache_creation)\n assign(\n attributes,\n ATTR.cacheCreation5mInputTokens,\n creation.ephemeral_5m_input_tokens\n )\n assign(\n attributes,\n ATTR.cacheCreation1hInputTokens,\n creation.ephemeral_1h_input_tokens\n )\n }\n assign(\n attributes,\n ATTR.reasoningTokens,\n record(usage.output_tokens_details).reasoning_tokens ??\n record(usage.output_tokens_details).thinking_tokens ??\n record(usage.completion_tokens_details).reasoning_tokens\n )\n assign(attributes, ATTR.responseStatus, response.status)\n const serverToolUsage = record(usage.server_tool_use)\n const hostedTools =\n list(response.output).some((item) => {\n const type = record(item).type\n return (\n typeof type === \"string\" &&\n type.endsWith(\"_call\") &&\n type !== \"function_call\" &&\n type !== \"custom_tool_call\"\n )\n }) ||\n list(response.content).some(\n (item) => record(item).type === \"server_tool_use\"\n )\n if (\n hostedTools ||\n Object.values(serverToolUsage).some(\n (count) => typeof count === \"number\" && count > 0\n ) ||\n (typeof response.service_tier === \"string\" &&\n ![\"default\", \"standard\", \"auto\"].includes(response.service_tier))\n )\n attributes[ATTR.pricingIncomplete] = true\n const reasons = list(response.choices)\n .map((choice) => record(choice).finish_reason)\n .filter((reason): reason is string => typeof reason === \"string\")\n if (typeof response.stop_reason === \"string\")\n reasons.push(response.stop_reason)\n if (reasons.length > 0) attributes[ATTR.finishReasons] = reasons.slice(0, 32)\n const toolCalls = extractToolCalls(api, response).length\n if (toolCalls > 0) attributes[ATTR.responseToolCalls] = toolCalls\n return attributes\n}\n\nexport interface ToolCall {\n id: string\n name: string\n arguments: unknown\n}\n\n/** Function/tool calls a complete (non-streaming) response asked the application to run. */\nexport function extractToolCalls(\n api: ProviderRoute[\"api\"],\n response: UnknownRecord\n): ToolCall[] {\n const calls: ToolCall[] = []\n const push = (id: unknown, name: unknown, args: unknown) => {\n if (typeof id !== \"string\" || id.length === 0) return\n calls.push({\n id,\n name: typeof name === \"string\" && name ? name : \"tool\",\n arguments: parseJson(args),\n })\n }\n if (api === \"anthropic\") {\n for (const item of list(response.content)) {\n const block = record(item)\n if (block.type === \"tool_use\") push(block.id, block.name, block.input)\n }\n return calls\n }\n if (response.output !== undefined) {\n for (const item of list(response.output)) {\n const entry = record(item)\n if (entry.type === \"function_call\")\n push(entry.call_id ?? entry.id, entry.name, entry.arguments)\n }\n return calls\n }\n for (const choice of list(response.choices)) {\n const message = record(record(choice).message)\n for (const item of list(message.tool_calls)) {\n const call = record(item)\n const fn = record(call.function)\n push(call.id, fn.name, fn.arguments)\n }\n }\n return calls\n}\n\nexport interface GenerationFailure {\n type: string\n message: string\n stack?: string\n status?: number\n}\n\nexport function isCancellation(error: unknown): boolean {\n return /abort|cancel/i.test(String(record(error).name ?? \"\"))\n}\n\n/** Map a thrown provider error or an HTTP failure onto a stable `error.type`. */\nexport function classifyFailure(error: unknown): GenerationFailure {\n const info = record(error)\n const status = typeof info.status === \"number\" ? info.status : undefined\n const name = String(info.name ?? \"\")\n const type =\n status === 429\n ? \"rate_limit\"\n : status === 408 || /timeout/i.test(name)\n ? \"timeout\"\n : status === 401 || status === 403\n ? \"auth\"\n : status !== undefined && status >= 500\n ? \"provider_error\"\n : status !== undefined && status >= 400 && status <= 422\n ? \"invalid_request\"\n : name || \"provider_error\"\n const message =\n typeof info.message === \"string\" && info.message\n ? info.message\n : error instanceof Error\n ? error.message\n : String(error)\n const failure: GenerationFailure = { type, message }\n if (typeof info.stack === \"string\") failure.stack = info.stack\n if (status !== undefined) failure.status = status\n return failure\n}\n\n/** The error body of a provider `4xx`/`5xx` answer, in either API's envelope. */\nexport function failureFromHttp(\n status: number,\n body: unknown\n): GenerationFailure {\n const error = record(record(body).error)\n const message =\n typeof error.message === \"string\" && error.message\n ? error.message\n : typeof record(body).message === \"string\"\n ? String(record(body).message)\n : `Provider responded with HTTP ${status}`\n return classifyFailure({ status, message })\n}\n\nexport interface GenerationInfo {\n name: string\n kind: \"generation\" | \"embedding\"\n attributes: Attributes\n input: unknown\n messages: unknown\n}\n\nexport function describeGeneration(\n route: ProviderRoute,\n request: unknown\n): GenerationInfo {\n const body = record(request)\n return {\n name: route.operation,\n kind: route.operation === \"embeddings\" ? \"embedding\" : \"generation\",\n attributes: requestAttributes(route.system, body),\n input: request,\n messages: body.messages,\n }\n}\n\nexport type GenerationStatus = \"ok\" | \"error\" | \"cancelled\"\n\nexport interface GenerationResult {\n status: GenerationStatus\n attributes: Attributes\n /** Assembled or complete output; absent when bodies are not captured. */\n output: unknown\n outputBytes: number\n outputTruncated: boolean\n error?: GenerationFailure\n /** A background response still queued or in progress: keep the span open. */\n pending: boolean\n responseId?: string\n toolCalls: ToolCall[]\n}\n\nexport interface AccumulatorOptions {\n captureBodies: boolean\n /** Same clock as `now`; milliseconds. */\n startedAt: number\n now: () => number\n}\n\n// At most 1 MB of UTF-8 text, shared across all choices, blocks and tool arguments.\n// Do not retain the chunk list: a long-running stream must have bounded overhead.\nconst MAX_CAPTURE_CHARACTERS = 262_144\nconst MAX_CAPTURE_PARTS = 32\nconst MAX_TRACKED_CHOICES = 128\nconst MAX_TOOL_CALLS = 256\n\nconst encoder = new (\n globalThis as unknown as {\n TextEncoder: new () => { encode(input: string): Uint8Array }\n }\n).TextEncoder()\n\nexport class GenerationAccumulator {\n private remaining = MAX_CAPTURE_CHARACTERS\n private truncated = false\n private firstTokenAt: number | undefined\n private outputTokens: number | undefined\n private usage: UnknownRecord = {}\n private attributes: Attributes = {}\n private parts = new Map<string, UnknownRecord>()\n private streamedTools = new Map<string, ToolCall>()\n private completeToolCalls: ToolCall[] | undefined\n private finalOutput: unknown\n private failure: GenerationFailure | undefined\n private failureCancelled = false\n private outputBytes = 0\n private pendingResponse = false\n private streaming = false\n private terminal = false\n private sawChatChoice = false\n private untrackedChoices = false\n private openChoices = new Set<number>()\n private responseId: string | undefined\n private readonly operation: ProviderOperation\n private readonly api: ProviderRoute[\"api\"]\n\n constructor(\n route: ProviderRoute,\n private readonly options: AccumulatorOptions\n ) {\n this.api = route.api\n this.operation =\n route.operation === \"responses.retrieve\" ||\n route.operation === \"responses.cancel\"\n ? \"responses\"\n : route.operation\n }\n\n stream(): void {\n this.streaming = true\n }\n\n fail(failure: GenerationFailure, cancelled = false): void {\n this.failure = failure\n this.failureCancelled = cancelled\n }\n\n private take(text: unknown): string {\n if (typeof text !== \"string\") return \"\"\n const retained = text.slice(0, this.remaining)\n this.remaining -= retained.length\n if (retained.length < text.length) this.truncated = true\n return retained\n }\n\n private part(key: string, initial: UnknownRecord): UnknownRecord | undefined {\n if (!this.options.captureBodies) return undefined\n const existing = this.parts.get(key)\n if (existing) return existing\n if (this.parts.size >= MAX_CAPTURE_PARTS) {\n this.truncated = true\n return undefined\n }\n this.parts.set(key, initial)\n return initial\n }\n\n private append(\n part: UnknownRecord | undefined,\n key: string,\n text: unknown\n ): void {\n if (typeof text !== \"string\" || text.length === 0) return\n this.token()\n this.outputBytes = Math.min(\n 2_147_483_647,\n this.outputBytes + encoder.encode(text).length\n )\n if (!part) return\n part[key] = String(part[key] ?? \"\") + this.take(text)\n }\n\n private tool(id: unknown, initial: Partial<ToolCall>): ToolCall | undefined {\n if (typeof id !== \"string\" || id.length === 0) return undefined\n const existing = this.streamedTools.get(id)\n if (existing) return existing\n if (this.streamedTools.size >= MAX_TOOL_CALLS) return undefined\n const call: ToolCall = { id, name: initial.name ?? \"tool\", arguments: \"\" }\n this.streamedTools.set(id, call)\n return call\n }\n\n private appendArguments(call: ToolCall | undefined, delta: unknown): void {\n if (!call || typeof delta !== \"string\") return\n if (typeof call.arguments !== \"string\") call.arguments = \"\"\n if ((call.arguments as string).length < 65_536)\n call.arguments = (call.arguments as string) + delta\n }\n\n private token(): void {\n if (this.firstTokenAt !== undefined) return\n this.firstTokenAt = this.options.now()\n this.attributes[ATTR.timeToFirstTokenMs] = Math.max(\n 0,\n this.firstTokenAt - this.options.startedAt\n )\n }\n\n private response(value: unknown): void {\n const response = record(value)\n if (typeof response.id === \"string\" && response.id)\n this.responseId = response.id\n if (typeof response.status === \"string\")\n this.pendingResponse =\n response.status === \"queued\" || response.status === \"in_progress\"\n // Anthropic's delta counters are cumulative; null means no new value.\n // Retain previous cache counts when only another counter is updated.\n const usage = record(response.usage)\n this.usage = {\n ...this.usage,\n ...Object.fromEntries(\n Object.entries(usage).filter(([, value]) => value != null)\n ),\n }\n const attributes = responseAttributes(this.api, {\n ...response,\n usage: this.usage,\n })\n const output = attributes[ATTR.outputTokens]\n if (typeof output === \"number\") this.outputTokens = output\n Object.assign(this.attributes, attributes)\n }\n\n /** A complete, non-streaming response body (or a background poll result). */\n complete(value: unknown): void {\n this.terminal = true\n this.response(value)\n this.finalOutput = value\n this.completeToolCalls = extractToolCalls(this.api, record(value))\n if (this.operation === \"responses\") {\n const response = record(value)\n if (response.status === \"queued\" || response.status === \"in_progress\")\n return\n this.responseOutcome(response)\n if (response.status === \"cancelled\") this.failureCancelled = true\n }\n }\n\n private responseOutcome(response: UnknownRecord): void {\n this.pendingResponse = false\n if (typeof response.status === \"string\")\n this.attributes[ATTR.responseStatus] = response.status\n if (response.status === \"failed\") {\n const error = record(response.error)\n this.failure = {\n type:\n typeof error.code === \"string\" && error.code\n ? error.code\n : \"provider_error\",\n message:\n typeof error.message === \"string\" && error.message\n ? error.message\n : \"Provider response failed\",\n }\n }\n if (response.status === \"incomplete\") {\n const reason = record(response.incomplete_details).reason\n if (typeof reason === \"string\")\n this.attributes[ATTR.finishReasons] = [reason]\n this.failure = {\n type: \"incomplete_response\",\n message:\n typeof reason === \"string\"\n ? `Provider response incomplete: ${reason}`\n : \"Provider response incomplete\",\n }\n }\n }\n\n /** One decoded streaming event. */\n chunk(value: unknown): void {\n const chunk = record(value)\n if (this.operation === \"chat.completions\") {\n this.response(chunk)\n for (const entry of list(chunk.choices)) {\n const choice = record(entry)\n const delta = record(choice.delta)\n const index = typeof choice.index === \"number\" ? choice.index : 0\n this.sawChatChoice = true\n if (\n Number.isInteger(index) &&\n index >= 0 &&\n index < MAX_TRACKED_CHOICES\n ) {\n if (\n typeof choice.finish_reason === \"string\" &&\n choice.finish_reason.length > 0\n )\n this.openChoices.delete(index)\n else this.openChoices.add(index)\n } else this.untrackedChoices = true\n const part = this.part(`choice:${index}`, { index, role: \"assistant\" })\n this.append(part, \"content\", delta.content)\n this.append(part, \"refusal\", delta.refusal)\n this.append(part, \"reasoning\", delta.reasoning_content)\n for (const item of list(delta.tool_calls)) {\n const tool = record(item)\n const fn = record(tool.function)\n const toolIndex = typeof tool.index === \"number\" ? tool.index : 0\n const key = `tool:${index}:${toolIndex}`\n const call = this.part(key, {\n type: \"function_call\",\n index: toolIndex,\n choice_index: index,\n })\n if (call && typeof tool.id === \"string\") call.id = this.take(tool.id)\n this.append(call, \"name\", fn.name)\n this.append(call, \"arguments\", fn.arguments)\n const tracked =\n this.tool(typeof tool.id === \"string\" ? tool.id : undefined, {\n name: typeof fn.name === \"string\" ? fn.name : undefined,\n }) ?? this.streamedToolAt(key)\n if (tracked) {\n if (typeof tool.id === \"string\")\n this.streamedToolKeys.set(key, tool.id)\n if (typeof fn.name === \"string\" && fn.name) tracked.name = fn.name\n this.appendArguments(tracked, fn.arguments)\n }\n }\n }\n this.terminal =\n this.sawChatChoice &&\n this.openChoices.size === 0 &&\n !this.untrackedChoices\n return\n }\n if (this.operation === \"responses\") {\n if (chunk.response !== undefined) this.response(chunk.response)\n if (\n chunk.type === \"response.output_text.delta\" ||\n chunk.type === \"response.refusal.delta\" ||\n chunk.type === \"response.reasoning_summary_text.delta\"\n ) {\n const index =\n typeof chunk.output_index === \"number\" ? chunk.output_index : 0\n const part = this.part(`${String(chunk.type)}:${index}`, {\n type: chunk.type,\n output_index: index,\n })\n this.append(part, \"text\", chunk.delta)\n }\n if (chunk.type === \"response.function_call_arguments.delta\") {\n const index =\n typeof chunk.output_index === \"number\" ? chunk.output_index : 0\n const part = this.part(`function:${index}`, {\n type: \"function_call\",\n output_index: index,\n })\n this.append(part, \"arguments\", chunk.delta)\n this.appendArguments(\n this.streamedToolAt(`function:${index}`),\n chunk.delta\n )\n }\n if (chunk.type === \"response.output_item.added\") {\n const item = record(chunk.item)\n if (item.type === \"function_call\") {\n const index =\n typeof chunk.output_index === \"number\" ? chunk.output_index : 0\n const part = this.part(`function:${index}`, {\n type: \"function_call\",\n output_index: index,\n })\n if (part) {\n part.name = this.take(item.name)\n part.call_id = this.take(item.call_id)\n }\n const tracked = this.tool(item.call_id ?? item.id, {\n name: typeof item.name === \"string\" ? item.name : undefined,\n })\n if (tracked) {\n this.streamedToolKeys.set(`function:${index}`, tracked.id)\n this.appendArguments(tracked, item.arguments)\n }\n }\n }\n if (\n chunk.type === \"response.completed\" ||\n chunk.type === \"response.incomplete\" ||\n chunk.type === \"response.failed\"\n ) {\n this.terminal = true\n this.finalOutput = chunk.response\n this.completeToolCalls = extractToolCalls(\n this.api,\n record(chunk.response)\n )\n const response = record(chunk.response)\n this.responseOutcome({\n ...response,\n status:\n response.status ?? String(chunk.type).slice(\"response.\".length),\n })\n }\n if (chunk.type === \"error\")\n this.failure = classifyFailure(chunk.error ?? chunk)\n return\n }\n if (chunk.type === \"message_start\") this.response(chunk.message)\n if (chunk.type === \"message_stop\") this.terminal = true\n if (chunk.type === \"message_delta\")\n this.response({ ...record(chunk.delta), usage: chunk.usage })\n if (chunk.type === \"content_block_start\") {\n const block = record(chunk.content_block)\n const index = typeof chunk.index === \"number\" ? chunk.index : 0\n const part = this.part(`block:${index}`, { type: block.type, index })\n if (part) {\n if (typeof block.id === \"string\") part.id = this.take(block.id)\n if (typeof block.name === \"string\") part.name = this.take(block.name)\n if (block.type === \"tool_use\") {\n const input = boundedJson(block.input)\n if (input !== undefined) part.input = parseJson(input)\n }\n }\n if (block.type === \"tool_use\") {\n const tracked = this.tool(block.id, {\n name: typeof block.name === \"string\" ? block.name : undefined,\n })\n if (tracked) this.streamedToolKeys.set(`block:${index}`, tracked.id)\n }\n this.append(part, \"text\", block.text)\n this.append(part, \"thinking\", block.thinking)\n }\n if (chunk.type === \"content_block_delta\") {\n const index = typeof chunk.index === \"number\" ? chunk.index : 0\n const delta = record(chunk.delta)\n const part = this.part(`block:${index}`, { index })\n this.append(part, \"text\", delta.text)\n this.append(part, \"thinking\", delta.thinking)\n this.append(part, \"partial_json\", delta.partial_json)\n this.appendArguments(\n this.streamedToolAt(`block:${index}`),\n delta.partial_json\n )\n }\n if (chunk.type === \"error\")\n this.failure = classifyFailure(chunk.error ?? chunk)\n }\n\n private streamedToolKeys = new Map<string, string>()\n\n private streamedToolAt(key: string): ToolCall | undefined {\n const id = this.streamedToolKeys.get(key)\n return id ? this.streamedTools.get(id) : undefined\n }\n\n /** Complete responses are returned as received; the caller decides what to keep. */\n private output(): unknown {\n if (this.finalOutput !== undefined) return this.finalOutput\n if (!this.options.captureBodies) return undefined\n const output = [...this.parts.values()]\n return this.truncated ? { content: output, truncated: true } : output\n }\n\n private toolCalls(): ToolCall[] {\n if (this.completeToolCalls) return this.completeToolCalls\n return [...this.streamedTools.values()].map((call) => ({\n ...call,\n arguments: parseJson(call.arguments),\n }))\n }\n\n /** The span data for the call so far; `pending` means keep the span open. */\n finish(options: { cancelled?: boolean } = {}): GenerationResult {\n const cancelled =\n options.cancelled === true ||\n this.failureCancelled ||\n this.pendingResponse\n if (\n this.streaming &&\n !this.terminal &&\n !cancelled &&\n this.failure === undefined\n ) {\n this.failure = {\n type: \"incomplete_stream\",\n message: \"Provider stream ended before its terminal event\",\n }\n }\n for (const part of this.parts.values()) {\n if (part.type === \"tool_use\" && typeof part.partial_json === \"string\") {\n try {\n part.input = JSON.parse(part.partial_json)\n } catch {\n /* Partial tool input is still useful on cancellation. */\n }\n }\n }\n const attributes: Attributes = { ...this.attributes }\n if (this.firstTokenAt !== undefined && this.outputTokens !== undefined) {\n const elapsed = (this.options.now() - this.firstTokenAt) / 1_000\n if (elapsed > 0)\n attributes[ATTR.tokensPerSecond] = this.outputTokens / elapsed\n }\n const toolCalls = this.toolCalls()\n if (toolCalls.length > 0)\n attributes[ATTR.responseToolCalls] = toolCalls.length\n if (this.failure) {\n attributes[ATTR.errorType] = this.failure.type\n if (this.failure.status !== undefined)\n attributes[ATTR.errorStatus] = this.failure.status\n }\n const pending =\n this.pendingResponse && this.failure === undefined && !options.cancelled\n const result: GenerationResult = {\n status: this.failure\n ? this.failureCancelled\n ? \"cancelled\"\n : \"error\"\n : cancelled && !pending\n ? \"cancelled\"\n : \"ok\",\n attributes,\n output: this.output(),\n outputBytes: this.outputBytes,\n outputTruncated: this.truncated && this.finalOutput === undefined,\n pending,\n toolCalls,\n }\n if (this.failure) result.error = this.failure\n if (this.responseId) result.responseId = this.responseId\n return result\n }\n}\n","import { list, record } from \"./capture-generation.js\"\n\n/** The current user turn, rather than repeated conversation history, labels an automatic run. */\nexport function providerInput(request: unknown): unknown {\n const body = record(request)\n const messages = list(body.messages)\n const input = body.input\n const candidates = messages.length ? messages : list(input)\n for (let index = candidates.length - 1; index >= 0; index--) {\n const message = record(candidates[index])\n if (message.role !== \"user\") continue\n const blocks = list(message.content)\n // Anthropic sends tool results as user messages; these are not human turns.\n if (\n blocks.length > 0 &&\n blocks.every((block) => record(block).type === \"tool_result\")\n )\n continue\n return message.content\n }\n return input\n}\n\n/** Human-facing provider answer; tool arguments and reasoning stay on the generation span. */\nexport function providerOutput(output: unknown): string | undefined {\n if (typeof output === \"string\") return output || undefined\n const body = record(output)\n const texts: string[] = []\n for (const choice of list(body.choices)) {\n const message = record(record(choice).message)\n const value = message.content ?? message.refusal\n if (typeof value === \"string\" && value) texts.push(value)\n }\n const blocks = Array.isArray(output)\n ? output\n : list(body.content).length\n ? list(body.content)\n : list(body.output)\n for (const value of blocks) {\n const block = record(value)\n if (typeof block.content === \"string\" && block.content)\n texts.push(block.content)\n else if (\n typeof block.text === \"string\" &&\n block.text &&\n block.type !== \"response.reasoning_summary_text.delta\"\n )\n texts.push(block.text)\n else\n for (const child of list(block.content)) {\n const text = record(child)\n if (\n (text.type === \"text\" || text.type === \"output_text\") &&\n typeof text.text === \"string\"\n )\n texts.push(text.text)\n }\n }\n return texts.length ? texts.join(\"\\n\") : undefined\n}\n","/**\n * Conversation linking (architecture 09 → defaults; ADR-015): how a model\n * call joins a session and a run without `setSession()` or `trace()`.\n *\n * - The **fingerprint** of a conversation is the SHA-256 of its system prompt\n * and first user message, which every later turn resends, so all turns of\n * one conversation share a session id in the SDK, the gateway and the log\n * endpoint alike.\n * - A request whose last message is a **tool result** continues the agent\n * loop of the previous call; a request whose last message is a **user\n * message** starts a new run in the same session.\n * - Tool results in the request, paired with the tool calls of the previous\n * response (present in the resent history, or remembered by the linker),\n * become **tool spans** with input, output and, when known, timing.\n */\n\nimport { sha256Hex } from \"./capture-hash.js\"\nimport { list, record, type ToolCall } from \"./capture-generation.js\"\nimport type { ProviderRoute } from \"./capture-routes.js\"\n\nexport interface ToolResult {\n callId: string\n /** Name and arguments when the request history carried the matching call. */\n name?: string\n input?: unknown\n output: unknown\n isError: boolean\n}\n\nexport interface ConversationSignals {\n /** Hex SHA-256 of the conversation's opening; absent for embeddings and empty requests. */\n fingerprint?: string\n /** Conversation id supplied explicitly by the request (OpenAI `conversation`). */\n conversationId?: string\n /** OpenAI Responses chaining; the linker resolves it to the conversation. */\n previousResponseId?: string\n /** End-user id the request carried (`user`, `metadata.user_id`). */\n userId?: string\n /** What the request appends to the conversation. */\n turn: \"user\" | \"tool\" | \"none\"\n toolResults: ToolResult[]\n}\n\nconst FINGERPRINT_TEXT_LIMIT = 8_192\n\nfunction textOf(content: unknown): string {\n if (typeof content === \"string\") return content\n return list(content)\n .map((item) => {\n const block = record(item)\n if (typeof block.text === \"string\") return block.text\n if (typeof block.input_text === \"string\") return block.input_text\n return \"\"\n })\n .join(\"\\n\")\n}\n\nfunction fingerprintOf(system: string, first: string): string | undefined {\n const opening = `${system.slice(0, FINGERPRINT_TEXT_LIMIT)}\\0${first.slice(0, FINGERPRINT_TEXT_LIMIT)}`\n if (opening.length <= 1) return undefined\n return sha256Hex(`tracehatch.conversation.v1\\0${opening}`)\n}\n\nfunction parseJson(value: unknown): unknown {\n if (typeof value !== \"string\") return value\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n}\n\nfunction chatSignals(body: Record<string, unknown>): ConversationSignals {\n const messages = list(body.messages).map((message) => record(message))\n const system = messages\n .filter(\n (message) => message.role === \"system\" || message.role === \"developer\"\n )\n .map((message) => textOf(message.content))\n .join(\"\\n\")\n const firstUser = messages.find((message) => message.role === \"user\")\n const last = messages.at(-1)\n const calls = new Map<string, ToolCall>()\n for (const message of messages) {\n if (message.role !== \"assistant\") continue\n for (const item of list(message.tool_calls)) {\n const call = record(item)\n const fn = record(call.function)\n if (typeof call.id === \"string\")\n calls.set(call.id, {\n id: call.id,\n name: typeof fn.name === \"string\" && fn.name ? fn.name : \"tool\",\n arguments: parseJson(fn.arguments),\n })\n }\n }\n const toolResults: ToolResult[] = []\n // Only the trailing tool results belong to this request's tool step.\n for (let index = messages.length - 1; index >= 0; index--) {\n const message = messages[index]!\n if (message.role !== \"tool\") break\n const callId = message.tool_call_id\n if (typeof callId !== \"string\") continue\n const call = calls.get(callId)\n toolResults.unshift({\n callId,\n ...(call ? { name: call.name, input: call.arguments } : {}),\n output: parseJson(message.content),\n isError: false,\n })\n }\n const signals: ConversationSignals = {\n turn:\n last?.role === \"tool\" ? \"tool\" : last?.role === \"user\" ? \"user\" : \"none\",\n toolResults,\n }\n const fingerprint = firstUser\n ? fingerprintOf(system, textOf(firstUser.content))\n : undefined\n if (fingerprint) signals.fingerprint = fingerprint\n if (typeof body.user === \"string\" && body.user) signals.userId = body.user\n return signals\n}\n\nfunction responsesSignals(body: Record<string, unknown>): ConversationSignals {\n const instructions =\n typeof body.instructions === \"string\" ? body.instructions : \"\"\n const items =\n typeof body.input === \"string\"\n ? [{ role: \"user\", content: body.input, type: \"message\" }]\n : list(body.input).map((item) => record(item))\n const isUserMessage = (item: Record<string, unknown>) =>\n (item.type === undefined || item.type === \"message\") && item.role === \"user\"\n const firstUser = items.find(isUserMessage)\n const last = items.at(-1)\n const calls = new Map<string, ToolCall>()\n for (const item of items) {\n if (item.type !== \"function_call\") continue\n const id = item.call_id ?? item.id\n if (typeof id === \"string\")\n calls.set(id, {\n id,\n name: typeof item.name === \"string\" && item.name ? item.name : \"tool\",\n arguments: parseJson(item.arguments),\n })\n }\n const toolResults: ToolResult[] = []\n for (let index = items.length - 1; index >= 0; index--) {\n const item = items[index]!\n if (item.type !== \"function_call_output\") break\n const callId = item.call_id\n if (typeof callId !== \"string\") continue\n const call = calls.get(callId)\n toolResults.unshift({\n callId,\n ...(call ? { name: call.name, input: call.arguments } : {}),\n output: parseJson(item.output),\n isError: false,\n })\n }\n const signals: ConversationSignals = {\n turn:\n last?.type === \"function_call_output\"\n ? \"tool\"\n : last && isUserMessage(last)\n ? \"user\"\n : \"none\",\n toolResults,\n }\n const conversation =\n typeof body.conversation === \"string\"\n ? body.conversation\n : record(body.conversation).id\n if (typeof conversation === \"string\" && conversation)\n signals.conversationId = conversation\n if (\n typeof body.previous_response_id === \"string\" &&\n body.previous_response_id\n )\n signals.previousResponseId = body.previous_response_id\n const fingerprint = firstUser\n ? fingerprintOf(instructions, textOf(firstUser.content))\n : undefined\n if (fingerprint) signals.fingerprint = fingerprint\n if (typeof body.user === \"string\" && body.user) signals.userId = body.user\n return signals\n}\n\nfunction anthropicSignals(body: Record<string, unknown>): ConversationSignals {\n const messages = list(body.messages).map((message) => record(message))\n const system = textOf(body.system)\n const blocksOf = (message: Record<string, unknown>) =>\n typeof message.content === \"string\"\n ? [{ type: \"text\", text: message.content }]\n : list(message.content).map((block) => record(block))\n const isToolResults = (message: Record<string, unknown>) => {\n const blocks = blocksOf(message)\n return (\n message.role === \"user\" &&\n blocks.length > 0 &&\n blocks.every((block) => block.type === \"tool_result\")\n )\n }\n const firstUser = messages.find(\n (message) => message.role === \"user\" && !isToolResults(message)\n )\n const last = messages.at(-1)\n const calls = new Map<string, ToolCall>()\n for (const message of messages) {\n if (message.role !== \"assistant\") continue\n for (const block of blocksOf(message)) {\n if (block.type === \"tool_use\" && typeof block.id === \"string\")\n calls.set(block.id, {\n id: block.id,\n name:\n typeof block.name === \"string\" && block.name ? block.name : \"tool\",\n arguments: block.input,\n })\n }\n }\n const toolResults: ToolResult[] = []\n if (last && isToolResults(last)) {\n for (const block of blocksOf(last)) {\n const callId = block.tool_use_id\n if (typeof callId !== \"string\") continue\n const call = calls.get(callId)\n toolResults.push({\n callId,\n ...(call ? { name: call.name, input: call.arguments } : {}),\n output:\n typeof block.content === \"string\"\n ? parseJson(block.content)\n : block.content,\n isError: block.is_error === true,\n })\n }\n }\n const signals: ConversationSignals = {\n turn: last\n ? isToolResults(last)\n ? \"tool\"\n : last.role === \"user\"\n ? \"user\"\n : \"none\"\n : \"none\",\n toolResults,\n }\n const fingerprint = firstUser\n ? fingerprintOf(\n system,\n blocksOf(firstUser)\n .map((block) => (typeof block.text === \"string\" ? block.text : \"\"))\n .join(\"\\n\")\n )\n : undefined\n if (fingerprint) signals.fingerprint = fingerprint\n const userId = record(body.metadata).user_id\n if (typeof userId === \"string\" && userId) signals.userId = userId\n return signals\n}\n\nexport function conversationSignals(\n route: ProviderRoute,\n request: unknown\n): ConversationSignals {\n const body = record(request)\n try {\n switch (route.operation) {\n case \"chat.completions\":\n return chatSignals(body)\n case \"responses\":\n return responsesSignals(body)\n case \"messages\":\n return anthropicSignals(body)\n default:\n return { turn: \"none\", toolResults: [] }\n }\n } catch {\n return { turn: \"none\", toolResults: [] }\n }\n}\n\n/** Session id derived from a fingerprint; stable across processes and restarts. */\nexport function autoSessionId(fingerprint: string): string {\n return `auto-${fingerprint.slice(0, 32)}`\n}\n\nexport interface SynthesizedToolSpan {\n callId: string\n name: string\n input: unknown\n output: unknown\n status: \"ok\" | \"error\"\n /** Same clock as the caller's `startedAt`; equal when the timing is unknown. */\n startedAt: number\n endedAt: number\n}\n\nexport interface LinkedRun {\n sessionId?: string\n userId?: string\n /** Continue this open run instead of starting one. */\n traceId?: string\n /** An open run of this conversation that a new user turn has ended. */\n endTraceId?: string\n toolSpans: SynthesizedToolSpan[]\n}\n\nexport interface RunCompletion {\n traceId: string\n responseId?: string\n toolCalls: ToolCall[]\n endedAt: number\n}\n\nexport interface LinkerOptions {\n maxConversations?: number\n /** A tool step arriving later than this starts a new run. */\n turnGapMs?: number\n}\n\ninterface ConversationState {\n sessionId: string | undefined\n openTraceId: string | undefined\n lastEndedAt: number\n lastToolCalls: ToolCall[]\n}\n\nconst DEFAULTS = { maxConversations: 10_000, turnGapMs: 5 * 60_000 }\nconst MAX_RESPONSE_IDS = 50_000\n\n/** Bounded per-process memory of conversations: which run is open and what it last asked for. */\nexport class ConversationLinker {\n private readonly conversations = new Map<string, ConversationState>()\n private readonly responses = new Map<string, string>()\n private readonly options: Required<LinkerOptions>\n\n constructor(options: LinkerOptions = {}) {\n this.options = { ...DEFAULTS, ...options }\n }\n\n private key(signals: ConversationSignals): string | undefined {\n if (signals.conversationId) return `conv:${signals.conversationId}`\n if (signals.previousResponseId) {\n const key = this.responses.get(signals.previousResponseId)\n if (key) return key\n }\n if (signals.fingerprint) return `fp:${signals.fingerprint}`\n return undefined\n }\n\n begin(signals: ConversationSignals, startedAt: number): LinkedRun {\n const run: LinkedRun = { toolSpans: [] }\n if (signals.userId) run.userId = signals.userId\n const key = this.key(signals)\n const state = key ? this.conversations.get(key) : undefined\n const sessionId =\n state?.sessionId ??\n signals.conversationId ??\n (signals.fingerprint ? autoSessionId(signals.fingerprint) : undefined)\n if (sessionId) run.sessionId = sessionId\n if (key && state) {\n // Refresh recency.\n this.conversations.delete(key)\n this.conversations.set(key, state)\n }\n const continues =\n state?.openTraceId !== undefined &&\n signals.turn === \"tool\" &&\n startedAt - state.lastEndedAt <= this.options.turnGapMs\n if (continues) run.traceId = state!.openTraceId\n else if (state?.openTraceId) {\n run.endTraceId = state.openTraceId\n state.openTraceId = undefined\n }\n if (signals.turn === \"tool\") {\n const known = new Map(\n (state?.lastToolCalls ?? []).map((call) => [call.id, call])\n )\n for (const result of signals.toolResults) {\n const call = known.get(result.callId)\n run.toolSpans.push({\n callId: result.callId,\n name: result.name ?? call?.name ?? \"tool\",\n input: result.input ?? call?.arguments,\n output: result.output,\n status: result.isError ? \"error\" : \"ok\",\n startedAt: continues ? state!.lastEndedAt : startedAt,\n endedAt: startedAt,\n })\n }\n }\n return run\n }\n\n /** Remember the finished call; `final` when the response asked for no tools. */\n complete(\n signals: ConversationSignals,\n completion: RunCompletion\n ): { final: boolean } {\n const final = completion.toolCalls.length === 0\n const key = this.key(signals)\n if (!key) return { final }\n const sessionId =\n this.conversations.get(key)?.sessionId ??\n signals.conversationId ??\n (signals.fingerprint ? autoSessionId(signals.fingerprint) : undefined)\n this.conversations.delete(key)\n this.conversations.set(key, {\n sessionId,\n openTraceId: final ? undefined : completion.traceId,\n lastEndedAt: completion.endedAt,\n lastToolCalls: completion.toolCalls,\n })\n while (this.conversations.size > this.options.maxConversations) {\n const oldest = this.conversations.keys().next().value\n if (oldest === undefined) break\n this.conversations.delete(oldest)\n }\n if (completion.responseId) {\n this.responses.delete(completion.responseId)\n this.responses.set(completion.responseId, key)\n while (this.responses.size > MAX_RESPONSE_IDS) {\n const oldest = this.responses.keys().next().value\n if (oldest === undefined) break\n this.responses.delete(oldest)\n }\n }\n return { final }\n }\n\n /** Forget an open run that ended for another reason (timeout, exit, explicit end). */\n release(traceId: string): void {\n for (const state of this.conversations.values())\n if (state.openTraceId === traceId) state.openTraceId = undefined\n }\n}\n","import type { InitOptions } from \"./types.js\"\n\nfunction setting(name: string): string | undefined {\n return process.env[`TRACEHATCH_${name}`]\n}\n\n/** Customer-process configuration; intentionally independent of the Nest API config. */\nexport function environmentDefaults(\n options: InitOptions = {}\n): Pick<InitOptions, \"apiKey\" | \"baseUrl\" | \"release\" | \"agent\"> {\n return {\n apiKey: options.apiKey ?? setting(\"API_KEY\"),\n baseUrl: options.baseUrl ?? setting(\"BASE_URL\"),\n release: options.release ?? setting(\"RELEASE\"),\n agent: options.agent ?? setting(\"AGENT\"),\n }\n}\n\nexport function apiBaseUrl(value: string): string {\n const url = new URL(value)\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password ||\n url.search ||\n url.hash\n ) {\n throw new TypeError(\n \"Tracehatch baseUrl must be an HTTP(S) URL without credentials, query, or fragment\"\n )\n }\n url.pathname = url.pathname.replace(/\\/+$/, \"\") || \"/api/v1\"\n return url.toString().replace(/\\/+$/, \"\")\n}\n\n/** Platforms that freeze or end the process right after a handler returns. */\nexport function isServerlessRuntime(): boolean {\n const env = process.env\n return Boolean(\n env.AWS_LAMBDA_FUNCTION_NAME ||\n env.VERCEL ||\n env.NETLIFY ||\n env.FUNCTIONS_WORKER_RUNTIME ||\n env.CF_PAGES\n )\n}\n","/**\n * Identifiers (ADR-003): every entity id is a UUIDv7 stored in a `uuid`\n * column and rendered on the wire as `prefix_` + 26 lowercase Crockford\n * base32 characters (the ULID alphabet), e.g. `run_01j9xk3m4np6q7r8s9t0v1w2x3`.\n *\n * Runs in browsers, Node and edge runtimes: no Node `crypto` import, only\n * `globalThis.crypto.getRandomValues`.\n */\n\nexport const ID_PREFIXES = {\n trace: \"run\",\n span: \"span\",\n session: \"sess\",\n authSession: \"asn\",\n user: \"usr\",\n workspace: \"ws\",\n project: \"proj\",\n environment: \"env\",\n apiKey: \"key\",\n agent: \"agnt\",\n alertEvent: \"alrt\",\n alertRule: \"rule\",\n endUser: \"eusr\",\n channel: \"chan\",\n webhook: \"whk\",\n delivery: \"dlv\",\n event: \"evt\",\n dataJob: \"job\",\n batch: \"bat\",\n release: \"rel\",\n savedView: \"view\",\n shareLink: \"shr\",\n score: \"scr\",\n annotation: \"ann\",\n budget: \"bud\",\n token: \"tok\",\n} as const\n\nexport type IdPrefix = (typeof ID_PREFIXES)[keyof typeof ID_PREFIXES]\nexport type Id<P extends string = IdPrefix> = `${P}_${string}`\n\n/** Lowercase Crockford base32: digits and letters without i, l, o, u. */\nconst ALPHABET = \"0123456789abcdefghjkmnpqrstvwxyz\"\nconst ID_BODY_LENGTH = 26\nconst ID_PATTERN = /^[0-7][0-9a-hjkmnp-tv-z]{25}$/\n\nconst DECODE = new Map<string, number>()\nfor (let i = 0; i < ALPHABET.length; i++) {\n DECODE.set(ALPHABET[i]!, i)\n}\n\nexport class InvalidIdError extends Error {\n constructor(\n message: string,\n public readonly value: string\n ) {\n super(message)\n this.name = \"InvalidIdError\"\n }\n}\n\ninterface RandomSource {\n getRandomValues<T extends ArrayBufferView>(array: T): T\n}\n\nfunction randomBytes(length: number): Uint8Array {\n const source = (globalThis as unknown as { crypto?: RandomSource }).crypto\n if (!source) {\n throw new Error(\"Web Crypto is not available in this runtime\")\n }\n const bytes = new Uint8Array(length)\n source.getRandomValues(bytes)\n return bytes\n}\n\n/**\n * Encodes bytes as Crockford base32, most significant bits first, padded\n * with leading zero bits so lexical order follows numeric order (as ULID\n * does for its 128 bits).\n */\nexport function encodeCrockford(bytes: Uint8Array): string {\n let value = 0n\n for (const byte of bytes) {\n value = (value << 8n) | BigInt(byte)\n }\n const length = Math.ceil((bytes.length * 8) / 5)\n const chars = new Array<string>(length)\n for (let i = length - 1; i >= 0; i--) {\n chars[i] = ALPHABET[Number(value & 31n)]!\n value >>= 5n\n }\n return chars.join(\"\")\n}\n\n/** Inverse of `encodeCrockford`; `byteLength` is the expected size. */\nexport function decodeCrockford(text: string, byteLength: number): Uint8Array {\n const expectedLength = Math.ceil((byteLength * 8) / 5)\n if (text.length !== expectedLength) {\n throw new InvalidIdError(\n `expected ${expectedLength} base32 characters, got ${text.length}`,\n text\n )\n }\n let value = 0n\n for (const char of text) {\n const digit = DECODE.get(char)\n if (digit === undefined) {\n throw new InvalidIdError(`invalid base32 character \"${char}\"`, text)\n }\n value = (value << 5n) | BigInt(digit)\n }\n const bytes = new Uint8Array(byteLength)\n for (let i = byteLength - 1; i >= 0; i--) {\n bytes[i] = Number(value & 255n)\n value >>= 8n\n }\n if (value !== 0n) {\n throw new InvalidIdError(\"value does not fit in the expected size\", text)\n }\n return bytes\n}\n\n/** 16 bytes of a UUIDv7: 48-bit ms timestamp, version 7, variant 10, random. */\nexport function uuidV7Bytes(now: number = Date.now()): Uint8Array {\n const bytes = randomBytes(16)\n const ms = BigInt(Math.max(0, Math.floor(now)))\n for (let i = 5; i >= 0; i--) {\n bytes[i] = Number((ms >> BigInt(8 * (5 - i))) & 255n)\n }\n bytes[6] = (bytes[6]! & 0x0f) | 0x70\n bytes[8] = (bytes[8]! & 0x3f) | 0x80\n return bytes\n}\n\nfunction bytesToUuid(bytes: Uint8Array): string {\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\")\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`\n}\n\nconst UUID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\nfunction uuidToBytes(uuid: string): Uint8Array {\n if (!UUID_PATTERN.test(uuid)) {\n throw new InvalidIdError(\"not a canonical uuid\", uuid)\n }\n const hex = uuid.replaceAll(\"-\", \"\").toLowerCase()\n const bytes = new Uint8Array(16)\n for (let i = 0; i < 16; i++) {\n bytes[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16)\n }\n return bytes\n}\n\n/** A fresh UUIDv7 in canonical form (for `uuid` columns without a prefix). */\nexport function newUuid(now?: number): string {\n return bytesToUuid(uuidV7Bytes(now))\n}\n\n/** `prefix_` + 26 characters for a new UUIDv7. */\nexport function newId<P extends string>(prefix: P, now?: number): Id<P> {\n return `${prefix}_${encodeCrockford(uuidV7Bytes(now))}`\n}\n\n/** Renders a stored uuid as the wire id for `prefix`. */\nexport function uuidToId<P extends string>(uuid: string, prefix: P): Id<P> {\n return `${prefix}_${encodeCrockford(uuidToBytes(uuid))}`\n}\n\nexport interface ParsedId<P extends string = string> {\n prefix: P\n /** Canonical uuid for the database. */\n uuid: string\n /** The 26-character body without the prefix. */\n body: string\n}\n\n/**\n * Validates a wire id and returns its parts. Throws `InvalidIdError` when\n * the prefix or the body is wrong (a route maps that to `validation_failed`).\n */\nexport function parseId<P extends string>(id: string, prefix: P): ParsedId<P> {\n if (typeof id !== \"string\") {\n throw new InvalidIdError(\"id must be a string\", String(id))\n }\n const separator = id.lastIndexOf(\"_\")\n if (separator === -1) {\n throw new InvalidIdError(\"id has no prefix\", id)\n }\n const actualPrefix = id.slice(0, separator)\n const body = id.slice(separator + 1)\n if (actualPrefix !== prefix) {\n throw new InvalidIdError(`expected a ${prefix}_ id`, id)\n }\n if (body.length !== ID_BODY_LENGTH || !ID_PATTERN.test(body)) {\n throw new InvalidIdError(\"id body is not 26 base32 characters\", id)\n }\n return { prefix, uuid: bytesToUuid(decodeCrockford(body, 16)), body }\n}\n\n/** `parseId` without throwing. */\nexport function isId<P extends string>(\n value: unknown,\n prefix: P\n): value is Id<P> {\n if (typeof value !== \"string\") return false\n try {\n parseId(value, prefix)\n return true\n } catch {\n return false\n }\n}\n\n/** Database form of a wire id. */\nexport function idToUuid<P extends string>(id: string, prefix: P): string {\n return parseId(id, prefix).uuid\n}\n\n/** Milliseconds since the epoch encoded in the id (its creation time). */\nexport function idTimestamp(id: string): number {\n const separator = id.lastIndexOf(\"_\")\n const bytes = decodeCrockford(id.slice(separator + 1), 16)\n let ms = 0n\n for (let i = 0; i < 6; i++) {\n ms = (ms << 8n) | BigInt(bytes[i]!)\n }\n return Number(ms)\n}\n\n/**\n * Short form for the UI: the prefix and the last six characters\n * (`run_v1w2x3`). The only place ids are shortened.\n */\nexport function displayId(id: string, chars = 6): string {\n const separator = id.lastIndexOf(\"_\")\n if (separator === -1) return id\n return `${id.slice(0, separator)}_${id.slice(-chars)}`\n}\n","import { randomBytes } from \"node:crypto\"\nimport { encodeCrockford } from \"@tracehatch/shared/ids\"\n\n/** Node 18 does not expose global Web Crypto in every invocation mode. */\nexport function newId<P extends string>(prefix: P): `${P}_${string}` {\n const bytes = randomBytes(16)\n bytes.writeUIntBE(Date.now(), 0, 6)\n bytes[6] = (bytes[6]! & 0x0f) | 0x70\n bytes[8] = (bytes[8]! & 0x3f) | 0x80\n return `${prefix}_${encodeCrockford(bytes)}`\n}\n","/** Platform-neutral redaction, also bundled into the SDK. */\nexport interface RedactionOptions {\n /** Built-in detectors and credential-key filtering are enabled by default. */\n builtIns?: boolean\n /** Additional expressions are applied globally without mutating their lastIndex. */\n rules?: readonly { name: string; pattern: RegExp }[]\n}\n\ntype Rule = {\n name: string\n pattern: RegExp\n accepts?: (match: string) => boolean\n}\n\nconst SECRET_KEY =\n /(?:authorization|proxyauthorization|apikey|x[a-z0-9]+key|password|passwd|secret|accesstoken|refreshtoken|authtoken|clientsecret|privatekey|credential|cookie|setcookie|token)$/i\nconst MARKER = /\\[REDACTED:[\\w.-]+\\]/g\nconst MAX_DEPTH = 32\nconst MAX_NODES = 50_000\n\nfunction isCard(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\")\n if (digits.length < 13 || digits.length > 19 || /^(\\d)\\1+$/.test(digits)) {\n return false\n }\n let sum = 0\n let double = false\n for (let index = digits.length - 1; index >= 0; index--) {\n let digit = Number(digits[index])\n if (double) {\n digit *= 2\n if (digit > 9) digit -= 9\n }\n sum += digit\n double = !double\n }\n return sum % 10 === 0\n}\n\nconst BUILT_INS: readonly Rule[] = [\n {\n name: \"secret\",\n pattern:\n /\\b(?:sk-(?:proj-|ant-api\\d{2}-)?[A-Za-z0-9_-]{12,}|(?:gh[pousr]_|github_pat_)[A-Za-z0-9_]{16,}|AKIA[A-Z0-9]{16}|[a-z][a-z0-9]{1,15}_(?:live|test|pat)_[A-Za-z0-9_-]{12,}|eyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+)\\b|\\bBearer\\s+[A-Za-z0-9._~+/-]+=*|\\b(?:api[_-]?key|password|passwd|client[_-]?secret|access[_-]?token|refresh[_-]?token)\\s*[:=]\\s*[\"']?[^\\s,\"';}]+/gi,\n },\n {\n name: \"email\",\n pattern: /\\b[A-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[A-Z0-9-]+(?:\\.[A-Z0-9-]+)+\\b/gi,\n },\n {\n name: \"iban\",\n pattern: /\\b[A-Z]{2}\\d{2}(?: ?[A-Z0-9]){11,30}\\b/g,\n },\n {\n name: \"card\",\n pattern: /(?<![\\w])\\d(?:[ -]?\\d){12,18}(?![\\w])/g,\n accepts: isCard,\n },\n {\n name: \"phone\",\n pattern:\n /(?<![\\w])(?:\\+\\d{1,3}[ .-]?)?(?:\\(\\d{2,4}\\)|\\d{2,4})[ .-]?\\d{3,4}[ .-]?\\d{3,4}(?![\\w])/g,\n accepts: (match) => {\n const length = match.replace(/\\D/g, \"\").length\n return length >= 10 && length <= 15\n },\n },\n]\n\n/**\n * Return an independent, JSON-safe snapshot with sensitive strings replaced.\n * Accessors and toJSON hooks are never invoked. Cycles, proxies that throw,\n * deeply nested data and non-JSON primitives cannot break the calling app.\n */\nexport function redact(\n value: unknown,\n options: RedactionOptions = {}\n): { value: unknown; counts: Record<string, number> } {\n const counts: Record<string, number> = Object.create(null)\n const ancestors = new WeakSet<object>()\n let nodes = 0\n let builtIns = true\n const rules: Rule[] = []\n try {\n builtIns = options.builtIns !== false\n if (builtIns) rules.push(...BUILT_INS)\n for (const rule of options.rules ?? []) {\n if (!/^[\\w.-]{1,64}$/.test(rule.name)) continue\n const flags = rule.pattern.flags.replace(/[gy]/g, \"\") + \"g\"\n rules.push({\n name: rule.name,\n pattern: new RegExp(rule.pattern.source, flags),\n })\n }\n } catch {\n // Malformed options must retain the default protection.\n if (rules.length === 0) rules.push(...BUILT_INS)\n }\n\n function replacement(name: string): string {\n counts[name] = (counts[name] ?? 0) + 1\n return `[REDACTED:${name}]`\n }\n\n function text(value: string): string {\n for (const rule of rules) {\n // Existing redaction markers survive custom rules and repeated snapshots.\n value = value\n .split(/(\\[REDACTED:[\\w.-]+\\])/g)\n .map((part) => {\n MARKER.lastIndex = 0\n if (MARKER.test(part)) return part\n return part.replace(rule.pattern, (match) =>\n rule.accepts && !rule.accepts(match)\n ? match\n : replacement(rule.name)\n )\n })\n .join(\"\")\n }\n return value\n }\n\n function visit(input: unknown, depth: number): unknown {\n nodes++\n if (nodes > MAX_NODES || depth > MAX_DEPTH) return \"[Truncated]\"\n if (typeof input === \"string\") return text(input)\n if (typeof input === \"bigint\") return text(input.toString())\n if (typeof input === \"number\") return Number.isFinite(input) ? input : null\n if (input === null || typeof input === \"boolean\") return input\n if (typeof input === \"undefined\") return null\n if (typeof input !== \"object\") return `[${typeof input}]`\n if (ancestors.has(input)) return \"[Circular]\"\n ancestors.add(input)\n try {\n if (input instanceof Date) {\n const timestamp = Date.prototype.getTime.call(input)\n return Number.isFinite(timestamp)\n ? Date.prototype.toISOString.call(input)\n : null\n }\n const descriptors = Object.getOwnPropertyDescriptors(input)\n if (Array.isArray(input)) {\n const result: unknown[] = []\n const originalLength = Number(descriptors.length?.value ?? 0)\n const length = Math.min(originalLength, MAX_NODES - nodes)\n for (let index = 0; index < length; index++) {\n const descriptor = descriptors[String(index)]\n result.push(\n descriptor && \"value\" in descriptor\n ? visit(descriptor.value, depth + 1)\n : null\n )\n if (nodes >= MAX_NODES) break\n }\n if (result.length < originalLength) result.push(\"[Truncated]\")\n return result\n }\n const result: Record<string, unknown> = Object.create(null)\n for (const [key, descriptor] of Object.entries(descriptors)) {\n if (!descriptor.enumerable) continue\n if (nodes >= MAX_NODES) break\n const safeKey = text(key)\n result[safeKey] =\n builtIns && SECRET_KEY.test(key.replace(/[^a-z0-9]/gi, \"\"))\n ? replacement(\"secret\")\n : \"value\" in descriptor\n ? visit(descriptor.value, depth + 1)\n : \"[Getter]\"\n }\n return result\n } catch {\n return \"[Unserializable]\"\n } finally {\n ancestors.delete(input)\n }\n }\n\n try {\n return { value: visit(value, 0), counts }\n } catch {\n // User-supplied regex objects may also throw; never send the unsafe original.\n return { value: \"[Unserializable]\", counts }\n }\n}\n","import { Buffer } from \"node:buffer\"\nimport { createHash } from \"node:crypto\"\n\nimport { redact, type RedactionOptions } from \"@tracehatch/shared/redaction\"\nimport {\n ATTR,\n COUNT_ATTRIBUTES,\n WIRE_LIMITS,\n SCORE_ID_PATTERN,\n SPAN_ID_PATTERN,\n type Attributes,\n type AttributeValue,\n type SpanEventWire,\n type SpanWire,\n type TraceEnvelopeWire,\n type WireScore,\n} from \"@tracehatch/shared/wire\"\n\nimport { sdkConfig } from \"./config.js\"\nimport { state } from \"./context.js\"\n\ninterface SerializationOptions {\n captureBodies: boolean\n redact: false | RedactionOptions\n}\n\n/** Read user fields without running accessors, including on a throwing Proxy. */\nfunction own(value: unknown, key: string): unknown {\n if (value === null || typeof value !== \"object\") return undefined\n try {\n const descriptor = Object.getOwnPropertyDescriptor(value, key)\n return descriptor && \"value\" in descriptor ? descriptor.value : undefined\n } catch {\n return undefined\n }\n}\n\nfunction clean(value: unknown, options: SerializationOptions): unknown {\n return redact(\n value,\n options.redact === false ? { builtIns: false } : options.redact\n ).value\n}\n\nfunction json(value: unknown): string {\n return JSON.stringify(value) ?? \"null\"\n}\n\nfunction bytes(value: unknown): number {\n if (value === null || value === undefined) return 0\n return Buffer.byteLength(typeof value === \"string\" ? value : json(value))\n}\n\n/** Cut only at UTF-8 boundaries, including when the input has astral characters. */\nfunction prefix(buffer: Buffer, limit: number): string {\n let end = Math.max(0, Math.min(limit, buffer.length))\n while (end > 0 && end < buffer.length && (buffer[end]! & 0xc0) === 0x80) end--\n return buffer.subarray(0, end).toString(\"utf8\")\n}\n\nfunction suffix(buffer: Buffer, limit: number): string {\n let start = Math.max(0, buffer.length - limit)\n while (start < buffer.length && (buffer[start]! & 0xc0) === 0x80) start++\n return buffer.subarray(start).toString(\"utf8\")\n}\n\nfunction boundedText(value: string, maxBytes: number): string {\n const encoded = Buffer.from(value)\n if (encoded.length <= maxBytes) return value\n return prefix(encoded, maxBytes)\n}\n\nfunction body(value: unknown, limit: number): unknown {\n if (bytes(value) <= limit) return value\n const encoded = Buffer.from(typeof value === \"string\" ? value : json(value))\n const marker = `…[truncated ${encoded.length} B]…`\n const remaining = Math.max(0, limit - Buffer.byteLength(marker))\n const head = Math.floor(remaining * 0.75)\n return prefix(encoded, head) + marker + suffix(encoded, remaining - head)\n}\n\nfunction text(\n value: unknown,\n limit: number,\n options: SerializationOptions,\n fallback = \"\"\n): string {\n const safe = typeof value === \"string\" ? clean(value, options) : fallback\n const truncated = String(safe).slice(0, limit)\n // Avoid leaving an unpaired surrogate when a name ends at the character limit.\n return /[\\uD800-\\uDBFF]$/.test(truncated) ? truncated.slice(0, -1) : truncated\n}\n\n/** Fixed redaction markers and truncated prefixes cannot serve as identity keys. */\nfunction serializeIdentifier(\n value: unknown,\n domain: \"session\" | \"user\",\n limit: number,\n options: SerializationOptions\n): string {\n if (typeof value !== \"string\") return \"\"\n const safe = text(value, limit, options)\n if (safe === value) return value\n const digest = createHash(\"sha256\")\n .update(`tracehatch.sdk.identifier.v1\\0${domain}\\0`)\n // JSON preserves distinct unpaired surrogates, unlike UTF-8 replacement.\n .update(JSON.stringify(value))\n .digest(\"hex\")\n return `redacted-${domain}-${digest}`\n}\n\n/** Options can be mutated by callers; trust only the exact rule contents. */\nfunction identityPolicy(options: SerializationOptions): string | symbol {\n if (options.redact === false) return \"disabled\"\n try {\n return JSON.stringify([\n options.redact.builtIns !== false,\n ...(options.redact.rules ?? []).map(({ name, pattern }) => [\n name,\n pattern.source,\n pattern.flags.replace(/[gy]/g, \"\"),\n ]),\n ])\n } catch {\n return Symbol(\"invalid redaction policy\")\n }\n}\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined\n}\n\n/** Keep compact attributes, reserving room for the existing truncation flag. */\nexport function serializeAttributes(\n value: unknown,\n options: SerializationOptions\n): Attributes | undefined {\n const source = record(clean(value, options))\n if (!source) return undefined\n const result: Attributes = Object.create(null)\n let truncated = false\n for (const [rawKey, rawValue] of Object.entries(source)) {\n const key = rawKey.slice(0, WIRE_LIMITS.maxAttributeKeyLength)\n if (!key) continue\n if (\n COUNT_ATTRIBUTES.includes(key) &&\n typeof rawValue === \"number\" &&\n (!Number.isFinite(rawValue) ||\n rawValue < 0 ||\n rawValue > WIRE_LIMITS.maxCount)\n ) {\n // Omit invalid measurements so one span cannot poison healthy batch siblings.\n if (key !== ATTR.timeToFirstTokenMs) result[ATTR.pricingIncomplete] = true\n continue\n }\n let value: AttributeValue\n if (typeof rawValue === \"string\" || typeof rawValue === \"boolean\") {\n value = rawValue\n } else if (typeof rawValue === \"number\" && Number.isFinite(rawValue)) {\n value = rawValue\n } else if (\n Array.isArray(rawValue) &&\n rawValue.every((item) => typeof item === \"string\")\n ) {\n value = rawValue\n } else {\n value = json(rawValue)\n }\n if (Object.keys(result).length >= WIRE_LIMITS.maxAttributesPerSpan) {\n truncated = true\n break\n }\n const candidate = { ...result, [key]: value }\n if (bytes(candidate) > WIRE_LIMITS.maxAttributesObjectBytes) {\n truncated = true\n continue\n }\n if (rawKey !== key) truncated = true\n result[key] = value\n }\n if (truncated) {\n result[ATTR.attributesTruncated] = true\n while (\n Object.keys(result).length > WIRE_LIMITS.maxAttributesPerSpan ||\n bytes(result) > WIRE_LIMITS.maxAttributesObjectBytes\n ) {\n const key = Object.keys(result)\n .reverse()\n .find((key) => key !== ATTR.attributesTruncated)\n if (!key) break\n delete result[key]\n }\n }\n return result\n}\n\nfunction metadata(\n value: unknown,\n options: SerializationOptions\n): Record<string, unknown> | undefined {\n const source = record(clean(value, options))\n if (!source) return undefined\n const result: Record<string, unknown> = Object.create(null)\n for (const [key, value] of Object.entries(source)) {\n if (bytes({ ...result, [key]: value }) <= WIRE_LIMITS.maxMetadataBytes) {\n result[key] = value\n }\n }\n return result\n}\n\nexport function serializeEvents(\n value: unknown,\n options: SerializationOptions\n): SpanEventWire[] | undefined {\n // Sanitize fields separately so custom patterns cannot alter timestamps.\n let length: number\n try {\n if (!Array.isArray(value)) return undefined\n length = Math.min(value.length, WIRE_LIMITS.maxEventsPerSpan)\n } catch {\n return undefined\n }\n const result: SpanEventWire[] = []\n for (let index = 0; index < length; index++) {\n const event = own(value, String(index))\n const ts = own(event, \"ts\")\n if (typeof ts !== \"string\" || !Number.isFinite(Date.parse(ts))) continue\n const level = own(event, \"level\")\n result.push({\n ts: new Date(ts).toISOString(),\n level:\n level === \"debug\" || level === \"warn\" || level === \"error\"\n ? level\n : \"info\",\n name:\n text(own(event, \"name\"), WIRE_LIMITS.maxNameLength, options, \"event\") ||\n \"event\",\n attributes: serializeAttributes(own(event, \"attributes\"), options),\n })\n }\n return result\n}\n\n/** Serialize an ended span before it can enter the exporter queue. */\nexport function serializeSpan(\n span: SpanWire,\n options: SerializationOptions\n): SpanWire {\n const result: SpanWire = {\n id: span.id,\n trace_id: span.trace_id,\n parent_id: span.parent_id,\n name:\n text(own(span, \"name\"), WIRE_LIMITS.maxNameLength, options, \"span\") ||\n \"span\",\n kind: span.kind,\n status: span.status,\n started_at: span.started_at,\n ended_at: span.ended_at,\n attempt: Math.max(1, Math.min(1_000, Math.floor(span.attempt) || 1)),\n attributes: serializeAttributes(own(span, \"attributes\"), options),\n events: serializeEvents(own(span, \"events\"), options),\n }\n const error = own(span, \"error\")\n if (error !== undefined) {\n result.error = {}\n const type = own(error, \"type\")\n const message = own(error, \"message\")\n const stack = own(error, \"stack\")\n if (typeof type === \"string\") {\n result.error.type = text(type, WIRE_LIMITS.maxErrorTypeLength, options)\n }\n if (typeof message === \"string\") {\n result.error.message = boundedText(\n String(clean(message, options)),\n WIRE_LIMITS.maxErrorMessageBytes\n )\n }\n if (typeof stack === \"string\") {\n result.error.stack = boundedText(\n String(clean(stack, options)),\n sdkConfig.maxStackBytes\n )\n }\n }\n for (const field of [\"input\", \"output\", \"messages\"] as const) {\n const original = own(span, field)\n const sizeField = `${field}_bytes` as const\n const truncatedField = `${field}_truncated` as const\n const previousSize = own(span, sizeField)\n const knownSize =\n typeof previousSize === \"number\" &&\n Number.isSafeInteger(previousSize) &&\n previousSize >= 0\n ? Math.min(previousSize, WIRE_LIMITS.maxCount)\n : undefined\n if (original !== undefined) {\n result[sizeField] =\n knownSize ??\n Math.min(\n WIRE_LIMITS.maxCount,\n bytes(clean(original, { ...options, redact: false }))\n )\n if (options.captureBodies) {\n const safe = clean(original, options)\n result[field] = body(safe, WIRE_LIMITS.maxAttributeBytes)\n if (\n own(span, truncatedField) === true ||\n bytes(safe) > WIRE_LIMITS.maxAttributeBytes\n )\n result[truncatedField] = true\n }\n } else {\n if (knownSize !== undefined) result[sizeField] = knownSize\n if (options.captureBodies && own(span, truncatedField) === true)\n result[truncatedField] = true\n }\n }\n return result\n}\n\n/** Scores accept primitive values only; accessors never execute during recording. */\nexport function serializeScore(\n id: string,\n value: unknown,\n options: SerializationOptions,\n spanField: \"span_id\" | \"spanId\" = \"span_id\"\n): WireScore | undefined {\n if (!SCORE_ID_PATTERN.test(id)) return undefined\n const name = text(\n own(value, \"name\"),\n WIRE_LIMITS.maxScoreNameLength,\n options\n ).trim()\n const rawValue = own(value, \"value\")\n const scoreValue =\n typeof rawValue === \"string\"\n ? text(rawValue, WIRE_LIMITS.maxScoreValueLength, options).trim()\n : rawValue\n if (\n !name ||\n !(\n (typeof scoreValue === \"number\" && Number.isFinite(scoreValue)) ||\n (typeof scoreValue === \"string\" && scoreValue.length > 0)\n )\n )\n return undefined\n const spanId = own(value, spanField)\n if (\n spanId !== undefined &&\n (typeof spanId !== \"string\" || !SPAN_ID_PATTERN.test(spanId))\n )\n return undefined\n const result: WireScore = { id, name, value: scoreValue }\n if (typeof spanId === \"string\") result.span_id = spanId\n const comment = own(value, \"comment\")\n if (comment !== undefined && typeof comment !== \"string\") return undefined\n if (typeof comment === \"string\")\n result.comment = text(comment, WIRE_LIMITS.maxScoreCommentLength, options)\n return result\n}\n\n/** Serialize a trace snapshot; linkage and clock fields are internal SDK data. */\nexport function serializeTrace(\n trace: TraceEnvelopeWire,\n options: SerializationOptions\n): TraceEnvelopeWire {\n const identities = (state.serializedTraceIdentities ??= new WeakMap())\n const previous = identities.get(trace)\n const policy = identityPolicy(options)\n const samePolicy = previous?.policy === policy\n const result: TraceEnvelopeWire = {\n id: trace.id,\n name:\n text(own(trace, \"name\"), WIRE_LIMITS.maxNameLength, options, \"trace\") ||\n \"trace\",\n started_at: trace.started_at,\n ended_at: trace.ended_at,\n status: trace.status,\n root_span_id: trace.root_span_id,\n ...(trace.expected_span_count !== undefined\n ? { expected_span_count: trace.expected_span_count }\n : {}),\n }\n for (const [field, limit] of [\n [\"agent\", WIRE_LIMITS.maxAgentLength],\n [\"release\", WIRE_LIMITS.maxReleaseLength],\n ] as const) {\n const value = text(own(trace, field), limit, options)\n if (value) result[field] = value\n }\n const rawSessionId = own(trace, \"session_id\")\n const sessionId =\n samePolicy && previous?.sessionId === rawSessionId\n ? previous.sessionId\n : serializeIdentifier(\n rawSessionId,\n \"session\",\n WIRE_LIMITS.maxSessionIdLength,\n options\n )\n if (sessionId) result.session_id = sessionId\n const user = own(trace, \"user\")\n const rawUserId = own(user, \"id\")\n const userId =\n samePolicy && previous?.userId === rawUserId\n ? previous.userId\n : serializeIdentifier(\n rawUserId,\n \"user\",\n WIRE_LIMITS.maxUserIdLength,\n options\n )\n if (userId) {\n result.user = { id: userId }\n const name = own(user, \"name\")\n const email = own(user, \"email\")\n if (typeof name === \"string\")\n result.user.name = text(name, WIRE_LIMITS.maxUserNameLength, options)\n if (typeof email === \"string\") result.user.email = text(email, 320, options)\n }\n const tags = clean(own(trace, \"tags\"), options)\n if (Array.isArray(tags)) {\n result.tags = [\n ...new Set(\n tags\n .filter((tag): tag is string => typeof tag === \"string\")\n .map((tag) => tag.slice(0, WIRE_LIMITS.maxTagLength))\n .filter(Boolean)\n ),\n ].slice(0, WIRE_LIMITS.maxTagsPerTrace)\n }\n result.metadata = metadata(own(trace, \"metadata\"), options)\n const scores = own(trace, \"scores\")\n if (Array.isArray(scores)) {\n result.scores = []\n for (\n let index = 0;\n index < Math.min(scores.length, WIRE_LIMITS.maxScoresPerTrace);\n index++\n ) {\n const raw = own(scores, String(index))\n const id = own(raw, \"id\")\n const score =\n typeof id === \"string\" ? serializeScore(id, raw, options) : undefined\n if (score) result.scores.push(score)\n }\n }\n if (options.captureBodies) {\n for (const field of [\"input\", \"output\"] as const) {\n const value = own(trace, field)\n if (value !== undefined)\n result[field] = body(clean(value, options), WIRE_LIMITS.traceBodyBytes)\n }\n }\n identities.set(result, { policy, sessionId, userId })\n return result\n}\n","import {\n ATTR,\n type Attributes,\n type SpanEventLevel,\n type SpanWire,\n} from \"@tracehatch/shared/wire\"\n\nimport { performance, timestamp } from \"./clock.js\"\nimport { currentContext, state } from \"./context.js\"\nimport { newId } from \"./ids.js\"\nimport {\n serializeAttributes,\n serializeEvents,\n serializeSpan,\n} from \"./serialize.js\"\nimport { trace, type TraceHandle } from \"./trace.js\"\nimport type {\n EndOptions,\n SpanHandle,\n SpanKind,\n SpanOptions,\n ToolOptions,\n} from \"./types.js\"\n\n/** Timing the SDK's own capture paths supply for steps that already happened. */\nexport interface InternalSpanOptions {\n startedAt?: string\n}\n\nexport class RecordingSpan implements SpanHandle {\n readonly id: string\n private ended = false\n private outputSet = false\n private removeAbort?: () => void\n private data: SpanWire\n private readonly isTool: boolean\n private toolCallId?: string\n\n constructor(\n readonly trace: TraceHandle | undefined,\n name: string,\n kind: SpanKind,\n options: SpanOptions = {},\n readonly parent?: RecordingSpan,\n rootId?: string,\n internal: InternalSpanOptions = {}\n ) {\n this.isTool = kind === \"tool\"\n if (this.isTool) this.toolCallId = toolCallId(options.attributes)\n this.id = rootId ?? newId(\"span\")\n const startedAt = internal.startedAt ?? timestamp()\n this.data = {\n id: this.id,\n trace_id: trace?.id ?? \"\",\n parent_id: parent?.id ?? null,\n name,\n kind,\n started_at: startedAt,\n ended_at: startedAt,\n status: \"ok\",\n attempt: 1,\n input: options.input,\n attributes: options.attributes,\n }\n this.sanitize()\n if (!rootId && this.isRecording) trace?.registerSpan(this)\n if (options.signal) {\n const signal = options.signal\n const abort = () => this.end({ status: \"cancelled\" })\n if (signal.aborted) abort()\n else {\n signal.addEventListener(\"abort\", abort, { once: true })\n this.removeAbort = () => signal.removeEventListener(\"abort\", abort)\n }\n }\n }\n\n get isRecording(): boolean {\n return !this.ended && Boolean(this.trace?.isRecording)\n }\n get isEnded(): boolean {\n return this.ended\n }\n get hasOutput(): boolean {\n return this.outputSet\n }\n\n private sanitize(): void {\n try {\n if (this.trace)\n this.data = serializeSpan(this.data, this.trace.client.options)\n } catch {\n /* best effort */\n }\n }\n\n run<T>(fn: () => T): T {\n if (!this.trace) return fn()\n return state.storage.run({ trace: this.trace, span: this }, fn)\n }\n\n setInput(value: unknown): void {\n if (this.ended) return\n this.data.input = value\n delete this.data.input_bytes\n delete this.data.input_truncated\n this.sanitize()\n }\n\n setOutput(value: unknown): void {\n if (this.ended) return\n this.outputSet = true\n this.data.output = value\n delete this.data.output_bytes\n delete this.data.output_truncated\n this.sanitize()\n }\n\n /** Size-only stream capture must never retain the generated content. */\n setOutputBytes(bytes: number): void {\n if (this.ended) return\n this.data.output_bytes = Math.min(2_147_483_647, Math.max(0, bytes))\n }\n\n /** A stream assembler can truncate before the generic body size limit. */\n markOutputTruncated(): void {\n if (!this.ended) this.data.output_truncated = true\n }\n\n setMessages(value: unknown): void {\n if (this.ended) return\n this.data.messages = value\n delete this.data.messages_bytes\n delete this.data.messages_truncated\n this.sanitize()\n }\n\n setAttributes(attributes: Attributes): void {\n if (this.ended) return\n try {\n if (!this.trace) return\n const safe = serializeAttributes(attributes, this.trace.client.options)\n this.data.attributes = serializeAttributes(\n { ...this.data.attributes, ...safe },\n this.trace.client.options\n )\n if (this.isTool && Object.hasOwn(attributes, ATTR.toolCallId))\n this.toolCallId = toolCallId(attributes)\n } catch {\n /* user getters */\n }\n }\n\n addEvent(\n name: string,\n attributes?: Attributes,\n level: SpanEventLevel = \"info\"\n ): void {\n if (this.ended || (this.data.events?.length ?? 0) >= 100) return\n try {\n if (!this.trace) return\n const safe = serializeEvents(\n [{ ts: timestamp(), name, attributes, level }],\n this.trace.client.options\n )\n this.data.events = [...(this.data.events ?? []), ...(safe ?? [])]\n } catch {\n /* best effort */\n }\n }\n\n setAttempt(attempt: number): void {\n if (!this.ended) this.data.attempt = attempt\n }\n\n end(options: EndOptions = {}): void {\n if (this.ended) return\n this.ended = true\n this.removeAbort?.()\n this.trace?.unregisterSpan(this)\n if (!this.trace?.isRecording) return\n try {\n if (\"output\" in options) {\n this.data.output = options.output\n delete this.data.output_bytes\n delete this.data.output_truncated\n }\n this.data.ended_at = options.endedAt ?? timestamp()\n this.data.status = options.status ?? (\"error\" in options ? \"error\" : \"ok\")\n if (\"error\" in options) this.data.error = errorDetails(options.error)\n if (this.isTool && this.toolCallId)\n this.trace.rememberToolCall(this.toolCallId)\n this.trace.client.enqueue(this.data, this.trace.snapshot())\n } catch {\n /* Internal failures never replace the user callback's error. */\n }\n }\n}\n\nfunction toolCallId(attributes: Attributes | undefined): string | undefined {\n try {\n const value =\n attributes &&\n Object.getOwnPropertyDescriptor(attributes, ATTR.toolCallId)?.value\n return typeof value === \"string\" && value ? value : undefined\n } catch {\n return undefined\n }\n}\n\nexport function errorDetails(error: unknown): NonNullable<SpanWire[\"error\"]> {\n try {\n return error instanceof Error\n ? {\n type: error.name || error.constructor.name,\n message: error.message,\n stack: error.stack,\n }\n : { type: \"Error\", message: String(error) }\n } catch {\n return { type: \"Error\", message: \"Unserializable error\" }\n }\n}\n\nexport function startSpan(\n name: string,\n kind: SpanKind,\n options: SpanOptions = {}\n): RecordingSpan {\n const context = currentContext()\n let parent = context?.span\n while (parent?.isEnded && parent.parent) parent = parent.parent\n return new RecordingSpan(context?.trace, name, kind, options, parent)\n}\n\nexport async function span<T>(\n name: string,\n kind: SpanKind,\n fn: (handle: SpanHandle) => T,\n options: SpanOptions = {}\n): Promise<Awaited<T>> {\n if (!currentContext() && state.client?.isEnabled) {\n // A step recorded outside any run is a run of its own; nothing is dropped.\n return trace(name, () => span(name, kind, fn, options), {\n signal: options.signal,\n })\n }\n let handle: RecordingSpan\n try {\n handle = startSpan(name, kind, options)\n } catch {\n return await fn(noopSpan)\n }\n try {\n const result = await handle.run(() => fn(handle))\n handle.end(\n result === undefined || handle.hasOutput ? {} : { output: result }\n )\n return result\n } catch (error) {\n handle.end({\n error,\n status: options.signal?.aborted ? \"cancelled\" : \"error\",\n })\n throw error\n }\n}\n\nexport async function tool<T>(\n name: string,\n fn: (handle: SpanHandle) => T,\n options: ToolOptions = {}\n): Promise<Awaited<T>> {\n const retries = Number.isFinite(options.retries)\n ? Math.min(999, Math.max(0, Math.floor(options.retries!)))\n : 0\n const backoff = Number.isFinite(options.backoffMs)\n ? Math.max(0, Math.min(60_000, options.backoffMs!))\n : 0\n return span(\n name,\n \"tool\",\n async (handle) => {\n for (let attempt = 1; ; attempt++) {\n const start = performance.now()\n if (\"setAttempt\" in handle)\n (handle as RecordingSpan).setAttempt(attempt)\n try {\n const result = await fn(handle)\n handle.addEvent(\"tool.attempt\", {\n attempt,\n duration_ms: performance.now() - start,\n })\n return result\n } catch (error) {\n handle.addEvent(\n \"tool.attempt\",\n {\n attempt,\n duration_ms: performance.now() - start,\n error: errorDetails(error).message ?? \"Error\",\n },\n \"error\"\n )\n if (attempt > retries || options.signal?.aborted) throw error\n if (backoff)\n await new Promise<void>((resolve) => setTimeout(resolve, backoff))\n }\n }\n },\n { ...options, attributes: { ...options.attributes, [ATTR.toolName]: name } }\n )\n}\n\nconst noopSpan: SpanHandle = {\n id: \"\",\n setOutput() {},\n setAttributes() {},\n addEvent() {},\n}\n","import {\n ConversationLinker,\n type ConversationSignals,\n type ProviderRoute,\n type SynthesizedToolSpan,\n type ToolCall,\n} from \"@tracehatch/shared/capture\"\nimport { ATTR } from \"@tracehatch/shared/wire\"\n\nimport { sdkConfig } from \"../config.js\"\nimport { isServerlessRuntime } from \"../env.js\"\nimport type { Tracehatch } from \"../init.js\"\nimport { RecordingSpan } from \"../span.js\"\nimport { TraceHandle } from \"../trace.js\"\nimport type { Outcome, TraceOptions } from \"../types.js\"\n\ninterface OpenRun {\n trace: TraceHandle\n timer: ReturnType<typeof setTimeout>\n lastEndedAt: number\n}\n\nexport interface RunCompletion {\n responseId?: string\n toolCalls: ToolCall[]\n endedAt: number\n status: Outcome\n}\n\n/**\n * Runs for model calls made outside any `trace()` or inbound request\n * (architecture 09 → defaults; ADR-015). A call starts a run; a response\n * that asks for tools keeps it open for the tool step and the follow-up\n * call; a response without tool calls, a failure, a new user turn, the idle\n * limit, or process exit ends it. Sessions and users come from the request.\n */\nexport class AutoRuns {\n private readonly linker = new ConversationLinker()\n private readonly open = new Map<string, OpenRun>()\n /** Explicit and inbound runs own their lifetime, but still need tool pairing. */\n private readonly boundLinkers = new WeakMap<TraceHandle, ConversationLinker>()\n private readonly recordedTools = new WeakMap<TraceHandle, Set<string>>()\n\n private boundLinker(trace: TraceHandle): ConversationLinker {\n let linker = this.boundLinkers.get(trace)\n if (!linker) {\n linker = new ConversationLinker()\n this.boundLinkers.set(trace, linker)\n }\n return linker\n }\n\n beginBound(\n trace: TraceHandle,\n signals: ConversationSignals,\n startedAt: number\n ): void {\n for (const tool of this.boundLinker(trace).begin(signals, startedAt)\n .toolSpans)\n this.recordTool(trace, tool)\n }\n\n completeBound(\n trace: TraceHandle,\n signals: ConversationSignals,\n completion: RunCompletion\n ): void {\n this.boundLinker(trace).complete(signals, {\n traceId: trace.id,\n ...completion,\n })\n }\n\n begin(\n client: Tracehatch,\n route: ProviderRoute,\n signals: ConversationSignals,\n model: string | undefined,\n startedAt: number\n ): TraceHandle {\n const link = this.linker.begin(signals, startedAt)\n if (link.endTraceId) this.end(link.endTraceId, \"ok\")\n const existing = link.traceId ? this.open.get(link.traceId) : undefined\n let trace = existing?.trace\n if (!trace || trace.isEnded) {\n if (link.traceId) this.linker.release(link.traceId)\n const options: TraceOptions = {\n metadata: { \"tracehatch.capture\": \"auto\" },\n }\n if (link.sessionId) options.sessionId = link.sessionId\n if (link.userId) options.user = { id: link.userId }\n trace = new TraceHandle(client, model ?? route.operation, options, {\n inferProviderBodies: true,\n })\n } else if (existing) {\n clearTimeout(existing.timer)\n this.open.delete(trace.id)\n }\n for (const tool of link.toolSpans) this.recordTool(trace, tool)\n return trace\n }\n\n private recordTool(trace: TraceHandle, tool: SynthesizedToolSpan): void {\n try {\n let recorded = this.recordedTools.get(trace)\n if (!recorded) {\n recorded = new Set()\n this.recordedTools.set(trace, recorded)\n }\n // A provider retry resends the same trailing tool results; it is not a new tool execution.\n if (recorded.has(tool.callId) || trace.hasRecordedToolCall(tool.callId))\n return\n recorded.add(tool.callId)\n const span = new RecordingSpan(\n trace,\n tool.name,\n \"tool\",\n {\n input: tool.input,\n attributes: {\n [ATTR.toolName]: tool.name,\n [ATTR.toolCallId]: tool.callId,\n },\n },\n trace.root,\n undefined,\n { startedAt: new Date(tool.startedAt).toISOString() }\n )\n const error = new Error(\"The tool reported an error\")\n error.name = \"tool_error\"\n span.end({\n status: tool.status,\n output: tool.output,\n endedAt: new Date(tool.endedAt).toISOString(),\n ...(tool.status === \"error\" ? { error } : {}),\n })\n } catch {\n /* A synthesized step must never affect the model call. */\n }\n }\n\n complete(\n trace: TraceHandle,\n signals: ConversationSignals,\n completion: RunCompletion\n ): void {\n const { final } = this.linker.complete(signals, {\n traceId: trace.id,\n responseId: completion.responseId,\n toolCalls: completion.toolCalls,\n endedAt: completion.endedAt,\n })\n if (final || completion.status !== \"ok\") {\n this.end(\n trace.id,\n completion.status,\n new Date(completion.endedAt).toISOString(),\n trace\n )\n return\n }\n const timer = setTimeout(\n () => this.end(trace.id, \"cancelled\"),\n sdkConfig.autoRunIdleMs\n )\n timer.unref?.()\n this.open.set(trace.id, { trace, timer, lastEndedAt: completion.endedAt })\n }\n\n end(\n traceId: string,\n outcome: Outcome,\n endedAt?: string,\n trace?: TraceHandle\n ): void {\n const open = this.open.get(traceId)\n if (open) {\n clearTimeout(open.timer)\n this.open.delete(traceId)\n }\n this.linker.release(traceId)\n const handle = trace ?? open?.trace\n if (!handle || handle.isEnded) return\n handle.end({\n outcome,\n endedAt:\n endedAt ??\n (open ? new Date(open.lastEndedAt).toISOString() : undefined),\n })\n if (isServerlessRuntime()) scheduleFlush(handle.client)\n }\n\n endAll(outcome: Outcome = \"ok\"): void {\n for (const id of [...this.open.keys()]) this.end(id, outcome)\n }\n}\n\n/** Serverless hosts may freeze after the handler returns; hand them the flush. */\nexport function scheduleFlush(client: Tracehatch): void {\n const flush = client.flush()\n try {\n const context = (\n globalThis as unknown as Record<\n symbol,\n { get?: () => unknown } | undefined\n >\n )[Symbol.for(\"@vercel/request-context\")]\n const request = context?.get?.() as\n | { waitUntil?: (promise: Promise<unknown>) => void }\n | undefined\n request?.waitUntil?.(flush)\n } catch {\n /* No request context outside Vercel functions. */\n }\n}\n","import {\n GenerationAccumulator,\n SseParser,\n classifyFailure,\n conversationSignals,\n describeGeneration,\n failureFromHttp,\n isCancellation,\n matchProviderRoute,\n record,\n sha256Hex,\n type ConversationSignals,\n type GenerationFailure,\n type GenerationResult,\n type ProviderRoute,\n} from \"@tracehatch/shared/capture\"\nimport { ATTR } from \"@tracehatch/shared/wire\"\n\nimport { performance } from \"../clock.js\"\nimport { sdkConfig } from \"../config.js\"\nimport { currentContext, state } from \"../context.js\"\nimport { startSpan, type RecordingSpan } from \"../span.js\"\nimport type { TraceHandle } from \"../trace.js\"\nimport { AutoRuns } from \"./auto-runs.js\"\nimport { providerInput, providerOutput } from \"./bodies.js\"\n\ntype Fetch = typeof globalThis.fetch\ntype FetchInput = string | URL | Request\n\n/**\n * Global `fetch` capture (architecture 09 → HTTP-boundary capture; ADR-015).\n * Every provider client and framework that uses the runtime's `fetch` is\n * observed here: the request body names the model call, the response (JSON\n * or SSE) is read from a clone while the application consumes the original.\n * Failures never change what the application receives.\n */\nexport function installFetchCapture(): void {\n const capture = (state.capture ??= {})\n const current = globalThis.fetch\n if (typeof current !== \"function\") return\n if (capture.patchedFetch && current === capture.patchedFetch) return\n capture.originalFetch = current\n const patched: Fetch = (input, init) => capturedFetch(input, init)\n capture.patchedFetch = patched\n globalThis.fetch = patched\n}\n\nexport function uninstallFetchCapture(): void {\n const capture = state.capture\n if (!capture?.patchedFetch) return\n if (globalThis.fetch === capture.patchedFetch && capture.originalFetch)\n globalThis.fetch = capture.originalFetch\n capture.patchedFetch = undefined\n capture.originalFetch = undefined\n}\n\nfunction autoRuns(): AutoRuns {\n return (state.autoRuns ??= new AutoRuns())\n}\n\ninterface Plan {\n route: ProviderRoute\n url: string\n method: string\n}\n\n/** One observed model call: the span it records into and the run it belongs to. */\ninterface Capture {\n span: RecordingSpan\n trace: TraceHandle\n /** Set when the call started or continued an automatic run. */\n auto: TraceHandle | undefined\n signals: ConversationSignals\n accumulator: GenerationAccumulator\n requestKey: string\n attempt: number\n toolPairing?: Promise<void>\n}\n\nconst MAX_PENDING = 1_000\n/** Background responses waiting for a terminal poll, by provider response id. */\nconst pending = new Map<string, Capture>()\n/** Non-streaming observations still reading their clone; polls wait for them. */\nconst settling = new Map<Promise<void>, TraceHandle>()\n/** Recent failed requests by content, so a provider client's retry is numbered. */\nconst failures = new Map<string, { attempt: number; at: number }>()\n\nconst decoder = new TextDecoder()\n\nasync function waitForToolMetadata(\n observations: Promise<void>[],\n signal?: AbortSignal | null\n): Promise<void> {\n if (!observations.length || signal?.aborted) return\n let timer: ReturnType<typeof setTimeout> | undefined\n let abort: (() => void) | undefined\n const bound = new Promise<void>((resolve) => {\n timer = setTimeout(resolve, sdkConfig.toolMetadataSettleMs)\n abort = resolve\n signal?.addEventListener(\"abort\", abort, { once: true })\n })\n try {\n await Promise.race([Promise.allSettled(observations), bound])\n } finally {\n clearTimeout(timer)\n if (abort) signal?.removeEventListener(\"abort\", abort)\n }\n}\n\nfunction headerValue(value: unknown): string | undefined {\n if (typeof value === \"string\") return value\n if (Array.isArray(value)) return value.map(String).join(\", \")\n return undefined\n}\n\nfunction headerLookup(\n init: RequestInit | undefined,\n request: Request | undefined\n): (name: string) => string | null | undefined {\n return (name) => {\n const headers = init?.headers\n const wanted = name.toLowerCase()\n if (headers) {\n if (headers instanceof Headers) return headers.get(name)\n const entries: Array<readonly unknown[]> = Array.isArray(headers)\n ? headers\n : Object.entries(headers)\n const entry = entries.find(\n ([key]) => typeof key === \"string\" && key.toLowerCase() === wanted\n )\n if (entry) return headerValue(entry[1])\n }\n return request?.headers.get(name)\n }\n}\n\nfunction plan(\n input: FetchInput,\n init: RequestInit | undefined\n): Plan | undefined {\n const request =\n typeof Request !== \"undefined\" && input instanceof Request\n ? input\n : undefined\n const url =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.href\n : request?.url\n if (!url) return undefined\n const method = init?.method ?? request?.method ?? \"GET\"\n const route = matchProviderRoute(method, url, {\n header: headerLookup(init, request),\n })\n return route ? { route, url, method } : undefined\n}\n\n/** The request body as text; `null` when it cannot be read without consuming it. */\nasync function requestText(\n input: FetchInput,\n init: RequestInit | undefined\n): Promise<string | undefined | null> {\n const body = init?.body\n if (body === undefined || body === null) {\n if (typeof Request !== \"undefined\" && input instanceof Request) {\n if (input.body === null) return undefined\n const text = await input.clone().text()\n return text.length > sdkConfig.maxCapturedRequestBytes ? null : text\n }\n return undefined\n }\n if (typeof body === \"string\")\n return body.length > sdkConfig.maxCapturedRequestBytes ? null : body\n if (body instanceof ArrayBuffer || ArrayBuffer.isView(body)) {\n const bytes =\n body instanceof ArrayBuffer\n ? new Uint8Array(body)\n : new Uint8Array(body.buffer, body.byteOffset, body.byteLength)\n if (bytes.byteLength > sdkConfig.maxCapturedRequestBytes) return null\n return decoder.decode(bytes)\n }\n return null\n}\n\nfunction parseJson(text: string | undefined): unknown {\n if (text === undefined || text === \"\") return undefined\n try {\n return JSON.parse(text)\n } catch {\n return undefined\n }\n}\n\nfunction toError(failure: GenerationFailure): Error {\n const error = new Error(failure.message)\n error.name = failure.type\n if (failure.stack) error.stack = failure.stack\n return error\n}\n\nfunction rememberFailure(key: string, attempt: number): void {\n failures.delete(key)\n failures.set(key, { attempt, at: Date.now() })\n while (failures.size > sdkConfig.maxRememberedFailures) {\n const oldest = failures.keys().next().value\n if (oldest === undefined) break\n failures.delete(oldest)\n }\n}\n\nfunction attemptFor(key: string): number {\n const previous = failures.get(key)\n if (!previous) return 1\n if (Date.now() - previous.at > sdkConfig.retryWindowMs) {\n failures.delete(key)\n return 1\n }\n return previous.attempt + 1\n}\n\n/** OpenAI chat streams report usage only when asked; ask when the client did not decide. */\nfunction withUsage(\n init: RequestInit | undefined,\n route: ProviderRoute,\n body: unknown\n): RequestInit | undefined {\n const request = record(body)\n if (\n route.system !== \"openai\" ||\n route.operation !== \"chat.completions\" ||\n request.stream !== true ||\n record(request.stream_options).include_usage !== undefined ||\n typeof init?.body !== \"string\"\n )\n return init\n return {\n ...init,\n body: JSON.stringify({\n ...request,\n stream_options: {\n ...record(request.stream_options),\n include_usage: true,\n },\n }),\n }\n}\n\nasync function boundedText(response: Response): Promise<string | undefined> {\n const length = Number(response.headers.get(\"content-length\"))\n if (Number.isFinite(length) && length > sdkConfig.maxCapturedResponseBytes) {\n await response.body?.cancel().catch(() => undefined)\n return undefined\n }\n const text = await response.text()\n return text.length > sdkConfig.maxCapturedResponseBytes ? undefined : text\n}\n\nasync function readStream(\n body: ReadableStream<Uint8Array> | null,\n accumulator: GenerationAccumulator\n): Promise<void> {\n if (!body) return\n const reader = body.getReader()\n const parser = new SseParser()\n const streamDecoder = new TextDecoder()\n const consume = (messages: ReturnType<SseParser[\"push\"]>) => {\n for (const message of messages) {\n if (message.data === \"[DONE]\") continue\n const event = parseJson(message.data)\n if (event !== undefined) accumulator.chunk(event)\n }\n }\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n consume(parser.push(streamDecoder.decode(value, { stream: true })))\n }\n consume(parser.push(streamDecoder.decode()))\n consume(parser.end())\n}\n\n/** Record the result on the span and settle the automatic run, if any. */\nfunction finish(capture: Capture, result: GenerationResult): void {\n const { span } = capture\n capture.trace.captureProviderOutput(providerOutput(result.output))\n span.setAttributes(result.attributes)\n if (result.output !== undefined) span.setOutput(result.output)\n if (result.outputTruncated) {\n span.markOutputTruncated()\n span.setOutputBytes(result.outputBytes)\n } else if (result.output === undefined && result.outputBytes > 0) {\n span.setOutputBytes(result.outputBytes)\n }\n span.end({\n status: result.status,\n ...(result.error ? { error: toError(result.error) } : {}),\n })\n if (result.status === \"ok\") failures.delete(capture.requestKey)\n else rememberFailure(capture.requestKey, capture.attempt)\n if (capture.auto) {\n autoRuns().complete(capture.auto, capture.signals, {\n responseId: result.responseId,\n toolCalls: result.toolCalls,\n endedAt: Date.now(),\n status: result.status,\n })\n } else {\n autoRuns().completeBound(capture.trace, capture.signals, {\n responseId: result.responseId,\n toolCalls: result.toolCalls,\n endedAt: Date.now(),\n status: result.status,\n })\n }\n}\n\nfunction fail(\n capture: Capture,\n failure: GenerationFailure,\n cancelled: boolean\n): void {\n capture.accumulator.fail(failure, cancelled)\n finish(capture, capture.accumulator.finish({ cancelled }))\n}\n\nfunction holdPending(responseId: string, capture: Capture): void {\n pending.delete(responseId)\n pending.set(responseId, capture)\n while (pending.size > MAX_PENDING) {\n const oldest = pending.keys().next().value\n if (oldest === undefined) break\n pending.delete(oldest)\n }\n}\n\n/** Read the application's response from a clone and record what it said. */\nasync function observe(response: Response, capture: Capture): Promise<void> {\n const { accumulator } = capture\n let clone: Response\n try {\n clone = response.clone()\n } catch {\n finish(capture, accumulator.finish())\n return\n }\n try {\n // Pairing may await another clone, but the caller already owns its original\n // response. The provider request and application body consumption never wait.\n if (capture.toolPairing) await capture.toolPairing\n if (!response.ok) {\n const text = await boundedText(clone)\n fail(\n capture,\n failureFromHttp(response.status, parseJson(text) ?? text),\n false\n )\n return\n }\n const type = clone.headers.get(\"content-type\") ?? \"\"\n if (type.includes(\"text/event-stream\")) {\n accumulator.stream()\n await readStream(clone.body, accumulator)\n finish(capture, accumulator.finish())\n return\n }\n const json = parseJson(await boundedText(clone))\n if (json !== undefined) accumulator.complete(json)\n const result = accumulator.finish()\n if (result.pending && result.responseId)\n holdPending(result.responseId, capture)\n else finish(capture, result)\n } catch (error) {\n if (isCancellation(error))\n finish(capture, accumulator.finish({ cancelled: true }))\n else fail(capture, classifyFailure(error), false)\n }\n}\n\n/** A poll of a background response completes the generation that created it. */\nasync function observePoll(\n response: Response,\n capture: Capture,\n responseId: string\n): Promise<void> {\n try {\n const clone = response.clone()\n if (!response.ok) {\n await clone.body?.cancel().catch(() => undefined)\n return\n }\n const json = parseJson(await boundedText(clone))\n if (json === undefined) return\n capture.accumulator.complete(json)\n const result = capture.accumulator.finish()\n if (result.pending) return\n pending.delete(responseId)\n finish(capture, result)\n } catch {\n /* A failed poll read leaves the generation pending; the trace end cancels it. */\n }\n}\n\nasync function capturedFetch(\n input: FetchInput,\n init?: RequestInit\n): Promise<Response> {\n const original = state.capture?.originalFetch ?? globalThis.fetch\n const client = state.client\n if (!client?.isEnabled) return original(input, init)\n let planned: Plan | undefined\n try {\n planned = plan(input, init)\n } catch {\n planned = undefined\n }\n if (!planned) return original(input, init)\n const context = currentContext()\n if (context && !context.trace.isRecording) return original(input, init)\n const { route } = planned\n\n if (\n route.operation === \"responses.retrieve\" ||\n route.operation === \"responses.cancel\"\n ) {\n const id = route.responseId\n // The create call's response may still be parsing when the first poll starts.\n if (settling.size > 0) await Promise.allSettled([...settling.keys()])\n const held = id ? pending.get(id) : undefined\n if (!id || !held || !held.span.isRecording) {\n if (id) pending.delete(id)\n return original(input, init)\n }\n const response = await held.span.run(() => original(input, init))\n held.trace.track(observePoll(response, held, id))\n return response\n }\n\n let text: string | undefined | null\n try {\n text = await requestText(input, init)\n } catch {\n text = null\n }\n if (text === null) return original(input, init)\n const body = parseJson(text)\n const info = describeGeneration(route, body)\n const signals = conversationSignals(route, body)\n const requestKey = sha256Hex(`${planned.method} ${planned.url}\u0000${text ?? \"\"}`)\n const startedAt = performance.now()\n const model = record(body).model\n let auto: TraceHandle | undefined\n let trace: TraceHandle\n let toolPairing: Promise<void> | undefined\n if (context) {\n trace = context.trace\n const at = Date.now()\n if (\n signals.previousResponseId &&\n signals.turn === \"tool\" &&\n signals.toolResults.some(\n (tool) => tool.name === undefined || tool.input === undefined\n )\n ) {\n const observations = [...settling]\n .filter(([, held]) => held === trace)\n .map(([promise]) => promise)\n const signal =\n init?.signal ?? (input instanceof Request ? input.signal : undefined)\n toolPairing = waitForToolMetadata(observations, signal).then(() => {\n autoRuns().beginBound(trace, signals, at)\n })\n trace.track(toolPairing)\n } else autoRuns().beginBound(trace, signals, at)\n } else {\n auto = autoRuns().begin(\n client,\n route,\n signals,\n typeof model === \"string\" ? model : undefined,\n Date.now()\n )\n trace = auto\n }\n const spanOptions = { input: info.input, attributes: info.attributes }\n trace.captureProviderInput(providerInput(body))\n const span = auto\n ? auto.root.run(() => startSpan(info.name, info.kind, spanOptions))\n : startSpan(info.name, info.kind, spanOptions)\n if (!span.isRecording) return original(input, init)\n if (info.messages !== undefined) span.setMessages(info.messages)\n const attempt = attemptFor(requestKey)\n if (attempt > 1) span.setAttempt(attempt)\n const capture: Capture = {\n span,\n trace,\n auto,\n signals,\n accumulator: new GenerationAccumulator(route, {\n captureBodies: client.options.captureBodies,\n startedAt,\n now: () => performance.now(),\n }),\n requestKey,\n attempt,\n toolPairing,\n }\n let response: Response\n try {\n response = await span.run(() =>\n original(input, withUsage(init, route, body))\n )\n } catch (error) {\n try {\n if (toolPairing) {\n rememberFailure(requestKey, attempt)\n trace.track(\n toolPairing.then(() =>\n fail(capture, classifyFailure(error), isCancellation(error))\n )\n )\n } else fail(capture, classifyFailure(error), isCancellation(error))\n } catch {\n /* Telemetry must not replace the application's error. */\n }\n throw error\n }\n try {\n span.setAttributes({ [ATTR.httpStatus]: response.status })\n // A provider client retries before it finishes reading the error body.\n if (!response.ok) rememberFailure(requestKey, attempt)\n const observation = observe(response, capture)\n trace.track(observation)\n const type = response.headers.get(\"content-type\") ?? \"\"\n if (!type.includes(\"text/event-stream\")) {\n settling.set(observation, trace)\n const done = () => settling.delete(observation)\n observation.then(done, done)\n }\n } catch {\n /* Observation failures never affect the response. */\n }\n return response\n}\n","import http from \"node:http\"\nimport https from \"node:https\"\n\nimport { state } from \"../context.js\"\nimport type { Tracehatch } from \"../init.js\"\nimport { TraceHandle } from \"../trace.js\"\n\ntype Emit = (\n this: unknown,\n event: string | symbol,\n ...args: unknown[]\n) => boolean\ninterface Emitter {\n emit: Emit\n}\n\nconst originals = new Map<Emitter, Emit>()\n\n/** Request headers an application can set to name the session and end user. */\nexport const SESSION_HEADER = \"x-tracehatch-session-id\"\nexport const USER_HEADER = \"x-tracehatch-user-id\"\n\nfunction single(value: string | string[] | undefined): string | undefined {\n const first = Array.isArray(value) ? value[0] : value\n const trimmed = first?.trim()\n return trimmed ? trimmed : undefined\n}\n\nfunction pathOf(request: http.IncomingMessage): string {\n return (request.url ?? \"/\").split(\"?\")[0] ?? \"/\"\n}\n\nfunction requestTrace(\n client: Tracehatch,\n request: http.IncomingMessage\n): TraceHandle {\n const method = request.method ?? \"GET\"\n const path = pathOf(request)\n const sessionId = single(request.headers[SESSION_HEADER])\n const userId = single(request.headers[USER_HEADER])\n return new TraceHandle(\n client,\n `${method} ${path}`.slice(0, 256),\n {\n metadata: { http: { method, path } },\n ...(sessionId ? { sessionId } : {}),\n ...(userId ? { user: { id: userId } } : {}),\n },\n { discardIfEmpty: true, inferProviderBodies: true }\n )\n}\n\nfunction finishRequest(\n trace: TraceHandle,\n request: http.IncomingMessage,\n response: http.ServerResponse\n): void {\n try {\n const status = response.statusCode\n trace.setMetadata({\n http: { method: request.method ?? \"GET\", path: pathOf(request), status },\n })\n // Streams still being read delay the end inside `TraceHandle.end()`.\n trace.end({ outcome: status >= 500 ? \"error\" : \"ok\" })\n } catch {\n /* Ending a request trace must never affect the response. */\n }\n}\n\n/**\n * One run per inbound HTTP request (architecture 09 → defaults; ADR-015):\n * `http.Server` and `https.Server` `request` events run inside a trace that\n * is sent only when a model call or explicit span happened during the\n * request. Express, Fastify, NestJS and Next.js servers all emit it.\n */\nexport function installServerCapture(): void {\n const capture = (state.capture ??= {})\n if (capture.serverPatched) return\n capture.serverPatched = true\n for (const Server of [http.Server, https.Server]) {\n const prototype = Server.prototype as unknown as Emitter\n const original = prototype.emit\n originals.set(prototype, original)\n const patched: Emit = function (this: unknown, event, ...args) {\n if (event !== \"request\") return original.apply(this, [event, ...args])\n const client = state.client\n if (!client?.isEnabled) return original.apply(this, [event, ...args])\n let trace: TraceHandle\n try {\n const [request, response] = args as [\n http.IncomingMessage,\n http.ServerResponse,\n ]\n trace = requestTrace(client, request)\n response.once(\"close\", () => finishRequest(trace, request, response))\n } catch {\n return original.apply(this, [event, ...args])\n }\n return trace.run(() => original.apply(this, [event, ...args]))\n }\n prototype.emit = patched\n }\n}\n\nexport function uninstallServerCapture(): void {\n const capture = state.capture\n if (!capture?.serverPatched) return\n for (const [prototype, original] of originals) prototype.emit = original\n originals.clear()\n capture.serverPatched = false\n}\n","import { sdkConfig } from \"../config.js\"\nimport { state } from \"../context.js\"\n\nconst SIGNALS = [\"SIGTERM\", \"SIGINT\"] as const\ntype Signal = (typeof SIGNALS)[number]\n\nconst listeners = new Map<Signal, () => void>()\n\nasync function handle(signal: Signal): Promise<void> {\n try {\n state.autoRuns?.endAll(\"ok\")\n await state.client?.flush(sdkConfig.signalFlushMs)\n } catch {\n /* Exit flushing is best effort. */\n }\n const listener = listeners.get(signal)\n if (listener) {\n process.off(signal, listener)\n listeners.delete(signal)\n }\n // Only restore the default outcome when no other handler owns the exit.\n if (process.listenerCount(signal) === 0) process.kill(process.pid, signal)\n}\n\n/**\n * Flush on termination signals without taking over exit: after the bounded\n * flush the SDK removes itself and re-raises the signal if nothing else\n * handles it, so `beforeExit`-less shutdowns still deliver the last batch.\n */\nexport function installSignalHooks(): void {\n const capture = (state.capture ??= {})\n if (capture.signalsInstalled) return\n capture.signalsInstalled = true\n for (const signal of SIGNALS) {\n const listener = () => void handle(signal)\n listeners.set(signal, listener)\n process.on(signal, listener)\n }\n}\n\nexport function uninstallSignalHooks(): void {\n const capture = state.capture\n if (!capture?.signalsInstalled) return\n for (const [signal, listener] of listeners) process.off(signal, listener)\n listeners.clear()\n capture.signalsInstalled = false\n}\n","import { state } from \"../context.js\"\nimport { AutoRuns } from \"./auto-runs.js\"\nimport { installFetchCapture, uninstallFetchCapture } from \"./fetch.js\"\nimport { installServerCapture, uninstallServerCapture } from \"./server.js\"\nimport { installSignalHooks, uninstallSignalHooks } from \"./signals.js\"\n\n/** Everything `init()` turns on: provider capture, request runs, exit flushing. */\nexport function installCapture(): void {\n state.autoRuns ??= new AutoRuns()\n installFetchCapture()\n installServerCapture()\n installSignalHooks()\n}\n\nexport function uninstallCapture(): void {\n uninstallFetchCapture()\n uninstallServerCapture()\n uninstallSignalHooks()\n}\n","import { sdkConfig } from \"./config.js\"\n\n/** Callers supply fixed diagnostic messages, never request bodies or credentials. */\nexport class Logger {\n private lastWarning = Number.NEGATIVE_INFINITY\n\n constructor(private readonly enabled = false) {}\n\n warn(message: string): void {\n const now = Date.now()\n if (now - this.lastWarning < sdkConfig.warnIntervalMs) return\n this.lastWarning = now\n try {\n console.warn(`[tracehatch] ${message}`)\n } catch {\n // Logging must never affect the application.\n }\n }\n\n debug(message: string): void {\n if (!this.enabled) return\n try {\n console.debug(`[tracehatch] ${message}`)\n } catch {\n // Hosts sometimes replace console methods with throwing implementations.\n }\n }\n}\n","import { SDK_VERSION, sdkConfig } from \"../config.js\"\nimport type { QueueEntry } from \"./queue.js\"\n\nexport interface Batch {\n entries: QueueEntry[]\n json: string\n bytes: number\n droppedSpans: number\n}\n\n/** Select the latest included envelope for each trace; one copy per batch. */\nexport function makeBatch(\n entries: QueueEntry[],\n redacted: boolean,\n droppedSpans: number\n): Batch {\n const traces = new Map<string, string>()\n for (const entry of entries) traces.set(entry.traceId, entry.traceJson)\n const sdk = {\n name: \"@tracehatch/sdk\",\n version: SDK_VERSION,\n runtime: `node/${process.versions.node}`,\n wire: sdkConfig.wireVersion,\n redacted,\n ...(droppedSpans > 0 ? { dropped_spans: droppedSpans } : {}),\n }\n const json = `{\"sdk\":${JSON.stringify(sdk)},\"traces\":[${[...traces.values()].join(\",\")}],\"spans\":[${entries.map((entry) => entry.spanJson).join(\",\")}]}`\n return { entries, json, bytes: Buffer.byteLength(json), droppedSpans }\n}\n","import type { SpanWire, TraceEnvelopeWire } from \"@tracehatch/shared/wire\"\n\nimport { sdkConfig } from \"../config.js\"\n\nexport interface QueueEntry {\n spanJson: string\n traceJson: string\n traceId: string\n bytes: number\n queuedAt: number\n}\n\n/** Both span and envelope are snapshotted before queueing; retries cannot drift. */\nexport function snapshotEntry(\n span: SpanWire,\n trace: TraceEnvelopeWire\n): QueueEntry {\n const spanJson = JSON.stringify(span)\n const traceJson = JSON.stringify(trace)\n return {\n spanJson,\n traceJson,\n traceId: trace.id,\n bytes: Buffer.byteLength(spanJson) + Buffer.byteLength(traceJson),\n queuedAt: Date.now(),\n }\n}\n\nexport class SpanQueue {\n private entries: QueueEntry[] = []\n bytes = 0\n\n constructor(private readonly maxBytes = sdkConfig.maxQueueBytes as number) {}\n\n get length(): number {\n return this.entries.length\n }\n\n peek(): QueueEntry | undefined {\n return this.entries[0]\n }\n\n push(entry: QueueEntry): number {\n if (entry.bytes > this.maxBytes) return 1\n let dropped = 0\n while (this.bytes + entry.bytes > this.maxBytes) {\n this.shift()\n dropped += 1\n }\n this.entries.push(entry)\n this.bytes += entry.bytes\n return dropped\n }\n\n shift(): QueueEntry | undefined {\n const entry = this.entries.shift()\n if (entry) this.bytes -= entry.bytes\n return entry\n }\n\n clear(): number {\n const count = this.entries.length\n this.entries = []\n this.bytes = 0\n return count\n }\n}\n","import { sdkConfig } from \"../config.js\"\n\nexport function shouldRetry(status: number): boolean {\n return status === 408 || status === 429 || status >= 500\n}\n\nexport function retryDelay(attempt: number, retryAfter: string | null): number {\n if (retryAfter !== null) {\n const seconds = Number(retryAfter)\n const parsed = /^\\d+(?:\\.\\d+)?$/.test(retryAfter.trim())\n ? seconds * 1_000\n : Date.parse(retryAfter) - Date.now()\n if (Number.isFinite(parsed)) {\n return Math.min(sdkConfig.retryAfterMaxMs, Math.max(0, parsed))\n }\n }\n const jitter = 1 + (Math.random() * 2 - 1) * sdkConfig.retryJitter\n return Math.min(\n sdkConfig.retryMaxMs,\n sdkConfig.retryBaseMs * 2 ** attempt * jitter\n )\n}\n\n/** A shutdown wakes every pending retry without leaving referenced timers. */\nexport function waitForRetry(ms: number, signal: AbortSignal): Promise<void> {\n if (signal.aborted) return Promise.resolve()\n return new Promise((resolve) => {\n const finish = () => {\n clearTimeout(timer)\n signal.removeEventListener(\"abort\", finish)\n resolve()\n }\n const timer = setTimeout(finish, ms)\n timer.unref?.()\n signal.addEventListener(\"abort\", finish, { once: true })\n })\n}\n","import { randomUUID } from \"node:crypto\"\nimport { gzip } from \"node:zlib\"\nimport { promisify } from \"node:util\"\n\nimport { SDK_VERSION, sdkConfig } from \"../config.js\"\n\nconst compress = promisify(gzip)\n\nexport interface TransportOptions {\n apiKey: string\n baseUrl: string\n}\n\nexport interface TransportResponse {\n status: number\n retryAfter: string | null\n /** Only present for a valid Tracehatch 202 acknowledgement. */\n acceptedSpans?: number\n samplingRate?: number\n problemCode?: string\n}\n\n// Do not echo arbitrary server response text into the customer's console.\nconst safeProblemCodes = new Set([\n \"unauthenticated\",\n \"key_revoked\",\n \"forbidden\",\n \"validation_failed\",\n \"sdk_upgrade_required\",\n \"payload_too_large\",\n \"rate_limited\",\n \"quota_exceeded\",\n \"overloaded\",\n])\n\n/** Timeout covers compression, connection and response body consumption. */\nexport async function sendBatch(\n json: string,\n options: TransportOptions,\n shutdownSignal: AbortSignal\n): Promise<TransportResponse> {\n const controller = new AbortController()\n const onShutdown = () => controller.abort()\n const timer = setTimeout(() => controller.abort(), sdkConfig.requestTimeoutMs)\n timer.unref?.()\n shutdownSignal.addEventListener(\"abort\", onShutdown, { once: true })\n if (shutdownSignal.aborted) controller.abort()\n let onAbort: (() => void) | undefined\n const cancelled = new Promise<never>((_, reject) => {\n onAbort = () => reject(new Error(\"Exporter request aborted\"))\n controller.signal.addEventListener(\"abort\", onAbort, { once: true })\n if (controller.signal.aborted) onAbort()\n })\n\n try {\n return await Promise.race([\n cancelled,\n (async () => {\n const compressed = Buffer.byteLength(json) >= sdkConfig.gzipMinBytes\n const body = compressed ? await compress(json) : json\n if (controller.signal.aborted)\n throw new Error(\"Exporter request aborted\")\n const response = await fetch(\n `${options.baseUrl.replace(/\\/$/, \"\")}/ingest`,\n {\n method: \"POST\",\n redirect: \"error\",\n headers: {\n Authorization: `Bearer ${options.apiKey}`,\n \"Content-Type\": \"application/json\",\n ...(compressed ? { \"Content-Encoding\": \"gzip\" } : {}),\n \"User-Agent\": `tracehatch-sdk/${SDK_VERSION} (node/${process.versions.node})`,\n \"X-Request-Id\": randomUUID(),\n },\n body,\n signal: controller.signal,\n }\n )\n let payload: unknown\n try {\n payload = await response.json()\n } catch {\n payload = undefined\n }\n const result: TransportResponse = {\n status: response.status,\n retryAfter: response.headers.get(\"Retry-After\"),\n }\n if (payload && typeof payload === \"object\") {\n if (\n response.status === 202 &&\n \"batch_id\" in payload &&\n typeof payload.batch_id === \"string\" &&\n /^bat_[0-7][0-9a-hjkmnp-tv-z]{25}$/.test(payload.batch_id) &&\n \"accepted\" in payload &&\n typeof payload.accepted === \"number\" &&\n Number.isSafeInteger(payload.accepted) &&\n payload.accepted >= 0\n ) {\n result.acceptedSpans = payload.accepted\n }\n if (\n \"code\" in payload &&\n typeof payload.code === \"string\" &&\n safeProblemCodes.has(payload.code)\n ) {\n result.problemCode = payload.code\n }\n if (\n \"sampling\" in payload &&\n payload.sampling &&\n typeof payload.sampling === \"object\" &&\n \"rate\" in payload.sampling\n ) {\n const rate = payload.sampling.rate\n if (\n typeof rate === \"number\" &&\n Number.isFinite(rate) &&\n rate >= 0 &&\n rate <= 1\n ) {\n result.samplingRate = rate\n }\n }\n }\n return result\n })(),\n ])\n } finally {\n clearTimeout(timer)\n shutdownSignal.removeEventListener(\"abort\", onShutdown)\n if (onAbort) controller.signal.removeEventListener(\"abort\", onAbort)\n }\n}\n","import type { SpanWire, TraceEnvelopeWire } from \"@tracehatch/shared/wire\"\n\nimport { sdkConfig } from \"../config.js\"\nimport { Logger } from \"../logger.js\"\nimport type { FlushResult } from \"../types.js\"\nimport { makeBatch, type Batch } from \"./batcher.js\"\nimport { snapshotEntry, SpanQueue, type QueueEntry } from \"./queue.js\"\nimport { retryDelay, shouldRetry, waitForRetry } from \"./retry.js\"\nimport { sendBatch, type TransportOptions } from \"./transport.js\"\n\nexport interface ExporterOptions extends TransportOptions {\n redacted: boolean\n debug?: boolean\n onSamplingRate?: (rate: number) => void\n}\n\nexport interface ExporterStats {\n queuedSpans: number\n queuedBytes: number\n inFlightBatches: number\n droppedSpans: number\n}\n\nexport class Exporter {\n private readonly queue = new SpanQueue()\n private readonly logger: Logger\n private readonly active = new Set<Promise<void>>()\n private readonly waiters = new Set<() => void>()\n private readonly abort = new AbortController()\n private timer?: ReturnType<typeof setTimeout>\n private immediate?: ReturnType<typeof setImmediate>\n private droppedSpans = 0\n private acceptedSpans = 0\n private inFlightSpans = 0\n private lastError?: FlushResult[\"lastError\"]\n private pendingDroppedSpans = 0\n private stopped = false\n private closing = false\n private shutdownPromise?: Promise<void>\n /** Last server-side keep rate; 1 whenever the API stops hinting. */\n private samplingRate = 1\n\n constructor(private readonly options: ExporterOptions) {\n this.logger = new Logger(options.debug)\n }\n\n /** Inputs have already been sanitised by the serialiser. */\n enqueue(span: SpanWire, trace: TraceEnvelopeWire): void {\n if (this.stopped || this.closing) return\n try {\n const dropped = this.queue.push(snapshotEntry(span, trace))\n if (dropped)\n this.drop(dropped, \"Export queue is full; oldest spans were dropped.\", {\n code: \"queue_full\",\n })\n this.schedule()\n } catch {\n this.drop(1, \"A span could not be serialised and was dropped.\", {\n code: \"serialization_error\",\n })\n }\n }\n\n stats(): ExporterStats {\n return {\n queuedSpans: this.queue.length,\n queuedBytes: this.queue.bytes,\n inFlightBatches: this.active.size,\n droppedSpans: this.droppedSpans,\n }\n }\n\n flush(timeoutMs: number = sdkConfig.flushTimeoutMs): Promise<void> {\n if (this.stopped || (this.queue.length === 0 && this.active.size === 0)) {\n return Promise.resolve()\n }\n return new Promise((resolve) => {\n const finish = () => {\n clearTimeout(timer)\n this.waiters.delete(finish)\n resolve()\n }\n const timer = setTimeout(\n finish,\n Number.isFinite(timeoutMs)\n ? Math.max(0, timeoutMs)\n : sdkConfig.flushTimeoutMs\n )\n this.waiters.add(finish)\n try {\n this.pump()\n } catch {\n finish()\n }\n })\n }\n\n async flushWithResult(timeoutMs?: number): Promise<FlushResult> {\n await this.flush(timeoutMs)\n const pendingSpans = this.queue.length + this.inFlightSpans\n return {\n status:\n pendingSpans > 0\n ? \"timeout\"\n : this.droppedSpans > 0\n ? \"failed\"\n : this.acceptedSpans > 0\n ? \"accepted\"\n : \"empty\",\n acceptedSpans: this.acceptedSpans,\n droppedSpans: this.droppedSpans,\n pendingSpans,\n ...(this.lastError ? { lastError: { ...this.lastError } } : {}),\n }\n }\n\n shutdown(): Promise<void> {\n if (this.shutdownPromise) return this.shutdownPromise\n this.closing = true\n this.shutdownPromise = (async () => {\n await this.flush()\n this.stopped = true\n this.clearScheduling()\n this.abort.abort()\n const dropped = this.queue.clear()\n if (dropped)\n this.drop(\n dropped,\n \"Shutdown timed out; remaining spans were dropped.\",\n {\n code: \"shutdown_timeout\",\n }\n )\n await Promise.allSettled([...this.active])\n for (const finish of [...this.waiters]) finish()\n })().catch(() => {\n // Shutdown is best effort and must not interrupt host cleanup.\n })\n return this.shutdownPromise\n }\n\n private clearScheduling(): void {\n if (this.timer) clearTimeout(this.timer)\n if (this.immediate) clearImmediate(this.immediate)\n this.timer = undefined\n this.immediate = undefined\n }\n\n private schedule(): void {\n if (\n this.stopped ||\n this.queue.length === 0 ||\n this.active.size >= sdkConfig.maxInFlightBatches\n )\n return\n if (this.waiters.size > 0 || this.queue.length >= sdkConfig.batchMaxSpans) {\n if (!this.immediate) {\n // A completed span never starts fetch or gzip on its own call stack.\n this.immediate = setImmediate(() => {\n this.immediate = undefined\n this.pump()\n })\n this.immediate.unref?.()\n }\n return\n }\n if (this.timer) return\n const age = Date.now() - (this.queue.peek()?.queuedAt ?? Date.now())\n this.timer = setTimeout(\n () => {\n this.timer = undefined\n this.pump()\n },\n Math.max(0, sdkConfig.batchMaxDelayMs - age)\n )\n this.timer.unref?.()\n }\n\n private pump(): void {\n if (this.stopped) return\n this.clearScheduling()\n while (\n this.queue.length > 0 &&\n this.active.size < sdkConfig.maxInFlightBatches\n ) {\n const age = Date.now() - (this.queue.peek()?.queuedAt ?? Date.now())\n if (\n this.waiters.size === 0 &&\n this.queue.length < sdkConfig.batchMaxSpans &&\n age < sdkConfig.batchMaxDelayMs\n )\n break\n const batch = this.takeBatch()\n if (!batch) continue\n this.inFlightSpans += batch.entries.length\n let remainingSpans = batch.entries.length\n const settle = (count: number) => {\n remainingSpans -= count\n this.inFlightSpans -= count\n }\n const task = this.deliver(batch, settle)\n .catch(() => {\n this.drop(remainingSpans, \"Export failed; spans were dropped.\", {\n code: \"export_error\",\n })\n })\n .finally(() => {\n this.inFlightSpans -= remainingSpans\n this.active.delete(task)\n this.pump()\n })\n this.active.add(task)\n }\n if (this.queue.length === 0 && this.active.size === 0) {\n for (const finish of [...this.waiters]) finish()\n }\n this.schedule()\n }\n\n private takeBatch(): Batch | undefined {\n const entries: QueueEntry[] = []\n let batch: Batch | undefined\n while (this.queue.length > 0 && entries.length < sdkConfig.batchMaxSpans) {\n const entry = this.queue.peek()\n if (!entry) break\n const candidate = makeBatch(\n [...entries, entry],\n this.options.redacted,\n this.pendingDroppedSpans\n )\n if (candidate.bytes > sdkConfig.batchMaxBytes) {\n if (entries.length > 0) break\n this.queue.shift()\n this.drop(1, \"A span exceeds the batch size limit and was dropped.\", {\n code: \"payload_too_large\",\n })\n continue\n }\n this.queue.shift()\n entries.push(entry)\n batch = candidate\n }\n if (batch) this.pendingDroppedSpans = 0\n return batch\n }\n\n /** The API hints only while the workspace is over its allowance; a plain 2xx ends it. */\n private applySamplingRate(rate: number): void {\n if (rate === this.samplingRate) return\n this.samplingRate = rate\n if (rate < 1) {\n this.logger.warn(\n `The workspace is over its monthly trace allowance; new traces are sampled at ${Math.round(rate * 100)}% until usage resets.`\n )\n } else {\n this.logger.debug(\n \"Server-side sampling ended; new traces are sent in full.\"\n )\n }\n try {\n this.options.onSamplingRate?.(rate)\n } catch {\n this.logger.debug(\"A sampling update could not be applied.\")\n }\n }\n\n private async deliver(\n batch: Batch,\n settle: (count: number) => void\n ): Promise<void> {\n let lastError: NonNullable<FlushResult[\"lastError\"]> = {\n code: \"network_error\",\n }\n for (let attempt = 0; attempt < sdkConfig.retryAttempts; attempt += 1) {\n if (this.stopped) {\n this.drop(\n batch.entries.length,\n \"Shutdown timed out; remaining spans were dropped.\",\n { code: \"shutdown_timeout\" }\n )\n settle(batch.entries.length)\n return\n }\n let retryAfter: string | null = null\n try {\n const response = await sendBatch(\n batch.json,\n this.options,\n this.abort.signal\n )\n if (response.status >= 200 && response.status < 300) {\n if (\n response.status !== 202 ||\n response.acceptedSpans !== batch.entries.length\n ) {\n this.drop(\n batch.entries.length,\n \"The API did not acknowledge this batch; check TRACEHATCH_BASE_URL.\",\n { code: \"unexpected_response\", httpStatus: response.status }\n )\n settle(batch.entries.length)\n return\n }\n this.acceptedSpans += batch.entries.length\n settle(batch.entries.length)\n this.applySamplingRate(response.samplingRate ?? 1)\n return\n }\n lastError = {\n code: response.problemCode ?? \"http_error\",\n httpStatus: response.status,\n }\n if (response.status === 413) {\n if (batch.entries.length === 1) {\n this.drop(\n 1,\n \"The API rejected an oversized span; the span was dropped.\",\n { code: \"payload_too_large\", httpStatus: response.status }\n )\n settle(1)\n return\n }\n const middle = Math.ceil(batch.entries.length / 2)\n // Splits occupy the same concurrency slot and preserve original snapshots.\n await this.deliver(\n makeBatch(\n batch.entries.slice(0, middle),\n this.options.redacted,\n batch.droppedSpans\n ),\n settle\n )\n await this.deliver(\n makeBatch(batch.entries.slice(middle), this.options.redacted, 0),\n settle\n )\n return\n }\n if (!shouldRetry(response.status)) {\n const reason = response.problemCode\n ? ` (${response.problemCode})`\n : ` (HTTP ${response.status})`\n this.drop(\n batch.entries.length,\n `The API rejected a batch${reason}; spans were dropped.`,\n lastError\n )\n settle(batch.entries.length)\n return\n }\n retryAfter = response.retryAfter\n } catch {\n lastError = { code: \"network_error\" }\n // Request errors may contain URLs, headers or request data. Never log them.\n }\n if (this.stopped || attempt + 1 === sdkConfig.retryAttempts) {\n this.drop(\n batch.entries.length,\n \"Export retries were exhausted; spans were dropped.\",\n lastError\n )\n settle(batch.entries.length)\n return\n }\n await waitForRetry(retryDelay(attempt, retryAfter), this.abort.signal)\n }\n }\n\n private drop(\n count: number,\n message: string,\n error: NonNullable<FlushResult[\"lastError\"]>\n ): void {\n this.droppedSpans += count\n this.pendingDroppedSpans += count\n this.lastError = error\n this.logger.warn(message)\n }\n}\n","import { readFileSync } from \"node:fs\"\nimport { basename, dirname, join } from \"node:path\"\n\n/**\n * Agent and release defaults (architecture 09 → defaults; ADR-015), read\n * once at `init()`: the nearest `package.json` name and the deployment's\n * commit. Every read is bounded and fails soft; explicit options and\n * `TRACEHATCH_AGENT` / `TRACEHATCH_RELEASE` win.\n */\n\nconst MAX_DIRECTORY_DEPTH = 12\n\nfunction* ancestors(start: string): Generator<string> {\n let current = start\n for (let depth = 0; depth < MAX_DIRECTORY_DEPTH; depth++) {\n yield current\n const parent = dirname(current)\n if (parent === current) return\n current = parent\n }\n}\n\nfunction readText(path: string): string | undefined {\n try {\n return readFileSync(path, \"utf8\")\n } catch {\n return undefined\n }\n}\n\nexport function detectAgent(cwd: string = process.cwd()): string | undefined {\n for (const directory of ancestors(cwd)) {\n const text = readText(join(directory, \"package.json\"))\n if (text === undefined) continue\n try {\n const name: unknown = JSON.parse(text).name\n if (typeof name === \"string\" && name.trim())\n return name.trim().slice(0, 128)\n } catch {\n /* A broken manifest is not the SDK's problem. */\n }\n break\n }\n const fallback = basename(cwd).trim()\n return fallback ? fallback.slice(0, 128) : undefined\n}\n\n/** Commit variables the common deployment platforms and CI systems set. */\nconst RELEASE_VARIABLES = [\n \"VERCEL_GIT_COMMIT_SHA\",\n \"RAILWAY_GIT_COMMIT_SHA\",\n \"RENDER_GIT_COMMIT\",\n \"HEROKU_SLUG_COMMIT\",\n \"GITHUB_SHA\",\n \"CI_COMMIT_SHA\",\n \"SOURCE_VERSION\",\n \"COMMIT_SHA\",\n] as const\n\nconst SHA = /^[0-9a-f]{7,64}$/i\n\nexport function detectRelease(\n cwd: string = process.cwd(),\n env: NodeJS.ProcessEnv = process.env\n): string | undefined {\n for (const name of RELEASE_VARIABLES) {\n const value = env[name]?.trim()\n if (value) return value.slice(0, 128)\n }\n for (const directory of ancestors(cwd)) {\n const head = readText(join(directory, \".git\", \"HEAD\"))?.trim()\n if (head === undefined) continue\n if (SHA.test(head)) return head\n const ref = /^ref:\\s*(\\S+)$/.exec(head)?.[1]\n if (!ref) return undefined\n const direct = readText(join(directory, \".git\", ref))?.trim()\n if (direct && SHA.test(direct)) return direct\n const packed = readText(join(directory, \".git\", \"packed-refs\"))\n const line = packed?.split(\"\\n\").find((entry) => entry.endsWith(` ${ref}`))\n const sha = line?.split(\" \")[0]\n return sha && SHA.test(sha) ? sha : undefined\n }\n return undefined\n}\n","import type { RedactionOptions } from \"@tracehatch/shared/redaction\"\nimport type { SpanWire, TraceEnvelopeWire } from \"@tracehatch/shared/wire\"\n\nimport { installCapture, uninstallCapture } from \"./capture/install.js\"\nimport { DEFAULT_BASE_URL, sdkConfig } from \"./config.js\"\nimport { state } from \"./context.js\"\nimport { apiBaseUrl, environmentDefaults } from \"./env.js\"\nimport { Exporter } from \"./exporter/exporter.js\"\nimport { detectAgent, detectRelease } from \"./identity.js\"\nimport { serializeSpan, serializeTrace } from \"./serialize.js\"\nimport type { FlushResult, InitOptions } from \"./types.js\"\n\nconst allowed = new Set([\n \"apiKey\",\n \"baseUrl\",\n \"release\",\n \"agent\",\n \"captureBodies\",\n \"redact\",\n \"sampling\",\n \"debug\",\n \"flushOnExit\",\n])\n\nfunction validate(options: InitOptions): void {\n for (const key of Object.keys(options)) {\n if (!allowed.has(key))\n throw new TypeError(`Unknown Tracehatch option: ${key}`)\n }\n for (const key of [\"apiKey\", \"baseUrl\", \"release\", \"agent\"] as const) {\n if (options[key] !== undefined && typeof options[key] !== \"string\")\n throw new TypeError(`Tracehatch ${key} must be a string`)\n }\n for (const key of [\"captureBodies\", \"debug\", \"flushOnExit\"] as const) {\n if (options[key] !== undefined && typeof options[key] !== \"boolean\")\n throw new TypeError(`Tracehatch ${key} must be a boolean`)\n }\n if (options.sampling !== undefined) {\n const rate = options.sampling?.rate\n if (\n !Number.isFinite(rate) ||\n rate < 0 ||\n rate > 1 ||\n Object.keys(options.sampling).some((key) => key !== \"rate\")\n ) {\n throw new TypeError(\"Tracehatch sampling.rate must be between 0 and 1\")\n }\n }\n if (options.redact !== undefined && options.redact !== false) {\n const redact = options.redact\n if (\n !redact ||\n typeof redact !== \"object\" ||\n Object.keys(redact).some((key) => ![\"builtIns\", \"rules\"].includes(key)) ||\n (redact.builtIns !== undefined && typeof redact.builtIns !== \"boolean\") ||\n (redact.rules !== undefined &&\n (!Array.isArray(redact.rules) ||\n redact.rules.some(\n (rule) =>\n !rule ||\n typeof rule.name !== \"string\" ||\n !/^[\\w.-]{1,64}$/.test(rule.name) ||\n !(rule.pattern instanceof RegExp)\n )))\n ) {\n throw new TypeError(\n \"Tracehatch redact must be false or an object with builtIns and named RegExp rules\"\n )\n }\n }\n}\n\nexport class Tracehatch {\n readonly options: {\n captureBodies: boolean\n redact: false | RedactionOptions\n release?: string\n agent?: string\n }\n private exporter?: Exporter\n private enabled = true\n private rate: number\n private onExit?: () => void\n private closing?: Promise<void>\n\n constructor(options: InitOptions) {\n this.options = {\n captureBodies: options.captureBodies ?? true,\n redact: options.redact ?? {},\n release: options.release,\n agent: options.agent,\n }\n this.rate = options.sampling?.rate ?? 1\n const baseUrl = apiBaseUrl(\n options.baseUrl?.trim() ? options.baseUrl : DEFAULT_BASE_URL\n )\n if (options.apiKey?.trim()) {\n this.exporter = new Exporter({\n apiKey: options.apiKey,\n baseUrl,\n redacted: options.redact !== false,\n debug: options.debug,\n onSamplingRate: (rate) => {\n this.rate = Math.min(options.sampling?.rate ?? 1, rate)\n },\n })\n if (options.flushOnExit ?? true) {\n this.onExit = () => {\n state.autoRuns?.endAll(\"ok\")\n void this.flush()\n }\n process.on(\"beforeExit\", this.onExit)\n }\n } else if (!state.missingKeyWarned) {\n state.missingKeyWarned = true\n try {\n console.warn(\"[tracehatch] No API key configured; tracing is disabled.\")\n } catch {\n /* Host logger failures must not break init. */\n }\n }\n }\n\n get isEnabled(): boolean {\n return this.enabled && Boolean(this.exporter)\n }\n\n samples(id: string): boolean {\n // Deterministic head sampling: stable per trace and shared by all its spans.\n let hash = 2166136261\n for (const char of id) hash = Math.imul(hash ^ char.charCodeAt(0), 16777619)\n return this.isEnabled && (hash >>> 0) / 0x100000000 < this.rate\n }\n\n enqueue(span: SpanWire, trace: TraceEnvelopeWire): void {\n if (!this.isEnabled) return\n try {\n this.exporter?.enqueue(\n serializeSpan(span, this.options),\n serializeTrace(trace, this.options)\n )\n } catch {\n /* Telemetry must not change the application's result or error. */\n }\n }\n\n async flush(timeoutMs?: number): Promise<void> {\n try {\n await awaitPendingEnds(timeoutMs)\n await this.exporter?.flush(timeoutMs)\n } catch {\n /* Never reject. */\n }\n }\n\n /** Inspect delivery during setup without making ordinary flush() reject. */\n async flushWithResult(timeoutMs?: number): Promise<FlushResult> {\n if (!this.exporter) return disabledFlushResult()\n await awaitPendingEnds(timeoutMs)\n return this.exporter.flushWithResult(timeoutMs)\n }\n\n shutdown(): Promise<void> {\n this.enabled = false\n if (this.onExit) process.off(\"beforeExit\", this.onExit)\n if (state.client === this) uninstallCapture()\n return (this.closing ??= (async () => {\n try {\n await this.exporter?.shutdown()\n } catch {\n /* Never reject. */\n }\n })())\n }\n\n stats() {\n return (\n this.exporter?.stats() ?? {\n queuedSpans: 0,\n queuedBytes: 0,\n inFlightBatches: 0,\n droppedSpans: 0,\n }\n )\n }\n}\n\n/**\n * Configure once per process. With an API key, every provider call made\n * through `fetch`, every inbound HTTP request with a model call, and every\n * explicit `trace`/`span`/`tool` is recorded. Agent and release default to\n * the package name and the deployment's commit.\n */\nexport function init(options: InitOptions = {}): Tracehatch {\n validate(options)\n const defaults = environmentDefaults(options)\n const apiKey = options.apiKey ?? defaults.apiKey\n const resolved: InitOptions = {\n ...options,\n apiKey,\n baseUrl: options.baseUrl ?? defaults.baseUrl,\n release: options.release ?? defaults.release ?? detectRelease(),\n agent: options.agent ?? defaults.agent ?? detectAgent(),\n }\n const client = new Tracehatch(resolved)\n const previous = state.client\n state.autoRuns?.endAll(\"ok\")\n state.client = client\n void previous?.shutdown()\n if (client.isEnabled) installCapture()\n return client\n}\n\nexport function getClient(): Tracehatch {\n return state.client ?? init()\n}\n\nexport async function flush(timeoutMs?: number): Promise<void> {\n await state.client?.flush(timeoutMs)\n}\nexport async function flushWithResult(\n timeoutMs?: number\n): Promise<FlushResult> {\n return state.client?.flushWithResult(timeoutMs) ?? disabledFlushResult()\n}\n\n/** Runs whose end waits for a provider response still being read, bounded like the flush. */\nasync function awaitPendingEnds(timeoutMs?: number): Promise<void> {\n // The state object may predate this field when an older copy created it.\n state.pendingEnds ??= new Set()\n if (state.pendingEnds.size === 0 && !state.pendingCaptures?.size) return\n let timer: ReturnType<typeof setTimeout> | undefined\n const timeout = new Promise<void>((resolve) => {\n timer = setTimeout(\n resolve,\n Number.isFinite(timeoutMs)\n ? Math.max(0, timeoutMs!)\n : sdkConfig.flushTimeoutMs\n )\n timer.unref?.()\n })\n const settled = async () => {\n while (state.pendingEnds.size > 0 || state.pendingCaptures?.size) {\n await Promise.allSettled([\n ...state.pendingEnds,\n ...(state.pendingCaptures ?? []),\n ])\n }\n }\n try {\n await Promise.race([settled(), timeout])\n } finally {\n clearTimeout(timer)\n }\n}\n\nfunction disabledFlushResult(): FlushResult {\n return {\n status: \"disabled\",\n acceptedSpans: 0,\n droppedSpans: 0,\n pendingSpans: 0,\n }\n}\n\nexport async function shutdown(): Promise<void> {\n state.autoRuns?.endAll(\"ok\")\n await state.client?.shutdown()\n}\n","import { WIRE_LIMITS, type TraceEnvelopeWire } from \"@tracehatch/shared/wire\"\n\nimport { timestamp } from \"./clock.js\"\nimport { sdkConfig } from \"./config.js\"\nimport { currentContext, state } from \"./context.js\"\nimport { getClient, type Tracehatch } from \"./init.js\"\nimport { newId } from \"./ids.js\"\nimport { serializeScore, serializeTrace } from \"./serialize.js\"\nimport { RecordingSpan } from \"./span.js\"\nimport type { Outcome, ScoreOptions, TraceOptions, User } from \"./types.js\"\n\n/** Behaviour only the SDK's own capture paths need. */\nexport interface InternalTraceOptions {\n /** End without sending anything when no span other than the root was recorded. */\n discardIfEmpty?: boolean\n /** Only SDK-created runs derive transcript content from their provider calls. */\n inferProviderBodies?: boolean\n}\n\nexport interface EndTraceOptions {\n outcome?: Outcome\n output?: unknown\n error?: unknown\n /** Wall-clock end (ISO) when the run ended earlier than the call, e.g. an automatic run. */\n endedAt?: string\n}\n\nexport class TraceHandle {\n readonly id = newId(\"run\")\n readonly root: RecordingSpan\n private sampled: boolean\n private ended = false\n private ending = false\n private outputSet = false\n private inputSet = false\n private inferredInputSet = false\n private readonly activeSpans = new Set<RecordingSpan>()\n private readonly captures = new Set<Promise<unknown>>()\n private readonly recordedToolCalls = new Set<string>()\n private expectedSpanCount = 1\n private data: TraceEnvelopeWire\n private removeAbort?: () => void\n\n constructor(\n readonly client: Tracehatch,\n name: string,\n options: TraceOptions = {},\n private readonly internal: InternalTraceOptions = {}\n ) {\n this.inputSet = options.input !== undefined\n this.sampled = client.samples(this.id)\n const rootId = newId(\"span\")\n const parent = currentContext()?.trace\n this.data = {\n id: this.id,\n root_span_id: rootId,\n name,\n status: \"pending\",\n started_at: timestamp(),\n agent: options.agent ?? client.options.agent,\n release: client.options.release,\n input: options.input,\n tags: options.tags,\n session_id: options.sessionId,\n user: options.user,\n metadata: options.metadata,\n }\n this.sanitize()\n if (parent) this.setMetadata({ parent_trace_id: parent.id })\n this.root = new RecordingSpan(\n this,\n options.rootName ?? \"agent.run\",\n \"agent\",\n { input: options.input },\n undefined,\n rootId\n )\n if (options.signal) {\n const signal = options.signal\n const abort = () => this.end({ outcome: \"cancelled\" })\n if (signal.aborted) abort()\n else {\n signal.addEventListener(\"abort\", abort, { once: true })\n this.removeAbort = () => signal.removeEventListener(\"abort\", abort)\n }\n }\n }\n\n get isRecording(): boolean {\n return !this.ended && this.sampled && this.client.isEnabled\n }\n get isEnded(): boolean {\n return this.ended\n }\n get hasOutput(): boolean {\n return this.outputSet\n }\n /** True once a span other than the root was recorded. */\n get hasChildren(): boolean {\n return this.expectedSpanCount > 1\n }\n registerSpan(span: RecordingSpan): void {\n if (!this.activeSpans.has(span)) {\n this.expectedSpanCount += 1\n this.activeSpans.add(span)\n }\n }\n unregisterSpan(span: RecordingSpan): void {\n this.activeSpans.delete(span)\n }\n\n /** Exact provider call identity lets explicit tool instrumentation take precedence. */\n rememberToolCall(callId: string): void {\n this.recordedToolCalls.add(callId)\n }\n hasRecordedToolCall(callId: string): boolean {\n return this.recordedToolCalls.has(callId)\n }\n\n /** A provider response still being read from its clone; `end()` waits for it. */\n track(capture: Promise<unknown>): void {\n this.captures.add(capture)\n const pending = (state.pendingCaptures ??= new Set())\n pending.add(capture)\n const done = () => {\n this.captures.delete(capture)\n pending.delete(capture)\n }\n capture.then(done, done)\n }\n\n private async settle(): Promise<void> {\n let timer: ReturnType<typeof setTimeout> | undefined\n const timeout = new Promise<void>((resolve) => {\n timer = setTimeout(resolve, sdkConfig.captureSettleMs)\n timer.unref?.()\n })\n try {\n await Promise.race([Promise.allSettled([...this.captures]), timeout])\n } finally {\n clearTimeout(timer)\n }\n }\n\n private sanitize(): void {\n try {\n this.data = serializeTrace(this.data, this.client.options)\n } catch {\n /* best effort */\n }\n }\n\n snapshot(): TraceEnvelopeWire {\n return this.data\n }\n run<T>(fn: (handle: TraceHandle) => T): T {\n return this.root.run(() => fn(this))\n }\n\n setInput(value: unknown): void {\n if (this.ended) return\n this.inputSet = true\n this.data.input = value\n this.root.setInput(value)\n this.sanitize()\n }\n setOutput(value: unknown): void {\n if (this.ended) return\n this.outputSet = true\n this.data.output = value\n this.root.setOutput(value)\n this.sanitize()\n }\n /** Capture internals only: explicit application values always take precedence. */\n captureProviderInput(value: unknown): void {\n if (\n this.ended ||\n !this.internal.inferProviderBodies ||\n !this.client.options.captureBodies ||\n this.inputSet ||\n this.inferredInputSet ||\n value === undefined\n )\n return\n this.inferredInputSet = true\n this.data.input = value\n this.root.setInput(value)\n this.sanitize()\n }\n captureProviderOutput(value: unknown): void {\n if (\n this.ended ||\n !this.internal.inferProviderBodies ||\n !this.client.options.captureBodies ||\n this.outputSet ||\n value === undefined\n )\n return\n this.data.output = value\n this.root.setOutput(value)\n this.sanitize()\n }\n setUser(user: User): void {\n if (!this.ended) {\n this.data.user = user\n this.sanitize()\n }\n }\n setSession(id: string): void {\n if (!this.ended) {\n this.data.session_id = id\n this.sanitize()\n }\n }\n addTags(...tags: string[]): void {\n if (!this.ended) {\n this.data.tags = [...new Set([...(this.data.tags ?? []), ...tags])]\n this.sanitize()\n }\n }\n setMetadata(metadata: Record<string, unknown>): void {\n if (this.ended) return\n try {\n const safe = serializeTrace(\n { ...this.data, metadata },\n this.client.options\n ).metadata\n this.data.metadata = { ...this.data.metadata, ...safe }\n this.sanitize()\n } catch {\n /* getters */\n }\n }\n\n /** Scores travel with subsequent completed spans, including the final root. */\n score(options: ScoreOptions): void {\n if (\n !this.isRecording ||\n (this.data.scores?.length ?? 0) >= WIRE_LIMITS.maxScoresPerTrace\n )\n return\n try {\n const score = serializeScore(\n newId(\"scr\"),\n options,\n this.client.options,\n \"spanId\"\n )\n if (score) this.data.scores = [...(this.data.scores ?? []), score]\n } catch {\n // Invalid instrumentation must never interrupt the user's agent.\n }\n }\n\n /**\n * End the run. A provider response still being read (a stream the caller\n * consumes after the run's callback returned, or a body parsed in parallel\n * with the caller) delays the end until it finishes, bounded by\n * `captureSettleMs`, so the generation is recorded instead of cancelled.\n */\n end(options: EndTraceOptions = {}): void {\n if (this.ended || this.ending) return\n if (this.captures.size > 0) {\n this.ending = true\n const settled = this.settle().then(() => {\n this.ending = false\n this.end(options)\n })\n const pendingEnds = (state.pendingEnds ??= new Set())\n pendingEnds.add(settled)\n void settled.finally(() => pendingEnds.delete(settled))\n return\n }\n try {\n if (this.internal.discardIfEmpty && !this.hasChildren) {\n this.ended = true\n return\n }\n // Close unfinished work while the envelope is still pending; root is last.\n for (const span of this.activeSpans) span.end({ status: \"cancelled\" })\n this.data.status =\n options.outcome ?? (\"error\" in options ? \"error\" : \"ok\")\n this.data.ended_at = options.endedAt ?? timestamp()\n this.data.expected_span_count = this.expectedSpanCount\n if (\"output\" in options) this.data.output = options.output\n this.sanitize()\n this.root.end({\n status: this.data.status,\n endedAt: this.data.ended_at,\n ...(\"output\" in options ? { output: options.output } : {}),\n ...(\"error\" in options ? { error: options.error } : {}),\n })\n } finally {\n this.ended = true\n this.removeAbort?.()\n }\n }\n}\n\nexport function startTrace(\n name: string,\n options: TraceOptions = {}\n): TraceHandle {\n try {\n return new TraceHandle(getClient(), name, options)\n } catch {\n return noopTrace()\n }\n}\n\nexport async function trace<T>(\n name: string,\n fn: (handle: TraceHandle) => T,\n options: TraceOptions = {}\n): Promise<Awaited<T>> {\n let handle: TraceHandle\n try {\n handle = startTrace(name, options)\n } catch {\n return await fn(noopTrace())\n }\n try {\n const result = await handle.run(fn)\n handle.end(\n result === undefined || handle.hasOutput ? {} : { output: result }\n )\n return result\n } catch (error) {\n handle.end({\n error,\n outcome: options.signal?.aborted ? \"cancelled\" : \"error\",\n })\n throw error\n }\n}\n\nfunction noopTrace(): TraceHandle {\n // Used only if runtime setup itself fails; run the user's callback exactly once.\n const handle = {\n id: \"\",\n isRecording: false,\n isEnded: true,\n hasChildren: false,\n setInput() {},\n setOutput() {},\n setUser() {},\n setSession() {},\n addTags() {},\n setMetadata() {},\n score() {},\n end() {},\n track() {},\n run<T>(fn: (handle: TraceHandle) => T): T {\n return fn(handle as unknown as TraceHandle)\n },\n }\n return handle as unknown as TraceHandle\n}\n\nexport function setUser(user: User): void {\n currentContext()?.trace.setUser(user)\n}\nexport function setSession(id: string): void {\n currentContext()?.trace.setSession(id)\n}\nexport function addTags(...tags: string[]): void {\n currentContext()?.trace.addTags(...tags)\n}\nexport function setMetadata(metadata: Record<string, unknown>): void {\n currentContext()?.trace.setMetadata(metadata)\n}\n\nexport function score(options: ScoreOptions): void {\n currentContext()?.trace.score(options)\n}\n"]}