bitfab 0.68.4 → 0.68.6

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.
Files changed (68) hide show
  1. package/dist/{autoTrace-D3-OZcmR.cjs → autoTrace-DUmR1KJ8.cjs} +417 -62
  2. package/dist/autoTrace-DUmR1KJ8.cjs.map +1 -0
  3. package/dist/{autoTrace-ghnojSj9.js → autoTrace-DVnpnuMb.js} +322 -57
  4. package/dist/autoTrace-DVnpnuMb.js.map +1 -0
  5. package/dist/autoTrace.cjs +3 -1
  6. package/dist/autoTrace.d.cts +29 -1
  7. package/dist/autoTrace.d.ts +29 -1
  8. package/dist/autoTrace.js +1 -1
  9. package/dist/{babelPlugin-0uOq-j1Q.cjs → babelPlugin-C0Im6AZ2.cjs} +37 -14
  10. package/dist/babelPlugin-C0Im6AZ2.cjs.map +1 -0
  11. package/dist/{babelPlugin-Muq0uuuu.js → babelPlugin-hS2Hb2vt.js} +37 -14
  12. package/dist/babelPlugin-hS2Hb2vt.js.map +1 -0
  13. package/dist/baml.cjs +1 -1
  14. package/dist/baml.js +1 -1
  15. package/dist/{bamlPeer-BUoZgNxZ.cjs → bamlPeer-5Ohpq8q9.cjs} +3 -17
  16. package/dist/bamlPeer-5Ohpq8q9.cjs.map +1 -0
  17. package/dist/{bamlPeer-CIVwS68E.js → bamlPeer-Dyeb3e5o.js} +3 -11
  18. package/dist/bamlPeer-Dyeb3e5o.js.map +1 -0
  19. package/dist/{http-C-HrwUb8.cjs → http-CARmid5D.cjs} +4 -4
  20. package/dist/{http-C-HrwUb8.cjs.map → http-CARmid5D.cjs.map} +1 -1
  21. package/dist/{http-BGY4ULH5.js → http-CYIjoMdj.js} +3 -3
  22. package/dist/{http-BGY4ULH5.js.map → http-CYIjoMdj.js.map} +1 -1
  23. package/dist/{index-BcGxu85i.d.cts → index-BuP59-AI.d.cts} +189 -4
  24. package/dist/{index-BcGxu85i.d.ts → index-BuP59-AI.d.ts} +189 -4
  25. package/dist/index.cjs +2 -2
  26. package/dist/index.d.cts +2 -2
  27. package/dist/index.d.ts +2 -2
  28. package/dist/index.js +2 -2
  29. package/dist/node.cjs +3 -3
  30. package/dist/node.d.cts +2 -2
  31. package/dist/node.d.ts +2 -2
  32. package/dist/node.js +3 -3
  33. package/dist/optionalPeer-CUH756lt.cjs +17 -0
  34. package/dist/optionalPeer-CUH756lt.cjs.map +1 -0
  35. package/dist/optionalPeer-CczrzrXx.js +12 -0
  36. package/dist/optionalPeer-CczrzrXx.js.map +1 -0
  37. package/dist/{registryCommand-Dk4Y1ZgW.js → registryCommand-D7bfo0Au.js} +179 -8
  38. package/dist/registryCommand-D7bfo0Au.js.map +1 -0
  39. package/dist/replayCli.js +1 -1
  40. package/dist/seedCli.js +1 -1
  41. package/dist/{src-BG2_8Fpf.cjs → src-C3H1v_hp.cjs} +62 -81
  42. package/dist/src-C3H1v_hp.cjs.map +1 -0
  43. package/dist/{src-Cmfs_7Ib.js → src-DgeGOhjN.js} +51 -70
  44. package/dist/src-DgeGOhjN.js.map +1 -0
  45. package/dist/transform/babel.cjs +1 -1
  46. package/dist/transform/babel.js +1 -1
  47. package/dist/transform/loaderRuntime.cjs +2 -2
  48. package/dist/transform/loaderRuntime.js +2 -2
  49. package/dist/transform/nodeLoader.js +36 -13
  50. package/dist/transform/nodeLoader.js.map +1 -1
  51. package/dist/transform/swc.cjs +1 -1
  52. package/dist/transform/swc.js +1 -1
  53. package/dist/transform/unplugin.cjs +2 -2
  54. package/dist/transform/unplugin.js +2 -2
  55. package/dist/{transform-CAJyLLe2.js → transform-BL1fJW-C.js} +2 -2
  56. package/dist/{transform-CAJyLLe2.js.map → transform-BL1fJW-C.js.map} +1 -1
  57. package/dist/{transform-ClCOpCZ2.cjs → transform-C4H7TKW-.cjs} +2 -2
  58. package/dist/{transform-ClCOpCZ2.cjs.map → transform-C4H7TKW-.cjs.map} +1 -1
  59. package/package.json +1 -1
  60. package/dist/autoTrace-D3-OZcmR.cjs.map +0 -1
  61. package/dist/autoTrace-ghnojSj9.js.map +0 -1
  62. package/dist/babelPlugin-0uOq-j1Q.cjs.map +0 -1
  63. package/dist/babelPlugin-Muq0uuuu.js.map +0 -1
  64. package/dist/bamlPeer-BUoZgNxZ.cjs.map +0 -1
  65. package/dist/bamlPeer-CIVwS68E.js.map +0 -1
  66. package/dist/registryCommand-Dk4Y1ZgW.js.map +0 -1
  67. package/dist/src-BG2_8Fpf.cjs.map +0 -1
  68. package/dist/src-Cmfs_7Ib.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoTrace-DUmR1KJ8.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\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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"}
