bitfab 0.68.8 → 0.68.9

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.
@@ -500,6 +500,17 @@ function runWithAutoTraceNodeConfiguration(nodeConfiguration, fn) {
500
500
  if (isAutoTraceAsyncGenerator(result)) return wrapAutoTraceNodeAsyncGenerator(nodeConfiguration, result);
501
501
  return result;
502
502
  }
503
+ function runWithAutoTraceFramesAt(spanStack, fn) {
504
+ const scope = currentAutoTraceScope();
505
+ if (!scope || scope.entries.length === 0) return fn();
506
+ return runWithAutoTraceScope({
507
+ ...scope,
508
+ entries: scope.entries.map((entry) => ({
509
+ ...entry,
510
+ spanStack
511
+ }))
512
+ }, fn);
513
+ }
503
514
  function runAsAutoTraceRootFunction(functionName, fn) {
504
515
  const scope = currentAutoTraceScope();
505
516
  if (!scope || scope.entries.length === 0 || functionName === "") return fn();
@@ -960,6 +971,12 @@ Object.defineProperty(exports, "runWithAutoTraceEntry", {
960
971
  return runWithAutoTraceEntry;
961
972
  }
962
973
  });
974
+ Object.defineProperty(exports, "runWithAutoTraceFramesAt", {
975
+ enumerable: true,
976
+ get: function() {
977
+ return runWithAutoTraceFramesAt;
978
+ }
979
+ });
963
980
  Object.defineProperty(exports, "runWithAutoTraceNodeConfiguration", {
964
981
  enumerable: true,
965
982
  get: function() {
@@ -1009,4 +1026,4 @@ Object.defineProperty(exports, "writeOnce", {
1009
1026
  }
1010
1027
  });
1011
1028
 
1012
- //# sourceMappingURL=autoTrace-DUmR1KJ8.cjs.map
1029
+ //# sourceMappingURL=autoTrace-DPWV1Xzr.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoTrace-DPWV1Xzr.cjs","names":["importOptionalPeer","target"],"sources":["../src/asyncStorage.ts","../src/captureSuppression.ts","../src/warnOnce.ts","../src/langchainRunScope.ts","../src/openaiAgentsSpanContext.ts","../src/clientCalls.ts","../src/autoTrace.ts"],"sourcesContent":["/**\n * Shared AsyncLocalStorage loader.\n *\n * Provides two ways to initialize AsyncLocalStorage:\n *\n * 1. **Synchronous registration** (preferred for Node.js):\n * `asyncStorageNode.ts` calls `registerAsyncLocalStorageClass()` at module\n * evaluation time, so the class is available immediately - no async gap.\n * The `node.ts` entry point imports it before anything else.\n *\n * 2. **Async dynamic import** (fallback for the default entry point):\n * Loads `node:async_hooks` via a bundler-safe dynamic import. This is used\n * by the default `index.ts` entry point so the SDK works in browsers\n * (where the import silently fails) and in Node.js when imported via the\n * default entry point.\n *\n * ## Why the dynamic import looks like this\n *\n * We need to handle three environments:\n *\n * 1. **Pure Node.js** - `import(\"node:async_hooks\")` works natively.\n * 2. **Webpack/Turbopack (Next.js server)** - The bundler processes\n * `import()` calls at build time. The `webpackIgnore` magic comment tells\n * webpack (and turbopack) to emit a native `import()` call instead of\n * trying to resolve it, so Node.js handles it at runtime.\n * 3. **Browsers / Edge** - The `process.versions?.node` guard prevents\n * execution entirely. If it somehow runs, `.catch(() => {})` swallows\n * the failure.\n */\n\nexport interface AsyncLocalStorageLike<T> {\n getStore(): T | undefined\n run<R>(store: T, fn: () => R): R\n}\n\nlet AsyncLocalStorageClass: (new () => AsyncLocalStorageLike<unknown>) | null =\n null\nlet initDone = false\n\n/**\n * Register the AsyncLocalStorage class synchronously.\n *\n * Called by `asyncStorageNode.ts` at module evaluation time so the class\n * is available before any span is created - no async gap, no race condition.\n *\n * Safe to call multiple times; subsequent calls are no-ops.\n */\nexport function registerAsyncLocalStorageClass(\n cls: new () => AsyncLocalStorageLike<unknown>,\n): void {\n if (!AsyncLocalStorageClass) {\n AsyncLocalStorageClass = cls\n }\n initDone = true\n}\n\n/**\n * Assert that AsyncLocalStorage was registered successfully.\n *\n * Called by `node.ts` after importing `asyncStorageNode.ts` to catch\n * import-order bugs at startup rather than silently degrading to the\n * browser fallback (flat spans with no nesting).\n *\n * This should ONLY be called from the Node.js entry point where we\n * know `node:async_hooks` must be available.\n */\nexport function assertAsyncStorageRegistered(): void {\n if (!AsyncLocalStorageClass) {\n console.warn(\n \"Bitfab: AsyncLocalStorage not available - nested span context will not propagate.\",\n )\n }\n}\n\nexport const asyncStorageReady: Promise<void> = (\n typeof process !== \"undefined\" && process.versions?.node\n ? // The join trick hides \"node:async_hooks\" from static analysis so\n // bundlers that ban Node.js built-ins don't fail at build time.\n // webpackIgnore tells webpack/turbopack to emit a native import()\n // so Node.js can resolve the module at runtime.\n import(\n /* webpackIgnore: true */\n [\"node\", \"async_hooks\"].join(\":\")\n )\n .then(\n (mod: {\n AsyncLocalStorage: new () => AsyncLocalStorageLike<unknown>\n }) => {\n registerAsyncLocalStorageClass(mod.AsyncLocalStorage)\n },\n )\n .catch(() => {})\n : Promise.resolve()\n).then(() => {\n initDone = true\n})\n\nexport function isAsyncStorageInitDone(): boolean {\n return initDone\n}\n\nexport function createAsyncLocalStorage<T>(): AsyncLocalStorageLike<T> | null {\n return AsyncLocalStorageClass\n ? (new AsyncLocalStorageClass() as AsyncLocalStorageLike<T>)\n : null\n}\n","interface CaptureSuppressionState {\n depth: number\n}\n\ninterface CaptureSuppressionGlobal {\n __bitfabCaptureSuppressionV1?: CaptureSuppressionState\n}\n\nconst suppressionGlobal = globalThis as unknown as CaptureSuppressionGlobal\nconst suppressionState: CaptureSuppressionState =\n suppressionGlobal.__bitfabCaptureSuppressionV1 ?? { depth: 0 }\nsuppressionGlobal.__bitfabCaptureSuppressionV1 = suppressionState\n\nexport function isCaptureSuppressed(): boolean {\n return suppressionState.depth > 0\n}\n\nexport function runWithCaptureSuppressed<T>(fn: () => T): T {\n suppressionState.depth += 1\n try {\n return fn()\n } finally {\n suppressionState.depth -= 1\n }\n}\n","/**\n * Emit a `console.warn` at most once per distinct `key` for the life of the\n * process.\n *\n * The SDK must NEVER crash a host app, so every failure on the user's path\n * degrades silently (a span is dropped, a call runs untraced, a payload is\n * stubbed). Silent is safe but undebuggable: a user who suddenly has no traces,\n * or sees `<unserializable>` in a span, has no signal as to why. A one-time\n * warning per distinct issue restores that signal without spamming the console\n * from a hot path.\n *\n * Keys should identify the specific degradation (e.g. include the traced\n * function key) so each distinct issue warns once, not just the first one seen.\n */\nconst warned = new Set<string>()\n\nexport function warn(message: string): void {\n try {\n console.warn(`[bitfab] ${message}`)\n } catch {\n // Logging must never crash the host app (e.g. a closed/replaced console).\n }\n}\n\nexport function warnOnce(key: string, message: string): void {\n if (warned.has(key)) {\n return\n }\n warned.add(key)\n warn(message)\n}\n\nexport function writeOnce(\n key: string,\n line: string,\n write: (line: string) => void = console.warn,\n): void {\n if (warned.has(key)) {\n return\n }\n warned.add(key)\n try {\n write(line)\n } catch {}\n}\n\n/** Test-only: clear the dedup set so a warning can fire again. */\nexport function _resetWarnOnce(): void {\n warned.clear()\n}\n","import {\n type AsyncLocalStorageLike,\n createAsyncLocalStorage,\n} from \"./asyncStorage.js\"\nimport { importOptionalPeer } from \"./optionalPeer.js\"\n\nconst RUN_SCOPE_STORAGE_SYMBOL = Symbol.for(\"bitfab.langchainRunScopeStorage\")\nconst SCOPED_GENERATE_SYMBOL = Symbol.for(\"bitfab.langchainScopedGenerate\")\nconst UNSCOPED_RUNS_SYMBOL = Symbol.for(\"bitfab.langchainUnscopedRuns\")\nconst MODEL_CLASSES = [\n {\n specifierParts: [\"@langchain\", \"core\", \"language_models\", \"chat_models\"],\n name: \"BaseChatModel\",\n },\n {\n specifierParts: [\"@langchain\", \"core\", \"language_models\", \"llms\"],\n name: \"BaseLLM\",\n },\n] as const\n\ninterface LangChainRunScope {\n recordedByHandler: boolean\n}\n\ntype Generate = ((...args: unknown[]) => unknown) & {\n [SCOPED_GENERATE_SYMBOL]?: true\n}\n\nlet runScopeStorage: AsyncLocalStorageLike<LangChainRunScope> | null = null\nlet installation: Promise<void> | null = null\n\nfunction storage(): AsyncLocalStorageLike<LangChainRunScope> | null {\n if (runScopeStorage) {\n return runScopeStorage\n }\n const shared = globalThis as typeof globalThis & Record<symbol, unknown>\n const existing = shared[RUN_SCOPE_STORAGE_SYMBOL] as\n | AsyncLocalStorageLike<LangChainRunScope>\n | undefined\n runScopeStorage = existing ?? createAsyncLocalStorage<LangChainRunScope>()\n if (runScopeStorage && !existing) {\n shared[RUN_SCOPE_STORAGE_SYMBOL] = runScopeStorage\n }\n return runScopeStorage\n}\n\nfunction unscopedRuns(): Set<string> {\n const shared = globalThis as typeof globalThis & Record<symbol, unknown>\n const existing = shared[UNSCOPED_RUNS_SYMBOL] as Set<string> | undefined\n if (existing) {\n return existing\n }\n const created = new Set<string>()\n shared[UNSCOPED_RUNS_SYMBOL] = created\n return created\n}\n\nfunction scopeGenerate(prototype: { generate?: Generate }): void {\n const original = prototype.generate\n if (typeof original !== \"function\" || original[SCOPED_GENERATE_SYMBOL]) {\n return\n }\n const scoped: Generate = function (this: unknown, ...args: unknown[]) {\n const runStorage = storage()\n if (!runStorage) {\n return original.apply(this, args)\n }\n return runStorage.run({ recordedByHandler: false }, () =>\n original.apply(this, args),\n )\n }\n scoped[SCOPED_GENERATE_SYMBOL] = true\n prototype.generate = scoped\n}\n\nasync function scopeModelClass(\n specifierParts: readonly string[],\n name: string,\n): Promise<void> {\n try {\n const module =\n await importOptionalPeer<Record<string, unknown>>(specifierParts)\n const modelClass = module[name] as { prototype?: { generate?: Generate } }\n if (modelClass?.prototype) {\n scopeGenerate(modelClass.prototype)\n }\n } catch {}\n}\n\nexport function installLangChainRunScopes(): Promise<void> {\n installation ??= Promise.all(\n MODEL_CLASSES.map(({ specifierParts, name }) =>\n scopeModelClass(specifierParts, name),\n ),\n ).then(() => undefined)\n return installation\n}\n\nexport function markLangChainRunRecorded(runId: string): void {\n const scope = storage()?.getStore()\n if (scope) {\n scope.recordedByHandler = true\n return\n }\n unscopedRuns().add(runId)\n}\n\nexport function forgetLangChainRun(runId: string): void {\n unscopedRuns().delete(runId)\n}\n\nexport function langChainHandlerRecordsCall(): boolean {\n const scope = storage()?.getStore()\n if (scope) {\n return scope.recordedByHandler\n }\n return unscopedRuns().size > 0\n}\n","const OPENAI_AGENTS_CONTEXT_STORAGE = Symbol.for(\n \"openai.agents.core.asyncLocalStorage\",\n)\nconst MAX_OPENAI_AGENTS_SPAN_CHAIN = 64\nconst MODEL_CALL_SPAN_TYPES = new Set([\"generation\", \"response\"])\n\ninterface OpenAiAgentsSpanLike {\n spanId?: unknown\n traceId?: unknown\n spanData?: { type?: unknown } | null\n previousSpan?: OpenAiAgentsSpanLike | null\n}\n\ninterface OpenAiAgentsContextStore {\n active?: unknown\n span?: OpenAiAgentsSpanLike | null\n}\n\ninterface OpenAiAgentsContextStorage {\n getStore(): OpenAiAgentsContextStore | undefined\n}\n\ninterface OpenAiAgentsSpanState {\n bitfabTraceIds: Map<string, string>\n endedSpanIds: Map<string, Set<string>>\n}\n\ninterface OpenAiAgentsSpanGlobal {\n __bitfabOpenAiAgentsSpansV1?: OpenAiAgentsSpanState\n}\n\nconst spanGlobal = globalThis as unknown as OpenAiAgentsSpanGlobal &\n Record<symbol, unknown>\nconst state: OpenAiAgentsSpanState = spanGlobal.__bitfabOpenAiAgentsSpansV1 ?? {\n bitfabTraceIds: new Map(),\n endedSpanIds: new Map(),\n}\nspanGlobal.__bitfabOpenAiAgentsSpansV1 = state\n\nexport function mapOpenAiAgentsTrace(\n agentsTraceId: string,\n bitfabTraceId: string,\n): void {\n state.bitfabTraceIds.set(agentsTraceId, bitfabTraceId)\n}\n\nexport function unmapOpenAiAgentsTrace(agentsTraceId: string): void {\n state.bitfabTraceIds.delete(agentsTraceId)\n state.endedSpanIds.delete(agentsTraceId)\n}\n\nexport function endOpenAiAgentsSpan(\n agentsTraceId: string,\n spanId: string,\n): void {\n if (!state.bitfabTraceIds.has(agentsTraceId)) {\n return\n }\n const ended = state.endedSpanIds.get(agentsTraceId) ?? new Set<string>()\n ended.add(spanId)\n state.endedSpanIds.set(agentsTraceId, ended)\n}\n\nfunction isOpenAiAgentsContextStorage(\n value: unknown,\n): value is OpenAiAgentsContextStorage {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as { getStore?: unknown }).getStore === \"function\"\n )\n}\n\nfunction currentOpenAiAgentsSpan(): OpenAiAgentsSpanLike | undefined {\n const storage = spanGlobal[OPENAI_AGENTS_CONTEXT_STORAGE]\n if (!isOpenAiAgentsContextStorage(storage)) {\n return undefined\n }\n try {\n const store = storage.getStore()\n return store?.active === true ? (store.span ?? undefined) : undefined\n } catch {\n return undefined\n }\n}\n\nfunction currentOpenAiAgentsSpans(): OpenAiAgentsSpanLike[] {\n const spans: OpenAiAgentsSpanLike[] = []\n let span = currentOpenAiAgentsSpan()\n while (span !== undefined && spans.length < MAX_OPENAI_AGENTS_SPAN_CHAIN) {\n spans.push(span)\n span = span.previousSpan ?? undefined\n }\n return spans\n}\n\nexport function openAiAgentsSpanChain(): string[] {\n if (state.bitfabTraceIds.size === 0) {\n return []\n }\n return currentOpenAiAgentsSpans()\n .map((span) => span.spanId)\n .filter((spanId): spanId is string => typeof spanId === \"string\")\n}\n\nexport function openAiAgentsParentSpanId(\n bitfabTraceId: string,\n enclosingSpanIds: readonly string[] | undefined,\n): string | undefined {\n if (state.bitfabTraceIds.size === 0) {\n return undefined\n }\n for (const span of currentOpenAiAgentsSpans()) {\n if (typeof span.spanId !== \"string\" || typeof span.traceId !== \"string\") {\n return undefined\n }\n if (state.bitfabTraceIds.get(span.traceId) !== bitfabTraceId) {\n return undefined\n }\n if (enclosingSpanIds?.includes(span.spanId)) {\n return undefined\n }\n if (!state.endedSpanIds.get(span.traceId)?.has(span.spanId)) {\n return span.spanId\n }\n }\n return undefined\n}\n\nexport function openAiAgentsModelCallOpen(): boolean {\n if (state.bitfabTraceIds.size === 0) {\n return false\n }\n return currentOpenAiAgentsSpans().some(\n (span) =>\n typeof span.traceId === \"string\" &&\n typeof span.spanId === \"string\" &&\n state.bitfabTraceIds.has(span.traceId) &&\n MODEL_CALL_SPAN_TYPES.has(String(span.spanData?.type)) &&\n !state.endedSpanIds.get(span.traceId)?.has(span.spanId),\n )\n}\n","import {\n type AsyncLocalStorageLike,\n createAsyncLocalStorage,\n} from \"./asyncStorage.js\"\nimport { langChainHandlerRecordsCall } from \"./langchainRunScope.js\"\nimport { openAiAgentsModelCallOpen } from \"./openaiAgentsSpanContext.js\"\n\nconst OPENROUTER_HOSTNAME = \"openrouter.ai\"\nconst CLIENT_CALL_WATCH_STORAGE_SYMBOL = Symbol.for(\n \"bitfab.clientCallWatchStorage\",\n)\n\nexport interface ClientCallProvider {\n key: string\n library: string\n matchesReceiver(receiver: unknown): boolean\n isResponse(response: unknown): boolean\n prompt(body: unknown): string | undefined\n context(\n body: unknown,\n response: unknown,\n durationMs: number,\n ): Record<string, unknown>\n}\n\ninterface ClientCallWatch {\n recorded: boolean\n parent: ClientCallWatch | null\n}\n\ninterface ClientCallSpan {\n addContext(context: Record<string, unknown>): void\n setPrompt(prompt: string): void\n}\n\ninterface PromptEntry {\n role: string\n content: string\n}\n\nconst responsesRecordedByAutoTrace = new WeakSet<object>()\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null\n}\n\nfunction field(value: unknown, name: string): unknown {\n return isRecord(value) ? value[name] : undefined\n}\n\nfunction numberField(value: unknown, name: string): number | undefined {\n const found = field(value, name)\n return typeof found === \"number\" && Number.isFinite(found) ? found : undefined\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value !== \"\" ? value : undefined\n}\n\nfunction presentFields(\n base: Record<string, unknown>,\n values: Record<string, unknown>,\n durationMs: number,\n): Record<string, unknown> {\n const context = { ...base }\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined) {\n context[key] = value\n }\n }\n context.durationMs = durationMs\n return context\n}\n\nfunction sumOfPresent(values: Array<number | undefined>): number | undefined {\n const present = values.filter((value) => value !== undefined)\n return present.length > 0\n ? present.reduce((total, value) => total + value, 0)\n : undefined\n}\n\nfunction textOf(content: unknown): string {\n return typeof content === \"string\" ? content : JSON.stringify(content)\n}\n\nfunction roleEntries(items: unknown[]): PromptEntry[] {\n return items.flatMap((item) => {\n const role = field(item, \"role\")\n if (typeof role !== \"string\") {\n return []\n }\n return [{ role, content: textOf(field(item, \"content\")) }]\n })\n}\n\nfunction renderedPrompt(entries: PromptEntry[]): string | undefined {\n return entries.length > 0 ? JSON.stringify(entries) : undefined\n}\n\nfunction clientOf(receiver: unknown): unknown {\n try {\n return field(receiver, \"_client\")\n } catch {\n return undefined\n }\n}\n\nfunction clientClassStatic(receiver: unknown, name: string): unknown {\n const client = clientOf(receiver)\n if (!isRecord(client)) {\n return undefined\n }\n try {\n const clientClass: unknown = client.constructor\n return typeof clientClass === \"function\"\n ? (clientClass as unknown as Record<string, unknown>)[name]\n : undefined\n } catch {\n return undefined\n }\n}\n\nfunction isOpenRouterBaseUrl(baseUrl: unknown): boolean {\n if (typeof baseUrl !== \"string\") {\n return false\n }\n try {\n const host = new URL(baseUrl).hostname\n return (\n host === OPENROUTER_HOSTNAME || host.endsWith(`.${OPENROUTER_HOSTNAME}`)\n )\n } catch {\n return false\n }\n}\n\nexport function isOpenRouterCompletions(receiver: unknown): boolean {\n try {\n return isOpenRouterBaseUrl(field(clientOf(receiver), \"baseURL\"))\n } catch {\n return false\n }\n}\n\nfunction isAnthropicMessages(receiver: unknown): boolean {\n return typeof clientClassStatic(receiver, \"HUMAN_PROMPT\") === \"string\"\n}\n\nfunction isOpenAIResponses(receiver: unknown): boolean {\n return typeof clientClassStatic(receiver, \"OpenAI\") === \"function\"\n}\n\nexport function isStreamingRequest(body: unknown): boolean {\n return field(body, \"stream\") === true\n}\n\nexport function openRouterPrompt(body: unknown): string | undefined {\n const messages = field(body, \"messages\")\n return Array.isArray(messages)\n ? renderedPrompt(roleEntries(messages))\n : undefined\n}\n\nexport function openRouterContext(\n body: unknown,\n response: unknown,\n durationMs: number,\n): Record<string, unknown> {\n const usage = field(response, \"usage\")\n return presentFields(\n { provider: \"openrouter\" },\n {\n model:\n nonEmptyString(field(response, \"model\")) ??\n nonEmptyString(field(body, \"model\")),\n upstreamProvider: nonEmptyString(field(response, \"provider\")),\n inputTokens: numberField(usage, \"prompt_tokens\"),\n outputTokens: numberField(usage, \"completion_tokens\"),\n cachedInputTokens: numberField(\n field(usage, \"prompt_tokens_details\"),\n \"cached_tokens\",\n ),\n reasoningTokens: numberField(\n field(usage, \"completion_tokens_details\"),\n \"reasoning_tokens\",\n ),\n costUsd: numberField(usage, \"cost\"),\n },\n durationMs,\n )\n}\n\nexport function anthropicPrompt(body: unknown): string | undefined {\n const system = field(body, \"system\")\n const messages = field(body, \"messages\")\n return renderedPrompt([\n ...(system === undefined || system === null\n ? []\n : [{ role: \"system\", content: textOf(system) }]),\n ...(Array.isArray(messages) ? roleEntries(messages) : []),\n ])\n}\n\nexport function anthropicContext(\n body: unknown,\n response: unknown,\n durationMs: number,\n): Record<string, unknown> {\n const usage = field(response, \"usage\")\n const cacheRead = numberField(usage, \"cache_read_input_tokens\")\n return presentFields(\n { provider: \"anthropic\" },\n {\n model:\n nonEmptyString(field(response, \"model\")) ??\n nonEmptyString(field(body, \"model\")),\n inputTokens: sumOfPresent([\n numberField(usage, \"input_tokens\"),\n cacheRead,\n numberField(usage, \"cache_creation_input_tokens\"),\n ]),\n outputTokens: numberField(usage, \"output_tokens\"),\n cachedInputTokens: cacheRead,\n },\n durationMs,\n )\n}\n\nexport function openAIResponsesPrompt(body: unknown): string | undefined {\n const instructions = field(body, \"instructions\")\n const input = field(body, \"input\")\n return renderedPrompt([\n ...(typeof instructions === \"string\"\n ? [{ role: \"system\", content: instructions }]\n : []),\n ...(typeof input === \"string\" ? [{ role: \"user\", content: input }] : []),\n ...(Array.isArray(input) ? roleEntries(input) : []),\n ])\n}\n\nexport function openAIResponsesContext(\n body: unknown,\n response: unknown,\n durationMs: number,\n): Record<string, unknown> {\n const usage = field(response, \"usage\")\n return presentFields(\n { provider: \"openai\" },\n {\n model:\n nonEmptyString(field(response, \"model\")) ??\n nonEmptyString(field(body, \"model\")),\n inputTokens: numberField(usage, \"input_tokens\"),\n outputTokens: numberField(usage, \"output_tokens\"),\n cachedInputTokens: numberField(\n field(usage, \"input_tokens_details\"),\n \"cached_tokens\",\n ),\n reasoningTokens: numberField(\n field(usage, \"output_tokens_details\"),\n \"reasoning_tokens\",\n ),\n costUsd: numberField(usage, \"cost\"),\n },\n durationMs,\n )\n}\n\nexport const OPENROUTER: ClientCallProvider = {\n key: \"openrouter\",\n library: \"openai\",\n matchesReceiver: isOpenRouterCompletions,\n isResponse: (response) =>\n isRecord(response) && Array.isArray(response.choices),\n prompt: openRouterPrompt,\n context: openRouterContext,\n}\n\nexport const ANTHROPIC: ClientCallProvider = {\n key: \"anthropic\",\n library: \"@anthropic-ai/sdk\",\n matchesReceiver: isAnthropicMessages,\n isResponse: (response) =>\n field(response, \"type\") === \"message\" &&\n Array.isArray(field(response, \"content\")),\n prompt: anthropicPrompt,\n context: anthropicContext,\n}\n\nexport const OPENAI_RESPONSES: ClientCallProvider = {\n key: \"openai-responses\",\n library: \"openai\",\n matchesReceiver: isOpenAIResponses,\n isResponse: (response) => field(response, \"object\") === \"response\",\n prompt: openAIResponsesPrompt,\n context: openAIResponsesContext,\n}\n\nconst CLIENT_CALL_PROVIDERS = new Map(\n [OPENROUTER, ANTHROPIC, OPENAI_RESPONSES].map((provider) => [\n provider.key,\n provider,\n ]),\n)\n\nexport function clientCallProvider(\n key: string | undefined,\n): ClientCallProvider | undefined {\n return key === undefined ? undefined : CLIENT_CALL_PROVIDERS.get(key)\n}\n\nfunction recordClientCall(\n provider: ClientCallProvider,\n span: ClientCallSpan,\n body: unknown,\n response: unknown,\n durationMs: number,\n): void {\n try {\n const prompt = provider.prompt(body)\n if (prompt !== undefined) {\n span.setPrompt(prompt)\n }\n span.addContext(provider.context(body, response, durationMs))\n } catch {}\n}\n\nlet clientCallWatchStorage: AsyncLocalStorageLike<ClientCallWatch> | null = null\n\nfunction watchStorage(): AsyncLocalStorageLike<ClientCallWatch> | null {\n if (clientCallWatchStorage) {\n return clientCallWatchStorage\n }\n const shared = globalThis as typeof globalThis & Record<symbol, unknown>\n const existing = shared[CLIENT_CALL_WATCH_STORAGE_SYMBOL] as\n | AsyncLocalStorageLike<ClientCallWatch>\n | undefined\n clientCallWatchStorage =\n existing ?? createAsyncLocalStorage<ClientCallWatch>()\n if (clientCallWatchStorage && !existing) {\n shared[CLIENT_CALL_WATCH_STORAGE_SYMBOL] = clientCallWatchStorage\n }\n return clientCallWatchStorage\n}\n\nexport function watchClientCall<T>(fn: () => T): {\n watch: ClientCallWatch\n result: T\n} {\n const storage = watchStorage()\n const watch: ClientCallWatch = {\n recorded: false,\n parent: storage?.getStore() ?? null,\n }\n const result = storage ? storage.run(watch, fn) : fn()\n return { watch, result }\n}\n\nfunction markEnclosingWatches(watch: ClientCallWatch): void {\n for (let current = watch.parent; current; current = current.parent) {\n current.recorded = true\n }\n}\n\nexport function frameworkRecordsClientCall(): boolean {\n return langChainHandlerRecordsCall() || openAiAgentsModelCallOpen()\n}\n\nfunction isRecordedByAutoTrace(response: unknown): boolean {\n return isRecord(response) && responsesRecordedByAutoTrace.has(response)\n}\n\nexport function recordWatchedClientCall(\n provider: ClientCallProvider,\n span: ClientCallSpan,\n watch: ClientCallWatch,\n body: unknown,\n response: unknown,\n durationMs: number,\n): void {\n if (watch.recorded || isRecordedByAutoTrace(response)) {\n markEnclosingWatches(watch)\n return\n }\n if (!provider.isResponse(response)) {\n return\n }\n recordClientCall(provider, span, body, response, durationMs)\n responsesRecordedByAutoTrace.add(response as object)\n markEnclosingWatches(watch)\n}\n\nexport function recordAutoTracedClientCall<T>(\n provider: ClientCallProvider,\n invokeFn: () => T,\n body: unknown,\n span: ClientCallSpan,\n): T {\n const startedAt = Date.now()\n const { watch, result } = watchClientCall(invokeFn)\n const settle = (response: unknown): void => {\n recordWatchedClientCall(\n provider,\n span,\n watch,\n body,\n response,\n Date.now() - startedAt,\n )\n }\n if (result instanceof Promise) {\n return result.then((response) => {\n settle(response)\n return response\n }) as T\n }\n settle(result)\n return result\n}\n","import {\n type AsyncLocalStorageLike,\n createAsyncLocalStorage,\n} from \"./asyncStorage.js\"\nimport { isCaptureSuppressed } from \"./captureSuppression.js\"\nimport {\n ANTHROPIC,\n type ClientCallProvider,\n frameworkRecordsClientCall,\n isStreamingRequest,\n OPENAI_RESPONSES,\n OPENROUTER,\n} from \"./clientCalls.js\"\nimport { warnOnce } from \"./warnOnce.js\"\n\nexport interface AutoTraceFunctionDefinition {\n id: string\n name: string\n file: string\n line: number\n column: number\n async?: boolean\n wrapper?: boolean\n baml?: boolean\n jev?: boolean\n clientCall?: string\n}\n\nexport interface AutoTraceNodeConfiguration {\n functionName: string\n name?: string\n type?: \"llm\" | \"agent\" | \"function\" | \"guardrail\" | \"handoff\" | \"custom\"\n defaultType?: boolean\n capture: boolean\n experimentId?: string\n /** @deprecated Use experimentId. */\n testRunId?: string\n mockOnReplay?: boolean\n replayReusable?: boolean\n // biome-ignore lint/suspicious/noExplicitAny: node finalizers receive the configured function's result, whose type is owned by the caller\n finalize?: (result: any) => unknown | Promise<unknown>\n}\n\nexport interface NestedTraceLink {\n traceFunctionKey: string\n traceId?: string\n rootSpanId?: string\n}\n\nexport interface SpanDetails {\n contexts: Record<string, unknown>[]\n prompt?: string\n}\n\nexport interface AutoTraceEntry {\n context: AutoTraceContext\n depth: number\n spanStack: unknown\n}\n\nexport interface AutoTraceContext {\n readonly traceFunctionKey: string\n invoke<T>(\n definition: AutoTraceFunctionDefinition,\n inputs: unknown[],\n fn: () => T,\n entry: AutoTraceEntry,\n spanDetails: SpanDetails,\n nodeConfiguration?: AutoTraceNodeConfiguration,\n ): T\n invokeNestedRoot<T>(\n name: string,\n functionName: string,\n inputs: unknown[],\n fn: () => T,\n entry: AutoTraceEntry,\n link: NestedTraceLink | undefined,\n spanDetails: SpanDetails,\n ): T\n}\n\ninterface AutoTraceRootFunction {\n name: string\n entering: boolean\n}\n\ninterface AutoTraceScope {\n entries: readonly AutoTraceEntry[]\n nodeConfiguration?: AutoTraceNodeConfiguration\n rootFunction?: AutoTraceRootFunction\n}\n\ninterface AutoTraceState {\n storage: AsyncLocalStorageLike<AutoTraceScope> | null\n browserScope: AutoTraceScope | undefined\n // Older SDK copies read this field when sharing the process-wide V4 state.\n capturePolicies: WeakMap<object, Map<string, ReadonlySet<string>>>\n activeRoots: number\n}\n\ninterface AutoTraceGlobal {\n __bitfabAutoTraceStateV4?: AutoTraceState\n __bitfab_auto_trace_transformed_v1__?: boolean\n}\n\ninterface AutoTraceAsyncGenerator {\n next(value?: unknown): Promise<IteratorResult<unknown, unknown>>\n return(value?: unknown): Promise<IteratorResult<unknown, unknown>>\n throw(error?: unknown): Promise<IteratorResult<unknown, unknown>>\n [Symbol.asyncIterator](): AutoTraceAsyncGenerator\n}\n\nconst autoTraceGlobal = globalThis as unknown as AutoTraceGlobal\nconst autoTraceState: AutoTraceState =\n autoTraceGlobal.__bitfabAutoTraceStateV4 ?? {\n storage: null,\n browserScope: undefined,\n capturePolicies: new WeakMap(),\n activeRoots: 0,\n }\nautoTraceGlobal.__bitfabAutoTraceStateV4 = autoTraceState\n\nfunction initializeAutoTraceStorage(): void {\n autoTraceState.storage ??= createAsyncLocalStorage<AutoTraceScope>()\n}\n\nfunction runWithAutoTraceScope<T>(scope: AutoTraceScope, fn: () => T): T {\n initializeAutoTraceStorage()\n if (autoTraceState.storage) {\n return autoTraceState.storage.run(scope, fn)\n }\n\n const previous = autoTraceState.browserScope\n autoTraceState.browserScope = scope\n try {\n return fn()\n } finally {\n autoTraceState.browserScope = previous\n }\n}\n\nexport function currentAutoTraceEntries(): readonly AutoTraceEntry[] {\n return currentAutoTraceScope()?.entries ?? []\n}\n\nfunction replaceEntry(\n entries: readonly AutoTraceEntry[],\n previous: AutoTraceEntry,\n updated: AutoTraceEntry,\n): readonly AutoTraceEntry[] {\n return entries.map((entry) => (entry === previous ? updated : entry))\n}\n\nexport function runWithAutoTraceEntry<T>(\n previous: AutoTraceEntry,\n updated: AutoTraceEntry,\n fn: () => T,\n): T {\n const result = runWithAutoTraceScope(\n { entries: replaceEntry(currentAutoTraceEntries(), previous, updated) },\n fn,\n )\n if (isAutoTraceAsyncGenerator(result)) {\n return wrapAutoTraceEntryAsyncGenerator(previous, updated, result) as T\n }\n return result\n}\n\nfunction wrapAutoTraceEntryAsyncGenerator(\n previous: AutoTraceEntry,\n updated: AutoTraceEntry,\n source: AutoTraceAsyncGenerator,\n): AutoTraceAsyncGenerator {\n const step = (\n method: \"next\" | \"return\" | \"throw\",\n value?: unknown,\n ): Promise<IteratorResult<unknown, unknown>> =>\n runWithAutoTraceScope(\n { entries: replaceEntry(currentAutoTraceEntries(), previous, updated) },\n () => source[method](value),\n )\n const wrapped: AutoTraceAsyncGenerator = {\n next: (value) => step(\"next\", value),\n return: (value) => step(\"return\", value),\n throw: (error) => step(\"throw\", error),\n [Symbol.asyncIterator]: () => wrapped,\n }\n return wrapped\n}\n\nexport function clearAutoTraceNodeConfiguration<T>(fn: () => T): T {\n return runWithAutoTraceScope({ entries: currentAutoTraceEntries() }, fn)\n}\n\nexport function runWithAutoTraceNodeConfiguration<T>(\n nodeConfiguration: AutoTraceNodeConfiguration,\n fn: () => T,\n): T {\n const scope = currentAutoTraceScope()\n if (!scope || scope.entries.length === 0) {\n return fn()\n }\n\n const result = runWithAutoTraceScope({ ...scope, nodeConfiguration }, fn)\n if (isAutoTraceAsyncGenerator(result)) {\n return wrapAutoTraceNodeAsyncGenerator(nodeConfiguration, result) as T\n }\n return result\n}\n\n/**\n * Run `fn` with every active auto-trace frame re-based onto `spanStack`, so a\n * call the build transform discovers inside a framework integration's span\n * attaches under that span rather than under the nearest discovered call.\n * @internal\n */\nexport function runWithAutoTraceFramesAt<T>(\n spanStack: unknown,\n fn: () => T,\n): T {\n const scope = currentAutoTraceScope()\n if (!scope || scope.entries.length === 0) {\n return fn()\n }\n return runWithAutoTraceScope(\n {\n ...scope,\n entries: scope.entries.map((entry) => ({ ...entry, spanStack })),\n },\n fn,\n )\n}\n\nexport function runAsAutoTraceRootFunction<T>(\n functionName: string,\n fn: () => T,\n): T {\n const scope = currentAutoTraceScope()\n if (!scope || scope.entries.length === 0 || functionName === \"\") {\n return fn()\n }\n const rootFunction: AutoTraceRootFunction = {\n name: functionName,\n entering: true,\n }\n try {\n return runWithAutoTraceScope({ ...scope, rootFunction }, fn)\n } finally {\n rootFunction.entering = false\n }\n}\n\nfunction isRootFunctionEntry(\n scope: AutoTraceScope,\n simpleName: string | undefined,\n): boolean {\n const rootFunction = scope.rootFunction\n if (rootFunction === undefined || !rootFunction.entering) {\n return false\n }\n rootFunction.entering = false\n return rootFunction.name === simpleName\n}\n\nconst SUBTREE_TRACING_DOCS_URL =\n \"https://docs.bitfab.ai/typescript-sdk#experimental-subtree-tracing\"\n\nfunction noteTransformedModule(): void {\n autoTraceGlobal.__bitfab_auto_trace_transformed_v1__ = true\n}\n\nfunction transformInstalled(): boolean {\n return autoTraceGlobal.__bitfab_auto_trace_transformed_v1__ === true\n}\n\nfunction runsOnNode(): boolean {\n return typeof process !== \"undefined\" && Boolean(process.versions?.node)\n}\n\nfunction closeAutoTraceRoot(): void {\n autoTraceState.activeRoots -= 1\n}\n\nfunction settleAutoTraceRoot(context: AutoTraceContext): void {\n closeAutoTraceRoot()\n if (transformInstalled() || !runsOnNode()) {\n return\n }\n warnOnce(\n \"auto-trace-transform-missing\",\n `trace root \"${context.traceFunctionKey}\" recorded only its own span. ` +\n \"No module in this build was compiled by @bitfab/sdk/transform, so calls \" +\n \"beneath the root were not discovered. Add the SDK's transform adapter \" +\n `to the server build: ${SUBTREE_TRACING_DOCS_URL}`,\n )\n}\n\nconst heldRootWork = new WeakMap<AutoTraceContext, Promise<unknown>[]>()\n\nexport function runWithAutoTraceRootContext<T>(\n context: AutoTraceContext,\n spanStack: unknown,\n fn: () => T,\n): T {\n autoTraceState.activeRoots += 1\n const entries = [\n ...currentAutoTraceEntries(),\n { context, depth: 0, spanStack },\n ]\n const held: Promise<unknown>[] = []\n heldRootWork.set(context, held)\n let result: T\n try {\n result = runWithAutoTraceScope({ entries }, fn)\n } catch (error) {\n heldRootWork.delete(context)\n settleAutoTraceRoot(context)\n throw error\n }\n\n if (isAutoTraceAsyncGenerator(result)) {\n heldRootWork.delete(context)\n closeAutoTraceRoot()\n return wrapAutoTraceAsyncGenerator(context, spanStack, result) as T\n }\n\n if (result instanceof Promise) {\n return result.then(\n (value) => finishAfterHeldWork(context, held, () => value),\n (error) =>\n finishAfterHeldWork(context, held, () => {\n throw error\n }),\n ) as T\n }\n\n heldRootWork.delete(context)\n settleAutoTraceRoot(context)\n return result\n}\n\nfunction finishAfterHeldWork<T>(\n context: AutoTraceContext,\n held: Promise<unknown>[],\n finish: () => T,\n): T | Promise<T> {\n const pending = held.splice(0)\n if (pending.length === 0) {\n heldRootWork.delete(context)\n settleAutoTraceRoot(context)\n return finish()\n }\n return Promise.all(pending).then(() =>\n finishAfterHeldWork(context, held, finish),\n )\n}\n\nfunction holdAutoTraceRoots(work: Promise<unknown>): void {\n const settled = work.then(\n () => undefined,\n () => undefined,\n )\n for (const entry of currentAutoTraceEntries()) {\n heldRootWork.get(entry.context)?.push(settled)\n }\n}\n\nexport function invokeThroughAutoTraceEntries<T>(\n entries: readonly AutoTraceEntry[],\n step: (entry: AutoTraceEntry, next: () => T) => T,\n fn: () => T,\n): T {\n let run = fn\n for (let index = entries.length - 1; index >= 0; index -= 1) {\n const entry = entries[index] as AutoTraceEntry\n const next = run\n run = () => step(entry, next)\n }\n return run()\n}\n\nfunction isAutoTraceAsyncGenerator(\n value: unknown,\n): value is AutoTraceAsyncGenerator {\n if (value === null || typeof value !== \"object\") {\n return false\n }\n const candidate = value as Record<PropertyKey, unknown>\n return (\n typeof candidate.next === \"function\" &&\n typeof candidate.return === \"function\" &&\n typeof candidate.throw === \"function\" &&\n typeof candidate[Symbol.asyncIterator] === \"function\"\n )\n}\n\nfunction wrapAutoTraceAsyncGenerator(\n context: AutoTraceContext,\n spanStack: unknown,\n source: AutoTraceAsyncGenerator,\n): AutoTraceAsyncGenerator {\n const step = (\n method: \"next\" | \"return\" | \"throw\",\n value?: unknown,\n ): Promise<IteratorResult<unknown, unknown>> =>\n runWithAutoTraceRootContext(context, spanStack, () => source[method](value))\n const wrapped: AutoTraceAsyncGenerator = {\n next: (value) => step(\"next\", value),\n return: (value) => step(\"return\", value),\n throw: (error) => step(\"throw\", error),\n [Symbol.asyncIterator]: () => wrapped,\n }\n return wrapped\n}\n\nfunction wrapAutoTraceNodeAsyncGenerator(\n nodeConfiguration: AutoTraceNodeConfiguration,\n source: AutoTraceAsyncGenerator,\n): AutoTraceAsyncGenerator {\n const step = (\n method: \"next\" | \"return\" | \"throw\",\n value?: unknown,\n ): Promise<IteratorResult<unknown, unknown>> =>\n runWithAutoTraceNodeConfiguration(nodeConfiguration, () =>\n source[method](value),\n )\n const wrapped: AutoTraceAsyncGenerator = {\n next: (value) => step(\"next\", value),\n return: (value) => step(\"return\", value),\n throw: (error) => step(\"throw\", error),\n [Symbol.asyncIterator]: () => wrapped,\n }\n return wrapped\n}\n\nfunction shareFinalize(\n configuration: AutoTraceNodeConfiguration,\n): AutoTraceNodeConfiguration {\n const finalize = configuration.finalize\n if (finalize === undefined) {\n return configuration\n }\n let settled: Promise<unknown> | undefined\n return {\n ...configuration,\n finalize: (result: unknown) => {\n settled ??= Promise.resolve().then(() => finalize(result))\n return settled\n },\n }\n}\n\nexport function __bitfabAutoSpan<T>(\n definition: AutoTraceFunctionDefinition,\n inputs: unknown[],\n fn: () => T,\n): T {\n noteTransformedModule()\n return invokeAsDiscoveredCall(definition, inputs, fn)\n}\n\n/**\n * Record a call the build transform did not wrap as a function, such as a\n * rewritten call site, as if the transform had discovered it. It is internal\n * runtime protocol, not a supported application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function invokeAsDiscoveredCall<T>(\n definition: AutoTraceFunctionDefinition,\n inputs: unknown[],\n fn: () => T,\n): T {\n const scope = currentAutoTraceScope()\n if (!scope || scope.entries.length === 0 || isCaptureSuppressed()) {\n return fn()\n }\n const nameParts = definition.name.split(\".\")\n const simpleName = nameParts[nameParts.length - 1]\n if (isRootFunctionEntry(scope, simpleName)) {\n return fn()\n }\n const nodeConfiguration =\n simpleName === scope.nodeConfiguration?.functionName\n ? shareFinalize(scope.nodeConfiguration)\n : undefined\n const spanDetails: SpanDetails = { contexts: [] }\n return invokeThroughAutoTraceEntries(\n scope.entries,\n (entry, next) =>\n entry.context.invoke(\n definition,\n inputs,\n next,\n entry,\n spanDetails,\n nodeConfiguration,\n ),\n fn,\n )\n}\n\nconst JEV_METHOD = \"systemOne\"\n\nconst jevDefinitions = new Map<string, AutoTraceFunctionDefinition>()\n\ntype JevReceiver = Record<typeof JEV_METHOD, (...args: unknown[]) => unknown>\n\ntype RecordedCallOutcome = { value: unknown } | { error: unknown }\n\nfunction receiverClassName(receiver: unknown): string | undefined {\n try {\n const name = (receiver as { constructor?: { name?: unknown } }).constructor\n ?.name\n return typeof name === \"string\" && name !== \"\" && name !== \"Object\"\n ? name\n : undefined\n } catch {\n return undefined\n }\n}\n\nfunction invokeRecordedClientCall(\n definition: AutoTraceFunctionDefinition,\n args: unknown[],\n call: () => unknown,\n): unknown {\n let outcome: RecordedCallOutcome | undefined\n const traced = invokeAsDiscoveredCall(definition, args, () => {\n try {\n const value = call()\n outcome = { value }\n return value\n } catch (error) {\n outcome = { error }\n throw error\n }\n })\n if (outcome === undefined) {\n return traced\n }\n if (\"value\" in outcome && traced === outcome.value) {\n return traced\n }\n if (traced instanceof Promise) {\n holdAutoTraceRoots(traced)\n }\n if (\"error\" in outcome) {\n throw outcome.error\n }\n return outcome.value\n}\n\nfunction jevDefinition(receiver: unknown): AutoTraceFunctionDefinition {\n const className = receiverClassName(receiver)\n const name =\n className === undefined ? JEV_METHOD : `${className}.${JEV_METHOD}`\n let definition = jevDefinitions.get(name)\n if (definition === undefined) {\n definition = {\n id: `ts-auto-v1:jev#${name}`,\n name,\n file: \"@typesafe-ai/sdk\",\n line: 0,\n column: 0,\n async: true,\n jev: true,\n }\n jevDefinitions.set(name, definition)\n }\n return definition\n}\n\n/**\n * Call `receiver.systemOne(...args)` from a call site rewritten by the build\n * transform. Beneath an automatic trace root the call is recorded as one `llm`\n * span with Jev's model and token usage, and the client's own returned value\n * is handed back unchanged. Outside a root it is a plain method call.\n *\n * This helper is internal transform/runtime protocol, not a supported\n * application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoJev(\n receiver: unknown,\n ...args: unknown[]\n): unknown {\n const target = receiver as JevReceiver\n if (!__bitfabAutoTraceActive()) {\n return target.systemOne(...args)\n }\n return invokeRecordedClientCall(jevDefinition(receiver), args, () =>\n target.systemOne(...args),\n )\n}\n\nconst CLIENT_CALL_METHOD = \"create\"\n\nconst clientCallDefinitions = new Map<string, AutoTraceFunctionDefinition>()\n\ntype ClientCallReceiver = Record<\n typeof CLIENT_CALL_METHOD,\n (...args: unknown[]) => unknown\n>\n\nfunction clientCallDefinition(\n provider: ClientCallProvider,\n receiver: unknown,\n): AutoTraceFunctionDefinition {\n const className = receiverClassName(receiver)\n const name =\n className === undefined\n ? CLIENT_CALL_METHOD\n : `${className}.${CLIENT_CALL_METHOD}`\n const id = `ts-auto-v1:${provider.key}#${name}`\n let definition = clientCallDefinitions.get(id)\n if (definition === undefined) {\n definition = {\n id,\n name,\n file: provider.library,\n line: 0,\n column: 0,\n async: true,\n clientCall: provider.key,\n }\n clientCallDefinitions.set(id, definition)\n }\n return definition\n}\n\nfunction invokeClientCall(\n provider: ClientCallProvider,\n receiver: unknown,\n args: unknown[],\n): unknown {\n const target = receiver as ClientCallReceiver\n if (\n !__bitfabAutoTraceActive() ||\n isStreamingRequest(args[0]) ||\n !provider.matchesReceiver(receiver) ||\n frameworkRecordsClientCall()\n ) {\n return target.create(...args)\n }\n return invokeRecordedClientCall(\n clientCallDefinition(provider, receiver),\n args,\n () => target.create(...args),\n )\n}\n\n/**\n * Call `receiver.create(...args)` from a `.chat.completions.create(...)` call\n * site rewritten by the build transform. Beneath an automatic trace root, when\n * the client's base URL is `openrouter.ai` and the request does not stream,\n * the call is recorded as one `llm` span with the prompt, model, token usage,\n * and the cost OpenRouter reports, and the client's own returned value is\n * handed back unchanged. Otherwise it is a plain method call.\n *\n * This helper is internal transform/runtime protocol, not a supported\n * application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoOpenRouter(\n receiver: unknown,\n ...args: unknown[]\n): unknown {\n return invokeClientCall(OPENROUTER, receiver, args)\n}\n\n/**\n * Call `receiver.create(...args)` from a `.messages.create(...)` call site\n * rewritten by the build transform. Beneath an automatic trace root, when the\n * receiver belongs to an `@anthropic-ai/sdk` client and the request does not\n * stream, the call is recorded as one `llm` span with the prompt, model, and\n * token usage, and the client's own returned value is handed back unchanged.\n * Otherwise it is a plain method call.\n *\n * This helper is internal transform/runtime protocol, not a supported\n * application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoAnthropic(\n receiver: unknown,\n ...args: unknown[]\n): unknown {\n return invokeClientCall(ANTHROPIC, receiver, args)\n}\n\n/**\n * Call `receiver.create(...args)` from a `.responses.create(...)` call site\n * rewritten by the build transform. Beneath an automatic trace root, when the\n * receiver belongs to an `openai` client and the request does not stream, the\n * call is recorded as one `llm` span with the prompt, model, and token usage,\n * and the client's own returned value is handed back unchanged. Otherwise it\n * is a plain method call.\n *\n * This helper is internal transform/runtime protocol, not a supported\n * application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoOpenAIResponses(\n receiver: unknown,\n ...args: unknown[]\n): unknown {\n return invokeClientCall(OPENAI_RESPONSES, receiver, args)\n}\n\n/**\n * Preserve a function's original call arguments for transform cases where\n * parameter bindings discard them, such as destructured arrow parameters.\n *\n * This helper is internal transform/runtime protocol. The proxy preserves the\n * target's callability, arity, async identity, and non-constructibility while\n * only allocating a trace closure beneath an active automatic trace root.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoWrap<T extends (...args: never[]) => unknown>(\n definition: AutoTraceFunctionDefinition,\n fn: T,\n): T {\n noteTransformedModule()\n if (fn.name === \"\") {\n const nameParts = definition.name.split(\".\")\n const inferredName = nameParts[nameParts.length - 1]\n if (inferredName !== undefined) {\n Object.defineProperty(fn, \"name\", {\n configurable: true,\n value: inferredName,\n })\n }\n }\n\n const target = fn as unknown as (...args: unknown[]) => unknown\n return new Proxy(target, {\n apply(callTarget, thisArg, args) {\n if (!__bitfabAutoTraceActive()) {\n return Reflect.apply(callTarget, thisArg, args)\n }\n return __bitfabAutoSpan(definition, args, () =>\n Reflect.apply(callTarget, thisArg, args),\n )\n },\n }) as unknown as T\n}\n\n/**\n * Return whether the current call is inside an automatic trace root.\n *\n * Build transforms use this before allocating function metadata, captured\n * inputs, or an invocation closure. It is internal transform/runtime protocol,\n * not a supported application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoTraceActive(): boolean {\n if (autoTraceState.activeRoots === 0 || isCaptureSuppressed()) {\n return false\n }\n return currentAutoTraceEntries().length > 0\n}\n\nfunction currentAutoTraceScope(): AutoTraceScope | undefined {\n initializeAutoTraceStorage()\n return autoTraceState.storage?.getStore() ?? autoTraceState.browserScope\n}\n\nexport function _resetAutoTraceTransformDetection(): void {\n autoTraceGlobal.__bitfab_auto_trace_transformed_v1__ = undefined\n}\n"],"mappings":";;AAmCA,IAAI,yBACF;AACF,IAAI,WAAW;AAUf,SAAgB,+BACd,KACM;CACN,IAAI,CAAC,wBACH,yBAAyB;CAE3B,WAAW;AACb;AAYA,SAAgB,+BAAqC;CACnD,IAAI,CAAC,wBACH,QAAQ,KACN,mFACF;AAEJ;AAEA,MAAa,qBACX,OAAO,YAAY,eAAe,QAAQ,UAAU;;AAKhD;;CAEE,CAAC,QAAQ,aAAa,CAAC,CAAC,KAAK,GAAG;CACjC,CACE,MACE,QAEK;CACJ,+BAA+B,IAAI,iBAAiB;AACtD,CACF,CAAC,CACA,YAAY,CAAC,CAAC,IACjB,QAAQ,QAAQ,EAAA,CACpB,WAAW;CACX,WAAW;AACb,CAAC;AAED,SAAgB,yBAAkC;CAChD,OAAO;AACT;AAEA,SAAgB,0BAA8D;CAC5E,OAAO,yBACF,IAAI,uBAAuB,IAC5B;AACN;;;ACjGA,MAAM,oBAAoB;AAC1B,MAAM,mBACJ,kBAAkB,gCAAgC,EAAE,OAAO,EAAE;AAC/D,kBAAkB,+BAA+B;AAEjD,SAAgB,sBAA+B;CAC7C,OAAO,iBAAiB,QAAQ;AAClC;AAEA,SAAgB,yBAA4B,IAAgB;CAC1D,iBAAiB,SAAS;CAC1B,IAAI;EACF,OAAO,GAAG;CACZ,UAAU;EACR,iBAAiB,SAAS;CAC5B;AACF;;;ACVA,MAAM,yBAAS,IAAI,IAAY;AAE/B,SAAgB,KAAK,SAAuB;CAC1C,IAAI;EACF,QAAQ,KAAK,YAAY,SAAS;CACpC,QAAQ,CAER;AACF;AAEA,SAAgB,SAAS,KAAa,SAAuB;CAC3D,IAAI,OAAO,IAAI,GAAG,GAChB;CAEF,OAAO,IAAI,GAAG;CACd,KAAK,OAAO;AACd;AAEA,SAAgB,UACd,KACA,MACA,QAAgC,QAAQ,MAClC;CACN,IAAI,OAAO,IAAI,GAAG,GAChB;CAEF,OAAO,IAAI,GAAG;CACd,IAAI;EACF,MAAM,IAAI;CACZ,QAAQ,CAAC;AACX;;;ACtCA,MAAM,2BAA2B,OAAO,IAAI,iCAAiC;AAC7E,MAAM,yBAAyB,OAAO,IAAI,gCAAgC;AAC1E,MAAM,uBAAuB,OAAO,IAAI,8BAA8B;AACtE,MAAM,gBAAgB,CACpB;CACE,gBAAgB;EAAC;EAAc;EAAQ;EAAmB;CAAa;CACvE,MAAM;AACR,GACA;CACE,gBAAgB;EAAC;EAAc;EAAQ;EAAmB;CAAM;CAChE,MAAM;AACR,CACF;AAUA,IAAI,kBAAmE;AACvE,IAAI,eAAqC;AAEzC,SAAS,UAA2D;CAClE,IAAI,iBACF,OAAO;CAET,MAAM,SAAS;CACf,MAAM,WAAW,OAAO;CAGxB,kBAAkB,YAAY,wBAA2C;CACzE,IAAI,mBAAmB,CAAC,UACtB,OAAO,4BAA4B;CAErC,OAAO;AACT;AAEA,SAAS,eAA4B;CACnC,MAAM,SAAS;CACf,MAAM,WAAW,OAAO;CACxB,IAAI,UACF,OAAO;CAET,MAAM,0BAAU,IAAI,IAAY;CAChC,OAAO,wBAAwB;CAC/B,OAAO;AACT;AAEA,SAAS,cAAc,WAA0C;CAC/D,MAAM,WAAW,UAAU;CAC3B,IAAI,OAAO,aAAa,cAAc,SAAS,yBAC7C;CAEF,MAAM,SAAmB,SAAyB,GAAG,MAAiB;EACpE,MAAM,aAAa,QAAQ;EAC3B,IAAI,CAAC,YACH,OAAO,SAAS,MAAM,MAAM,IAAI;EAElC,OAAO,WAAW,IAAI,EAAE,mBAAmB,MAAM,SAC/C,SAAS,MAAM,MAAM,IAAI,CAC3B;CACF;CACA,OAAO,0BAA0B;CACjC,UAAU,WAAW;AACvB;AAEA,eAAe,gBACb,gBACA,MACe;CACf,IAAI;EAGF,MAAM,cAAa,MADXA,qBAAAA,mBAA4C,cAAc,EAAA,CACxC;EAC1B,IAAI,YAAY,WACd,cAAc,WAAW,SAAS;CAEtC,QAAQ,CAAC;AACX;AAEA,SAAgB,4BAA2C;CACzD,iBAAA,eAAiB,QAAQ,IACvB,cAAc,KAAK,EAAE,gBAAgB,WACnC,gBAAgB,gBAAgB,IAAI,CACtC,CACF,CAAC,CAAC,WAAW,KAAA,CAAS;CACtB,OAAO;AACT;AAEA,SAAgB,yBAAyB,OAAqB;CAC5D,MAAM,QAAQ,QAAQ,CAAC,EAAE,SAAS;CAClC,IAAI,OAAO;EACT,MAAM,oBAAoB;EAC1B;CACF;CACA,aAAa,CAAC,CAAC,IAAI,KAAK;AAC1B;AAEA,SAAgB,mBAAmB,OAAqB;CACtD,aAAa,CAAC,CAAC,OAAO,KAAK;AAC7B;AAEA,SAAgB,8BAAuC;CACrD,MAAM,QAAQ,QAAQ,CAAC,EAAE,SAAS;CAClC,IAAI,OACF,OAAO,MAAM;CAEf,OAAO,aAAa,CAAC,CAAC,OAAO;AAC/B;;;ACrHA,MAAM,gCAAgC,OAAO,IAC3C,sCACF;AACA,MAAM,+BAA+B;AACrC,MAAM,wCAAwB,IAAI,IAAI,CAAC,cAAc,UAAU,CAAC;AA2BhE,MAAM,aAAa;AAEnB,MAAM,QAA+B,WAAW,+BAA+B;CAC7E,gCAAgB,IAAI,IAAI;CACxB,8BAAc,IAAI,IAAI;AACxB;AACA,WAAW,8BAA8B;AAEzC,SAAgB,qBACd,eACA,eACM;CACN,MAAM,eAAe,IAAI,eAAe,aAAa;AACvD;AAEA,SAAgB,uBAAuB,eAA6B;CAClE,MAAM,eAAe,OAAO,aAAa;CACzC,MAAM,aAAa,OAAO,aAAa;AACzC;AAEA,SAAgB,oBACd,eACA,QACM;CACN,IAAI,CAAC,MAAM,eAAe,IAAI,aAAa,GACzC;CAEF,MAAM,QAAQ,MAAM,aAAa,IAAI,aAAa,qBAAK,IAAI,IAAY;CACvE,MAAM,IAAI,MAAM;CAChB,MAAM,aAAa,IAAI,eAAe,KAAK;AAC7C;AAEA,SAAS,6BACP,OACqC;CACrC,OACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAQ,MAAiC,aAAa;AAE1D;AAEA,SAAS,0BAA4D;CACnE,MAAM,UAAU,WAAW;CAC3B,IAAI,CAAC,6BAA6B,OAAO,GACvC;CAEF,IAAI;EACF,MAAM,QAAQ,QAAQ,SAAS;EAC/B,OAAO,OAAO,WAAW,OAAQ,MAAM,QAAQ,KAAA,IAAa,KAAA;CAC9D,QAAQ;EACN;CACF;AACF;AAEA,SAAS,2BAAmD;CAC1D,MAAM,QAAgC,CAAC;CACvC,IAAI,OAAO,wBAAwB;CACnC,OAAO,SAAS,KAAA,KAAa,MAAM,SAAS,8BAA8B;EACxE,MAAM,KAAK,IAAI;EACf,OAAO,KAAK,gBAAgB,KAAA;CAC9B;CACA,OAAO;AACT;AAEA,SAAgB,wBAAkC;CAChD,IAAI,MAAM,eAAe,SAAS,GAChC,OAAO,CAAC;CAEV,OAAO,yBAAyB,CAAC,CAC9B,KAAK,SAAS,KAAK,MAAM,CAAC,CAC1B,QAAQ,WAA6B,OAAO,WAAW,QAAQ;AACpE;AAEA,SAAgB,yBACd,eACA,kBACoB;CACpB,IAAI,MAAM,eAAe,SAAS,GAChC;CAEF,KAAK,MAAM,QAAQ,yBAAyB,GAAG;EAC7C,IAAI,OAAO,KAAK,WAAW,YAAY,OAAO,KAAK,YAAY,UAC7D;EAEF,IAAI,MAAM,eAAe,IAAI,KAAK,OAAO,MAAM,eAC7C;EAEF,IAAI,kBAAkB,SAAS,KAAK,MAAM,GACxC;EAEF,IAAI,CAAC,MAAM,aAAa,IAAI,KAAK,OAAO,CAAC,EAAE,IAAI,KAAK,MAAM,GACxD,OAAO,KAAK;CAEhB;AAEF;AAEA,SAAgB,4BAAqC;CACnD,IAAI,MAAM,eAAe,SAAS,GAChC,OAAO;CAET,OAAO,yBAAyB,CAAC,CAAC,MAC/B,SACC,OAAO,KAAK,YAAY,YACxB,OAAO,KAAK,WAAW,YACvB,MAAM,eAAe,IAAI,KAAK,OAAO,KACrC,sBAAsB,IAAI,OAAO,KAAK,UAAU,IAAI,CAAC,KACrD,CAAC,MAAM,aAAa,IAAI,KAAK,OAAO,CAAC,EAAE,IAAI,KAAK,MAAM,CAC1D;AACF;;;ACtIA,MAAM,sBAAsB;AAC5B,MAAM,mCAAmC,OAAO,IAC9C,+BACF;AA8BA,MAAM,+CAA+B,IAAI,QAAgB;AAEzD,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,MAAM,OAAgB,MAAuB;CACpD,OAAO,SAAS,KAAK,IAAI,MAAM,QAAQ,KAAA;AACzC;AAEA,SAAS,YAAY,OAAgB,MAAkC;CACrE,MAAM,QAAQ,MAAM,OAAO,IAAI;CAC/B,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ,KAAA;AACvE;AAEA,SAAS,eAAe,OAAoC;CAC1D,OAAO,OAAO,UAAU,YAAY,UAAU,KAAK,QAAQ,KAAA;AAC7D;AAEA,SAAS,cACP,MACA,QACA,YACyB;CACzB,MAAM,UAAU,EAAE,GAAG,KAAK;CAC1B,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAC9C,IAAI,UAAU,KAAA,GACZ,QAAQ,OAAO;CAGnB,QAAQ,aAAa;CACrB,OAAO;AACT;AAEA,SAAS,aAAa,QAAuD;CAC3E,MAAM,UAAU,OAAO,QAAQ,UAAU,UAAU,KAAA,CAAS;CAC5D,OAAO,QAAQ,SAAS,IACpB,QAAQ,QAAQ,OAAO,UAAU,QAAQ,OAAO,CAAC,IACjD,KAAA;AACN;AAEA,SAAS,OAAO,SAA0B;CACxC,OAAO,OAAO,YAAY,WAAW,UAAU,KAAK,UAAU,OAAO;AACvE;AAEA,SAAS,YAAY,OAAiC;CACpD,OAAO,MAAM,SAAS,SAAS;EAC7B,MAAM,OAAO,MAAM,MAAM,MAAM;EAC/B,IAAI,OAAO,SAAS,UAClB,OAAO,CAAC;EAEV,OAAO,CAAC;GAAE;GAAM,SAAS,OAAO,MAAM,MAAM,SAAS,CAAC;EAAE,CAAC;CAC3D,CAAC;AACH;AAEA,SAAS,eAAe,SAA4C;CAClE,OAAO,QAAQ,SAAS,IAAI,KAAK,UAAU,OAAO,IAAI,KAAA;AACxD;AAEA,SAAS,SAAS,UAA4B;CAC5C,IAAI;EACF,OAAO,MAAM,UAAU,SAAS;CAClC,QAAQ;EACN;CACF;AACF;AAEA,SAAS,kBAAkB,UAAmB,MAAuB;CACnE,MAAM,SAAS,SAAS,QAAQ;CAChC,IAAI,CAAC,SAAS,MAAM,GAClB;CAEF,IAAI;EACF,MAAM,cAAuB,OAAO;EACpC,OAAO,OAAO,gBAAgB,aACzB,YAAmD,QACpD,KAAA;CACN,QAAQ;EACN;CACF;AACF;AAEA,SAAS,oBAAoB,SAA2B;CACtD,IAAI,OAAO,YAAY,UACrB,OAAO;CAET,IAAI;EACF,MAAM,OAAO,IAAI,IAAI,OAAO,CAAC,CAAC;EAC9B,OACE,SAAS,uBAAuB,KAAK,SAAS,IAAI,qBAAqB;CAE3E,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAgB,wBAAwB,UAA4B;CAClE,IAAI;EACF,OAAO,oBAAoB,MAAM,SAAS,QAAQ,GAAG,SAAS,CAAC;CACjE,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,oBAAoB,UAA4B;CACvD,OAAO,OAAO,kBAAkB,UAAU,cAAc,MAAM;AAChE;AAEA,SAAS,kBAAkB,UAA4B;CACrD,OAAO,OAAO,kBAAkB,UAAU,QAAQ,MAAM;AAC1D;AAEA,SAAgB,mBAAmB,MAAwB;CACzD,OAAO,MAAM,MAAM,QAAQ,MAAM;AACnC;AAEA,SAAgB,iBAAiB,MAAmC;CAClE,MAAM,WAAW,MAAM,MAAM,UAAU;CACvC,OAAO,MAAM,QAAQ,QAAQ,IACzB,eAAe,YAAY,QAAQ,CAAC,IACpC,KAAA;AACN;AAEA,SAAgB,kBACd,MACA,UACA,YACyB;CACzB,MAAM,QAAQ,MAAM,UAAU,OAAO;CACrC,OAAO,cACL,EAAE,UAAU,aAAa,GACzB;EACE,OACE,eAAe,MAAM,UAAU,OAAO,CAAC,KACvC,eAAe,MAAM,MAAM,OAAO,CAAC;EACrC,kBAAkB,eAAe,MAAM,UAAU,UAAU,CAAC;EAC5D,aAAa,YAAY,OAAO,eAAe;EAC/C,cAAc,YAAY,OAAO,mBAAmB;EACpD,mBAAmB,YACjB,MAAM,OAAO,uBAAuB,GACpC,eACF;EACA,iBAAiB,YACf,MAAM,OAAO,2BAA2B,GACxC,kBACF;EACA,SAAS,YAAY,OAAO,MAAM;CACpC,GACA,UACF;AACF;AAEA,SAAgB,gBAAgB,MAAmC;CACjE,MAAM,SAAS,MAAM,MAAM,QAAQ;CACnC,MAAM,WAAW,MAAM,MAAM,UAAU;CACvC,OAAO,eAAe,CACpB,GAAI,WAAW,KAAA,KAAa,WAAW,OACnC,CAAC,IACD,CAAC;EAAE,MAAM;EAAU,SAAS,OAAO,MAAM;CAAE,CAAC,GAChD,GAAI,MAAM,QAAQ,QAAQ,IAAI,YAAY,QAAQ,IAAI,CAAC,CACzD,CAAC;AACH;AAEA,SAAgB,iBACd,MACA,UACA,YACyB;CACzB,MAAM,QAAQ,MAAM,UAAU,OAAO;CACrC,MAAM,YAAY,YAAY,OAAO,yBAAyB;CAC9D,OAAO,cACL,EAAE,UAAU,YAAY,GACxB;EACE,OACE,eAAe,MAAM,UAAU,OAAO,CAAC,KACvC,eAAe,MAAM,MAAM,OAAO,CAAC;EACrC,aAAa,aAAa;GACxB,YAAY,OAAO,cAAc;GACjC;GACA,YAAY,OAAO,6BAA6B;EAClD,CAAC;EACD,cAAc,YAAY,OAAO,eAAe;EAChD,mBAAmB;CACrB,GACA,UACF;AACF;AAEA,SAAgB,sBAAsB,MAAmC;CACvE,MAAM,eAAe,MAAM,MAAM,cAAc;CAC/C,MAAM,QAAQ,MAAM,MAAM,OAAO;CACjC,OAAO,eAAe;EACpB,GAAI,OAAO,iBAAiB,WACxB,CAAC;GAAE,MAAM;GAAU,SAAS;EAAa,CAAC,IAC1C,CAAC;EACL,GAAI,OAAO,UAAU,WAAW,CAAC;GAAE,MAAM;GAAQ,SAAS;EAAM,CAAC,IAAI,CAAC;EACtE,GAAI,MAAM,QAAQ,KAAK,IAAI,YAAY,KAAK,IAAI,CAAC;CACnD,CAAC;AACH;AAEA,SAAgB,uBACd,MACA,UACA,YACyB;CACzB,MAAM,QAAQ,MAAM,UAAU,OAAO;CACrC,OAAO,cACL,EAAE,UAAU,SAAS,GACrB;EACE,OACE,eAAe,MAAM,UAAU,OAAO,CAAC,KACvC,eAAe,MAAM,MAAM,OAAO,CAAC;EACrC,aAAa,YAAY,OAAO,cAAc;EAC9C,cAAc,YAAY,OAAO,eAAe;EAChD,mBAAmB,YACjB,MAAM,OAAO,sBAAsB,GACnC,eACF;EACA,iBAAiB,YACf,MAAM,OAAO,uBAAuB,GACpC,kBACF;EACA,SAAS,YAAY,OAAO,MAAM;CACpC,GACA,UACF;AACF;AAEA,MAAa,aAAiC;CAC5C,KAAK;CACL,SAAS;CACT,iBAAiB;CACjB,aAAa,aACX,SAAS,QAAQ,KAAK,MAAM,QAAQ,SAAS,OAAO;CACtD,QAAQ;CACR,SAAS;AACX;AAEA,MAAa,YAAgC;CAC3C,KAAK;CACL,SAAS;CACT,iBAAiB;CACjB,aAAa,aACX,MAAM,UAAU,MAAM,MAAM,aAC5B,MAAM,QAAQ,MAAM,UAAU,SAAS,CAAC;CAC1C,QAAQ;CACR,SAAS;AACX;AAEA,MAAa,mBAAuC;CAClD,KAAK;CACL,SAAS;CACT,iBAAiB;CACjB,aAAa,aAAa,MAAM,UAAU,QAAQ,MAAM;CACxD,QAAQ;CACR,SAAS;AACX;AAEA,MAAM,wBAAwB,IAAI,IAChC;CAAC;CAAY;CAAW;AAAgB,CAAC,CAAC,KAAK,aAAa,CAC1D,SAAS,KACT,QACF,CAAC,CACH;AAEA,SAAgB,mBACd,KACgC;CAChC,OAAO,QAAQ,KAAA,IAAY,KAAA,IAAY,sBAAsB,IAAI,GAAG;AACtE;AAEA,SAAS,iBACP,UACA,MACA,MACA,UACA,YACM;CACN,IAAI;EACF,MAAM,SAAS,SAAS,OAAO,IAAI;EACnC,IAAI,WAAW,KAAA,GACb,KAAK,UAAU,MAAM;EAEvB,KAAK,WAAW,SAAS,QAAQ,MAAM,UAAU,UAAU,CAAC;CAC9D,QAAQ,CAAC;AACX;AAEA,IAAI,yBAAwE;AAE5E,SAAS,eAA8D;CACrE,IAAI,wBACF,OAAO;CAET,MAAM,SAAS;CACf,MAAM,WAAW,OAAO;CAGxB,yBACE,YAAY,wBAAyC;CACvD,IAAI,0BAA0B,CAAC,UAC7B,OAAO,oCAAoC;CAE7C,OAAO;AACT;AAEA,SAAgB,gBAAmB,IAGjC;CACA,MAAM,UAAU,aAAa;CAC7B,MAAM,QAAyB;EAC7B,UAAU;EACV,QAAQ,SAAS,SAAS,KAAK;CACjC;CAEA,OAAO;EAAE;EAAO,QADD,UAAU,QAAQ,IAAI,OAAO,EAAE,IAAI,GAAG;CAC9B;AACzB;AAEA,SAAS,qBAAqB,OAA8B;CAC1D,KAAK,IAAI,UAAU,MAAM,QAAQ,SAAS,UAAU,QAAQ,QAC1D,QAAQ,WAAW;AAEvB;AAEA,SAAgB,6BAAsC;CACpD,OAAO,4BAA4B,KAAK,0BAA0B;AACpE;AAEA,SAAS,sBAAsB,UAA4B;CACzD,OAAO,SAAS,QAAQ,KAAK,6BAA6B,IAAI,QAAQ;AACxE;AAEA,SAAgB,wBACd,UACA,MACA,OACA,MACA,UACA,YACM;CACN,IAAI,MAAM,YAAY,sBAAsB,QAAQ,GAAG;EACrD,qBAAqB,KAAK;EAC1B;CACF;CACA,IAAI,CAAC,SAAS,WAAW,QAAQ,GAC/B;CAEF,iBAAiB,UAAU,MAAM,MAAM,UAAU,UAAU;CAC3D,6BAA6B,IAAI,QAAkB;CACnD,qBAAqB,KAAK;AAC5B;AAEA,SAAgB,2BACd,UACA,UACA,MACA,MACG;CACH,MAAM,YAAY,KAAK,IAAI;CAC3B,MAAM,EAAE,OAAO,WAAW,gBAAgB,QAAQ;CAClD,MAAM,UAAU,aAA4B;EAC1C,wBACE,UACA,MACA,OACA,MACA,UACA,KAAK,IAAI,IAAI,SACf;CACF;CACA,IAAI,kBAAkB,SACpB,OAAO,OAAO,MAAM,aAAa;EAC/B,OAAO,QAAQ;EACf,OAAO;CACT,CAAC;CAEH,OAAO,MAAM;CACb,OAAO;AACT;;;AClTA,MAAM,kBAAkB;AACxB,MAAM,iBACJ,gBAAgB,4BAA4B;CAC1C,SAAS;CACT,cAAc,KAAA;CACd,iCAAiB,IAAI,QAAQ;CAC7B,aAAa;AACf;AACF,gBAAgB,2BAA2B;AAE3C,SAAS,6BAAmC;CAC1C,eAAe,YAAf,eAAe,UAAY,wBAAwC;AACrE;AAEA,SAAS,sBAAyB,OAAuB,IAAgB;CACvE,2BAA2B;CAC3B,IAAI,eAAe,SACjB,OAAO,eAAe,QAAQ,IAAI,OAAO,EAAE;CAG7C,MAAM,WAAW,eAAe;CAChC,eAAe,eAAe;CAC9B,IAAI;EACF,OAAO,GAAG;CACZ,UAAU;EACR,eAAe,eAAe;CAChC;AACF;AAEA,SAAgB,0BAAqD;CACnE,OAAO,sBAAsB,CAAC,EAAE,WAAW,CAAC;AAC9C;AAEA,SAAS,aACP,SACA,UACA,SAC2B;CAC3B,OAAO,QAAQ,KAAK,UAAW,UAAU,WAAW,UAAU,KAAM;AACtE;AAEA,SAAgB,sBACd,UACA,SACA,IACG;CACH,MAAM,SAAS,sBACb,EAAE,SAAS,aAAa,wBAAwB,GAAG,UAAU,OAAO,EAAE,GACtE,EACF;CACA,IAAI,0BAA0B,MAAM,GAClC,OAAO,iCAAiC,UAAU,SAAS,MAAM;CAEnE,OAAO;AACT;AAEA,SAAS,iCACP,UACA,SACA,QACyB;CACzB,MAAM,QACJ,QACA,UAEA,sBACE,EAAE,SAAS,aAAa,wBAAwB,GAAG,UAAU,OAAO,EAAE,SAChE,OAAO,OAAO,CAAC,KAAK,CAC5B;CACF,MAAM,UAAmC;EACvC,OAAO,UAAU,KAAK,QAAQ,KAAK;EACnC,SAAS,UAAU,KAAK,UAAU,KAAK;EACvC,QAAQ,UAAU,KAAK,SAAS,KAAK;GACpC,OAAO,sBAAsB;CAChC;CACA,OAAO;AACT;AAEA,SAAgB,gCAAmC,IAAgB;CACjE,OAAO,sBAAsB,EAAE,SAAS,wBAAwB,EAAE,GAAG,EAAE;AACzE;AAEA,SAAgB,kCACd,mBACA,IACG;CACH,MAAM,QAAQ,sBAAsB;CACpC,IAAI,CAAC,SAAS,MAAM,QAAQ,WAAW,GACrC,OAAO,GAAG;CAGZ,MAAM,SAAS,sBAAsB;EAAE,GAAG;EAAO;CAAkB,GAAG,EAAE;CACxE,IAAI,0BAA0B,MAAM,GAClC,OAAO,gCAAgC,mBAAmB,MAAM;CAElE,OAAO;AACT;AAQA,SAAgB,yBACd,WACA,IACG;CACH,MAAM,QAAQ,sBAAsB;CACpC,IAAI,CAAC,SAAS,MAAM,QAAQ,WAAW,GACrC,OAAO,GAAG;CAEZ,OAAO,sBACL;EACE,GAAG;EACH,SAAS,MAAM,QAAQ,KAAK,WAAW;GAAE,GAAG;GAAO;EAAU,EAAE;CACjE,GACA,EACF;AACF;AAEA,SAAgB,2BACd,cACA,IACG;CACH,MAAM,QAAQ,sBAAsB;CACpC,IAAI,CAAC,SAAS,MAAM,QAAQ,WAAW,KAAK,iBAAiB,IAC3D,OAAO,GAAG;CAEZ,MAAM,eAAsC;EAC1C,MAAM;EACN,UAAU;CACZ;CACA,IAAI;EACF,OAAO,sBAAsB;GAAE,GAAG;GAAO;EAAa,GAAG,EAAE;CAC7D,UAAU;EACR,aAAa,WAAW;CAC1B;AACF;AAEA,SAAS,oBACP,OACA,YACS;CACT,MAAM,eAAe,MAAM;CAC3B,IAAI,iBAAiB,KAAA,KAAa,CAAC,aAAa,UAC9C,OAAO;CAET,aAAa,WAAW;CACxB,OAAO,aAAa,SAAS;AAC/B;AAEA,MAAM,2BACJ;AAEF,SAAS,wBAA8B;CACrC,gBAAgB,uCAAuC;AACzD;AAEA,SAAS,qBAA8B;CACrC,OAAO,gBAAgB,yCAAyC;AAClE;AAEA,SAAS,aAAsB;CAC7B,OAAO,OAAO,YAAY,eAAe,QAAQ,QAAQ,UAAU,IAAI;AACzE;AAEA,SAAS,qBAA2B;CAClC,eAAe,eAAe;AAChC;AAEA,SAAS,oBAAoB,SAAiC;CAC5D,mBAAmB;CACnB,IAAI,mBAAmB,KAAK,CAAC,WAAW,GACtC;CAEF,SACE,gCACA,eAAe,QAAQ,iBAAiB,mMAGd,0BAC5B;AACF;AAEA,MAAM,+BAAe,IAAI,QAA8C;AAEvE,SAAgB,4BACd,SACA,WACA,IACG;CACH,eAAe,eAAe;CAC9B,MAAM,UAAU,CACd,GAAG,wBAAwB,GAC3B;EAAE;EAAS,OAAO;EAAG;CAAU,CACjC;CACA,MAAM,OAA2B,CAAC;CAClC,aAAa,IAAI,SAAS,IAAI;CAC9B,IAAI;CACJ,IAAI;EACF,SAAS,sBAAsB,EAAE,QAAQ,GAAG,EAAE;CAChD,SAAS,OAAO;EACd,aAAa,OAAO,OAAO;EAC3B,oBAAoB,OAAO;EAC3B,MAAM;CACR;CAEA,IAAI,0BAA0B,MAAM,GAAG;EACrC,aAAa,OAAO,OAAO;EAC3B,mBAAmB;EACnB,OAAO,4BAA4B,SAAS,WAAW,MAAM;CAC/D;CAEA,IAAI,kBAAkB,SACpB,OAAO,OAAO,MACX,UAAU,oBAAoB,SAAS,YAAY,KAAK,IACxD,UACC,oBAAoB,SAAS,YAAY;EACvC,MAAM;CACR,CAAC,CACL;CAGF,aAAa,OAAO,OAAO;CAC3B,oBAAoB,OAAO;CAC3B,OAAO;AACT;AAEA,SAAS,oBACP,SACA,MACA,QACgB;CAChB,MAAM,UAAU,KAAK,OAAO,CAAC;CAC7B,IAAI,QAAQ,WAAW,GAAG;EACxB,aAAa,OAAO,OAAO;EAC3B,oBAAoB,OAAO;EAC3B,OAAO,OAAO;CAChB;CACA,OAAO,QAAQ,IAAI,OAAO,CAAC,CAAC,WAC1B,oBAAoB,SAAS,MAAM,MAAM,CAC3C;AACF;AAEA,SAAS,mBAAmB,MAA8B;CACxD,MAAM,UAAU,KAAK,WACb,KAAA,SACA,KAAA,CACR;CACA,KAAK,MAAM,SAAS,wBAAwB,GAC1C,aAAa,IAAI,MAAM,OAAO,CAAC,EAAE,KAAK,OAAO;AAEjD;AAEA,SAAgB,8BACd,SACA,MACA,IACG;CACH,IAAI,MAAM;CACV,KAAK,IAAI,QAAQ,QAAQ,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;EAC3D,MAAM,QAAQ,QAAQ;EACtB,MAAM,OAAO;EACb,YAAY,KAAK,OAAO,IAAI;CAC9B;CACA,OAAO,IAAI;AACb;AAEA,SAAS,0BACP,OACkC;CAClC,IAAI,UAAU,QAAQ,OAAO,UAAU,UACrC,OAAO;CAET,MAAM,YAAY;CAClB,OACE,OAAO,UAAU,SAAS,cAC1B,OAAO,UAAU,WAAW,cAC5B,OAAO,UAAU,UAAU,cAC3B,OAAO,UAAU,OAAO,mBAAmB;AAE/C;AAEA,SAAS,4BACP,SACA,WACA,QACyB;CACzB,MAAM,QACJ,QACA,UAEA,4BAA4B,SAAS,iBAAiB,OAAO,OAAO,CAAC,KAAK,CAAC;CAC7E,MAAM,UAAmC;EACvC,OAAO,UAAU,KAAK,QAAQ,KAAK;EACnC,SAAS,UAAU,KAAK,UAAU,KAAK;EACvC,QAAQ,UAAU,KAAK,SAAS,KAAK;GACpC,OAAO,sBAAsB;CAChC;CACA,OAAO;AACT;AAEA,SAAS,gCACP,mBACA,QACyB;CACzB,MAAM,QACJ,QACA,UAEA,kCAAkC,yBAChC,OAAO,OAAO,CAAC,KAAK,CACtB;CACF,MAAM,UAAmC;EACvC,OAAO,UAAU,KAAK,QAAQ,KAAK;EACnC,SAAS,UAAU,KAAK,UAAU,KAAK;EACvC,QAAQ,UAAU,KAAK,SAAS,KAAK;GACpC,OAAO,sBAAsB;CAChC;CACA,OAAO;AACT;AAEA,SAAS,cACP,eAC4B;CAC5B,MAAM,WAAW,cAAc;CAC/B,IAAI,aAAa,KAAA,GACf,OAAO;CAET,IAAI;CACJ,OAAO;EACL,GAAG;EACH,WAAW,WAAoB;GAC7B,YAAA,UAAY,QAAQ,QAAQ,CAAC,CAAC,WAAW,SAAS,MAAM,CAAC;GACzD,OAAO;EACT;CACF;AACF;AAEA,SAAgB,iBACd,YACA,QACA,IACG;CACH,sBAAsB;CACtB,OAAO,uBAAuB,YAAY,QAAQ,EAAE;AACtD;AASA,SAAgB,uBACd,YACA,QACA,IACG;CACH,MAAM,QAAQ,sBAAsB;CACpC,IAAI,CAAC,SAAS,MAAM,QAAQ,WAAW,KAAK,oBAAoB,GAC9D,OAAO,GAAG;CAEZ,MAAM,YAAY,WAAW,KAAK,MAAM,GAAG;CAC3C,MAAM,aAAa,UAAU,UAAU,SAAS;CAChD,IAAI,oBAAoB,OAAO,UAAU,GACvC,OAAO,GAAG;CAEZ,MAAM,oBACJ,eAAe,MAAM,mBAAmB,eACpC,cAAc,MAAM,iBAAiB,IACrC,KAAA;CACN,MAAM,cAA2B,EAAE,UAAU,CAAC,EAAE;CAChD,OAAO,8BACL,MAAM,UACL,OAAO,SACN,MAAM,QAAQ,OACZ,YACA,QACA,MACA,OACA,aACA,iBACF,GACF,EACF;AACF;AAEA,MAAM,aAAa;AAEnB,MAAM,iCAAiB,IAAI,IAAyC;AAMpE,SAAS,kBAAkB,UAAuC;CAChE,IAAI;EACF,MAAM,OAAQ,SAAkD,aAC5D;EACJ,OAAO,OAAO,SAAS,YAAY,SAAS,MAAM,SAAS,WACvD,OACA,KAAA;CACN,QAAQ;EACN;CACF;AACF;AAEA,SAAS,yBACP,YACA,MACA,MACS;CACT,IAAI;CACJ,MAAM,SAAS,uBAAuB,YAAY,YAAY;EAC5D,IAAI;GACF,MAAM,QAAQ,KAAK;GACnB,UAAU,EAAE,MAAM;GAClB,OAAO;EACT,SAAS,OAAO;GACd,UAAU,EAAE,MAAM;GAClB,MAAM;EACR;CACF,CAAC;CACD,IAAI,YAAY,KAAA,GACd,OAAO;CAET,IAAI,WAAW,WAAW,WAAW,QAAQ,OAC3C,OAAO;CAET,IAAI,kBAAkB,SACpB,mBAAmB,MAAM;CAE3B,IAAI,WAAW,SACb,MAAM,QAAQ;CAEhB,OAAO,QAAQ;AACjB;AAEA,SAAS,cAAc,UAAgD;CACrE,MAAM,YAAY,kBAAkB,QAAQ;CAC5C,MAAM,OACJ,cAAc,KAAA,IAAY,aAAa,GAAG,UAAU,GAAG;CACzD,IAAI,aAAa,eAAe,IAAI,IAAI;CACxC,IAAI,eAAe,KAAA,GAAW;EAC5B,aAAa;GACX,IAAI,kBAAkB;GACtB;GACA,MAAM;GACN,MAAM;GACN,QAAQ;GACR,OAAO;GACP,KAAK;EACP;EACA,eAAe,IAAI,MAAM,UAAU;CACrC;CACA,OAAO;AACT;AAaA,SAAgB,gBACd,UACA,GAAG,MACM;CACT,MAAM,SAAS;CACf,IAAI,CAAC,wBAAwB,GAC3B,OAAO,OAAO,UAAU,GAAG,IAAI;CAEjC,OAAO,yBAAyB,cAAc,QAAQ,GAAG,YACvD,OAAO,UAAU,GAAG,IAAI,CAC1B;AACF;AAEA,MAAM,qBAAqB;AAE3B,MAAM,wCAAwB,IAAI,IAAyC;AAO3E,SAAS,qBACP,UACA,UAC6B;CAC7B,MAAM,YAAY,kBAAkB,QAAQ;CAC5C,MAAM,OACJ,cAAc,KAAA,IACV,qBACA,GAAG,UAAU,GAAG;CACtB,MAAM,KAAK,cAAc,SAAS,IAAI,GAAG;CACzC,IAAI,aAAa,sBAAsB,IAAI,EAAE;CAC7C,IAAI,eAAe,KAAA,GAAW;EAC5B,aAAa;GACX;GACA;GACA,MAAM,SAAS;GACf,MAAM;GACN,QAAQ;GACR,OAAO;GACP,YAAY,SAAS;EACvB;EACA,sBAAsB,IAAI,IAAI,UAAU;CAC1C;CACA,OAAO;AACT;AAEA,SAAS,iBACP,UACA,UACA,MACS;CACT,MAAM,SAAS;CACf,IACE,CAAC,wBAAwB,KACzB,mBAAmB,KAAK,EAAE,KAC1B,CAAC,SAAS,gBAAgB,QAAQ,KAClC,2BAA2B,GAE3B,OAAO,OAAO,OAAO,GAAG,IAAI;CAE9B,OAAO,yBACL,qBAAqB,UAAU,QAAQ,GACvC,YACM,OAAO,OAAO,GAAG,IAAI,CAC7B;AACF;AAeA,SAAgB,uBACd,UACA,GAAG,MACM;CACT,OAAO,iBAAiB,YAAY,UAAU,IAAI;AACpD;AAeA,SAAgB,sBACd,UACA,GAAG,MACM;CACT,OAAO,iBAAiB,WAAW,UAAU,IAAI;AACnD;AAeA,SAAgB,4BACd,UACA,GAAG,MACM;CACT,OAAO,iBAAiB,kBAAkB,UAAU,IAAI;AAC1D;AAYA,SAAgB,iBACd,YACA,IACG;CACH,sBAAsB;CACtB,IAAI,GAAG,SAAS,IAAI;EAClB,MAAM,YAAY,WAAW,KAAK,MAAM,GAAG;EAC3C,MAAM,eAAe,UAAU,UAAU,SAAS;EAClD,IAAI,iBAAiB,KAAA,GACnB,OAAO,eAAe,IAAI,QAAQ;GAChC,cAAc;GACd,OAAO;EACT,CAAC;CAEL;CAGA,OAAO,IAAI,MAAMC,IAAQ,EACvB,MAAM,YAAY,SAAS,MAAM;EAC/B,IAAI,CAAC,wBAAwB,GAC3B,OAAO,QAAQ,MAAM,YAAY,SAAS,IAAI;EAEhD,OAAO,iBAAiB,YAAY,YAClC,QAAQ,MAAM,YAAY,SAAS,IAAI,CACzC;CACF,EACF,CAAC;AACH;AAWA,SAAgB,0BAAmC;CACjD,IAAI,eAAe,gBAAgB,KAAK,oBAAoB,GAC1D,OAAO;CAET,OAAO,wBAAwB,CAAC,CAAC,SAAS;AAC5C;AAEA,SAAS,wBAAoD;CAC3D,2BAA2B;CAC3B,OAAO,eAAe,SAAS,SAAS,KAAK,eAAe;AAC9D;AAEA,SAAgB,oCAA0C;CACxD,gBAAgB,uCAAuC,KAAA;AACzD"}
@@ -500,6 +500,17 @@ function runWithAutoTraceNodeConfiguration(nodeConfiguration, fn) {
500
500
  if (isAutoTraceAsyncGenerator(result)) return wrapAutoTraceNodeAsyncGenerator(nodeConfiguration, result);
501
501
  return result;
502
502
  }
503
+ function runWithAutoTraceFramesAt(spanStack, fn) {
504
+ const scope = currentAutoTraceScope();
505
+ if (!scope || scope.entries.length === 0) return fn();
506
+ return runWithAutoTraceScope({
507
+ ...scope,
508
+ entries: scope.entries.map((entry) => ({
509
+ ...entry,
510
+ spanStack
511
+ }))
512
+ }, fn);
513
+ }
503
514
  function runAsAutoTraceRootFunction(functionName, fn) {
504
515
  const scope = currentAutoTraceScope();
505
516
  if (!scope || scope.entries.length === 0 || functionName === "") return fn();
@@ -756,6 +767,6 @@ function _resetAutoTraceTransformDetection() {
756
767
  autoTraceGlobal.__bitfab_auto_trace_transformed_v1__ = void 0;
757
768
  }
758
769
  //#endregion
759
- export { forgetLangChainRun as A, createAsyncLocalStorage as B, recordWatchedClientCall as C, openAiAgentsParentSpanId as D, mapOpenAiAgentsTrace as E, writeOnce as F, registerAsyncLocalStorageClass as H, isCaptureSuppressed as I, runWithCaptureSuppressed as L, markLangChainRunRecorded as M, warn as N, openAiAgentsSpanChain as O, warnOnce as P, assertAsyncStorageRegistered as R, recordAutoTracedClientCall as S, endOpenAiAgentsSpan as T, isAsyncStorageInitDone as V, ANTHROPIC as _, __bitfabAutoSpan as a, clientCallProvider as b, _resetAutoTraceTransformDetection as c, invokeAsDiscoveredCall as d, invokeThroughAutoTraceEntries as f, runWithAutoTraceRootContext as g, runWithAutoTraceNodeConfiguration as h, __bitfabAutoOpenRouter as i, installLangChainRunScopes as j, unmapOpenAiAgentsTrace as k, clearAutoTraceNodeConfiguration as l, runWithAutoTraceEntry as m, __bitfabAutoJev as n, __bitfabAutoTraceActive as o, runAsAutoTraceRootFunction as p, __bitfabAutoOpenAIResponses as r, __bitfabAutoWrap as s, __bitfabAutoAnthropic as t, currentAutoTraceEntries as u, OPENAI_RESPONSES as v, watchClientCall as w, frameworkRecordsClientCall as x, OPENROUTER as y, asyncStorageReady as z };
770
+ export { unmapOpenAiAgentsTrace as A, asyncStorageReady as B, recordAutoTracedClientCall as C, mapOpenAiAgentsTrace as D, endOpenAiAgentsSpan as E, warnOnce as F, isAsyncStorageInitDone as H, writeOnce as I, isCaptureSuppressed as L, installLangChainRunScopes as M, markLangChainRunRecorded as N, openAiAgentsParentSpanId as O, warn as P, runWithCaptureSuppressed as R, frameworkRecordsClientCall as S, watchClientCall as T, registerAsyncLocalStorageClass as U, createAsyncLocalStorage as V, runWithAutoTraceRootContext as _, __bitfabAutoSpan as a, OPENROUTER as b, _resetAutoTraceTransformDetection as c, invokeAsDiscoveredCall as d, invokeThroughAutoTraceEntries as f, runWithAutoTraceNodeConfiguration as g, runWithAutoTraceFramesAt as h, __bitfabAutoOpenRouter as i, forgetLangChainRun as j, openAiAgentsSpanChain as k, clearAutoTraceNodeConfiguration as l, runWithAutoTraceEntry as m, __bitfabAutoJev as n, __bitfabAutoTraceActive as o, runAsAutoTraceRootFunction as p, __bitfabAutoOpenAIResponses as r, __bitfabAutoWrap as s, __bitfabAutoAnthropic as t, currentAutoTraceEntries as u, ANTHROPIC as v, recordWatchedClientCall as w, clientCallProvider as x, OPENAI_RESPONSES as y, assertAsyncStorageRegistered as z };
760
771
 
761
- //# sourceMappingURL=autoTrace-DVnpnuMb.js.map
772
+ //# sourceMappingURL=autoTrace-kHOBg49M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoTrace-kHOBg49M.js","names":["target"],"sources":["../src/asyncStorage.ts","../src/captureSuppression.ts","../src/warnOnce.ts","../src/langchainRunScope.ts","../src/openaiAgentsSpanContext.ts","../src/clientCalls.ts","../src/autoTrace.ts"],"sourcesContent":["/**\n * Shared AsyncLocalStorage loader.\n *\n * Provides two ways to initialize AsyncLocalStorage:\n *\n * 1. **Synchronous registration** (preferred for Node.js):\n * `asyncStorageNode.ts` calls `registerAsyncLocalStorageClass()` at module\n * evaluation time, so the class is available immediately - no async gap.\n * The `node.ts` entry point imports it before anything else.\n *\n * 2. **Async dynamic import** (fallback for the default entry point):\n * Loads `node:async_hooks` via a bundler-safe dynamic import. This is used\n * by the default `index.ts` entry point so the SDK works in browsers\n * (where the import silently fails) and in Node.js when imported via the\n * default entry point.\n *\n * ## Why the dynamic import looks like this\n *\n * We need to handle three environments:\n *\n * 1. **Pure Node.js** - `import(\"node:async_hooks\")` works natively.\n * 2. **Webpack/Turbopack (Next.js server)** - The bundler processes\n * `import()` calls at build time. The `webpackIgnore` magic comment tells\n * webpack (and turbopack) to emit a native `import()` call instead of\n * trying to resolve it, so Node.js handles it at runtime.\n * 3. **Browsers / Edge** - The `process.versions?.node` guard prevents\n * execution entirely. If it somehow runs, `.catch(() => {})` swallows\n * the failure.\n */\n\nexport interface AsyncLocalStorageLike<T> {\n getStore(): T | undefined\n run<R>(store: T, fn: () => R): R\n}\n\nlet AsyncLocalStorageClass: (new () => AsyncLocalStorageLike<unknown>) | null =\n null\nlet initDone = false\n\n/**\n * Register the AsyncLocalStorage class synchronously.\n *\n * Called by `asyncStorageNode.ts` at module evaluation time so the class\n * is available before any span is created - no async gap, no race condition.\n *\n * Safe to call multiple times; subsequent calls are no-ops.\n */\nexport function registerAsyncLocalStorageClass(\n cls: new () => AsyncLocalStorageLike<unknown>,\n): void {\n if (!AsyncLocalStorageClass) {\n AsyncLocalStorageClass = cls\n }\n initDone = true\n}\n\n/**\n * Assert that AsyncLocalStorage was registered successfully.\n *\n * Called by `node.ts` after importing `asyncStorageNode.ts` to catch\n * import-order bugs at startup rather than silently degrading to the\n * browser fallback (flat spans with no nesting).\n *\n * This should ONLY be called from the Node.js entry point where we\n * know `node:async_hooks` must be available.\n */\nexport function assertAsyncStorageRegistered(): void {\n if (!AsyncLocalStorageClass) {\n console.warn(\n \"Bitfab: AsyncLocalStorage not available - nested span context will not propagate.\",\n )\n }\n}\n\nexport const asyncStorageReady: Promise<void> = (\n typeof process !== \"undefined\" && process.versions?.node\n ? // The join trick hides \"node:async_hooks\" from static analysis so\n // bundlers that ban Node.js built-ins don't fail at build time.\n // webpackIgnore tells webpack/turbopack to emit a native import()\n // so Node.js can resolve the module at runtime.\n import(\n /* webpackIgnore: true */\n [\"node\", \"async_hooks\"].join(\":\")\n )\n .then(\n (mod: {\n AsyncLocalStorage: new () => AsyncLocalStorageLike<unknown>\n }) => {\n registerAsyncLocalStorageClass(mod.AsyncLocalStorage)\n },\n )\n .catch(() => {})\n : Promise.resolve()\n).then(() => {\n initDone = true\n})\n\nexport function isAsyncStorageInitDone(): boolean {\n return initDone\n}\n\nexport function createAsyncLocalStorage<T>(): AsyncLocalStorageLike<T> | null {\n return AsyncLocalStorageClass\n ? (new AsyncLocalStorageClass() as AsyncLocalStorageLike<T>)\n : null\n}\n","interface CaptureSuppressionState {\n depth: number\n}\n\ninterface CaptureSuppressionGlobal {\n __bitfabCaptureSuppressionV1?: CaptureSuppressionState\n}\n\nconst suppressionGlobal = globalThis as unknown as CaptureSuppressionGlobal\nconst suppressionState: CaptureSuppressionState =\n suppressionGlobal.__bitfabCaptureSuppressionV1 ?? { depth: 0 }\nsuppressionGlobal.__bitfabCaptureSuppressionV1 = suppressionState\n\nexport function isCaptureSuppressed(): boolean {\n return suppressionState.depth > 0\n}\n\nexport function runWithCaptureSuppressed<T>(fn: () => T): T {\n suppressionState.depth += 1\n try {\n return fn()\n } finally {\n suppressionState.depth -= 1\n }\n}\n","/**\n * Emit a `console.warn` at most once per distinct `key` for the life of the\n * process.\n *\n * The SDK must NEVER crash a host app, so every failure on the user's path\n * degrades silently (a span is dropped, a call runs untraced, a payload is\n * stubbed). Silent is safe but undebuggable: a user who suddenly has no traces,\n * or sees `<unserializable>` in a span, has no signal as to why. A one-time\n * warning per distinct issue restores that signal without spamming the console\n * from a hot path.\n *\n * Keys should identify the specific degradation (e.g. include the traced\n * function key) so each distinct issue warns once, not just the first one seen.\n */\nconst warned = new Set<string>()\n\nexport function warn(message: string): void {\n try {\n console.warn(`[bitfab] ${message}`)\n } catch {\n // Logging must never crash the host app (e.g. a closed/replaced console).\n }\n}\n\nexport function warnOnce(key: string, message: string): void {\n if (warned.has(key)) {\n return\n }\n warned.add(key)\n warn(message)\n}\n\nexport function writeOnce(\n key: string,\n line: string,\n write: (line: string) => void = console.warn,\n): void {\n if (warned.has(key)) {\n return\n }\n warned.add(key)\n try {\n write(line)\n } catch {}\n}\n\n/** Test-only: clear the dedup set so a warning can fire again. */\nexport function _resetWarnOnce(): void {\n warned.clear()\n}\n","import {\n type AsyncLocalStorageLike,\n createAsyncLocalStorage,\n} from \"./asyncStorage.js\"\nimport { importOptionalPeer } from \"./optionalPeer.js\"\n\nconst RUN_SCOPE_STORAGE_SYMBOL = Symbol.for(\"bitfab.langchainRunScopeStorage\")\nconst SCOPED_GENERATE_SYMBOL = Symbol.for(\"bitfab.langchainScopedGenerate\")\nconst UNSCOPED_RUNS_SYMBOL = Symbol.for(\"bitfab.langchainUnscopedRuns\")\nconst MODEL_CLASSES = [\n {\n specifierParts: [\"@langchain\", \"core\", \"language_models\", \"chat_models\"],\n name: \"BaseChatModel\",\n },\n {\n specifierParts: [\"@langchain\", \"core\", \"language_models\", \"llms\"],\n name: \"BaseLLM\",\n },\n] as const\n\ninterface LangChainRunScope {\n recordedByHandler: boolean\n}\n\ntype Generate = ((...args: unknown[]) => unknown) & {\n [SCOPED_GENERATE_SYMBOL]?: true\n}\n\nlet runScopeStorage: AsyncLocalStorageLike<LangChainRunScope> | null = null\nlet installation: Promise<void> | null = null\n\nfunction storage(): AsyncLocalStorageLike<LangChainRunScope> | null {\n if (runScopeStorage) {\n return runScopeStorage\n }\n const shared = globalThis as typeof globalThis & Record<symbol, unknown>\n const existing = shared[RUN_SCOPE_STORAGE_SYMBOL] as\n | AsyncLocalStorageLike<LangChainRunScope>\n | undefined\n runScopeStorage = existing ?? createAsyncLocalStorage<LangChainRunScope>()\n if (runScopeStorage && !existing) {\n shared[RUN_SCOPE_STORAGE_SYMBOL] = runScopeStorage\n }\n return runScopeStorage\n}\n\nfunction unscopedRuns(): Set<string> {\n const shared = globalThis as typeof globalThis & Record<symbol, unknown>\n const existing = shared[UNSCOPED_RUNS_SYMBOL] as Set<string> | undefined\n if (existing) {\n return existing\n }\n const created = new Set<string>()\n shared[UNSCOPED_RUNS_SYMBOL] = created\n return created\n}\n\nfunction scopeGenerate(prototype: { generate?: Generate }): void {\n const original = prototype.generate\n if (typeof original !== \"function\" || original[SCOPED_GENERATE_SYMBOL]) {\n return\n }\n const scoped: Generate = function (this: unknown, ...args: unknown[]) {\n const runStorage = storage()\n if (!runStorage) {\n return original.apply(this, args)\n }\n return runStorage.run({ recordedByHandler: false }, () =>\n original.apply(this, args),\n )\n }\n scoped[SCOPED_GENERATE_SYMBOL] = true\n prototype.generate = scoped\n}\n\nasync function scopeModelClass(\n specifierParts: readonly string[],\n name: string,\n): Promise<void> {\n try {\n const module =\n await importOptionalPeer<Record<string, unknown>>(specifierParts)\n const modelClass = module[name] as { prototype?: { generate?: Generate } }\n if (modelClass?.prototype) {\n scopeGenerate(modelClass.prototype)\n }\n } catch {}\n}\n\nexport function installLangChainRunScopes(): Promise<void> {\n installation ??= Promise.all(\n MODEL_CLASSES.map(({ specifierParts, name }) =>\n scopeModelClass(specifierParts, name),\n ),\n ).then(() => undefined)\n return installation\n}\n\nexport function markLangChainRunRecorded(runId: string): void {\n const scope = storage()?.getStore()\n if (scope) {\n scope.recordedByHandler = true\n return\n }\n unscopedRuns().add(runId)\n}\n\nexport function forgetLangChainRun(runId: string): void {\n unscopedRuns().delete(runId)\n}\n\nexport function langChainHandlerRecordsCall(): boolean {\n const scope = storage()?.getStore()\n if (scope) {\n return scope.recordedByHandler\n }\n return unscopedRuns().size > 0\n}\n","const OPENAI_AGENTS_CONTEXT_STORAGE = Symbol.for(\n \"openai.agents.core.asyncLocalStorage\",\n)\nconst MAX_OPENAI_AGENTS_SPAN_CHAIN = 64\nconst MODEL_CALL_SPAN_TYPES = new Set([\"generation\", \"response\"])\n\ninterface OpenAiAgentsSpanLike {\n spanId?: unknown\n traceId?: unknown\n spanData?: { type?: unknown } | null\n previousSpan?: OpenAiAgentsSpanLike | null\n}\n\ninterface OpenAiAgentsContextStore {\n active?: unknown\n span?: OpenAiAgentsSpanLike | null\n}\n\ninterface OpenAiAgentsContextStorage {\n getStore(): OpenAiAgentsContextStore | undefined\n}\n\ninterface OpenAiAgentsSpanState {\n bitfabTraceIds: Map<string, string>\n endedSpanIds: Map<string, Set<string>>\n}\n\ninterface OpenAiAgentsSpanGlobal {\n __bitfabOpenAiAgentsSpansV1?: OpenAiAgentsSpanState\n}\n\nconst spanGlobal = globalThis as unknown as OpenAiAgentsSpanGlobal &\n Record<symbol, unknown>\nconst state: OpenAiAgentsSpanState = spanGlobal.__bitfabOpenAiAgentsSpansV1 ?? {\n bitfabTraceIds: new Map(),\n endedSpanIds: new Map(),\n}\nspanGlobal.__bitfabOpenAiAgentsSpansV1 = state\n\nexport function mapOpenAiAgentsTrace(\n agentsTraceId: string,\n bitfabTraceId: string,\n): void {\n state.bitfabTraceIds.set(agentsTraceId, bitfabTraceId)\n}\n\nexport function unmapOpenAiAgentsTrace(agentsTraceId: string): void {\n state.bitfabTraceIds.delete(agentsTraceId)\n state.endedSpanIds.delete(agentsTraceId)\n}\n\nexport function endOpenAiAgentsSpan(\n agentsTraceId: string,\n spanId: string,\n): void {\n if (!state.bitfabTraceIds.has(agentsTraceId)) {\n return\n }\n const ended = state.endedSpanIds.get(agentsTraceId) ?? new Set<string>()\n ended.add(spanId)\n state.endedSpanIds.set(agentsTraceId, ended)\n}\n\nfunction isOpenAiAgentsContextStorage(\n value: unknown,\n): value is OpenAiAgentsContextStorage {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as { getStore?: unknown }).getStore === \"function\"\n )\n}\n\nfunction currentOpenAiAgentsSpan(): OpenAiAgentsSpanLike | undefined {\n const storage = spanGlobal[OPENAI_AGENTS_CONTEXT_STORAGE]\n if (!isOpenAiAgentsContextStorage(storage)) {\n return undefined\n }\n try {\n const store = storage.getStore()\n return store?.active === true ? (store.span ?? undefined) : undefined\n } catch {\n return undefined\n }\n}\n\nfunction currentOpenAiAgentsSpans(): OpenAiAgentsSpanLike[] {\n const spans: OpenAiAgentsSpanLike[] = []\n let span = currentOpenAiAgentsSpan()\n while (span !== undefined && spans.length < MAX_OPENAI_AGENTS_SPAN_CHAIN) {\n spans.push(span)\n span = span.previousSpan ?? undefined\n }\n return spans\n}\n\nexport function openAiAgentsSpanChain(): string[] {\n if (state.bitfabTraceIds.size === 0) {\n return []\n }\n return currentOpenAiAgentsSpans()\n .map((span) => span.spanId)\n .filter((spanId): spanId is string => typeof spanId === \"string\")\n}\n\nexport function openAiAgentsParentSpanId(\n bitfabTraceId: string,\n enclosingSpanIds: readonly string[] | undefined,\n): string | undefined {\n if (state.bitfabTraceIds.size === 0) {\n return undefined\n }\n for (const span of currentOpenAiAgentsSpans()) {\n if (typeof span.spanId !== \"string\" || typeof span.traceId !== \"string\") {\n return undefined\n }\n if (state.bitfabTraceIds.get(span.traceId) !== bitfabTraceId) {\n return undefined\n }\n if (enclosingSpanIds?.includes(span.spanId)) {\n return undefined\n }\n if (!state.endedSpanIds.get(span.traceId)?.has(span.spanId)) {\n return span.spanId\n }\n }\n return undefined\n}\n\nexport function openAiAgentsModelCallOpen(): boolean {\n if (state.bitfabTraceIds.size === 0) {\n return false\n }\n return currentOpenAiAgentsSpans().some(\n (span) =>\n typeof span.traceId === \"string\" &&\n typeof span.spanId === \"string\" &&\n state.bitfabTraceIds.has(span.traceId) &&\n MODEL_CALL_SPAN_TYPES.has(String(span.spanData?.type)) &&\n !state.endedSpanIds.get(span.traceId)?.has(span.spanId),\n )\n}\n","import {\n type AsyncLocalStorageLike,\n createAsyncLocalStorage,\n} from \"./asyncStorage.js\"\nimport { langChainHandlerRecordsCall } from \"./langchainRunScope.js\"\nimport { openAiAgentsModelCallOpen } from \"./openaiAgentsSpanContext.js\"\n\nconst OPENROUTER_HOSTNAME = \"openrouter.ai\"\nconst CLIENT_CALL_WATCH_STORAGE_SYMBOL = Symbol.for(\n \"bitfab.clientCallWatchStorage\",\n)\n\nexport interface ClientCallProvider {\n key: string\n library: string\n matchesReceiver(receiver: unknown): boolean\n isResponse(response: unknown): boolean\n prompt(body: unknown): string | undefined\n context(\n body: unknown,\n response: unknown,\n durationMs: number,\n ): Record<string, unknown>\n}\n\ninterface ClientCallWatch {\n recorded: boolean\n parent: ClientCallWatch | null\n}\n\ninterface ClientCallSpan {\n addContext(context: Record<string, unknown>): void\n setPrompt(prompt: string): void\n}\n\ninterface PromptEntry {\n role: string\n content: string\n}\n\nconst responsesRecordedByAutoTrace = new WeakSet<object>()\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null\n}\n\nfunction field(value: unknown, name: string): unknown {\n return isRecord(value) ? value[name] : undefined\n}\n\nfunction numberField(value: unknown, name: string): number | undefined {\n const found = field(value, name)\n return typeof found === \"number\" && Number.isFinite(found) ? found : undefined\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value !== \"\" ? value : undefined\n}\n\nfunction presentFields(\n base: Record<string, unknown>,\n values: Record<string, unknown>,\n durationMs: number,\n): Record<string, unknown> {\n const context = { ...base }\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined) {\n context[key] = value\n }\n }\n context.durationMs = durationMs\n return context\n}\n\nfunction sumOfPresent(values: Array<number | undefined>): number | undefined {\n const present = values.filter((value) => value !== undefined)\n return present.length > 0\n ? present.reduce((total, value) => total + value, 0)\n : undefined\n}\n\nfunction textOf(content: unknown): string {\n return typeof content === \"string\" ? content : JSON.stringify(content)\n}\n\nfunction roleEntries(items: unknown[]): PromptEntry[] {\n return items.flatMap((item) => {\n const role = field(item, \"role\")\n if (typeof role !== \"string\") {\n return []\n }\n return [{ role, content: textOf(field(item, \"content\")) }]\n })\n}\n\nfunction renderedPrompt(entries: PromptEntry[]): string | undefined {\n return entries.length > 0 ? JSON.stringify(entries) : undefined\n}\n\nfunction clientOf(receiver: unknown): unknown {\n try {\n return field(receiver, \"_client\")\n } catch {\n return undefined\n }\n}\n\nfunction clientClassStatic(receiver: unknown, name: string): unknown {\n const client = clientOf(receiver)\n if (!isRecord(client)) {\n return undefined\n }\n try {\n const clientClass: unknown = client.constructor\n return typeof clientClass === \"function\"\n ? (clientClass as unknown as Record<string, unknown>)[name]\n : undefined\n } catch {\n return undefined\n }\n}\n\nfunction isOpenRouterBaseUrl(baseUrl: unknown): boolean {\n if (typeof baseUrl !== \"string\") {\n return false\n }\n try {\n const host = new URL(baseUrl).hostname\n return (\n host === OPENROUTER_HOSTNAME || host.endsWith(`.${OPENROUTER_HOSTNAME}`)\n )\n } catch {\n return false\n }\n}\n\nexport function isOpenRouterCompletions(receiver: unknown): boolean {\n try {\n return isOpenRouterBaseUrl(field(clientOf(receiver), \"baseURL\"))\n } catch {\n return false\n }\n}\n\nfunction isAnthropicMessages(receiver: unknown): boolean {\n return typeof clientClassStatic(receiver, \"HUMAN_PROMPT\") === \"string\"\n}\n\nfunction isOpenAIResponses(receiver: unknown): boolean {\n return typeof clientClassStatic(receiver, \"OpenAI\") === \"function\"\n}\n\nexport function isStreamingRequest(body: unknown): boolean {\n return field(body, \"stream\") === true\n}\n\nexport function openRouterPrompt(body: unknown): string | undefined {\n const messages = field(body, \"messages\")\n return Array.isArray(messages)\n ? renderedPrompt(roleEntries(messages))\n : undefined\n}\n\nexport function openRouterContext(\n body: unknown,\n response: unknown,\n durationMs: number,\n): Record<string, unknown> {\n const usage = field(response, \"usage\")\n return presentFields(\n { provider: \"openrouter\" },\n {\n model:\n nonEmptyString(field(response, \"model\")) ??\n nonEmptyString(field(body, \"model\")),\n upstreamProvider: nonEmptyString(field(response, \"provider\")),\n inputTokens: numberField(usage, \"prompt_tokens\"),\n outputTokens: numberField(usage, \"completion_tokens\"),\n cachedInputTokens: numberField(\n field(usage, \"prompt_tokens_details\"),\n \"cached_tokens\",\n ),\n reasoningTokens: numberField(\n field(usage, \"completion_tokens_details\"),\n \"reasoning_tokens\",\n ),\n costUsd: numberField(usage, \"cost\"),\n },\n durationMs,\n )\n}\n\nexport function anthropicPrompt(body: unknown): string | undefined {\n const system = field(body, \"system\")\n const messages = field(body, \"messages\")\n return renderedPrompt([\n ...(system === undefined || system === null\n ? []\n : [{ role: \"system\", content: textOf(system) }]),\n ...(Array.isArray(messages) ? roleEntries(messages) : []),\n ])\n}\n\nexport function anthropicContext(\n body: unknown,\n response: unknown,\n durationMs: number,\n): Record<string, unknown> {\n const usage = field(response, \"usage\")\n const cacheRead = numberField(usage, \"cache_read_input_tokens\")\n return presentFields(\n { provider: \"anthropic\" },\n {\n model:\n nonEmptyString(field(response, \"model\")) ??\n nonEmptyString(field(body, \"model\")),\n inputTokens: sumOfPresent([\n numberField(usage, \"input_tokens\"),\n cacheRead,\n numberField(usage, \"cache_creation_input_tokens\"),\n ]),\n outputTokens: numberField(usage, \"output_tokens\"),\n cachedInputTokens: cacheRead,\n },\n durationMs,\n )\n}\n\nexport function openAIResponsesPrompt(body: unknown): string | undefined {\n const instructions = field(body, \"instructions\")\n const input = field(body, \"input\")\n return renderedPrompt([\n ...(typeof instructions === \"string\"\n ? [{ role: \"system\", content: instructions }]\n : []),\n ...(typeof input === \"string\" ? [{ role: \"user\", content: input }] : []),\n ...(Array.isArray(input) ? roleEntries(input) : []),\n ])\n}\n\nexport function openAIResponsesContext(\n body: unknown,\n response: unknown,\n durationMs: number,\n): Record<string, unknown> {\n const usage = field(response, \"usage\")\n return presentFields(\n { provider: \"openai\" },\n {\n model:\n nonEmptyString(field(response, \"model\")) ??\n nonEmptyString(field(body, \"model\")),\n inputTokens: numberField(usage, \"input_tokens\"),\n outputTokens: numberField(usage, \"output_tokens\"),\n cachedInputTokens: numberField(\n field(usage, \"input_tokens_details\"),\n \"cached_tokens\",\n ),\n reasoningTokens: numberField(\n field(usage, \"output_tokens_details\"),\n \"reasoning_tokens\",\n ),\n costUsd: numberField(usage, \"cost\"),\n },\n durationMs,\n )\n}\n\nexport const OPENROUTER: ClientCallProvider = {\n key: \"openrouter\",\n library: \"openai\",\n matchesReceiver: isOpenRouterCompletions,\n isResponse: (response) =>\n isRecord(response) && Array.isArray(response.choices),\n prompt: openRouterPrompt,\n context: openRouterContext,\n}\n\nexport const ANTHROPIC: ClientCallProvider = {\n key: \"anthropic\",\n library: \"@anthropic-ai/sdk\",\n matchesReceiver: isAnthropicMessages,\n isResponse: (response) =>\n field(response, \"type\") === \"message\" &&\n Array.isArray(field(response, \"content\")),\n prompt: anthropicPrompt,\n context: anthropicContext,\n}\n\nexport const OPENAI_RESPONSES: ClientCallProvider = {\n key: \"openai-responses\",\n library: \"openai\",\n matchesReceiver: isOpenAIResponses,\n isResponse: (response) => field(response, \"object\") === \"response\",\n prompt: openAIResponsesPrompt,\n context: openAIResponsesContext,\n}\n\nconst CLIENT_CALL_PROVIDERS = new Map(\n [OPENROUTER, ANTHROPIC, OPENAI_RESPONSES].map((provider) => [\n provider.key,\n provider,\n ]),\n)\n\nexport function clientCallProvider(\n key: string | undefined,\n): ClientCallProvider | undefined {\n return key === undefined ? undefined : CLIENT_CALL_PROVIDERS.get(key)\n}\n\nfunction recordClientCall(\n provider: ClientCallProvider,\n span: ClientCallSpan,\n body: unknown,\n response: unknown,\n durationMs: number,\n): void {\n try {\n const prompt = provider.prompt(body)\n if (prompt !== undefined) {\n span.setPrompt(prompt)\n }\n span.addContext(provider.context(body, response, durationMs))\n } catch {}\n}\n\nlet clientCallWatchStorage: AsyncLocalStorageLike<ClientCallWatch> | null = null\n\nfunction watchStorage(): AsyncLocalStorageLike<ClientCallWatch> | null {\n if (clientCallWatchStorage) {\n return clientCallWatchStorage\n }\n const shared = globalThis as typeof globalThis & Record<symbol, unknown>\n const existing = shared[CLIENT_CALL_WATCH_STORAGE_SYMBOL] as\n | AsyncLocalStorageLike<ClientCallWatch>\n | undefined\n clientCallWatchStorage =\n existing ?? createAsyncLocalStorage<ClientCallWatch>()\n if (clientCallWatchStorage && !existing) {\n shared[CLIENT_CALL_WATCH_STORAGE_SYMBOL] = clientCallWatchStorage\n }\n return clientCallWatchStorage\n}\n\nexport function watchClientCall<T>(fn: () => T): {\n watch: ClientCallWatch\n result: T\n} {\n const storage = watchStorage()\n const watch: ClientCallWatch = {\n recorded: false,\n parent: storage?.getStore() ?? null,\n }\n const result = storage ? storage.run(watch, fn) : fn()\n return { watch, result }\n}\n\nfunction markEnclosingWatches(watch: ClientCallWatch): void {\n for (let current = watch.parent; current; current = current.parent) {\n current.recorded = true\n }\n}\n\nexport function frameworkRecordsClientCall(): boolean {\n return langChainHandlerRecordsCall() || openAiAgentsModelCallOpen()\n}\n\nfunction isRecordedByAutoTrace(response: unknown): boolean {\n return isRecord(response) && responsesRecordedByAutoTrace.has(response)\n}\n\nexport function recordWatchedClientCall(\n provider: ClientCallProvider,\n span: ClientCallSpan,\n watch: ClientCallWatch,\n body: unknown,\n response: unknown,\n durationMs: number,\n): void {\n if (watch.recorded || isRecordedByAutoTrace(response)) {\n markEnclosingWatches(watch)\n return\n }\n if (!provider.isResponse(response)) {\n return\n }\n recordClientCall(provider, span, body, response, durationMs)\n responsesRecordedByAutoTrace.add(response as object)\n markEnclosingWatches(watch)\n}\n\nexport function recordAutoTracedClientCall<T>(\n provider: ClientCallProvider,\n invokeFn: () => T,\n body: unknown,\n span: ClientCallSpan,\n): T {\n const startedAt = Date.now()\n const { watch, result } = watchClientCall(invokeFn)\n const settle = (response: unknown): void => {\n recordWatchedClientCall(\n provider,\n span,\n watch,\n body,\n response,\n Date.now() - startedAt,\n )\n }\n if (result instanceof Promise) {\n return result.then((response) => {\n settle(response)\n return response\n }) as T\n }\n settle(result)\n return result\n}\n","import {\n type AsyncLocalStorageLike,\n createAsyncLocalStorage,\n} from \"./asyncStorage.js\"\nimport { isCaptureSuppressed } from \"./captureSuppression.js\"\nimport {\n ANTHROPIC,\n type ClientCallProvider,\n frameworkRecordsClientCall,\n isStreamingRequest,\n OPENAI_RESPONSES,\n OPENROUTER,\n} from \"./clientCalls.js\"\nimport { warnOnce } from \"./warnOnce.js\"\n\nexport interface AutoTraceFunctionDefinition {\n id: string\n name: string\n file: string\n line: number\n column: number\n async?: boolean\n wrapper?: boolean\n baml?: boolean\n jev?: boolean\n clientCall?: string\n}\n\nexport interface AutoTraceNodeConfiguration {\n functionName: string\n name?: string\n type?: \"llm\" | \"agent\" | \"function\" | \"guardrail\" | \"handoff\" | \"custom\"\n defaultType?: boolean\n capture: boolean\n experimentId?: string\n /** @deprecated Use experimentId. */\n testRunId?: string\n mockOnReplay?: boolean\n replayReusable?: boolean\n // biome-ignore lint/suspicious/noExplicitAny: node finalizers receive the configured function's result, whose type is owned by the caller\n finalize?: (result: any) => unknown | Promise<unknown>\n}\n\nexport interface NestedTraceLink {\n traceFunctionKey: string\n traceId?: string\n rootSpanId?: string\n}\n\nexport interface SpanDetails {\n contexts: Record<string, unknown>[]\n prompt?: string\n}\n\nexport interface AutoTraceEntry {\n context: AutoTraceContext\n depth: number\n spanStack: unknown\n}\n\nexport interface AutoTraceContext {\n readonly traceFunctionKey: string\n invoke<T>(\n definition: AutoTraceFunctionDefinition,\n inputs: unknown[],\n fn: () => T,\n entry: AutoTraceEntry,\n spanDetails: SpanDetails,\n nodeConfiguration?: AutoTraceNodeConfiguration,\n ): T\n invokeNestedRoot<T>(\n name: string,\n functionName: string,\n inputs: unknown[],\n fn: () => T,\n entry: AutoTraceEntry,\n link: NestedTraceLink | undefined,\n spanDetails: SpanDetails,\n ): T\n}\n\ninterface AutoTraceRootFunction {\n name: string\n entering: boolean\n}\n\ninterface AutoTraceScope {\n entries: readonly AutoTraceEntry[]\n nodeConfiguration?: AutoTraceNodeConfiguration\n rootFunction?: AutoTraceRootFunction\n}\n\ninterface AutoTraceState {\n storage: AsyncLocalStorageLike<AutoTraceScope> | null\n browserScope: AutoTraceScope | undefined\n // Older SDK copies read this field when sharing the process-wide V4 state.\n capturePolicies: WeakMap<object, Map<string, ReadonlySet<string>>>\n activeRoots: number\n}\n\ninterface AutoTraceGlobal {\n __bitfabAutoTraceStateV4?: AutoTraceState\n __bitfab_auto_trace_transformed_v1__?: boolean\n}\n\ninterface AutoTraceAsyncGenerator {\n next(value?: unknown): Promise<IteratorResult<unknown, unknown>>\n return(value?: unknown): Promise<IteratorResult<unknown, unknown>>\n throw(error?: unknown): Promise<IteratorResult<unknown, unknown>>\n [Symbol.asyncIterator](): AutoTraceAsyncGenerator\n}\n\nconst autoTraceGlobal = globalThis as unknown as AutoTraceGlobal\nconst autoTraceState: AutoTraceState =\n autoTraceGlobal.__bitfabAutoTraceStateV4 ?? {\n storage: null,\n browserScope: undefined,\n capturePolicies: new WeakMap(),\n activeRoots: 0,\n }\nautoTraceGlobal.__bitfabAutoTraceStateV4 = autoTraceState\n\nfunction initializeAutoTraceStorage(): void {\n autoTraceState.storage ??= createAsyncLocalStorage<AutoTraceScope>()\n}\n\nfunction runWithAutoTraceScope<T>(scope: AutoTraceScope, fn: () => T): T {\n initializeAutoTraceStorage()\n if (autoTraceState.storage) {\n return autoTraceState.storage.run(scope, fn)\n }\n\n const previous = autoTraceState.browserScope\n autoTraceState.browserScope = scope\n try {\n return fn()\n } finally {\n autoTraceState.browserScope = previous\n }\n}\n\nexport function currentAutoTraceEntries(): readonly AutoTraceEntry[] {\n return currentAutoTraceScope()?.entries ?? []\n}\n\nfunction replaceEntry(\n entries: readonly AutoTraceEntry[],\n previous: AutoTraceEntry,\n updated: AutoTraceEntry,\n): readonly AutoTraceEntry[] {\n return entries.map((entry) => (entry === previous ? updated : entry))\n}\n\nexport function runWithAutoTraceEntry<T>(\n previous: AutoTraceEntry,\n updated: AutoTraceEntry,\n fn: () => T,\n): T {\n const result = runWithAutoTraceScope(\n { entries: replaceEntry(currentAutoTraceEntries(), previous, updated) },\n fn,\n )\n if (isAutoTraceAsyncGenerator(result)) {\n return wrapAutoTraceEntryAsyncGenerator(previous, updated, result) as T\n }\n return result\n}\n\nfunction wrapAutoTraceEntryAsyncGenerator(\n previous: AutoTraceEntry,\n updated: AutoTraceEntry,\n source: AutoTraceAsyncGenerator,\n): AutoTraceAsyncGenerator {\n const step = (\n method: \"next\" | \"return\" | \"throw\",\n value?: unknown,\n ): Promise<IteratorResult<unknown, unknown>> =>\n runWithAutoTraceScope(\n { entries: replaceEntry(currentAutoTraceEntries(), previous, updated) },\n () => source[method](value),\n )\n const wrapped: AutoTraceAsyncGenerator = {\n next: (value) => step(\"next\", value),\n return: (value) => step(\"return\", value),\n throw: (error) => step(\"throw\", error),\n [Symbol.asyncIterator]: () => wrapped,\n }\n return wrapped\n}\n\nexport function clearAutoTraceNodeConfiguration<T>(fn: () => T): T {\n return runWithAutoTraceScope({ entries: currentAutoTraceEntries() }, fn)\n}\n\nexport function runWithAutoTraceNodeConfiguration<T>(\n nodeConfiguration: AutoTraceNodeConfiguration,\n fn: () => T,\n): T {\n const scope = currentAutoTraceScope()\n if (!scope || scope.entries.length === 0) {\n return fn()\n }\n\n const result = runWithAutoTraceScope({ ...scope, nodeConfiguration }, fn)\n if (isAutoTraceAsyncGenerator(result)) {\n return wrapAutoTraceNodeAsyncGenerator(nodeConfiguration, result) as T\n }\n return result\n}\n\n/**\n * Run `fn` with every active auto-trace frame re-based onto `spanStack`, so a\n * call the build transform discovers inside a framework integration's span\n * attaches under that span rather than under the nearest discovered call.\n * @internal\n */\nexport function runWithAutoTraceFramesAt<T>(\n spanStack: unknown,\n fn: () => T,\n): T {\n const scope = currentAutoTraceScope()\n if (!scope || scope.entries.length === 0) {\n return fn()\n }\n return runWithAutoTraceScope(\n {\n ...scope,\n entries: scope.entries.map((entry) => ({ ...entry, spanStack })),\n },\n fn,\n )\n}\n\nexport function runAsAutoTraceRootFunction<T>(\n functionName: string,\n fn: () => T,\n): T {\n const scope = currentAutoTraceScope()\n if (!scope || scope.entries.length === 0 || functionName === \"\") {\n return fn()\n }\n const rootFunction: AutoTraceRootFunction = {\n name: functionName,\n entering: true,\n }\n try {\n return runWithAutoTraceScope({ ...scope, rootFunction }, fn)\n } finally {\n rootFunction.entering = false\n }\n}\n\nfunction isRootFunctionEntry(\n scope: AutoTraceScope,\n simpleName: string | undefined,\n): boolean {\n const rootFunction = scope.rootFunction\n if (rootFunction === undefined || !rootFunction.entering) {\n return false\n }\n rootFunction.entering = false\n return rootFunction.name === simpleName\n}\n\nconst SUBTREE_TRACING_DOCS_URL =\n \"https://docs.bitfab.ai/typescript-sdk#experimental-subtree-tracing\"\n\nfunction noteTransformedModule(): void {\n autoTraceGlobal.__bitfab_auto_trace_transformed_v1__ = true\n}\n\nfunction transformInstalled(): boolean {\n return autoTraceGlobal.__bitfab_auto_trace_transformed_v1__ === true\n}\n\nfunction runsOnNode(): boolean {\n return typeof process !== \"undefined\" && Boolean(process.versions?.node)\n}\n\nfunction closeAutoTraceRoot(): void {\n autoTraceState.activeRoots -= 1\n}\n\nfunction settleAutoTraceRoot(context: AutoTraceContext): void {\n closeAutoTraceRoot()\n if (transformInstalled() || !runsOnNode()) {\n return\n }\n warnOnce(\n \"auto-trace-transform-missing\",\n `trace root \"${context.traceFunctionKey}\" recorded only its own span. ` +\n \"No module in this build was compiled by @bitfab/sdk/transform, so calls \" +\n \"beneath the root were not discovered. Add the SDK's transform adapter \" +\n `to the server build: ${SUBTREE_TRACING_DOCS_URL}`,\n )\n}\n\nconst heldRootWork = new WeakMap<AutoTraceContext, Promise<unknown>[]>()\n\nexport function runWithAutoTraceRootContext<T>(\n context: AutoTraceContext,\n spanStack: unknown,\n fn: () => T,\n): T {\n autoTraceState.activeRoots += 1\n const entries = [\n ...currentAutoTraceEntries(),\n { context, depth: 0, spanStack },\n ]\n const held: Promise<unknown>[] = []\n heldRootWork.set(context, held)\n let result: T\n try {\n result = runWithAutoTraceScope({ entries }, fn)\n } catch (error) {\n heldRootWork.delete(context)\n settleAutoTraceRoot(context)\n throw error\n }\n\n if (isAutoTraceAsyncGenerator(result)) {\n heldRootWork.delete(context)\n closeAutoTraceRoot()\n return wrapAutoTraceAsyncGenerator(context, spanStack, result) as T\n }\n\n if (result instanceof Promise) {\n return result.then(\n (value) => finishAfterHeldWork(context, held, () => value),\n (error) =>\n finishAfterHeldWork(context, held, () => {\n throw error\n }),\n ) as T\n }\n\n heldRootWork.delete(context)\n settleAutoTraceRoot(context)\n return result\n}\n\nfunction finishAfterHeldWork<T>(\n context: AutoTraceContext,\n held: Promise<unknown>[],\n finish: () => T,\n): T | Promise<T> {\n const pending = held.splice(0)\n if (pending.length === 0) {\n heldRootWork.delete(context)\n settleAutoTraceRoot(context)\n return finish()\n }\n return Promise.all(pending).then(() =>\n finishAfterHeldWork(context, held, finish),\n )\n}\n\nfunction holdAutoTraceRoots(work: Promise<unknown>): void {\n const settled = work.then(\n () => undefined,\n () => undefined,\n )\n for (const entry of currentAutoTraceEntries()) {\n heldRootWork.get(entry.context)?.push(settled)\n }\n}\n\nexport function invokeThroughAutoTraceEntries<T>(\n entries: readonly AutoTraceEntry[],\n step: (entry: AutoTraceEntry, next: () => T) => T,\n fn: () => T,\n): T {\n let run = fn\n for (let index = entries.length - 1; index >= 0; index -= 1) {\n const entry = entries[index] as AutoTraceEntry\n const next = run\n run = () => step(entry, next)\n }\n return run()\n}\n\nfunction isAutoTraceAsyncGenerator(\n value: unknown,\n): value is AutoTraceAsyncGenerator {\n if (value === null || typeof value !== \"object\") {\n return false\n }\n const candidate = value as Record<PropertyKey, unknown>\n return (\n typeof candidate.next === \"function\" &&\n typeof candidate.return === \"function\" &&\n typeof candidate.throw === \"function\" &&\n typeof candidate[Symbol.asyncIterator] === \"function\"\n )\n}\n\nfunction wrapAutoTraceAsyncGenerator(\n context: AutoTraceContext,\n spanStack: unknown,\n source: AutoTraceAsyncGenerator,\n): AutoTraceAsyncGenerator {\n const step = (\n method: \"next\" | \"return\" | \"throw\",\n value?: unknown,\n ): Promise<IteratorResult<unknown, unknown>> =>\n runWithAutoTraceRootContext(context, spanStack, () => source[method](value))\n const wrapped: AutoTraceAsyncGenerator = {\n next: (value) => step(\"next\", value),\n return: (value) => step(\"return\", value),\n throw: (error) => step(\"throw\", error),\n [Symbol.asyncIterator]: () => wrapped,\n }\n return wrapped\n}\n\nfunction wrapAutoTraceNodeAsyncGenerator(\n nodeConfiguration: AutoTraceNodeConfiguration,\n source: AutoTraceAsyncGenerator,\n): AutoTraceAsyncGenerator {\n const step = (\n method: \"next\" | \"return\" | \"throw\",\n value?: unknown,\n ): Promise<IteratorResult<unknown, unknown>> =>\n runWithAutoTraceNodeConfiguration(nodeConfiguration, () =>\n source[method](value),\n )\n const wrapped: AutoTraceAsyncGenerator = {\n next: (value) => step(\"next\", value),\n return: (value) => step(\"return\", value),\n throw: (error) => step(\"throw\", error),\n [Symbol.asyncIterator]: () => wrapped,\n }\n return wrapped\n}\n\nfunction shareFinalize(\n configuration: AutoTraceNodeConfiguration,\n): AutoTraceNodeConfiguration {\n const finalize = configuration.finalize\n if (finalize === undefined) {\n return configuration\n }\n let settled: Promise<unknown> | undefined\n return {\n ...configuration,\n finalize: (result: unknown) => {\n settled ??= Promise.resolve().then(() => finalize(result))\n return settled\n },\n }\n}\n\nexport function __bitfabAutoSpan<T>(\n definition: AutoTraceFunctionDefinition,\n inputs: unknown[],\n fn: () => T,\n): T {\n noteTransformedModule()\n return invokeAsDiscoveredCall(definition, inputs, fn)\n}\n\n/**\n * Record a call the build transform did not wrap as a function, such as a\n * rewritten call site, as if the transform had discovered it. It is internal\n * runtime protocol, not a supported application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function invokeAsDiscoveredCall<T>(\n definition: AutoTraceFunctionDefinition,\n inputs: unknown[],\n fn: () => T,\n): T {\n const scope = currentAutoTraceScope()\n if (!scope || scope.entries.length === 0 || isCaptureSuppressed()) {\n return fn()\n }\n const nameParts = definition.name.split(\".\")\n const simpleName = nameParts[nameParts.length - 1]\n if (isRootFunctionEntry(scope, simpleName)) {\n return fn()\n }\n const nodeConfiguration =\n simpleName === scope.nodeConfiguration?.functionName\n ? shareFinalize(scope.nodeConfiguration)\n : undefined\n const spanDetails: SpanDetails = { contexts: [] }\n return invokeThroughAutoTraceEntries(\n scope.entries,\n (entry, next) =>\n entry.context.invoke(\n definition,\n inputs,\n next,\n entry,\n spanDetails,\n nodeConfiguration,\n ),\n fn,\n )\n}\n\nconst JEV_METHOD = \"systemOne\"\n\nconst jevDefinitions = new Map<string, AutoTraceFunctionDefinition>()\n\ntype JevReceiver = Record<typeof JEV_METHOD, (...args: unknown[]) => unknown>\n\ntype RecordedCallOutcome = { value: unknown } | { error: unknown }\n\nfunction receiverClassName(receiver: unknown): string | undefined {\n try {\n const name = (receiver as { constructor?: { name?: unknown } }).constructor\n ?.name\n return typeof name === \"string\" && name !== \"\" && name !== \"Object\"\n ? name\n : undefined\n } catch {\n return undefined\n }\n}\n\nfunction invokeRecordedClientCall(\n definition: AutoTraceFunctionDefinition,\n args: unknown[],\n call: () => unknown,\n): unknown {\n let outcome: RecordedCallOutcome | undefined\n const traced = invokeAsDiscoveredCall(definition, args, () => {\n try {\n const value = call()\n outcome = { value }\n return value\n } catch (error) {\n outcome = { error }\n throw error\n }\n })\n if (outcome === undefined) {\n return traced\n }\n if (\"value\" in outcome && traced === outcome.value) {\n return traced\n }\n if (traced instanceof Promise) {\n holdAutoTraceRoots(traced)\n }\n if (\"error\" in outcome) {\n throw outcome.error\n }\n return outcome.value\n}\n\nfunction jevDefinition(receiver: unknown): AutoTraceFunctionDefinition {\n const className = receiverClassName(receiver)\n const name =\n className === undefined ? JEV_METHOD : `${className}.${JEV_METHOD}`\n let definition = jevDefinitions.get(name)\n if (definition === undefined) {\n definition = {\n id: `ts-auto-v1:jev#${name}`,\n name,\n file: \"@typesafe-ai/sdk\",\n line: 0,\n column: 0,\n async: true,\n jev: true,\n }\n jevDefinitions.set(name, definition)\n }\n return definition\n}\n\n/**\n * Call `receiver.systemOne(...args)` from a call site rewritten by the build\n * transform. Beneath an automatic trace root the call is recorded as one `llm`\n * span with Jev's model and token usage, and the client's own returned value\n * is handed back unchanged. Outside a root it is a plain method call.\n *\n * This helper is internal transform/runtime protocol, not a supported\n * application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoJev(\n receiver: unknown,\n ...args: unknown[]\n): unknown {\n const target = receiver as JevReceiver\n if (!__bitfabAutoTraceActive()) {\n return target.systemOne(...args)\n }\n return invokeRecordedClientCall(jevDefinition(receiver), args, () =>\n target.systemOne(...args),\n )\n}\n\nconst CLIENT_CALL_METHOD = \"create\"\n\nconst clientCallDefinitions = new Map<string, AutoTraceFunctionDefinition>()\n\ntype ClientCallReceiver = Record<\n typeof CLIENT_CALL_METHOD,\n (...args: unknown[]) => unknown\n>\n\nfunction clientCallDefinition(\n provider: ClientCallProvider,\n receiver: unknown,\n): AutoTraceFunctionDefinition {\n const className = receiverClassName(receiver)\n const name =\n className === undefined\n ? CLIENT_CALL_METHOD\n : `${className}.${CLIENT_CALL_METHOD}`\n const id = `ts-auto-v1:${provider.key}#${name}`\n let definition = clientCallDefinitions.get(id)\n if (definition === undefined) {\n definition = {\n id,\n name,\n file: provider.library,\n line: 0,\n column: 0,\n async: true,\n clientCall: provider.key,\n }\n clientCallDefinitions.set(id, definition)\n }\n return definition\n}\n\nfunction invokeClientCall(\n provider: ClientCallProvider,\n receiver: unknown,\n args: unknown[],\n): unknown {\n const target = receiver as ClientCallReceiver\n if (\n !__bitfabAutoTraceActive() ||\n isStreamingRequest(args[0]) ||\n !provider.matchesReceiver(receiver) ||\n frameworkRecordsClientCall()\n ) {\n return target.create(...args)\n }\n return invokeRecordedClientCall(\n clientCallDefinition(provider, receiver),\n args,\n () => target.create(...args),\n )\n}\n\n/**\n * Call `receiver.create(...args)` from a `.chat.completions.create(...)` call\n * site rewritten by the build transform. Beneath an automatic trace root, when\n * the client's base URL is `openrouter.ai` and the request does not stream,\n * the call is recorded as one `llm` span with the prompt, model, token usage,\n * and the cost OpenRouter reports, and the client's own returned value is\n * handed back unchanged. Otherwise it is a plain method call.\n *\n * This helper is internal transform/runtime protocol, not a supported\n * application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoOpenRouter(\n receiver: unknown,\n ...args: unknown[]\n): unknown {\n return invokeClientCall(OPENROUTER, receiver, args)\n}\n\n/**\n * Call `receiver.create(...args)` from a `.messages.create(...)` call site\n * rewritten by the build transform. Beneath an automatic trace root, when the\n * receiver belongs to an `@anthropic-ai/sdk` client and the request does not\n * stream, the call is recorded as one `llm` span with the prompt, model, and\n * token usage, and the client's own returned value is handed back unchanged.\n * Otherwise it is a plain method call.\n *\n * This helper is internal transform/runtime protocol, not a supported\n * application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoAnthropic(\n receiver: unknown,\n ...args: unknown[]\n): unknown {\n return invokeClientCall(ANTHROPIC, receiver, args)\n}\n\n/**\n * Call `receiver.create(...args)` from a `.responses.create(...)` call site\n * rewritten by the build transform. Beneath an automatic trace root, when the\n * receiver belongs to an `openai` client and the request does not stream, the\n * call is recorded as one `llm` span with the prompt, model, and token usage,\n * and the client's own returned value is handed back unchanged. Otherwise it\n * is a plain method call.\n *\n * This helper is internal transform/runtime protocol, not a supported\n * application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoOpenAIResponses(\n receiver: unknown,\n ...args: unknown[]\n): unknown {\n return invokeClientCall(OPENAI_RESPONSES, receiver, args)\n}\n\n/**\n * Preserve a function's original call arguments for transform cases where\n * parameter bindings discard them, such as destructured arrow parameters.\n *\n * This helper is internal transform/runtime protocol. The proxy preserves the\n * target's callability, arity, async identity, and non-constructibility while\n * only allocating a trace closure beneath an active automatic trace root.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoWrap<T extends (...args: never[]) => unknown>(\n definition: AutoTraceFunctionDefinition,\n fn: T,\n): T {\n noteTransformedModule()\n if (fn.name === \"\") {\n const nameParts = definition.name.split(\".\")\n const inferredName = nameParts[nameParts.length - 1]\n if (inferredName !== undefined) {\n Object.defineProperty(fn, \"name\", {\n configurable: true,\n value: inferredName,\n })\n }\n }\n\n const target = fn as unknown as (...args: unknown[]) => unknown\n return new Proxy(target, {\n apply(callTarget, thisArg, args) {\n if (!__bitfabAutoTraceActive()) {\n return Reflect.apply(callTarget, thisArg, args)\n }\n return __bitfabAutoSpan(definition, args, () =>\n Reflect.apply(callTarget, thisArg, args),\n )\n },\n }) as unknown as T\n}\n\n/**\n * Return whether the current call is inside an automatic trace root.\n *\n * Build transforms use this before allocating function metadata, captured\n * inputs, or an invocation closure. It is internal transform/runtime protocol,\n * not a supported application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoTraceActive(): boolean {\n if (autoTraceState.activeRoots === 0 || isCaptureSuppressed()) {\n return false\n }\n return currentAutoTraceEntries().length > 0\n}\n\nfunction currentAutoTraceScope(): AutoTraceScope | undefined {\n initializeAutoTraceStorage()\n return autoTraceState.storage?.getStore() ?? autoTraceState.browserScope\n}\n\nexport function _resetAutoTraceTransformDetection(): void {\n autoTraceGlobal.__bitfab_auto_trace_transformed_v1__ = undefined\n}\n"],"mappings":"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"}
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_autoTrace = require("./autoTrace-DUmR1KJ8.cjs");
5
+ const require_autoTrace = require("./autoTrace-DPWV1Xzr.cjs");
6
6
  exports.__bitfabAutoAnthropic = require_autoTrace.__bitfabAutoAnthropic;
7
7
  exports.__bitfabAutoJev = require_autoTrace.__bitfabAutoJev;
8
8
  exports.__bitfabAutoOpenAIResponses = require_autoTrace.__bitfabAutoOpenAIResponses;
@@ -17,5 +17,6 @@ exports.invokeAsDiscoveredCall = require_autoTrace.invokeAsDiscoveredCall;
17
17
  exports.invokeThroughAutoTraceEntries = require_autoTrace.invokeThroughAutoTraceEntries;
18
18
  exports.runAsAutoTraceRootFunction = require_autoTrace.runAsAutoTraceRootFunction;
19
19
  exports.runWithAutoTraceEntry = require_autoTrace.runWithAutoTraceEntry;
20
+ exports.runWithAutoTraceFramesAt = require_autoTrace.runWithAutoTraceFramesAt;
20
21
  exports.runWithAutoTraceNodeConfiguration = require_autoTrace.runWithAutoTraceNodeConfiguration;
21
22
  exports.runWithAutoTraceRootContext = require_autoTrace.runWithAutoTraceRootContext;
@@ -47,6 +47,13 @@ export declare function currentAutoTraceEntries(): readonly AutoTraceEntry[];
47
47
  export declare function runWithAutoTraceEntry<T>(previous: AutoTraceEntry, updated: AutoTraceEntry, fn: () => T): T;
48
48
  export declare function clearAutoTraceNodeConfiguration<T>(fn: () => T): T;
49
49
  export declare function runWithAutoTraceNodeConfiguration<T>(nodeConfiguration: AutoTraceNodeConfiguration, fn: () => T): T;
50
+ /**
51
+ * Run `fn` with every active auto-trace frame re-based onto `spanStack`, so a
52
+ * call the build transform discovers inside a framework integration's span
53
+ * attaches under that span rather than under the nearest discovered call.
54
+ * @internal
55
+ */
56
+ export declare function runWithAutoTraceFramesAt<T>(spanStack: unknown, fn: () => T): T;
50
57
  export declare function runAsAutoTraceRootFunction<T>(functionName: string, fn: () => T): T;
51
58
  export declare function runWithAutoTraceRootContext<T>(context: AutoTraceContext, spanStack: unknown, fn: () => T): T;
52
59
  export declare function invokeThroughAutoTraceEntries<T>(entries: readonly AutoTraceEntry[], step: (entry: AutoTraceEntry, next: () => T) => T, fn: () => T): T;
@@ -47,6 +47,13 @@ export declare function currentAutoTraceEntries(): readonly AutoTraceEntry[];
47
47
  export declare function runWithAutoTraceEntry<T>(previous: AutoTraceEntry, updated: AutoTraceEntry, fn: () => T): T;
48
48
  export declare function clearAutoTraceNodeConfiguration<T>(fn: () => T): T;
49
49
  export declare function runWithAutoTraceNodeConfiguration<T>(nodeConfiguration: AutoTraceNodeConfiguration, fn: () => T): T;
50
+ /**
51
+ * Run `fn` with every active auto-trace frame re-based onto `spanStack`, so a
52
+ * call the build transform discovers inside a framework integration's span
53
+ * attaches under that span rather than under the nearest discovered call.
54
+ * @internal
55
+ */
56
+ export declare function runWithAutoTraceFramesAt<T>(spanStack: unknown, fn: () => T): T;
50
57
  export declare function runAsAutoTraceRootFunction<T>(functionName: string, fn: () => T): T;
51
58
  export declare function runWithAutoTraceRootContext<T>(context: AutoTraceContext, spanStack: unknown, fn: () => T): T;
52
59
  export declare function invokeThroughAutoTraceEntries<T>(entries: readonly AutoTraceEntry[], step: (entry: AutoTraceEntry, next: () => T) => T, fn: () => T): T;
package/dist/autoTrace.js CHANGED
@@ -1 +1 @@
1
- export { t as __bitfabAutoAnthropic, n as __bitfabAutoJev, r as __bitfabAutoOpenAIResponses, i as __bitfabAutoOpenRouter, a as __bitfabAutoSpan, o as __bitfabAutoTraceActive, s as __bitfabAutoWrap, c as _resetAutoTraceTransformDetection, l as clearAutoTraceNodeConfiguration, u as currentAutoTraceEntries, d as invokeAsDiscoveredCall, f as invokeThroughAutoTraceEntries, p as runAsAutoTraceRootFunction, m as runWithAutoTraceEntry, h as runWithAutoTraceNodeConfiguration, g as runWithAutoTraceRootContext } from "./autoTrace-DVnpnuMb.js";
1
+ export { t as __bitfabAutoAnthropic, n as __bitfabAutoJev, r as __bitfabAutoOpenAIResponses, i as __bitfabAutoOpenRouter, a as __bitfabAutoSpan, o as __bitfabAutoTraceActive, s as __bitfabAutoWrap, c as _resetAutoTraceTransformDetection, l as clearAutoTraceNodeConfiguration, u as currentAutoTraceEntries, d as invokeAsDiscoveredCall, f as invokeThroughAutoTraceEntries, p as runAsAutoTraceRootFunction, m as runWithAutoTraceEntry, h as runWithAutoTraceFramesAt, g as runWithAutoTraceNodeConfiguration, _ as runWithAutoTraceRootContext } from "./autoTrace-kHOBg49M.js";
@@ -1,11 +1,11 @@
1
1
  const require_bamlPeer = require("./bamlPeer-5Ohpq8q9.cjs");
2
- const require_autoTrace = require("./autoTrace-DUmR1KJ8.cjs");
2
+ const require_autoTrace = require("./autoTrace-DPWV1Xzr.cjs");
3
3
  let _opentelemetry_api = require("@opentelemetry/api");
4
4
  let _opentelemetry_core = require("@opentelemetry/core");
5
5
  let _opentelemetry_resources = require("@opentelemetry/resources");
6
6
  let _opentelemetry_sdk_trace = require("@opentelemetry/sdk-trace");
7
7
  //#region src/version.generated.ts
8
- const __version__ = "0.68.8";
8
+ const __version__ = "0.68.9";
9
9
  const __packageName__ = "bitfab";
10
10
  //#endregion
11
11
  //#region src/traceCompletion.ts
@@ -634,14 +634,16 @@ const SPAN_INSTRUMENTATIONS = [
634
634
  "langgraph",
635
635
  "claude-agent-sdk",
636
636
  "vercel-ai",
637
- "rivet"
637
+ "rivet",
638
+ "pi"
638
639
  ];
639
640
  const FRAMEWORK_INSTRUMENTATION_SET = /* @__PURE__ */ new Set([
640
641
  "openai-agents",
641
642
  "langgraph",
642
643
  "claude-agent-sdk",
643
644
  "vercel-ai",
644
- "rivet"
645
+ "rivet",
646
+ "pi"
645
647
  ]);
646
648
  function isFrameworkInstrumentation(value) {
647
649
  return typeof value === "string" && FRAMEWORK_INSTRUMENTATION_SET.has(value);
@@ -2189,6 +2191,12 @@ Object.defineProperty(exports, "MAX_COMPRESSIBLE_SPAN_CARRIER_BYTES", {
2189
2191
  return MAX_COMPRESSIBLE_SPAN_CARRIER_BYTES;
2190
2192
  }
2191
2193
  });
2194
+ Object.defineProperty(exports, "MAX_SPAN_CARRIER_BYTES", {
2195
+ enumerable: true,
2196
+ get: function() {
2197
+ return MAX_SPAN_CARRIER_BYTES;
2198
+ }
2199
+ });
2192
2200
  Object.defineProperty(exports, "MixedTracingError", {
2193
2201
  enumerable: true,
2194
2202
  get: function() {
@@ -2304,4 +2312,4 @@ Object.defineProperty(exports, "unrefTimer", {
2304
2312
  }
2305
2313
  });
2306
2314
 
2307
- //# sourceMappingURL=http-CqYiYU9P.cjs.map
2315
+ //# sourceMappingURL=http-BB9wDcLm.cjs.map