langwatch 1.20.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/agent/index.js +19 -2
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/index.mjs +19 -2
- package/dist/agent/index.mjs.map +1 -1
- package/dist/{chunk-ET5KYCG2.mjs → chunk-2GKEMCKT.mjs} +1 -1
- package/dist/chunk-2GKEMCKT.mjs.map +1 -0
- package/dist/{chunk-BDQ2RG7R.mjs → chunk-AYPQNLCC.mjs} +2 -2
- package/dist/{chunk-EQ5CFQGJ.js → chunk-DLZCOUXC.js} +12 -12
- package/dist/{chunk-EQ5CFQGJ.js.map → chunk-DLZCOUXC.js.map} +1 -1
- package/dist/{chunk-5ZNEXSAB.js → chunk-F7BVJW3S.js} +1 -1
- package/dist/chunk-F7BVJW3S.js.map +1 -0
- package/dist/{chunk-FKYYEGJ7.mjs → chunk-M3DSPR5S.mjs} +6 -2
- package/dist/chunk-M3DSPR5S.mjs.map +1 -0
- package/dist/{chunk-HCK7TCSK.js → chunk-MAO3SIBB.js} +7 -3
- package/dist/chunk-MAO3SIBB.js.map +1 -0
- package/dist/cli/bundle.js +523 -505
- package/dist/{implementation-B4Z2ksnA.d.mts → implementation-BXVPzwOt.d.mts} +1 -1
- package/dist/{implementation-BFUgzz5C.d.ts → implementation-DJ-JveZl.d.ts} +1 -1
- package/dist/index.d.mts +84 -10
- package/dist/index.d.ts +84 -10
- package/dist/index.js +979 -632
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +907 -560
- package/dist/index.mjs.map +1 -1
- package/dist/observability-sdk/index.d.mts +3 -3
- package/dist/observability-sdk/index.d.ts +3 -3
- package/dist/observability-sdk/index.js +4 -4
- package/dist/observability-sdk/index.js.map +1 -1
- package/dist/observability-sdk/index.mjs +8 -8
- package/dist/observability-sdk/instrumentation/langchain/index.d.mts +1 -1
- package/dist/observability-sdk/instrumentation/langchain/index.d.ts +1 -1
- package/dist/observability-sdk/instrumentation/langchain/index.js +4 -4
- package/dist/observability-sdk/instrumentation/langchain/index.mjs +1 -1
- package/dist/observability-sdk/setup/node/index.js +3 -3
- package/dist/observability-sdk/setup/node/index.mjs +2 -2
- package/dist/{types-B696jWYQ.d.mts → types--ExXvd26.d.mts} +911 -338
- package/dist/{types-Bo6OvFct.d.ts → types-CpT3iEIj.d.ts} +911 -338
- package/package.json +3 -4
- package/dist/chunk-5ZNEXSAB.js.map +0 -1
- package/dist/chunk-ET5KYCG2.mjs.map +0 -1
- package/dist/chunk-FKYYEGJ7.mjs.map +0 -1
- package/dist/chunk-HCK7TCSK.js.map +0 -1
- /package/dist/{chunk-BDQ2RG7R.mjs.map → chunk-AYPQNLCC.mjs.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/observability-sdk/exporters/langwatch-trace-exporter.ts","../src/internal/api/auth.ts","../package.json","../src/internal/runtime.ts","../src/internal/constants.ts","../src/internal/otlp-compression.ts","../src/observability-sdk/exporters/trace-filters.ts","../src/observability-sdk/exporters/langwatch-logs-exporter.ts","../src/observability-sdk/logger/index.ts","../src/observability-sdk/logger/implementation.ts"],"sourcesContent":["import { type ExportResult } from \"@opentelemetry/core\";\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-proto\";\nimport { type CompressionAlgorithm } from \"@opentelemetry/otlp-exporter-base\";\nimport { type ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\n\nimport { buildAuthHeaders } from \"../../internal/api/auth\";\nimport {\n DEFAULT_ENDPOINT,\n LANGWATCH_SDK_LANGUAGE,\n LANGWATCH_SDK_NAME_OBSERVABILITY,\n LANGWATCH_SDK_RUNTIME,\n LANGWATCH_SDK_VERSION,\n TRACES_PATH,\n} from \"../../internal/constants\";\nimport { resolveOtlpCompression } from \"../../internal/otlp-compression\";\nimport { type TraceFilter, type Criteria, type Match, applyFilters } from \"./trace-filters\";\n\n/** Options: endpoint URL, API key for auth, and optional span filters (default excludes HTTP). */\nexport interface LangWatchTraceExporterOptions {\n endpoint?: string;\n apiKey?: string;\n /**\n * Project identifier. Required when `apiKey` is a Personal Access Token\n * (`pat-lw-*`); ignored for legacy `sk-lw-*` keys. Falls back to\n * `LANGWATCH_PROJECT_ID`.\n */\n projectId?: string;\n filters?: TraceFilter[] | null;\n /** Request compression: gzip unless an OTEL_EXPORTER_OTLP_*COMPRESSION env var is set. */\n compression?: CompressionAlgorithm;\n}\n\nexport type { TraceFilter, Criteria, Match };\n\n/** Sends traces to LangWatch with auth; applies span filters (default excludes HTTP). */\nexport class LangWatchTraceExporter extends OTLPTraceExporter {\n private readonly filters: TraceFilter[];\n /** Configures auth from opts or environment; applies filters to span stream. */\n constructor(opts?: LangWatchTraceExporterOptions) {\n const apiKey = opts?.apiKey ?? process.env.LANGWATCH_API_KEY ?? \"\";\n const projectId = opts?.projectId ?? process.env.LANGWATCH_PROJECT_ID;\n const endpoint = opts?.endpoint ?? process.env.LANGWATCH_ENDPOINT ?? DEFAULT_ENDPOINT;\n\n const url = new URL(TRACES_PATH, endpoint);\n const otelEndpoint = url.toString();\n\n super({\n headers: {\n \"x-langwatch-sdk-name\": LANGWATCH_SDK_NAME_OBSERVABILITY,\n \"x-langwatch-sdk-language\": LANGWATCH_SDK_LANGUAGE,\n \"x-langwatch-sdk-version\": LANGWATCH_SDK_VERSION,\n \"x-langwatch-sdk-runtime\": LANGWATCH_SDK_RUNTIME(),\n ...buildAuthHeaders({ apiKey, projectId }),\n },\n url: otelEndpoint.toString(),\n compression: resolveOtlpCompression({ compression: opts?.compression, signal: \"TRACES\" }),\n });\n\n // Handle filters: null or [] = no filtering, undefined = default, array = use provided\n if (opts?.filters === null || (Array.isArray(opts?.filters) && opts.filters.length === 0)) {\n this.filters = [];\n } else if (Array.isArray(opts?.filters)) {\n this.filters = opts.filters;\n } else {\n this.filters = [{ preset: \"excludeHttpRequests\" }];\n }\n }\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n const filtered = applyFilters(this.filters, spans);\n super.export(filtered, resultCallback);\n }\n}\n","/**\n * Authentication header assembly, two token families: legacy `sk-lw-`\n * project keys send `Bearer` + `X-Auth-Token`; user-scoped keys send\n * `Basic base64(projectId:token)` so the server can resolve the role binding.\n */\n\n/** Old PAT prefix — still accepted by the server for backward compat. */\nconst LEGACY_PAT_PREFIX = \"pat-lw-\";\n\n/** Unified API key prefix — also used by legacy project keys. */\nconst API_KEY_PREFIX = \"sk-lw-\";\n\nexport interface LangWatchAuthHeadersInput {\n /** API key token. May be empty; in that case no auth headers are emitted. */\n apiKey: string;\n /**\n * Project identifier. Required for user-scoped API keys to resolve scope;\n * optional for legacy project keys (the token already encodes project identity).\n * Falls back to `LANGWATCH_PROJECT_ID` when omitted.\n */\n projectId?: string;\n}\n\nexport type LangWatchAuthHeaders = Record<string, string>;\n\n/**\n * Whether the credential is a user-scoped API key (as opposed to a legacy project key): a\n * `pat-lw-` prefix, or a `sk-lw-` prefix with an underscore in the body (the new format).\n */\nexport const isUserScopedApiKey = (token: string): boolean => {\n if (token.startsWith(LEGACY_PAT_PREFIX)) return true;\n if (token.startsWith(API_KEY_PREFIX)) {\n const body = token.slice(API_KEY_PREFIX.length);\n return body.includes(\"_\");\n }\n return false;\n};\n\n/**\n * Builds the HTTP headers required to authenticate against the LangWatch\n * API using either a legacy project key or a user-scoped API key.\n */\nexport const buildAuthHeaders = ({\n apiKey,\n projectId,\n}: LangWatchAuthHeadersInput): LangWatchAuthHeaders => {\n if (!apiKey) return {};\n\n const resolvedProjectId = projectId ?? process.env.LANGWATCH_PROJECT_ID ?? undefined;\n\n if (isUserScopedApiKey(apiKey)) {\n if (resolvedProjectId) {\n // Basic Auth is the canonical carrier — the server extracts both\n // the project and the token from one header.\n const encoded = Buffer.from(`${resolvedProjectId}:${apiKey}`, \"utf-8\").toString(\"base64\");\n return { authorization: `Basic ${encoded}` };\n }\n\n // API key without a projectId: use Bearer and let the server reject\n // unresolvable requests.\n return {\n authorization: `Bearer ${apiKey}`,\n \"x-auth-token\": apiKey,\n };\n }\n\n // Legacy sk-lw-* project key: preserve the dual-header shape.\n return {\n authorization: `Bearer ${apiKey}`,\n \"x-auth-token\": apiKey,\n };\n};\n","{\n \"name\": \"langwatch\",\n \"version\": \"1.20.0\",\n \"description\": \"LangWatch TypeScript/JavaScript SDK. Interact with the full LangWatch API and use the LangWatch OpenTelemetry SDK to instrument your application. For more information, see https://docs.langwatch.ai/integration/typescript/guide\",\n \"license\": \"MIT\",\n \"author\": \"LangWatch\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/langwatch/langwatch.git\",\n \"directory\": \"typescript-sdk\"\n },\n \"bin\": {\n \"langwatch\": \"./dist/cli/index.js\",\n \"lw\": \"./dist/cli/index.js\"\n },\n \"files\": [\n \"dist\",\n \"!dist/bin\",\n \"!dist/cli/*.map\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n },\n \"./observability\": {\n \"types\": \"./dist/observability-sdk/index.d.ts\",\n \"require\": \"./dist/observability-sdk/index.js\",\n \"import\": \"./dist/observability-sdk/index.mjs\"\n },\n \"./observability/semconv\": {\n \"types\": \"./dist/observability-sdk/semconv/index.d.ts\",\n \"require\": \"./dist/observability-sdk/semconv/index.js\",\n \"import\": \"./dist/observability-sdk/semconv/index.mjs\"\n },\n \"./observability/node\": {\n \"types\": \"./dist/observability-sdk/setup/node/index.d.ts\",\n \"require\": \"./dist/observability-sdk/setup/node/index.js\",\n \"import\": \"./dist/observability-sdk/setup/node/index.mjs\"\n },\n \"./observability/instrumentation/langchain\": {\n \"types\": \"./dist/observability-sdk/instrumentation/langchain/index.d.ts\",\n \"require\": \"./dist/observability-sdk/instrumentation/langchain/index.js\",\n \"import\": \"./dist/observability-sdk/instrumentation/langchain/index.mjs\"\n },\n \"./agent\": {\n \"types\": \"./dist/agent/index.d.ts\",\n \"require\": \"./dist/agent/index.js\",\n \"import\": \"./dist/agent/index.mjs\"\n }\n },\n \"scripts\": {\n \"generate\": \"pnpm run generate:server-types\",\n \"cli\": \"node dist/cli/index.js\",\n \"prelint\": \"pnpm run generate\",\n \"lint\": \"eslint .\",\n \"pretest\": \"pnpm run generate\",\n \"test\": \"vitest run --exclude '**/*.integration.test.ts'\",\n \"test:e2e\": \"dotenv -- vitest run -c ./vitest.e2e.config.mts\",\n \"test:governance-e2e\": \"vitest run -c ./vitest.governance-e2e.config.mts\",\n \"test:seed\": \"dotenv -e .env.test -- pnpm -w run prisma:seed\",\n \"prebuild\": \"pnpm run generate\",\n \"build\": \"rm -rf dist && tsup\",\n \"postbuild\": \"node -e \\\"const{statSync}=require('node:fs'),{execFileSync}=require('node:child_process');const f='dist/cli/index.js',want=require('./package.json').version;const s=statSync(f);if(process.platform!=='win32'&&!(s.mode&0o111))throw new Error(f+' is not executable');const got=execFileSync(process.execPath,[f,'--version'],{encoding:'utf8',env:{...process.env,LANGWATCH_NO_DAEMON:'1'}}).trim();if(got!==want)throw new Error('version mismatch: '+f+' reports '+got+', package.json says '+want);console.log('postbuild: '+f+' ok ('+got+')')\\\"\",\n \"build:binary\": \"bun run scripts/build-cli-binary.ts\",\n \"tarball\": \"pnpm build && pnpm pack\",\n \"typecheck\": \"GOMAXPROCS=2 GOMEMLIMIT=2GiB pnpm -w exec tsc -b sdks/typescript\",\n \"prepublish\": \"pnpm run build\",\n \"generate:openapi-types\": \"node scripts/generate-openapi-types.mjs\",\n \"generate:server-types\": \"./copy-types.sh\"\n },\n \"dependencies\": {\n \"@opentelemetry/api-logs\": \"catalog:\",\n \"@opentelemetry/context-async-hooks\": \"catalog:\",\n \"@opentelemetry/core\": \"catalog:\",\n \"@opentelemetry/exporter-logs-otlp-proto\": \"catalog:\",\n \"@opentelemetry/exporter-trace-otlp-proto\": \"catalog:\",\n \"@opentelemetry/otlp-exporter-base\": \"catalog:\",\n \"@opentelemetry/resources\": \"catalog:\",\n \"@opentelemetry/sdk-logs\": \"catalog:\",\n \"@opentelemetry/sdk-trace-base\": \"catalog:\",\n \"@opentelemetry/sdk-trace-node\": \"catalog:\",\n \"liquidjs\": \"catalog:\",\n \"open\": \"^11.0.0\",\n \"openapi-fetch\": \"^0.17.0\",\n \"ws\": \"catalog:\",\n \"xksuid\": \"^0.0.4\",\n \"zod\": \"catalog:\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.32.0\",\n \"@langchain/core\": \">=0.3.68 <0.4.0\",\n \"@langchain/langgraph\": \">=0.4.0 <1.0.0\",\n \"@langchain/openai\": \">=0.6.0 <1.0.0\",\n \"@langwatch/e2e-stack\": \"workspace:*\",\n \"@langwatch/handled-error\": \"workspace:*\",\n \"@opentelemetry/api\": \"catalog:\",\n \"@opentelemetry/instrumentation\": \"catalog:\",\n \"@opentelemetry/sdk-metrics\": \"catalog:\",\n \"@opentelemetry/sdk-trace-web\": \"catalog:\",\n \"@types/debug\": \"catalog:\",\n \"@types/js-yaml\": \"catalog:\",\n \"@types/node\": \"catalog:\",\n \"@types/prompts\": \"catalog:\",\n \"@types/ws\": \"catalog:\",\n \"@typescript-eslint/parser\": \"^8.58.1\",\n \"@vercel/otel\": \"^1.13.0\",\n \"@vitest/coverage-v8\": \"^5.0.1\",\n \"chalk\": \"catalog:\",\n \"cloudflared\": \"0.7.1\",\n \"commander\": \"catalog:\",\n \"dotenv\": \"catalog:\",\n \"dotenv-cli\": \"^11.0.0\",\n \"esbuild\": \"catalog:\",\n \"eslint\": \"^9.32.0\",\n \"fets\": \"^0.8.5\",\n \"fishery\": \"^2.3.1\",\n \"js-yaml\": \"catalog:\",\n \"jsonc-parser\": \"^3.3.1\",\n \"langchain\": \">=0.3.0 <2.0.0\",\n \"msw\": \"^2.10.4\",\n \"nock\": \"^14.0.8\",\n \"openapi-msw\": \"^1.2.0\",\n \"openapi-typescript\": \"7.13.0\",\n \"ora\": \"catalog:\",\n \"prompts\": \"catalog:\",\n \"tsup\": \"catalog:\",\n \"typescript\": \"catalog:sdk-toolchain\",\n \"typescript-eslint\": \"catalog:\",\n \"vitest\": \"catalog:\",\n \"vitest-mock-extended\": \"^5.1.1\",\n \"yaml\": \"^2.8.1\"\n },\n \"peerDependencies\": {\n \"@ai-sdk/openai\": \">=2.0.0 <5.0.0\",\n \"@langchain/core\": \">=0.3.0 <2.0.0\",\n \"@langchain/langgraph\": \">=0.4.0 <2.0.0\",\n \"@langchain/openai\": \">=0.6.0 <2.0.0\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/context-zone\": \">=1.19.0 <3.0.0\",\n \"@opentelemetry/exporter-trace-otlp-grpc\": \">=0.221.0 <1.0.0\",\n \"@opentelemetry/instrumentation\": \">=0.200.0 <1.0.0\",\n \"@opentelemetry/sdk-metrics\": \">=2.0.0 <3.0.0\",\n \"@opentelemetry/sdk-trace-web\": \">=1.19.0 <3.0.0\",\n \"langchain\": \">=0.3.0 <2.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@ai-sdk/openai\": {\n \"optional\": true\n },\n \"@langchain/core\": {\n \"optional\": true\n },\n \"@langchain/langgraph\": {\n \"optional\": true\n },\n \"@langchain/openai\": {\n \"optional\": true\n },\n \"@opentelemetry/context-zone\": {\n \"optional\": true\n },\n \"@opentelemetry/exporter-trace-otlp-grpc\": {\n \"optional\": true\n },\n \"@opentelemetry/instrumentation\": {\n \"optional\": true\n },\n \"@opentelemetry/sdk-metrics\": {\n \"optional\": true\n },\n \"@opentelemetry/sdk-trace-web\": {\n \"optional\": true\n },\n \"langchain\": {\n \"optional\": true\n }\n },\n \"engines\": {\n \"node\": \"^22.23.4 || ^24.22.1 || >=26.12.1\",\n \"pnpm\": \">=8\"\n },\n \"nx\": {\n \"namedInputs\": {\n \"sdkBuild\": [\n \"default\",\n \"!{projectRoot}/**/*.test.ts\",\n \"!{projectRoot}/**/*.test.tsx\",\n \"!{projectRoot}/**/*.test.mts\",\n \"!{projectRoot}/vitest.config.*\",\n \"!{projectRoot}/vitest.integration.config.*\",\n \"!{projectRoot}/__tests__/**/*\"\n ],\n \"production\": [\n \"sdkBuild\",\n \"!{projectRoot}/src/cli/**/*\"\n ]\n }\n }\n}\n","export type JsRuntime = \"node\" | \"deno\" | \"bun\" | \"web\" | \"unknown\";\n\nlet _runtime: JsRuntime | undefined;\n\n/**\n * Gets the cached JavaScript runtime environment.\n * @returns The detected runtime environment\n */\nexport const getRuntime = (): JsRuntime => {\n _runtime ??= detectRuntime();\n return _runtime;\n};\n\n/**\n * Resets the cached runtime. Only used for testing.\n * @internal\n */\nexport const resetRuntimeCache = (): void => {\n _runtime = undefined;\n};\n\n/**\n * Detects the JavaScript runtime environment.\n * @param globals - (Test only) Override the global object for environment simulation;\n * only used if NODE_ENV === 'test'.\n */\nexport function detectRuntime(globals?: object): JsRuntime {\n let g: object = globalThis;\n if (globals) {\n if (process.env.NODE_ENV === \"test\") {\n g = globals;\n } else {\n console.warn(\n \"[LangWatch Observability] overriding detectRuntime is only supported when running in NODE_ENV=test\",\n );\n }\n }\n\n try {\n if (isDenoRuntime(g)) return \"deno\";\n if (isBunRuntime(g)) return \"bun\";\n if (isNodeRuntime(g)) return \"node\";\n if (isWebRuntime(g)) {\n return \"web\";\n }\n return \"unknown\";\n } catch (error) {\n console.warn(\"[LangWatch Observability] Failed to detect runtime\", error);\n return \"unknown\";\n }\n}\n\nfunction isWebRuntime(g: object): boolean {\n if (!(\"window\" in g) || typeof g.window !== \"object\" || !g.window) {\n return false;\n }\n const win: object = g.window;\n if (g !== win) return false;\n return \"document\" in win && typeof win.document !== \"undefined\";\n}\n\nfunction isDenoRuntime(g: object): boolean {\n if (!(\"Deno\" in g) || typeof g.Deno !== \"object\" || !g.Deno) {\n return false;\n }\n return \"version\" in g.Deno && typeof g.Deno.version === \"object\";\n}\n\nfunction isBunRuntime(g: object): boolean {\n if (!(\"Bun\" in g) || typeof g.Bun !== \"object\" || !g.Bun) {\n return false;\n }\n return \"version\" in g.Bun && typeof g.Bun.version === \"string\";\n}\n\nfunction isNodeRuntime(g: object): boolean {\n if (!(\"process\" in g) || typeof g.process !== \"object\" || !g.process) {\n return false;\n }\n const versions: unknown = \"versions\" in g.process ? g.process.versions : undefined;\n return (\n typeof versions === \"object\" &&\n versions !== null &&\n \"node\" in versions &&\n typeof versions.node === \"string\"\n );\n}\n","import { version } from \"../../package.json\";\nimport { getRuntime } from \"./runtime\";\n\nexport const LANGWATCH_SDK_RUNTIME = getRuntime;\n\nexport const LANGWATCH_SDK_NAME_OBSERVABILITY = \"langwatch-observability-sdk\";\nexport const LANGWATCH_SDK_NAME_CLIENT = \"langwatch-client-sdk\";\nexport const LANGWATCH_SDK_LANGUAGE = \"typescript\";\nexport const LANGWATCH_SDK_VERSION = version;\n\nexport const DEFAULT_ENDPOINT = \"https://app.langwatch.ai\";\nexport const DEFAULT_SERVICE_NAME = \"unknown-service.langwatch\";\n\nexport const TRACES_PATH = \"/api/otel/v1/traces\";\nexport const LOGS_PATH = \"/api/otel/v1/logs\";\nexport const METRICS_PATH = \"/api/otel/v1/metrics\";\n","import { CompressionAlgorithm } from \"@opentelemetry/otlp-exporter-base\";\n\n/**\n * The compression an OTLP exporter is built with: the caller's choice, else\n * the standard OTel env vars (left to the exporter), else gzip. Explicit\n * config beats env in OTel JS, so gzip is only set when neither is given.\n */\nexport function resolveOtlpCompression({\n compression,\n signal,\n}: {\n compression?: CompressionAlgorithm;\n signal: \"TRACES\" | \"LOGS\" | \"METRICS\";\n}): CompressionAlgorithm | undefined {\n if (compression !== undefined) return compression;\n const isSetInEnv = [\n \"OTEL_EXPORTER_OTLP_COMPRESSION\",\n `OTEL_EXPORTER_OTLP_${signal}_COMPRESSION`,\n ].some((name) => process.env[name]?.trim());\n return isSetInEnv ? undefined : CompressionAlgorithm.GZIP;\n}\n","import { type ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\n\nexport interface Criteria {\n instrumentationScopeName?: Match[];\n name?: Match[];\n}\n\nexport interface Match {\n equals?: string;\n startsWith?: string;\n matches?: RegExp;\n ignoreCase?: boolean;\n}\n\nexport type TraceFilter =\n | { preset: \"vercelAIOnly\" | \"excludeHttpRequests\" }\n | { include: Criteria }\n | { exclude: Criteria };\n\n/**\n * Applies filters to spans sequentially (AND semantics).\n * @param filters - Filter rules to apply in sequence\n * @param spans - Array of spans to filter\n */\nexport function applyFilters(\n filters: TraceFilter[] | undefined,\n spans: ReadableSpan[],\n): ReadableSpan[] {\n if (!filters || filters.length === 0) return spans;\n return filters.reduce((current, rule) => applyFilterRule(rule, current), spans);\n}\n\n/**\n * Applies a single filter rule (preset, include, or exclude).\n * @param rule - Filter rule to apply\n * @param spans - Array of spans to filter\n */\nexport function applyFilterRule(rule: TraceFilter, spans: ReadableSpan[]): ReadableSpan[] {\n if (\"preset\" in rule && rule.preset) {\n return applyPreset(rule.preset, spans);\n }\n\n if (\"include\" in rule && rule.include) {\n const criteria = (rule as { include: Criteria }).include;\n return spans.filter((s) => matchesCriteria(s, criteria));\n }\n\n if (\"exclude\" in rule && rule.exclude) {\n const criteria = (rule as { exclude: Criteria }).exclude;\n return spans.filter((s) => !matchesCriteria(s, criteria));\n }\n\n return spans;\n}\n\n/**\n * Applies a preset filter: vercelAIOnly or excludeHttpRequests.\n * @param preset - Preset filter name\n * @param spans - Array of spans to filter\n */\nexport function applyPreset(\n preset: \"vercelAIOnly\" | \"excludeHttpRequests\",\n spans: ReadableSpan[],\n): ReadableSpan[] {\n if (preset === \"vercelAIOnly\") return spans.filter((s) => isVercelAiSpan(s));\n if (preset === \"excludeHttpRequests\") return spans.filter((s) => !isHttpRequestSpan(s));\n\n return spans;\n}\n\n/**\n * Checks if a span matches criteria (AND within fields, OR within each field).\n * @param span - Span to evaluate\n * @param criteria - Criteria to match against\n */\nexport function matchesCriteria(span: ReadableSpan, criteria: Criteria): boolean {\n if (criteria.instrumentationScopeName !== void 0) {\n const scopeName = span.instrumentationScope?.name ?? \"\";\n const ok = criteria.instrumentationScopeName.some((m) => valueMatches(scopeName, m));\n if (!ok) return false;\n }\n\n if (criteria.name !== void 0) {\n const ok = criteria.name.some((m) => valueMatches(span.name ?? \"\", m));\n if (!ok) return false;\n }\n\n return true;\n}\n\n/**\n * Evaluates if a string matches a rule (equals, startsWith, or regex).\n * Case-sensitive by default unless ignoreCase is true.\n * @param value - String to evaluate\n * @param rule - Match rule\n */\nexport function valueMatches(value: string, rule: Match): boolean {\n const raw = value ?? \"\";\n const ignoreCase = rule.ignoreCase ?? false;\n\n if (rule.equals !== void 0) {\n return ignoreCase\n ? raw.localeCompare(rule.equals, void 0, { sensitivity: \"base\" }) === 0\n : raw === rule.equals;\n }\n\n if (rule.startsWith !== void 0) {\n return ignoreCase\n ? raw.toLowerCase().startsWith(rule.startsWith.toLowerCase())\n : raw.startsWith(rule.startsWith);\n }\n\n if (rule.matches instanceof RegExp) {\n const flags = rule.matches.flags;\n const re =\n ignoreCase && !flags.includes(\"i\")\n ? new RegExp(rule.matches.source, (flags || \"\") + \"i\")\n : rule.matches;\n return re.test(raw);\n }\n\n return false;\n}\n\n/**\n * Checks if a span is from the Vercel AI SDK (scope name === 'ai', case-insensitive).\n * @param span - Span to check\n */\nexport function isVercelAiSpan(span: ReadableSpan): boolean {\n const scope = span.instrumentationScope?.name?.toLowerCase?.() ?? \"\";\n return scope === \"ai\";\n}\n\n/**\n * Instrumentation scopes that emit HTTP client/server request spans. Only\n * fully qualified package scopes count: an application is free to name its\n * own instrumentation \"fetch\" or \"undici\", and such spans are user data.\n */\nconst HTTP_INSTRUMENTATION_SCOPES = new Set([\n \"@opentelemetry/instrumentation-http\",\n \"@opentelemetry/instrumentation-undici\",\n \"@opentelemetry/instrumentation-fetch\",\n]);\n\n/**\n * Checks if a span is an HTTP instrumentation span.\n * Checks scope, then http.request.method attribute, then name heuristic.\n * @param span - Span to check\n */\nexport function isHttpRequestSpan(span: ReadableSpan): boolean {\n const scopeName = span.instrumentationScope?.name ?? \"\";\n if (HTTP_INSTRUMENTATION_SCOPES.has(scopeName)) return true;\n\n const attributes = (span.attributes ?? {}) as Record<string, unknown>;\n if (attributes[\"http.request.method\"] !== undefined || attributes[\"http.method\"] !== undefined) {\n return true;\n }\n\n return /^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD|CONNECT|TRACE)( |$)/.test(span.name ?? \"\");\n}\n","import { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-proto\";\nimport { type CompressionAlgorithm } from \"@opentelemetry/otlp-exporter-base\";\n\nimport {\n DEFAULT_ENDPOINT,\n LANGWATCH_SDK_LANGUAGE,\n LANGWATCH_SDK_NAME_OBSERVABILITY,\n LANGWATCH_SDK_RUNTIME,\n LANGWATCH_SDK_VERSION,\n LOGS_PATH,\n} from \"../../internal/constants\";\nimport { resolveOtlpCompression } from \"../../internal/otlp-compression\";\n\nexport interface LangWatchLogsExporterOptions {\n endpoint?: string;\n apiKey?: string;\n /** Request compression: gzip unless an OTEL_EXPORTER_OTLP_*COMPRESSION env var is set. */\n compression?: CompressionAlgorithm;\n}\n\n/** Extends OpenTelemetry OTLP HTTP logs exporter to send logs to LangWatch with authentication. */\nexport class LangWatchLogsExporter extends OTLPLogExporter {\n /** Configures auth headers and endpoint; reads defaults from environment if needed. */\n constructor(opts?: LangWatchLogsExporterOptions) {\n const apiKey = opts?.apiKey ?? process.env.LANGWATCH_API_KEY ?? \"\";\n const endpoint = opts?.endpoint ?? process.env.LANGWATCH_ENDPOINT ?? DEFAULT_ENDPOINT;\n\n const url = new URL(LOGS_PATH, endpoint);\n const otelEndpoint = url.toString();\n\n super({\n headers: {\n \"x-langwatch-sdk-name\": LANGWATCH_SDK_NAME_OBSERVABILITY,\n \"x-langwatch-sdk-language\": LANGWATCH_SDK_LANGUAGE,\n \"x-langwatch-sdk-version\": LANGWATCH_SDK_VERSION,\n \"x-langwatch-sdk-runtime\": LANGWATCH_SDK_RUNTIME(),\n ...(apiKey ? { authorization: `Bearer ${apiKey}` } : {}),\n },\n url: otelEndpoint.toString(),\n compression: resolveOtlpCompression({ compression: opts?.compression, signal: \"LOGS\" }),\n });\n }\n}\n","import {\n type Logger,\n type LoggerOptions,\n type LoggerProvider,\n createNoopLogger,\n} from \"@opentelemetry/api-logs\";\n\nimport { LangWatchLoggerInternal } from \"./implementation\";\nimport { type LangWatchLogger } from \"./types\";\n\n/**\n * `NoopLoggerProvider` was dropped from @opentelemetry/api-logs' public exports\n * (0.221) in favour of the still-exported `createNoopLogger`, so this is its\n * replacement: a provider whose loggers are always the shared no-op logger.\n */\nconst NOOP_LOGGER_PROVIDER: LoggerProvider = {\n getLogger: (_name: string, _version?: string, _options?: LoggerOptions) => createNoopLogger(),\n};\n\n/**\n * The LangWatch-specific global logger provider -- may differ from the\n * current OTel one; the last one `setupObservability` knows about.\n * @internal\n */\nlet currentLoggerProvider: LoggerProvider = NOOP_LOGGER_PROVIDER;\n\n/** Sets the global logger provider that {@link getLangWatchLogger} will use. */\nexport function setLangWatchLoggerProvider(loggerProvider: LoggerProvider): void {\n currentLoggerProvider = loggerProvider;\n}\n\n/**\n * @param name - The logger name (typically your service or module name).\n * @param version - Optional logger version.\n * @returns A {@link LangWatchLogger} instance, or a no-op logger if no provider was set.\n */\nexport function getLangWatchLogger(name: string, version?: string): LangWatchLogger {\n return getLangWatchLoggerFromProvider(currentLoggerProvider, name, version);\n}\n\n/**\n * @param loggerProvider - The OpenTelemetry logger provider to use.\n * @param name - The name of the logger.\n * @param version - Optional logger version.\n * @returns A {@link LangWatchLogger} instance.\n */\nexport function getLangWatchLoggerFromProvider(\n loggerProvider: LoggerProvider,\n name: string,\n version?: string,\n): LangWatchLogger {\n return createLangWatchLogger(loggerProvider.getLogger(name, version));\n}\n\n/**\n * Wraps an OpenTelemetry logger as a LangWatch logger.\n * @param logger - The OpenTelemetry logger to wrap.\n * @returns A {@link LangWatchLogger} instance.\n */\nexport function createLangWatchLogger(logger: Logger): LangWatchLogger {\n return new LangWatchLoggerInternal(logger);\n}\n\n// Export types and implementation\nexport * from \"./types\";\nexport * from \"./implementation\";\n","import { context } from \"@opentelemetry/api\";\nimport { type AnyValue, type Logger } from \"@opentelemetry/api-logs\";\n\nimport { shouldCaptureOutput } from \"../config\";\nimport * as intSemconv from \"../semconv\";\nimport { type SemConvLogRecordAttributes } from \"../semconv\";\nimport {\n type EmitOptions,\n type LangWatchLogger,\n type LangWatchLogRecord,\n type LangWatchSpanGenAIAssistantMessageEventBody,\n type LangWatchSpanGenAIChoiceEventBody,\n type LangWatchSpanGenAISystemMessageEventBody,\n type LangWatchSpanGenAIToolMessageEventBody,\n type LangWatchSpanGenAIUserMessageEventBody,\n} from \"./types\";\n\n/** Internal implementation of {@link LangWatchLogger}. Wraps OpenTelemetry\n * logger with LangWatch functionality. Use {@link getLangWatchLogger} instead. */\nexport class LangWatchLoggerInternal implements LangWatchLogger {\n constructor(private logger: Logger) {}\n\n // Delegates to the wrapped OTel logger rather than always returning `true`:\n // the underlying logger is what actually knows whether a processor is\n // registered, so this is what keeps `enabled()` truthful for a caller that\n // wraps a no-op provider (e.g. `getLangWatchLogger` before setup runs).\n enabled(options?: Parameters<Logger[\"enabled\"]>[0]): boolean {\n return this.logger.enabled(options);\n }\n\n emit(logRecord: LangWatchLogRecord, options?: EmitOptions): void {\n // Handle output capture configuration\n if (!shouldCaptureOutput()) {\n logRecord.body = void 0;\n }\n\n // Set context if not provided and not explicitly excluded\n if (!logRecord.context && !options?.excludeContext) {\n logRecord.context = context.active();\n }\n\n // Emit the log record through the underlying OpenTelemetry logger\n this.logger.emit(logRecord);\n }\n\n emitGenAISystemMessageEvent(\n body: LangWatchSpanGenAISystemMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: SemConvLogRecordAttributes,\n ): void {\n this.emitGenAIEvent(\n intSemconv.LOG_EVNT_GEN_AI_SYSTEM_MESSAGE,\n {\n ...body,\n role: body.role ?? \"system\",\n } satisfies LangWatchSpanGenAISystemMessageEventBody,\n {\n ...attributes,\n \"gen_ai.system\": system,\n },\n );\n }\n\n emitGenAIUserMessageEvent(\n body: LangWatchSpanGenAIUserMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: SemConvLogRecordAttributes,\n ) {\n this.emitGenAIEvent(\n intSemconv.LOG_EVNT_GEN_AI_USER_MESSAGE,\n {\n ...body,\n role: body.role ?? \"user\",\n } satisfies LangWatchSpanGenAIUserMessageEventBody,\n {\n ...attributes,\n \"gen_ai.system\": system,\n },\n );\n }\n\n emitGenAIAssistantMessageEvent(\n body: LangWatchSpanGenAIAssistantMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: SemConvLogRecordAttributes,\n ) {\n this.emitGenAIEvent(\n intSemconv.LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE,\n {\n ...body,\n role: body.role ?? \"assistant\",\n } satisfies LangWatchSpanGenAIAssistantMessageEventBody,\n {\n ...attributes,\n \"gen_ai.system\": system,\n },\n );\n }\n\n emitGenAIToolMessageEvent(\n body: LangWatchSpanGenAIToolMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: SemConvLogRecordAttributes,\n ) {\n if (body.role === void 0) {\n body.role = \"tool\";\n }\n\n this.emitGenAIEvent(\n intSemconv.LOG_EVNT_GEN_AI_TOOL_MESSAGE,\n { ...body },\n {\n ...attributes,\n \"gen_ai.system\": system,\n },\n );\n }\n\n emitGenAIChoiceEvent(\n body: LangWatchSpanGenAIChoiceEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: SemConvLogRecordAttributes,\n ) {\n if (body.message && body.message.role === void 0) {\n body.message.role = \"assistant\";\n }\n\n this.emitGenAIEvent(\n intSemconv.LOG_EVNT_GEN_AI_CHOICE,\n {\n ...body,\n message: { ...body.message, role: body.message?.role ?? \"assistant\" },\n } satisfies LangWatchSpanGenAIChoiceEventBody,\n {\n ...attributes,\n \"gen_ai.system\": system,\n },\n );\n }\n\n private emitGenAIEvent(\n eventName: string,\n body: AnyValue,\n attributes?: SemConvLogRecordAttributes,\n ): void {\n this.emit({\n eventName,\n context: context.active(),\n attributes: { ...attributes },\n body: shouldCaptureOutput() ? body : void 0,\n observedTimestamp: new Date().getTime(),\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AACA,SAAS,yBAAyB;;;ACMlC,IAAM,oBAAoB;AAG1B,IAAM,iBAAiB;AAmBhB,IAAM,qBAAqB,CAAC,UAA2B;AAC5D,MAAI,MAAM,WAAW,iBAAiB,EAAG,QAAO;AAChD,MAAI,MAAM,WAAW,cAAc,GAAG;AACpC,UAAM,OAAO,MAAM,MAAM,eAAe,MAAM;AAC9C,WAAO,KAAK,SAAS,GAAG;AAAA,EAC1B;AACA,SAAO;AACT;AAMO,IAAM,mBAAmB,CAAC;AAAA,EAC/B;AAAA,EACA;AACF,MAAuD;AA7CvD;AA8CE,MAAI,CAAC,OAAQ,QAAO,CAAC;AAErB,QAAM,qBAAoB,qCAAa,QAAQ,IAAI,yBAAzB,YAAiD;AAE3E,MAAI,mBAAmB,MAAM,GAAG;AAC9B,QAAI,mBAAmB;AAGrB,YAAM,UAAU,OAAO,KAAK,GAAG,iBAAiB,IAAI,MAAM,IAAI,OAAO,EAAE,SAAS,QAAQ;AACxF,aAAO,EAAE,eAAe,SAAS,OAAO,GAAG;AAAA,IAC7C;AAIA,WAAO;AAAA,MACL,eAAe,UAAU,MAAM;AAAA,MAC/B,gBAAgB;AAAA,IAClB;AAAA,EACF;AAGA,SAAO;AAAA,IACL,eAAe,UAAU,MAAM;AAAA,IAC/B,gBAAgB;AAAA,EAClB;AACF;;;ACrEE,cAAW;;;ACAb,IAAI;AAMG,IAAM,aAAa,MAAiB;AACzC,2CAAa,cAAc;AAC3B,SAAO;AACT;AAeO,SAAS,cAAc,SAA6B;AACzD,MAAI,IAAY;AAChB,MAAI,SAAS;AACX,QAAI,QAAQ,IAAI,aAAa,QAAQ;AACnC,UAAI;AAAA,IACN,OAAO;AACL,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,QAAI,cAAc,CAAC,EAAG,QAAO;AAC7B,QAAI,aAAa,CAAC,EAAG,QAAO;AAC5B,QAAI,cAAc,CAAC,EAAG,QAAO;AAC7B,QAAI,aAAa,CAAC,GAAG;AACnB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,KAAK,sDAAsD,KAAK;AACxE,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,GAAoB;AACxC,MAAI,EAAE,YAAY,MAAM,OAAO,EAAE,WAAW,YAAY,CAAC,EAAE,QAAQ;AACjE,WAAO;AAAA,EACT;AACA,QAAM,MAAc,EAAE;AACtB,MAAI,MAAM,IAAK,QAAO;AACtB,SAAO,cAAc,OAAO,OAAO,IAAI,aAAa;AACtD;AAEA,SAAS,cAAc,GAAoB;AACzC,MAAI,EAAE,UAAU,MAAM,OAAO,EAAE,SAAS,YAAY,CAAC,EAAE,MAAM;AAC3D,WAAO;AAAA,EACT;AACA,SAAO,aAAa,EAAE,QAAQ,OAAO,EAAE,KAAK,YAAY;AAC1D;AAEA,SAAS,aAAa,GAAoB;AACxC,MAAI,EAAE,SAAS,MAAM,OAAO,EAAE,QAAQ,YAAY,CAAC,EAAE,KAAK;AACxD,WAAO;AAAA,EACT;AACA,SAAO,aAAa,EAAE,OAAO,OAAO,EAAE,IAAI,YAAY;AACxD;AAEA,SAAS,cAAc,GAAoB;AACzC,MAAI,EAAE,aAAa,MAAM,OAAO,EAAE,YAAY,YAAY,CAAC,EAAE,SAAS;AACpE,WAAO;AAAA,EACT;AACA,QAAM,WAAoB,cAAc,EAAE,UAAU,EAAE,QAAQ,WAAW;AACzE,SACE,OAAO,aAAa,YACpB,aAAa,QACb,UAAU,YACV,OAAO,SAAS,SAAS;AAE7B;;;ACnFO,IAAM,wBAAwB;AAE9B,IAAM,mCAAmC;AACzC,IAAM,4BAA4B;AAClC,IAAM,yBAAyB;AAC/B,IAAM,wBAAwB;AAE9B,IAAM,mBAAmB;AACzB,IAAM,uBAAuB;AAE7B,IAAM,cAAc;AACpB,IAAM,YAAY;;;ACdzB,SAAS,4BAA4B;AAO9B,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AACF,GAGqC;AACnC,MAAI,gBAAgB,OAAW,QAAO;AACtC,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,sBAAsB,MAAM;AAAA,EAC9B,EAAE,KAAK,CAAC,SAAM;AAlBhB;AAkBmB,yBAAQ,IAAI,IAAI,MAAhB,mBAAmB;AAAA,GAAM;AAC1C,SAAO,aAAa,SAAY,qBAAqB;AACvD;;;ACIO,SAAS,aACd,SACA,OACgB;AAChB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAC7C,SAAO,QAAQ,OAAO,CAAC,SAAS,SAAS,gBAAgB,MAAM,OAAO,GAAG,KAAK;AAChF;AAOO,SAAS,gBAAgB,MAAmB,OAAuC;AACxF,MAAI,YAAY,QAAQ,KAAK,QAAQ;AACnC,WAAO,YAAY,KAAK,QAAQ,KAAK;AAAA,EACvC;AAEA,MAAI,aAAa,QAAQ,KAAK,SAAS;AACrC,UAAM,WAAY,KAA+B;AACjD,WAAO,MAAM,OAAO,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAAA,EACzD;AAEA,MAAI,aAAa,QAAQ,KAAK,SAAS;AACrC,UAAM,WAAY,KAA+B;AACjD,WAAO,MAAM,OAAO,CAAC,MAAM,CAAC,gBAAgB,GAAG,QAAQ,CAAC;AAAA,EAC1D;AAEA,SAAO;AACT;AAOO,SAAS,YACd,QACA,OACgB;AAChB,MAAI,WAAW,eAAgB,QAAO,MAAM,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC;AAC3E,MAAI,WAAW,sBAAuB,QAAO,MAAM,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAEtF,SAAO;AACT;AAOO,SAAS,gBAAgB,MAAoB,UAA6B;AA3EjF;AA4EE,MAAI,SAAS,6BAA6B,QAAQ;AAChD,UAAM,aAAY,gBAAK,yBAAL,mBAA2B,SAA3B,YAAmC;AACrD,UAAM,KAAK,SAAS,yBAAyB,KAAK,CAAC,MAAM,aAAa,WAAW,CAAC,CAAC;AACnF,QAAI,CAAC,GAAI,QAAO;AAAA,EAClB;AAEA,MAAI,SAAS,SAAS,QAAQ;AAC5B,UAAM,KAAK,SAAS,KAAK,KAAK,CAAC,MAAG;AAnFtC,UAAAA;AAmFyC,2BAAaA,MAAA,KAAK,SAAL,OAAAA,MAAa,IAAI,CAAC;AAAA,KAAC;AACrE,QAAI,CAAC,GAAI,QAAO;AAAA,EAClB;AAEA,SAAO;AACT;AAQO,SAAS,aAAa,OAAe,MAAsB;AAhGlE;AAiGE,QAAM,MAAM,wBAAS;AACrB,QAAM,cAAa,UAAK,eAAL,YAAmB;AAEtC,MAAI,KAAK,WAAW,QAAQ;AAC1B,WAAO,aACH,IAAI,cAAc,KAAK,QAAQ,QAAQ,EAAE,aAAa,OAAO,CAAC,MAAM,IACpE,QAAQ,KAAK;AAAA,EACnB;AAEA,MAAI,KAAK,eAAe,QAAQ;AAC9B,WAAO,aACH,IAAI,YAAY,EAAE,WAAW,KAAK,WAAW,YAAY,CAAC,IAC1D,IAAI,WAAW,KAAK,UAAU;AAAA,EACpC;AAEA,MAAI,KAAK,mBAAmB,QAAQ;AAClC,UAAM,QAAQ,KAAK,QAAQ;AAC3B,UAAM,KACJ,cAAc,CAAC,MAAM,SAAS,GAAG,IAC7B,IAAI,OAAO,KAAK,QAAQ,SAAS,SAAS,MAAM,GAAG,IACnD,KAAK;AACX,WAAO,GAAG,KAAK,GAAG;AAAA,EACpB;AAEA,SAAO;AACT;AAMO,SAAS,eAAe,MAA6B;AAhI5D;AAiIE,QAAM,SAAQ,4BAAK,yBAAL,mBAA2B,SAA3B,mBAAiC,gBAAjC,4CAAoD;AAClE,SAAO,UAAU;AACnB;AAOA,IAAM,8BAA8B,oBAAI,IAAI;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOM,SAAS,kBAAkB,MAA6B;AArJ/D;AAsJE,QAAM,aAAY,gBAAK,yBAAL,mBAA2B,SAA3B,YAAmC;AACrD,MAAI,4BAA4B,IAAI,SAAS,EAAG,QAAO;AAEvD,QAAM,cAAc,UAAK,eAAL,YAAmB,CAAC;AACxC,MAAI,WAAW,qBAAqB,MAAM,UAAa,WAAW,aAAa,MAAM,QAAW;AAC9F,WAAO;AAAA,EACT;AAEA,SAAO,+DAA+D,MAAK,UAAK,SAAL,YAAa,EAAE;AAC5F;;;AN5HO,IAAM,yBAAN,cAAqC,kBAAkB;AAAA;AAAA,EAG5D,YAAY,MAAsC;AAtCpD;AAuCI,UAAM,UAAS,wCAAM,WAAN,YAAgB,QAAQ,IAAI,sBAA5B,YAAiD;AAChE,UAAM,aAAY,kCAAM,cAAN,YAAmB,QAAQ,IAAI;AACjD,UAAM,YAAW,wCAAM,aAAN,YAAkB,QAAQ,IAAI,uBAA9B,YAAoD;AAErE,UAAM,MAAM,IAAI,IAAI,aAAa,QAAQ;AACzC,UAAM,eAAe,IAAI,SAAS;AAElC,UAAM;AAAA,MACJ,SAAS;AAAA,QACP,wBAAwB;AAAA,QACxB,4BAA4B;AAAA,QAC5B,2BAA2B;AAAA,QAC3B,2BAA2B,sBAAsB;AAAA,SAC9C,iBAAiB,EAAE,QAAQ,UAAU,CAAC;AAAA,MAE3C,KAAK,aAAa,SAAS;AAAA,MAC3B,aAAa,uBAAuB,EAAE,aAAa,6BAAM,aAAa,QAAQ,SAAS,CAAC;AAAA,IAC1F,CAAC;AAGD,SAAI,6BAAM,aAAY,QAAS,MAAM,QAAQ,6BAAM,OAAO,KAAK,KAAK,QAAQ,WAAW,GAAI;AACzF,WAAK,UAAU,CAAC;AAAA,IAClB,WAAW,MAAM,QAAQ,6BAAM,OAAO,GAAG;AACvC,WAAK,UAAU,KAAK;AAAA,IACtB,OAAO;AACL,WAAK,UAAU,CAAC,EAAE,QAAQ,sBAAsB,CAAC;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,OAAO,OAAuB,gBAAsD;AAClF,UAAM,WAAW,aAAa,KAAK,SAAS,KAAK;AACjD,UAAM,OAAO,UAAU,cAAc;AAAA,EACvC;AACF;;;AOxEA,SAAS,uBAAuB;AAqBzB,IAAM,wBAAN,cAAoC,gBAAgB;AAAA;AAAA,EAEzD,YAAY,MAAqC;AAvBnD;AAwBI,UAAM,UAAS,wCAAM,WAAN,YAAgB,QAAQ,IAAI,sBAA5B,YAAiD;AAChE,UAAM,YAAW,wCAAM,aAAN,YAAkB,QAAQ,IAAI,uBAA9B,YAAoD;AAErE,UAAM,MAAM,IAAI,IAAI,WAAW,QAAQ;AACvC,UAAM,eAAe,IAAI,SAAS;AAElC,UAAM;AAAA,MACJ,SAAS;AAAA,QACP,wBAAwB;AAAA,QACxB,4BAA4B;AAAA,QAC5B,2BAA2B;AAAA,QAC3B,2BAA2B,sBAAsB;AAAA,SAC7C,SAAS,EAAE,eAAe,UAAU,MAAM,GAAG,IAAI,CAAC;AAAA,MAExD,KAAK,aAAa,SAAS;AAAA,MAC3B,aAAa,uBAAuB,EAAE,aAAa,6BAAM,aAAa,QAAQ,OAAO,CAAC;AAAA,IACxF,CAAC;AAAA,EACH;AACF;;;AC1CA;AAAA,EAIE;AAAA,OACK;;;ACLP,SAAS,eAAe;AAmBjB,IAAM,0BAAN,MAAyD;AAAA,EAC9D,YAAoB,QAAgB;AAAhB;AAAA,EAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrC,QAAQ,SAAqD;AAC3D,WAAO,KAAK,OAAO,QAAQ,OAAO;AAAA,EACpC;AAAA,EAEA,KAAK,WAA+B,SAA6B;AAE/D,QAAI,CAAC,oBAAoB,GAAG;AAC1B,gBAAU,OAAO;AAAA,IACnB;AAGA,QAAI,CAAC,UAAU,WAAW,EAAC,mCAAS,iBAAgB;AAClD,gBAAU,UAAU,QAAQ,OAAO;AAAA,IACrC;AAGA,SAAK,OAAO,KAAK,SAAS;AAAA,EAC5B;AAAA,EAEA,4BACE,MACA,QACA,YACM;AAjDV;AAkDI,SAAK;AAAA,MACQ;AAAA,MACX,iCACK,OADL;AAAA,QAEE,OAAM,UAAK,SAAL,YAAa;AAAA,MACrB;AAAA,MACA,iCACK,aADL;AAAA,QAEE,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,0BACE,MACA,QACA,YACA;AAnEJ;AAoEI,SAAK;AAAA,MACQ;AAAA,MACX,iCACK,OADL;AAAA,QAEE,OAAM,UAAK,SAAL,YAAa;AAAA,MACrB;AAAA,MACA,iCACK,aADL;AAAA,QAEE,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,+BACE,MACA,QACA,YACA;AArFJ;AAsFI,SAAK;AAAA,MACQ;AAAA,MACX,iCACK,OADL;AAAA,QAEE,OAAM,UAAK,SAAL,YAAa;AAAA,MACrB;AAAA,MACA,iCACK,aADL;AAAA,QAEE,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,0BACE,MACA,QACA,YACA;AACA,QAAI,KAAK,SAAS,QAAQ;AACxB,WAAK,OAAO;AAAA,IACd;AAEA,SAAK;AAAA,MACQ;AAAA,MACX,mBAAK;AAAA,MACL,iCACK,aADL;AAAA,QAEE,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,qBACE,MACA,QACA,YACA;AA1HJ;AA2HI,QAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,QAAQ;AAChD,WAAK,QAAQ,OAAO;AAAA,IACtB;AAEA,SAAK;AAAA,MACQ;AAAA,MACX,iCACK,OADL;AAAA,QAEE,SAAS,iCAAK,KAAK,UAAV,EAAmB,OAAM,gBAAK,YAAL,mBAAc,SAAd,YAAsB,YAAY;AAAA,MACtE;AAAA,MACA,iCACK,aADL;AAAA,QAEE,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eACN,WACA,MACA,YACM;AACN,SAAK,KAAK;AAAA,MACR;AAAA,MACA,SAAS,QAAQ,OAAO;AAAA,MACxB,YAAY,mBAAK;AAAA,MACjB,MAAM,oBAAoB,IAAI,OAAO;AAAA,MACrC,oBAAmB,oBAAI,KAAK,GAAE,QAAQ;AAAA,IACxC,CAAC;AAAA,EACH;AACF;;;AD1IA,IAAM,uBAAuC;AAAA,EAC3C,WAAW,CAAC,OAAe,UAAmB,aAA6B,iBAAiB;AAC9F;AAOA,IAAI,wBAAwC;AAGrC,SAAS,2BAA2B,gBAAsC;AAC/E,0BAAwB;AAC1B;AAOO,SAAS,mBAAmB,MAAcC,UAAmC;AAClF,SAAO,+BAA+B,uBAAuB,MAAMA,QAAO;AAC5E;AAQO,SAAS,+BACd,gBACA,MACAA,UACiB;AACjB,SAAO,sBAAsB,eAAe,UAAU,MAAMA,QAAO,CAAC;AACtE;AAOO,SAAS,sBAAsB,QAAiC;AACrE,SAAO,IAAI,wBAAwB,MAAM;AAC3C;","names":["_a","version"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/sdks/typescript/dist/chunk-HCK7TCSK.js","../src/observability-sdk/exporters/langwatch-trace-exporter.ts","../src/internal/api/auth.ts","../package.json","../src/internal/runtime.ts","../src/internal/constants.ts","../src/internal/otlp-compression.ts","../src/observability-sdk/exporters/trace-filters.ts","../src/observability-sdk/exporters/langwatch-logs-exporter.ts","../src/observability-sdk/logger/index.ts","../src/observability-sdk/logger/implementation.ts"],"names":["_a","version"],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/sdks/typescript/dist/chunk-HCK7TCSK.js","sourcesContent":[null,"import { type ExportResult } from \"@opentelemetry/core\";\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-proto\";\nimport { type CompressionAlgorithm } from \"@opentelemetry/otlp-exporter-base\";\nimport { type ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\n\nimport { buildAuthHeaders } from \"../../internal/api/auth\";\nimport {\n DEFAULT_ENDPOINT,\n LANGWATCH_SDK_LANGUAGE,\n LANGWATCH_SDK_NAME_OBSERVABILITY,\n LANGWATCH_SDK_RUNTIME,\n LANGWATCH_SDK_VERSION,\n TRACES_PATH,\n} from \"../../internal/constants\";\nimport { resolveOtlpCompression } from \"../../internal/otlp-compression\";\nimport { type TraceFilter, type Criteria, type Match, applyFilters } from \"./trace-filters\";\n\n/** Options: endpoint URL, API key for auth, and optional span filters (default excludes HTTP). */\nexport interface LangWatchTraceExporterOptions {\n endpoint?: string;\n apiKey?: string;\n /**\n * Project identifier. Required when `apiKey` is a Personal Access Token\n * (`pat-lw-*`); ignored for legacy `sk-lw-*` keys. Falls back to\n * `LANGWATCH_PROJECT_ID`.\n */\n projectId?: string;\n filters?: TraceFilter[] | null;\n /** Request compression: gzip unless an OTEL_EXPORTER_OTLP_*COMPRESSION env var is set. */\n compression?: CompressionAlgorithm;\n}\n\nexport type { TraceFilter, Criteria, Match };\n\n/** Sends traces to LangWatch with auth; applies span filters (default excludes HTTP). */\nexport class LangWatchTraceExporter extends OTLPTraceExporter {\n private readonly filters: TraceFilter[];\n /** Configures auth from opts or environment; applies filters to span stream. */\n constructor(opts?: LangWatchTraceExporterOptions) {\n const apiKey = opts?.apiKey ?? process.env.LANGWATCH_API_KEY ?? \"\";\n const projectId = opts?.projectId ?? process.env.LANGWATCH_PROJECT_ID;\n const endpoint = opts?.endpoint ?? process.env.LANGWATCH_ENDPOINT ?? DEFAULT_ENDPOINT;\n\n const url = new URL(TRACES_PATH, endpoint);\n const otelEndpoint = url.toString();\n\n super({\n headers: {\n \"x-langwatch-sdk-name\": LANGWATCH_SDK_NAME_OBSERVABILITY,\n \"x-langwatch-sdk-language\": LANGWATCH_SDK_LANGUAGE,\n \"x-langwatch-sdk-version\": LANGWATCH_SDK_VERSION,\n \"x-langwatch-sdk-runtime\": LANGWATCH_SDK_RUNTIME(),\n ...buildAuthHeaders({ apiKey, projectId }),\n },\n url: otelEndpoint.toString(),\n compression: resolveOtlpCompression({ compression: opts?.compression, signal: \"TRACES\" }),\n });\n\n // Handle filters: null or [] = no filtering, undefined = default, array = use provided\n if (opts?.filters === null || (Array.isArray(opts?.filters) && opts.filters.length === 0)) {\n this.filters = [];\n } else if (Array.isArray(opts?.filters)) {\n this.filters = opts.filters;\n } else {\n this.filters = [{ preset: \"excludeHttpRequests\" }];\n }\n }\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n const filtered = applyFilters(this.filters, spans);\n super.export(filtered, resultCallback);\n }\n}\n","/**\n * Authentication header assembly, two token families: legacy `sk-lw-`\n * project keys send `Bearer` + `X-Auth-Token`; user-scoped keys send\n * `Basic base64(projectId:token)` so the server can resolve the role binding.\n */\n\n/** Old PAT prefix — still accepted by the server for backward compat. */\nconst LEGACY_PAT_PREFIX = \"pat-lw-\";\n\n/** Unified API key prefix — also used by legacy project keys. */\nconst API_KEY_PREFIX = \"sk-lw-\";\n\nexport interface LangWatchAuthHeadersInput {\n /** API key token. May be empty; in that case no auth headers are emitted. */\n apiKey: string;\n /**\n * Project identifier. Required for user-scoped API keys to resolve scope;\n * optional for legacy project keys (the token already encodes project identity).\n * Falls back to `LANGWATCH_PROJECT_ID` when omitted.\n */\n projectId?: string;\n}\n\nexport type LangWatchAuthHeaders = Record<string, string>;\n\n/**\n * Whether the credential is a user-scoped API key (as opposed to a legacy project key): a\n * `pat-lw-` prefix, or a `sk-lw-` prefix with an underscore in the body (the new format).\n */\nexport const isUserScopedApiKey = (token: string): boolean => {\n if (token.startsWith(LEGACY_PAT_PREFIX)) return true;\n if (token.startsWith(API_KEY_PREFIX)) {\n const body = token.slice(API_KEY_PREFIX.length);\n return body.includes(\"_\");\n }\n return false;\n};\n\n/**\n * Builds the HTTP headers required to authenticate against the LangWatch\n * API using either a legacy project key or a user-scoped API key.\n */\nexport const buildAuthHeaders = ({\n apiKey,\n projectId,\n}: LangWatchAuthHeadersInput): LangWatchAuthHeaders => {\n if (!apiKey) return {};\n\n const resolvedProjectId = projectId ?? process.env.LANGWATCH_PROJECT_ID ?? undefined;\n\n if (isUserScopedApiKey(apiKey)) {\n if (resolvedProjectId) {\n // Basic Auth is the canonical carrier — the server extracts both\n // the project and the token from one header.\n const encoded = Buffer.from(`${resolvedProjectId}:${apiKey}`, \"utf-8\").toString(\"base64\");\n return { authorization: `Basic ${encoded}` };\n }\n\n // API key without a projectId: use Bearer and let the server reject\n // unresolvable requests.\n return {\n authorization: `Bearer ${apiKey}`,\n \"x-auth-token\": apiKey,\n };\n }\n\n // Legacy sk-lw-* project key: preserve the dual-header shape.\n return {\n authorization: `Bearer ${apiKey}`,\n \"x-auth-token\": apiKey,\n };\n};\n","{\n \"name\": \"langwatch\",\n \"version\": \"1.20.0\",\n \"description\": \"LangWatch TypeScript/JavaScript SDK. Interact with the full LangWatch API and use the LangWatch OpenTelemetry SDK to instrument your application. For more information, see https://docs.langwatch.ai/integration/typescript/guide\",\n \"license\": \"MIT\",\n \"author\": \"LangWatch\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/langwatch/langwatch.git\",\n \"directory\": \"typescript-sdk\"\n },\n \"bin\": {\n \"langwatch\": \"./dist/cli/index.js\",\n \"lw\": \"./dist/cli/index.js\"\n },\n \"files\": [\n \"dist\",\n \"!dist/bin\",\n \"!dist/cli/*.map\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n },\n \"./observability\": {\n \"types\": \"./dist/observability-sdk/index.d.ts\",\n \"require\": \"./dist/observability-sdk/index.js\",\n \"import\": \"./dist/observability-sdk/index.mjs\"\n },\n \"./observability/semconv\": {\n \"types\": \"./dist/observability-sdk/semconv/index.d.ts\",\n \"require\": \"./dist/observability-sdk/semconv/index.js\",\n \"import\": \"./dist/observability-sdk/semconv/index.mjs\"\n },\n \"./observability/node\": {\n \"types\": \"./dist/observability-sdk/setup/node/index.d.ts\",\n \"require\": \"./dist/observability-sdk/setup/node/index.js\",\n \"import\": \"./dist/observability-sdk/setup/node/index.mjs\"\n },\n \"./observability/instrumentation/langchain\": {\n \"types\": \"./dist/observability-sdk/instrumentation/langchain/index.d.ts\",\n \"require\": \"./dist/observability-sdk/instrumentation/langchain/index.js\",\n \"import\": \"./dist/observability-sdk/instrumentation/langchain/index.mjs\"\n },\n \"./agent\": {\n \"types\": \"./dist/agent/index.d.ts\",\n \"require\": \"./dist/agent/index.js\",\n \"import\": \"./dist/agent/index.mjs\"\n }\n },\n \"scripts\": {\n \"generate\": \"pnpm run generate:server-types\",\n \"cli\": \"node dist/cli/index.js\",\n \"prelint\": \"pnpm run generate\",\n \"lint\": \"eslint .\",\n \"pretest\": \"pnpm run generate\",\n \"test\": \"vitest run --exclude '**/*.integration.test.ts'\",\n \"test:e2e\": \"dotenv -- vitest run -c ./vitest.e2e.config.mts\",\n \"test:governance-e2e\": \"vitest run -c ./vitest.governance-e2e.config.mts\",\n \"test:seed\": \"dotenv -e .env.test -- pnpm -w run prisma:seed\",\n \"prebuild\": \"pnpm run generate\",\n \"build\": \"rm -rf dist && tsup\",\n \"postbuild\": \"node -e \\\"const{statSync}=require('node:fs'),{execFileSync}=require('node:child_process');const f='dist/cli/index.js',want=require('./package.json').version;const s=statSync(f);if(process.platform!=='win32'&&!(s.mode&0o111))throw new Error(f+' is not executable');const got=execFileSync(process.execPath,[f,'--version'],{encoding:'utf8',env:{...process.env,LANGWATCH_NO_DAEMON:'1'}}).trim();if(got!==want)throw new Error('version mismatch: '+f+' reports '+got+', package.json says '+want);console.log('postbuild: '+f+' ok ('+got+')')\\\"\",\n \"build:binary\": \"bun run scripts/build-cli-binary.ts\",\n \"tarball\": \"pnpm build && pnpm pack\",\n \"typecheck\": \"GOMAXPROCS=2 GOMEMLIMIT=2GiB pnpm -w exec tsc -b sdks/typescript\",\n \"prepublish\": \"pnpm run build\",\n \"generate:openapi-types\": \"node scripts/generate-openapi-types.mjs\",\n \"generate:server-types\": \"./copy-types.sh\"\n },\n \"dependencies\": {\n \"@opentelemetry/api-logs\": \"catalog:\",\n \"@opentelemetry/context-async-hooks\": \"catalog:\",\n \"@opentelemetry/core\": \"catalog:\",\n \"@opentelemetry/exporter-logs-otlp-proto\": \"catalog:\",\n \"@opentelemetry/exporter-trace-otlp-proto\": \"catalog:\",\n \"@opentelemetry/otlp-exporter-base\": \"catalog:\",\n \"@opentelemetry/resources\": \"catalog:\",\n \"@opentelemetry/sdk-logs\": \"catalog:\",\n \"@opentelemetry/sdk-trace-base\": \"catalog:\",\n \"@opentelemetry/sdk-trace-node\": \"catalog:\",\n \"liquidjs\": \"catalog:\",\n \"open\": \"^11.0.0\",\n \"openapi-fetch\": \"^0.17.0\",\n \"ws\": \"catalog:\",\n \"xksuid\": \"^0.0.4\",\n \"zod\": \"catalog:\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.32.0\",\n \"@langchain/core\": \">=0.3.68 <0.4.0\",\n \"@langchain/langgraph\": \">=0.4.0 <1.0.0\",\n \"@langchain/openai\": \">=0.6.0 <1.0.0\",\n \"@langwatch/e2e-stack\": \"workspace:*\",\n \"@langwatch/handled-error\": \"workspace:*\",\n \"@opentelemetry/api\": \"catalog:\",\n \"@opentelemetry/instrumentation\": \"catalog:\",\n \"@opentelemetry/sdk-metrics\": \"catalog:\",\n \"@opentelemetry/sdk-trace-web\": \"catalog:\",\n \"@types/debug\": \"catalog:\",\n \"@types/js-yaml\": \"catalog:\",\n \"@types/node\": \"catalog:\",\n \"@types/prompts\": \"catalog:\",\n \"@types/ws\": \"catalog:\",\n \"@typescript-eslint/parser\": \"^8.58.1\",\n \"@vercel/otel\": \"^1.13.0\",\n \"@vitest/coverage-v8\": \"^5.0.1\",\n \"chalk\": \"catalog:\",\n \"cloudflared\": \"0.7.1\",\n \"commander\": \"catalog:\",\n \"dotenv\": \"catalog:\",\n \"dotenv-cli\": \"^11.0.0\",\n \"esbuild\": \"catalog:\",\n \"eslint\": \"^9.32.0\",\n \"fets\": \"^0.8.5\",\n \"fishery\": \"^2.3.1\",\n \"js-yaml\": \"catalog:\",\n \"jsonc-parser\": \"^3.3.1\",\n \"langchain\": \">=0.3.0 <2.0.0\",\n \"msw\": \"^2.10.4\",\n \"nock\": \"^14.0.8\",\n \"openapi-msw\": \"^1.2.0\",\n \"openapi-typescript\": \"7.13.0\",\n \"ora\": \"catalog:\",\n \"prompts\": \"catalog:\",\n \"tsup\": \"catalog:\",\n \"typescript\": \"catalog:sdk-toolchain\",\n \"typescript-eslint\": \"catalog:\",\n \"vitest\": \"catalog:\",\n \"vitest-mock-extended\": \"^5.1.1\",\n \"yaml\": \"^2.8.1\"\n },\n \"peerDependencies\": {\n \"@ai-sdk/openai\": \">=2.0.0 <5.0.0\",\n \"@langchain/core\": \">=0.3.0 <2.0.0\",\n \"@langchain/langgraph\": \">=0.4.0 <2.0.0\",\n \"@langchain/openai\": \">=0.6.0 <2.0.0\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/context-zone\": \">=1.19.0 <3.0.0\",\n \"@opentelemetry/exporter-trace-otlp-grpc\": \">=0.221.0 <1.0.0\",\n \"@opentelemetry/instrumentation\": \">=0.200.0 <1.0.0\",\n \"@opentelemetry/sdk-metrics\": \">=2.0.0 <3.0.0\",\n \"@opentelemetry/sdk-trace-web\": \">=1.19.0 <3.0.0\",\n \"langchain\": \">=0.3.0 <2.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@ai-sdk/openai\": {\n \"optional\": true\n },\n \"@langchain/core\": {\n \"optional\": true\n },\n \"@langchain/langgraph\": {\n \"optional\": true\n },\n \"@langchain/openai\": {\n \"optional\": true\n },\n \"@opentelemetry/context-zone\": {\n \"optional\": true\n },\n \"@opentelemetry/exporter-trace-otlp-grpc\": {\n \"optional\": true\n },\n \"@opentelemetry/instrumentation\": {\n \"optional\": true\n },\n \"@opentelemetry/sdk-metrics\": {\n \"optional\": true\n },\n \"@opentelemetry/sdk-trace-web\": {\n \"optional\": true\n },\n \"langchain\": {\n \"optional\": true\n }\n },\n \"engines\": {\n \"node\": \"^22.23.4 || ^24.22.1 || >=26.12.1\",\n \"pnpm\": \">=8\"\n },\n \"nx\": {\n \"namedInputs\": {\n \"sdkBuild\": [\n \"default\",\n \"!{projectRoot}/**/*.test.ts\",\n \"!{projectRoot}/**/*.test.tsx\",\n \"!{projectRoot}/**/*.test.mts\",\n \"!{projectRoot}/vitest.config.*\",\n \"!{projectRoot}/vitest.integration.config.*\",\n \"!{projectRoot}/__tests__/**/*\"\n ],\n \"production\": [\n \"sdkBuild\",\n \"!{projectRoot}/src/cli/**/*\"\n ]\n }\n }\n}\n","export type JsRuntime = \"node\" | \"deno\" | \"bun\" | \"web\" | \"unknown\";\n\nlet _runtime: JsRuntime | undefined;\n\n/**\n * Gets the cached JavaScript runtime environment.\n * @returns The detected runtime environment\n */\nexport const getRuntime = (): JsRuntime => {\n _runtime ??= detectRuntime();\n return _runtime;\n};\n\n/**\n * Resets the cached runtime. Only used for testing.\n * @internal\n */\nexport const resetRuntimeCache = (): void => {\n _runtime = undefined;\n};\n\n/**\n * Detects the JavaScript runtime environment.\n * @param globals - (Test only) Override the global object for environment simulation;\n * only used if NODE_ENV === 'test'.\n */\nexport function detectRuntime(globals?: object): JsRuntime {\n let g: object = globalThis;\n if (globals) {\n if (process.env.NODE_ENV === \"test\") {\n g = globals;\n } else {\n console.warn(\n \"[LangWatch Observability] overriding detectRuntime is only supported when running in NODE_ENV=test\",\n );\n }\n }\n\n try {\n if (isDenoRuntime(g)) return \"deno\";\n if (isBunRuntime(g)) return \"bun\";\n if (isNodeRuntime(g)) return \"node\";\n if (isWebRuntime(g)) {\n return \"web\";\n }\n return \"unknown\";\n } catch (error) {\n console.warn(\"[LangWatch Observability] Failed to detect runtime\", error);\n return \"unknown\";\n }\n}\n\nfunction isWebRuntime(g: object): boolean {\n if (!(\"window\" in g) || typeof g.window !== \"object\" || !g.window) {\n return false;\n }\n const win: object = g.window;\n if (g !== win) return false;\n return \"document\" in win && typeof win.document !== \"undefined\";\n}\n\nfunction isDenoRuntime(g: object): boolean {\n if (!(\"Deno\" in g) || typeof g.Deno !== \"object\" || !g.Deno) {\n return false;\n }\n return \"version\" in g.Deno && typeof g.Deno.version === \"object\";\n}\n\nfunction isBunRuntime(g: object): boolean {\n if (!(\"Bun\" in g) || typeof g.Bun !== \"object\" || !g.Bun) {\n return false;\n }\n return \"version\" in g.Bun && typeof g.Bun.version === \"string\";\n}\n\nfunction isNodeRuntime(g: object): boolean {\n if (!(\"process\" in g) || typeof g.process !== \"object\" || !g.process) {\n return false;\n }\n const versions: unknown = \"versions\" in g.process ? g.process.versions : undefined;\n return (\n typeof versions === \"object\" &&\n versions !== null &&\n \"node\" in versions &&\n typeof versions.node === \"string\"\n );\n}\n","import { version } from \"../../package.json\";\nimport { getRuntime } from \"./runtime\";\n\nexport const LANGWATCH_SDK_RUNTIME = getRuntime;\n\nexport const LANGWATCH_SDK_NAME_OBSERVABILITY = \"langwatch-observability-sdk\";\nexport const LANGWATCH_SDK_NAME_CLIENT = \"langwatch-client-sdk\";\nexport const LANGWATCH_SDK_LANGUAGE = \"typescript\";\nexport const LANGWATCH_SDK_VERSION = version;\n\nexport const DEFAULT_ENDPOINT = \"https://app.langwatch.ai\";\nexport const DEFAULT_SERVICE_NAME = \"unknown-service.langwatch\";\n\nexport const TRACES_PATH = \"/api/otel/v1/traces\";\nexport const LOGS_PATH = \"/api/otel/v1/logs\";\nexport const METRICS_PATH = \"/api/otel/v1/metrics\";\n","import { CompressionAlgorithm } from \"@opentelemetry/otlp-exporter-base\";\n\n/**\n * The compression an OTLP exporter is built with: the caller's choice, else\n * the standard OTel env vars (left to the exporter), else gzip. Explicit\n * config beats env in OTel JS, so gzip is only set when neither is given.\n */\nexport function resolveOtlpCompression({\n compression,\n signal,\n}: {\n compression?: CompressionAlgorithm;\n signal: \"TRACES\" | \"LOGS\" | \"METRICS\";\n}): CompressionAlgorithm | undefined {\n if (compression !== undefined) return compression;\n const isSetInEnv = [\n \"OTEL_EXPORTER_OTLP_COMPRESSION\",\n `OTEL_EXPORTER_OTLP_${signal}_COMPRESSION`,\n ].some((name) => process.env[name]?.trim());\n return isSetInEnv ? undefined : CompressionAlgorithm.GZIP;\n}\n","import { type ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\n\nexport interface Criteria {\n instrumentationScopeName?: Match[];\n name?: Match[];\n}\n\nexport interface Match {\n equals?: string;\n startsWith?: string;\n matches?: RegExp;\n ignoreCase?: boolean;\n}\n\nexport type TraceFilter =\n | { preset: \"vercelAIOnly\" | \"excludeHttpRequests\" }\n | { include: Criteria }\n | { exclude: Criteria };\n\n/**\n * Applies filters to spans sequentially (AND semantics).\n * @param filters - Filter rules to apply in sequence\n * @param spans - Array of spans to filter\n */\nexport function applyFilters(\n filters: TraceFilter[] | undefined,\n spans: ReadableSpan[],\n): ReadableSpan[] {\n if (!filters || filters.length === 0) return spans;\n return filters.reduce((current, rule) => applyFilterRule(rule, current), spans);\n}\n\n/**\n * Applies a single filter rule (preset, include, or exclude).\n * @param rule - Filter rule to apply\n * @param spans - Array of spans to filter\n */\nexport function applyFilterRule(rule: TraceFilter, spans: ReadableSpan[]): ReadableSpan[] {\n if (\"preset\" in rule && rule.preset) {\n return applyPreset(rule.preset, spans);\n }\n\n if (\"include\" in rule && rule.include) {\n const criteria = (rule as { include: Criteria }).include;\n return spans.filter((s) => matchesCriteria(s, criteria));\n }\n\n if (\"exclude\" in rule && rule.exclude) {\n const criteria = (rule as { exclude: Criteria }).exclude;\n return spans.filter((s) => !matchesCriteria(s, criteria));\n }\n\n return spans;\n}\n\n/**\n * Applies a preset filter: vercelAIOnly or excludeHttpRequests.\n * @param preset - Preset filter name\n * @param spans - Array of spans to filter\n */\nexport function applyPreset(\n preset: \"vercelAIOnly\" | \"excludeHttpRequests\",\n spans: ReadableSpan[],\n): ReadableSpan[] {\n if (preset === \"vercelAIOnly\") return spans.filter((s) => isVercelAiSpan(s));\n if (preset === \"excludeHttpRequests\") return spans.filter((s) => !isHttpRequestSpan(s));\n\n return spans;\n}\n\n/**\n * Checks if a span matches criteria (AND within fields, OR within each field).\n * @param span - Span to evaluate\n * @param criteria - Criteria to match against\n */\nexport function matchesCriteria(span: ReadableSpan, criteria: Criteria): boolean {\n if (criteria.instrumentationScopeName !== void 0) {\n const scopeName = span.instrumentationScope?.name ?? \"\";\n const ok = criteria.instrumentationScopeName.some((m) => valueMatches(scopeName, m));\n if (!ok) return false;\n }\n\n if (criteria.name !== void 0) {\n const ok = criteria.name.some((m) => valueMatches(span.name ?? \"\", m));\n if (!ok) return false;\n }\n\n return true;\n}\n\n/**\n * Evaluates if a string matches a rule (equals, startsWith, or regex).\n * Case-sensitive by default unless ignoreCase is true.\n * @param value - String to evaluate\n * @param rule - Match rule\n */\nexport function valueMatches(value: string, rule: Match): boolean {\n const raw = value ?? \"\";\n const ignoreCase = rule.ignoreCase ?? false;\n\n if (rule.equals !== void 0) {\n return ignoreCase\n ? raw.localeCompare(rule.equals, void 0, { sensitivity: \"base\" }) === 0\n : raw === rule.equals;\n }\n\n if (rule.startsWith !== void 0) {\n return ignoreCase\n ? raw.toLowerCase().startsWith(rule.startsWith.toLowerCase())\n : raw.startsWith(rule.startsWith);\n }\n\n if (rule.matches instanceof RegExp) {\n const flags = rule.matches.flags;\n const re =\n ignoreCase && !flags.includes(\"i\")\n ? new RegExp(rule.matches.source, (flags || \"\") + \"i\")\n : rule.matches;\n return re.test(raw);\n }\n\n return false;\n}\n\n/**\n * Checks if a span is from the Vercel AI SDK (scope name === 'ai', case-insensitive).\n * @param span - Span to check\n */\nexport function isVercelAiSpan(span: ReadableSpan): boolean {\n const scope = span.instrumentationScope?.name?.toLowerCase?.() ?? \"\";\n return scope === \"ai\";\n}\n\n/**\n * Instrumentation scopes that emit HTTP client/server request spans. Only\n * fully qualified package scopes count: an application is free to name its\n * own instrumentation \"fetch\" or \"undici\", and such spans are user data.\n */\nconst HTTP_INSTRUMENTATION_SCOPES = new Set([\n \"@opentelemetry/instrumentation-http\",\n \"@opentelemetry/instrumentation-undici\",\n \"@opentelemetry/instrumentation-fetch\",\n]);\n\n/**\n * Checks if a span is an HTTP instrumentation span.\n * Checks scope, then http.request.method attribute, then name heuristic.\n * @param span - Span to check\n */\nexport function isHttpRequestSpan(span: ReadableSpan): boolean {\n const scopeName = span.instrumentationScope?.name ?? \"\";\n if (HTTP_INSTRUMENTATION_SCOPES.has(scopeName)) return true;\n\n const attributes = (span.attributes ?? {}) as Record<string, unknown>;\n if (attributes[\"http.request.method\"] !== undefined || attributes[\"http.method\"] !== undefined) {\n return true;\n }\n\n return /^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD|CONNECT|TRACE)( |$)/.test(span.name ?? \"\");\n}\n","import { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-proto\";\nimport { type CompressionAlgorithm } from \"@opentelemetry/otlp-exporter-base\";\n\nimport {\n DEFAULT_ENDPOINT,\n LANGWATCH_SDK_LANGUAGE,\n LANGWATCH_SDK_NAME_OBSERVABILITY,\n LANGWATCH_SDK_RUNTIME,\n LANGWATCH_SDK_VERSION,\n LOGS_PATH,\n} from \"../../internal/constants\";\nimport { resolveOtlpCompression } from \"../../internal/otlp-compression\";\n\nexport interface LangWatchLogsExporterOptions {\n endpoint?: string;\n apiKey?: string;\n /** Request compression: gzip unless an OTEL_EXPORTER_OTLP_*COMPRESSION env var is set. */\n compression?: CompressionAlgorithm;\n}\n\n/** Extends OpenTelemetry OTLP HTTP logs exporter to send logs to LangWatch with authentication. */\nexport class LangWatchLogsExporter extends OTLPLogExporter {\n /** Configures auth headers and endpoint; reads defaults from environment if needed. */\n constructor(opts?: LangWatchLogsExporterOptions) {\n const apiKey = opts?.apiKey ?? process.env.LANGWATCH_API_KEY ?? \"\";\n const endpoint = opts?.endpoint ?? process.env.LANGWATCH_ENDPOINT ?? DEFAULT_ENDPOINT;\n\n const url = new URL(LOGS_PATH, endpoint);\n const otelEndpoint = url.toString();\n\n super({\n headers: {\n \"x-langwatch-sdk-name\": LANGWATCH_SDK_NAME_OBSERVABILITY,\n \"x-langwatch-sdk-language\": LANGWATCH_SDK_LANGUAGE,\n \"x-langwatch-sdk-version\": LANGWATCH_SDK_VERSION,\n \"x-langwatch-sdk-runtime\": LANGWATCH_SDK_RUNTIME(),\n ...(apiKey ? { authorization: `Bearer ${apiKey}` } : {}),\n },\n url: otelEndpoint.toString(),\n compression: resolveOtlpCompression({ compression: opts?.compression, signal: \"LOGS\" }),\n });\n }\n}\n","import {\n type Logger,\n type LoggerOptions,\n type LoggerProvider,\n createNoopLogger,\n} from \"@opentelemetry/api-logs\";\n\nimport { LangWatchLoggerInternal } from \"./implementation\";\nimport { type LangWatchLogger } from \"./types\";\n\n/**\n * `NoopLoggerProvider` was dropped from @opentelemetry/api-logs' public exports\n * (0.221) in favour of the still-exported `createNoopLogger`, so this is its\n * replacement: a provider whose loggers are always the shared no-op logger.\n */\nconst NOOP_LOGGER_PROVIDER: LoggerProvider = {\n getLogger: (_name: string, _version?: string, _options?: LoggerOptions) => createNoopLogger(),\n};\n\n/**\n * The LangWatch-specific global logger provider -- may differ from the\n * current OTel one; the last one `setupObservability` knows about.\n * @internal\n */\nlet currentLoggerProvider: LoggerProvider = NOOP_LOGGER_PROVIDER;\n\n/** Sets the global logger provider that {@link getLangWatchLogger} will use. */\nexport function setLangWatchLoggerProvider(loggerProvider: LoggerProvider): void {\n currentLoggerProvider = loggerProvider;\n}\n\n/**\n * @param name - The logger name (typically your service or module name).\n * @param version - Optional logger version.\n * @returns A {@link LangWatchLogger} instance, or a no-op logger if no provider was set.\n */\nexport function getLangWatchLogger(name: string, version?: string): LangWatchLogger {\n return getLangWatchLoggerFromProvider(currentLoggerProvider, name, version);\n}\n\n/**\n * @param loggerProvider - The OpenTelemetry logger provider to use.\n * @param name - The name of the logger.\n * @param version - Optional logger version.\n * @returns A {@link LangWatchLogger} instance.\n */\nexport function getLangWatchLoggerFromProvider(\n loggerProvider: LoggerProvider,\n name: string,\n version?: string,\n): LangWatchLogger {\n return createLangWatchLogger(loggerProvider.getLogger(name, version));\n}\n\n/**\n * Wraps an OpenTelemetry logger as a LangWatch logger.\n * @param logger - The OpenTelemetry logger to wrap.\n * @returns A {@link LangWatchLogger} instance.\n */\nexport function createLangWatchLogger(logger: Logger): LangWatchLogger {\n return new LangWatchLoggerInternal(logger);\n}\n\n// Export types and implementation\nexport * from \"./types\";\nexport * from \"./implementation\";\n","import { context } from \"@opentelemetry/api\";\nimport { type AnyValue, type Logger } from \"@opentelemetry/api-logs\";\n\nimport { shouldCaptureOutput } from \"../config\";\nimport * as intSemconv from \"../semconv\";\nimport { type SemConvLogRecordAttributes } from \"../semconv\";\nimport {\n type EmitOptions,\n type LangWatchLogger,\n type LangWatchLogRecord,\n type LangWatchSpanGenAIAssistantMessageEventBody,\n type LangWatchSpanGenAIChoiceEventBody,\n type LangWatchSpanGenAISystemMessageEventBody,\n type LangWatchSpanGenAIToolMessageEventBody,\n type LangWatchSpanGenAIUserMessageEventBody,\n} from \"./types\";\n\n/** Internal implementation of {@link LangWatchLogger}. Wraps OpenTelemetry\n * logger with LangWatch functionality. Use {@link getLangWatchLogger} instead. */\nexport class LangWatchLoggerInternal implements LangWatchLogger {\n constructor(private logger: Logger) {}\n\n // Delegates to the wrapped OTel logger rather than always returning `true`:\n // the underlying logger is what actually knows whether a processor is\n // registered, so this is what keeps `enabled()` truthful for a caller that\n // wraps a no-op provider (e.g. `getLangWatchLogger` before setup runs).\n enabled(options?: Parameters<Logger[\"enabled\"]>[0]): boolean {\n return this.logger.enabled(options);\n }\n\n emit(logRecord: LangWatchLogRecord, options?: EmitOptions): void {\n // Handle output capture configuration\n if (!shouldCaptureOutput()) {\n logRecord.body = void 0;\n }\n\n // Set context if not provided and not explicitly excluded\n if (!logRecord.context && !options?.excludeContext) {\n logRecord.context = context.active();\n }\n\n // Emit the log record through the underlying OpenTelemetry logger\n this.logger.emit(logRecord);\n }\n\n emitGenAISystemMessageEvent(\n body: LangWatchSpanGenAISystemMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: SemConvLogRecordAttributes,\n ): void {\n this.emitGenAIEvent(\n intSemconv.LOG_EVNT_GEN_AI_SYSTEM_MESSAGE,\n {\n ...body,\n role: body.role ?? \"system\",\n } satisfies LangWatchSpanGenAISystemMessageEventBody,\n {\n ...attributes,\n \"gen_ai.system\": system,\n },\n );\n }\n\n emitGenAIUserMessageEvent(\n body: LangWatchSpanGenAIUserMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: SemConvLogRecordAttributes,\n ) {\n this.emitGenAIEvent(\n intSemconv.LOG_EVNT_GEN_AI_USER_MESSAGE,\n {\n ...body,\n role: body.role ?? \"user\",\n } satisfies LangWatchSpanGenAIUserMessageEventBody,\n {\n ...attributes,\n \"gen_ai.system\": system,\n },\n );\n }\n\n emitGenAIAssistantMessageEvent(\n body: LangWatchSpanGenAIAssistantMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: SemConvLogRecordAttributes,\n ) {\n this.emitGenAIEvent(\n intSemconv.LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE,\n {\n ...body,\n role: body.role ?? \"assistant\",\n } satisfies LangWatchSpanGenAIAssistantMessageEventBody,\n {\n ...attributes,\n \"gen_ai.system\": system,\n },\n );\n }\n\n emitGenAIToolMessageEvent(\n body: LangWatchSpanGenAIToolMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: SemConvLogRecordAttributes,\n ) {\n if (body.role === void 0) {\n body.role = \"tool\";\n }\n\n this.emitGenAIEvent(\n intSemconv.LOG_EVNT_GEN_AI_TOOL_MESSAGE,\n { ...body },\n {\n ...attributes,\n \"gen_ai.system\": system,\n },\n );\n }\n\n emitGenAIChoiceEvent(\n body: LangWatchSpanGenAIChoiceEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: SemConvLogRecordAttributes,\n ) {\n if (body.message && body.message.role === void 0) {\n body.message.role = \"assistant\";\n }\n\n this.emitGenAIEvent(\n intSemconv.LOG_EVNT_GEN_AI_CHOICE,\n {\n ...body,\n message: { ...body.message, role: body.message?.role ?? \"assistant\" },\n } satisfies LangWatchSpanGenAIChoiceEventBody,\n {\n ...attributes,\n \"gen_ai.system\": system,\n },\n );\n }\n\n private emitGenAIEvent(\n eventName: string,\n body: AnyValue,\n attributes?: SemConvLogRecordAttributes,\n ): void {\n this.emit({\n eventName,\n context: context.active(),\n attributes: { ...attributes },\n body: shouldCaptureOutput() ? body : void 0,\n observedTimestamp: new Date().getTime(),\n });\n }\n}\n"]}
|
|
File without changes
|