@@ -1,3 +1,4 @@
1
+ import { t as importOptionalPeer } from "./optionalPeer-CczrzrXx.js";
1
2
  //#region src/asyncStorage.ts
2
3
  let AsyncLocalStorageClass = null;
3
4
  let initDone = false;
@@ -61,11 +62,150 @@ function writeOnce(key, line, write = console.warn) {
61
62
  } catch {}
62
63
  }
63
64
  //#endregion
64
- //#region src/openrouter.ts
65
- const OPENROUTER_PROVIDER = "openrouter";
65
+ //#region src/langchainRunScope.ts
66
+ const RUN_SCOPE_STORAGE_SYMBOL = Symbol.for("bitfab.langchainRunScopeStorage");
67
+ const SCOPED_GENERATE_SYMBOL = Symbol.for("bitfab.langchainScopedGenerate");
68
+ const UNSCOPED_RUNS_SYMBOL = Symbol.for("bitfab.langchainUnscopedRuns");
69
+ const MODEL_CLASSES = [{
70
+ specifierParts: [
71
+ "@langchain",
72
+ "core",
73
+ "language_models",
74
+ "chat_models"
75
+ ],
76
+ name: "BaseChatModel"
77
+ }, {
78
+ specifierParts: [
79
+ "@langchain",
80
+ "core",
81
+ "language_models",
82
+ "llms"
83
+ ],
84
+ name: "BaseLLM"
85
+ }];
86
+ let runScopeStorage = null;
87
+ let installation = null;
88
+ function storage() {
89
+ if (runScopeStorage) return runScopeStorage;
90
+ const shared = globalThis;
91
+ const existing = shared[RUN_SCOPE_STORAGE_SYMBOL];
92
+ runScopeStorage = existing ?? createAsyncLocalStorage();
93
+ if (runScopeStorage && !existing) shared[RUN_SCOPE_STORAGE_SYMBOL] = runScopeStorage;
94
+ return runScopeStorage;
95
+ }
96
+ function unscopedRuns() {
97
+ const shared = globalThis;
98
+ const existing = shared[UNSCOPED_RUNS_SYMBOL];
99
+ if (existing) return existing;
100
+ const created = /* @__PURE__ */ new Set();
101
+ shared[UNSCOPED_RUNS_SYMBOL] = created;
102
+ return created;
103
+ }
104
+ function scopeGenerate(prototype) {
105
+ const original = prototype.generate;
106
+ if (typeof original !== "function" || original[SCOPED_GENERATE_SYMBOL]) return;
107
+ const scoped = function(...args) {
108
+ const runStorage = storage();
109
+ if (!runStorage) return original.apply(this, args);
110
+ return runStorage.run({ recordedByHandler: false }, () => original.apply(this, args));
111
+ };
112
+ scoped[SCOPED_GENERATE_SYMBOL] = true;
113
+ prototype.generate = scoped;
114
+ }
115
+ async function scopeModelClass(specifierParts, name) {
116
+ try {
117
+ const modelClass = (await importOptionalPeer(specifierParts))[name];
118
+ if (modelClass?.prototype) scopeGenerate(modelClass.prototype);
119
+ } catch {}
120
+ }
121
+ function installLangChainRunScopes() {
122
+ installation ?? (installation = Promise.all(MODEL_CLASSES.map(({ specifierParts, name }) => scopeModelClass(specifierParts, name))).then(() => void 0));
123
+ return installation;
124
+ }
125
+ function markLangChainRunRecorded(runId) {
126
+ const scope = storage()?.getStore();
127
+ if (scope) {
128
+ scope.recordedByHandler = true;
129
+ return;
130
+ }
131
+ unscopedRuns().add(runId);
132
+ }
133
+ function forgetLangChainRun(runId) {
134
+ unscopedRuns().delete(runId);
135
+ }
136
+ function langChainHandlerRecordsCall() {
137
+ const scope = storage()?.getStore();
138
+ if (scope) return scope.recordedByHandler;
139
+ return unscopedRuns().size > 0;
140
+ }
141
+ //#endregion
142
+ //#region src/openaiAgentsSpanContext.ts
143
+ const OPENAI_AGENTS_CONTEXT_STORAGE = Symbol.for("openai.agents.core.asyncLocalStorage");
144
+ const MAX_OPENAI_AGENTS_SPAN_CHAIN = 64;
145
+ const MODEL_CALL_SPAN_TYPES = /* @__PURE__ */ new Set(["generation", "response"]);
146
+ const spanGlobal = globalThis;
147
+ const state = spanGlobal.__bitfabOpenAiAgentsSpansV1 ?? {
148
+ bitfabTraceIds: /* @__PURE__ */ new Map(),
149
+ endedSpanIds: /* @__PURE__ */ new Map()
150
+ };
151
+ spanGlobal.__bitfabOpenAiAgentsSpansV1 = state;
152
+ function mapOpenAiAgentsTrace(agentsTraceId, bitfabTraceId) {
153
+ state.bitfabTraceIds.set(agentsTraceId, bitfabTraceId);
154
+ }
155
+ function unmapOpenAiAgentsTrace(agentsTraceId) {
156
+ state.bitfabTraceIds.delete(agentsTraceId);
157
+ state.endedSpanIds.delete(agentsTraceId);
158
+ }
159
+ function endOpenAiAgentsSpan(agentsTraceId, spanId) {
160
+ if (!state.bitfabTraceIds.has(agentsTraceId)) return;
161
+ const ended = state.endedSpanIds.get(agentsTraceId) ?? /* @__PURE__ */ new Set();
162
+ ended.add(spanId);
163
+ state.endedSpanIds.set(agentsTraceId, ended);
164
+ }
165
+ function isOpenAiAgentsContextStorage(value) {
166
+ return value !== null && typeof value === "object" && typeof value.getStore === "function";
167
+ }
168
+ function currentOpenAiAgentsSpan() {
169
+ const storage = spanGlobal[OPENAI_AGENTS_CONTEXT_STORAGE];
170
+ if (!isOpenAiAgentsContextStorage(storage)) return;
171
+ try {
172
+ const store = storage.getStore();
173
+ return store?.active === true ? store.span ?? void 0 : void 0;
174
+ } catch {
175
+ return;
176
+ }
177
+ }
178
+ function currentOpenAiAgentsSpans() {
179
+ const spans = [];
180
+ let span = currentOpenAiAgentsSpan();
181
+ while (span !== void 0 && spans.length < MAX_OPENAI_AGENTS_SPAN_CHAIN) {
182
+ spans.push(span);
183
+ span = span.previousSpan ?? void 0;
184
+ }
185
+ return spans;
186
+ }
187
+ function openAiAgentsSpanChain() {
188
+ if (state.bitfabTraceIds.size === 0) return [];
189
+ return currentOpenAiAgentsSpans().map((span) => span.spanId).filter((spanId) => typeof spanId === "string");
190
+ }
191
+ function openAiAgentsParentSpanId(bitfabTraceId, enclosingSpanIds) {
192
+ if (state.bitfabTraceIds.size === 0) return;
193
+ for (const span of currentOpenAiAgentsSpans()) {
194
+ if (typeof span.spanId !== "string" || typeof span.traceId !== "string") return;
195
+ if (state.bitfabTraceIds.get(span.traceId) !== bitfabTraceId) return;
196
+ if (enclosingSpanIds?.includes(span.spanId)) return;
197
+ if (!state.endedSpanIds.get(span.traceId)?.has(span.spanId)) return span.spanId;
198
+ }
199
+ }
200
+ function openAiAgentsModelCallOpen() {
201
+ if (state.bitfabTraceIds.size === 0) return false;
202
+ return currentOpenAiAgentsSpans().some((span) => typeof span.traceId === "string" && typeof span.spanId === "string" && state.bitfabTraceIds.has(span.traceId) && MODEL_CALL_SPAN_TYPES.has(String(span.spanData?.type)) && !state.endedSpanIds.get(span.traceId)?.has(span.spanId));
203
+ }
204
+ //#endregion
205
+ //#region src/clientCalls.ts
66
206
  const OPENROUTER_HOSTNAME = "openrouter.ai";
67
- const OPENROUTER_WATCH_STORAGE_SYMBOL = Symbol.for("bitfab.openRouterWatchStorage");
68
- const completionsRecordedByAutoTrace = /* @__PURE__ */ new WeakSet();
207
+ const CLIENT_CALL_WATCH_STORAGE_SYMBOL = Symbol.for("bitfab.clientCallWatchStorage");
208
+ const responsesRecordedByAutoTrace = /* @__PURE__ */ new WeakSet();
69
209
  function isRecord(value) {
70
210
  return typeof value === "object" && value !== null;
71
211
  }
@@ -79,6 +219,49 @@ function numberField(value, name) {
79
219
  function nonEmptyString(value) {
80
220
  return typeof value === "string" && value !== "" ? value : void 0;
81
221
  }
222
+ function presentFields(base, values, durationMs) {
223
+ const context = { ...base };
224
+ for (const [key, value] of Object.entries(values)) if (value !== void 0) context[key] = value;
225
+ context.durationMs = durationMs;
226
+ return context;
227
+ }
228
+ function sumOfPresent(values) {
229
+ const present = values.filter((value) => value !== void 0);
230
+ return present.length > 0 ? present.reduce((total, value) => total + value, 0) : void 0;
231
+ }
232
+ function textOf(content) {
233
+ return typeof content === "string" ? content : JSON.stringify(content);
234
+ }
235
+ function roleEntries(items) {
236
+ return items.flatMap((item) => {
237
+ const role = field(item, "role");
238
+ if (typeof role !== "string") return [];
239
+ return [{
240
+ role,
241
+ content: textOf(field(item, "content"))
242
+ }];
243
+ });
244
+ }
245
+ function renderedPrompt(entries) {
246
+ return entries.length > 0 ? JSON.stringify(entries) : void 0;
247
+ }
248
+ function clientOf(receiver) {
249
+ try {
250
+ return field(receiver, "_client");
251
+ } catch {
252
+ return;
253
+ }
254
+ }
255
+ function clientClassStatic(receiver, name) {
256
+ const client = clientOf(receiver);
257
+ if (!isRecord(client)) return;
258
+ try {
259
+ const clientClass = client.constructor;
260
+ return typeof clientClass === "function" ? clientClass[name] : void 0;
261
+ } catch {
262
+ return;
263
+ }
264
+ }
82
265
  function isOpenRouterBaseUrl(baseUrl) {
83
266
  if (typeof baseUrl !== "string") return false;
84
267
  try {
@@ -90,35 +273,27 @@ function isOpenRouterBaseUrl(baseUrl) {
90
273
  }
91
274
  function isOpenRouterCompletions(receiver) {
92
275
  try {
93
- return isOpenRouterBaseUrl(field(field(receiver, "_client"), "baseURL"));
276
+ return isOpenRouterBaseUrl(field(clientOf(receiver), "baseURL"));
94
277
  } catch {
95
278
  return false;
96
279
  }
97
280
  }
281
+ function isAnthropicMessages(receiver) {
282
+ return typeof clientClassStatic(receiver, "HUMAN_PROMPT") === "string";
283
+ }
284
+ function isOpenAIResponses(receiver) {
285
+ return typeof clientClassStatic(receiver, "OpenAI") === "function";
286
+ }
98
287
  function isStreamingRequest(body) {
99
288
  return field(body, "stream") === true;
100
289
  }
101
- function isChatCompletion(value) {
102
- return isRecord(value) && Array.isArray(value.choices);
103
- }
104
290
  function openRouterPrompt(body) {
105
291
  const messages = field(body, "messages");
106
- if (!Array.isArray(messages)) return;
107
- const rendered = messages.flatMap((message) => {
108
- const role = field(message, "role");
109
- if (typeof role !== "string") return [];
110
- const content = field(message, "content");
111
- return [{
112
- role,
113
- content: typeof content === "string" ? content : JSON.stringify(content)
114
- }];
115
- });
116
- return rendered.length > 0 ? JSON.stringify(rendered) : void 0;
292
+ return Array.isArray(messages) ? renderedPrompt(roleEntries(messages)) : void 0;
117
293
  }
118
294
  function openRouterContext(body, response, durationMs) {
119
295
  const usage = field(response, "usage");
120
- const context = { provider: OPENROUTER_PROVIDER };
121
- const values = {
296
+ return presentFields({ provider: "openrouter" }, {
122
297
  model: nonEmptyString(field(response, "model")) ?? nonEmptyString(field(body, "model")),
123
298
  upstreamProvider: nonEmptyString(field(response, "provider")),
124
299
  inputTokens: numberField(usage, "prompt_tokens"),
@@ -126,28 +301,105 @@ function openRouterContext(body, response, durationMs) {
126
301
  cachedInputTokens: numberField(field(usage, "prompt_tokens_details"), "cached_tokens"),
127
302
  reasoningTokens: numberField(field(usage, "completion_tokens_details"), "reasoning_tokens"),
128
303
  costUsd: numberField(usage, "cost")
129
- };
130
- for (const [key, value] of Object.entries(values)) if (value !== void 0) context[key] = value;
131
- context.durationMs = durationMs;
132
- return context;
304
+ }, durationMs);
305
+ }
306
+ function anthropicPrompt(body) {
307
+ const system = field(body, "system");
308
+ const messages = field(body, "messages");
309
+ return renderedPrompt([...system === void 0 || system === null ? [] : [{
310
+ role: "system",
311
+ content: textOf(system)
312
+ }], ...Array.isArray(messages) ? roleEntries(messages) : []]);
133
313
  }
134
- function recordOpenRouterCompletion(span, body, response, durationMs) {
314
+ function anthropicContext(body, response, durationMs) {
315
+ const usage = field(response, "usage");
316
+ const cacheRead = numberField(usage, "cache_read_input_tokens");
317
+ return presentFields({ provider: "anthropic" }, {
318
+ model: nonEmptyString(field(response, "model")) ?? nonEmptyString(field(body, "model")),
319
+ inputTokens: sumOfPresent([
320
+ numberField(usage, "input_tokens"),
321
+ cacheRead,
322
+ numberField(usage, "cache_creation_input_tokens")
323
+ ]),
324
+ outputTokens: numberField(usage, "output_tokens"),
325
+ cachedInputTokens: cacheRead
326
+ }, durationMs);
327
+ }
328
+ function openAIResponsesPrompt(body) {
329
+ const instructions = field(body, "instructions");
330
+ const input = field(body, "input");
331
+ return renderedPrompt([
332
+ ...typeof instructions === "string" ? [{
333
+ role: "system",
334
+ content: instructions
335
+ }] : [],
336
+ ...typeof input === "string" ? [{
337
+ role: "user",
338
+ content: input
339
+ }] : [],
340
+ ...Array.isArray(input) ? roleEntries(input) : []
341
+ ]);
342
+ }
343
+ function openAIResponsesContext(body, response, durationMs) {
344
+ const usage = field(response, "usage");
345
+ return presentFields({ provider: "openai" }, {
346
+ model: nonEmptyString(field(response, "model")) ?? nonEmptyString(field(body, "model")),
347
+ inputTokens: numberField(usage, "input_tokens"),
348
+ outputTokens: numberField(usage, "output_tokens"),
349
+ cachedInputTokens: numberField(field(usage, "input_tokens_details"), "cached_tokens"),
350
+ reasoningTokens: numberField(field(usage, "output_tokens_details"), "reasoning_tokens"),
351
+ costUsd: numberField(usage, "cost")
352
+ }, durationMs);
353
+ }
354
+ const OPENROUTER = {
355
+ key: "openrouter",
356
+ library: "openai",
357
+ matchesReceiver: isOpenRouterCompletions,
358
+ isResponse: (response) => isRecord(response) && Array.isArray(response.choices),
359
+ prompt: openRouterPrompt,
360
+ context: openRouterContext
361
+ };
362
+ const ANTHROPIC = {
363
+ key: "anthropic",
364
+ library: "@anthropic-ai/sdk",
365
+ matchesReceiver: isAnthropicMessages,
366
+ isResponse: (response) => field(response, "type") === "message" && Array.isArray(field(response, "content")),
367
+ prompt: anthropicPrompt,
368
+ context: anthropicContext
369
+ };
370
+ const OPENAI_RESPONSES = {
371
+ key: "openai-responses",
372
+ library: "openai",
373
+ matchesReceiver: isOpenAIResponses,
374
+ isResponse: (response) => field(response, "object") === "response",
375
+ prompt: openAIResponsesPrompt,
376
+ context: openAIResponsesContext
377
+ };
378
+ const CLIENT_CALL_PROVIDERS = new Map([
379
+ OPENROUTER,
380
+ ANTHROPIC,
381
+ OPENAI_RESPONSES
382
+ ].map((provider) => [provider.key, provider]));
383
+ function clientCallProvider(key) {
384
+ return key === void 0 ? void 0 : CLIENT_CALL_PROVIDERS.get(key);
385
+ }
386
+ function recordClientCall(provider, span, body, response, durationMs) {
135
387
  try {
136
- const prompt = openRouterPrompt(body);
388
+ const prompt = provider.prompt(body);
137
389
  if (prompt !== void 0) span.setPrompt(prompt);
138
- span.addContext(openRouterContext(body, response, durationMs));
390
+ span.addContext(provider.context(body, response, durationMs));
139
391
  } catch {}
140
392
  }
141
- let openRouterWatchStorage = null;
393
+ let clientCallWatchStorage = null;
142
394
  function watchStorage() {
143
- if (openRouterWatchStorage) return openRouterWatchStorage;
395
+ if (clientCallWatchStorage) return clientCallWatchStorage;
144
396
  const shared = globalThis;
145
- const existing = shared[OPENROUTER_WATCH_STORAGE_SYMBOL];
146
- openRouterWatchStorage = existing ?? createAsyncLocalStorage();
147
- if (openRouterWatchStorage && !existing) shared[OPENROUTER_WATCH_STORAGE_SYMBOL] = openRouterWatchStorage;
148
- return openRouterWatchStorage;
397
+ const existing = shared[CLIENT_CALL_WATCH_STORAGE_SYMBOL];
398
+ clientCallWatchStorage = existing ?? createAsyncLocalStorage();
399
+ if (clientCallWatchStorage && !existing) shared[CLIENT_CALL_WATCH_STORAGE_SYMBOL] = clientCallWatchStorage;
400
+ return clientCallWatchStorage;
149
401
  }
150
- function watchOpenRouterUsage(fn) {
402
+ function watchClientCall(fn) {
151
403
  const storage = watchStorage();
152
404
  const watch = {
153
405
  recorded: false,
@@ -161,24 +413,27 @@ function watchOpenRouterUsage(fn) {
161
413
  function markEnclosingWatches(watch) {
162
414
  for (let current = watch.parent; current; current = current.parent) current.recorded = true;
163
415
  }
416
+ function frameworkRecordsClientCall() {
417
+ return langChainHandlerRecordsCall() || openAiAgentsModelCallOpen();
418
+ }
164
419
  function isRecordedByAutoTrace(response) {
165
- return isRecord(response) && completionsRecordedByAutoTrace.has(response);
420
+ return isRecord(response) && responsesRecordedByAutoTrace.has(response);
166
421
  }
167
- function recordWatchedOpenRouterCompletion(span, watch, body, response, durationMs) {
422
+ function recordWatchedClientCall(provider, span, watch, body, response, durationMs) {
168
423
  if (watch.recorded || isRecordedByAutoTrace(response)) {
169
424
  markEnclosingWatches(watch);
170
425
  return;
171
426
  }
172
- if (!isChatCompletion(response)) return;
173
- recordOpenRouterCompletion(span, body, response, durationMs);
174
- completionsRecordedByAutoTrace.add(response);
427
+ if (!provider.isResponse(response)) return;
428
+ recordClientCall(provider, span, body, response, durationMs);
429
+ responsesRecordedByAutoTrace.add(response);
175
430
  markEnclosingWatches(watch);
176
431
  }
177
- function recordAutoTracedOpenRouter(invokeFn, body, span) {
432
+ function recordAutoTracedClientCall(provider, invokeFn, body, span) {
178
433
  const startedAt = Date.now();
179
- const { watch, result } = watchOpenRouterUsage(invokeFn);
434
+ const { watch, result } = watchClientCall(invokeFn);
180
435
  const settle = (response) => {
181
- recordWatchedOpenRouterCompletion(span, watch, body, response, Date.now() - startedAt);
436
+ recordWatchedClientCall(provider, span, watch, body, response, Date.now() - startedAt);
182
437
  };
183
438
  if (result instanceof Promise) return result.then((response) => {
184
439
  settle(response);
@@ -439,30 +694,40 @@ function __bitfabAutoJev(receiver, ...args) {
439
694
  if (!__bitfabAutoTraceActive()) return target.systemOne(...args);
440
695
  return invokeRecordedClientCall(jevDefinition(receiver), args, () => target.systemOne(...args));
441
696
  }
442
- const OPENROUTER_METHOD = "create";
443
- const openRouterDefinitions = /* @__PURE__ */ new Map();
444
- function openRouterDefinition(receiver) {
697
+ const CLIENT_CALL_METHOD = "create";
698
+ const clientCallDefinitions = /* @__PURE__ */ new Map();
699
+ function clientCallDefinition(provider, receiver) {
445
700
  const className = receiverClassName(receiver);
446
- const name = className === void 0 ? OPENROUTER_METHOD : `${className}.${OPENROUTER_METHOD}`;
447
- let definition = openRouterDefinitions.get(name);
701
+ const name = className === void 0 ? CLIENT_CALL_METHOD : `${className}.${CLIENT_CALL_METHOD}`;
702
+ const id = `ts-auto-v1:${provider.key}#${name}`;
703
+ let definition = clientCallDefinitions.get(id);
448
704
  if (definition === void 0) {
449
705
  definition = {
450
- id: `ts-auto-v1:openrouter#${name}`,
706
+ id,
451
707
  name,
452
- file: "openai",
708
+ file: provider.library,
453
709
  line: 0,
454
710
  column: 0,
455
711
  async: true,
456
- openrouter: true
712
+ clientCall: provider.key
457
713
  };
458
- openRouterDefinitions.set(name, definition);
714
+ clientCallDefinitions.set(id, definition);
459
715
  }
460
716
  return definition;
461
717
  }
462
- function __bitfabAutoOpenRouter(receiver, ...args) {
718
+ function invokeClientCall(provider, receiver, args) {
463
719
  const target = receiver;
464
- if (!__bitfabAutoTraceActive() || isStreamingRequest(args[0]) || !isOpenRouterCompletions(receiver)) return target.create(...args);
465
- return invokeRecordedClientCall(openRouterDefinition(receiver), args, () => target.create(...args));
720
+ if (!__bitfabAutoTraceActive() || isStreamingRequest(args[0]) || !provider.matchesReceiver(receiver) || frameworkRecordsClientCall()) return target.create(...args);
721
+ return invokeRecordedClientCall(clientCallDefinition(provider, receiver), args, () => target.create(...args));
722
+ }
723
+ function __bitfabAutoOpenRouter(receiver, ...args) {
724
+ return invokeClientCall(OPENROUTER, receiver, args);
725
+ }
726
+ function __bitfabAutoAnthropic(receiver, ...args) {
727
+ return invokeClientCall(ANTHROPIC, receiver, args);
728
+ }
729
+ function __bitfabAutoOpenAIResponses(receiver, ...args) {
730
+ return invokeClientCall(OPENAI_RESPONSES, receiver, args);
466
731
  }
467
732
  function __bitfabAutoWrap(definition, fn) {
468
733
  noteTransformedModule();
@@ -491,6 +756,6 @@ function _resetAutoTraceTransformDetection() {
491
756
  autoTraceGlobal.__bitfab_auto_trace_transformed_v1__ = void 0;
492
757
  }
493
758
  //#endregion
494
- export { assertAsyncStorageRegistered as C, registerAsyncLocalStorageClass as D, isAsyncStorageInitDone as E, runWithCaptureSuppressed as S, createAsyncLocalStorage as T, watchOpenRouterUsage as _, __bitfabAutoWrap as a, writeOnce as b, currentAutoTraceEntries as c, runAsAutoTraceRootFunction as d, runWithAutoTraceEntry as f, recordWatchedOpenRouterCompletion as g, recordAutoTracedOpenRouter as h, __bitfabAutoTraceActive as i, invokeAsDiscoveredCall as l, runWithAutoTraceRootContext as m, __bitfabAutoOpenRouter as n, _resetAutoTraceTransformDetection as o, runWithAutoTraceNodeConfiguration as p, __bitfabAutoSpan as r, clearAutoTraceNodeConfiguration as s, __bitfabAutoJev as t, invokeThroughAutoTraceEntries as u, warn as v, asyncStorageReady as w, isCaptureSuppressed as x, warnOnce as y };
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 };
495
760
 
496
- //# sourceMappingURL=autoTrace-ghnojSj9.js.map
761
+ //# sourceMappingURL=autoTrace-DVnpnuMb.js.map