langwatch 1.9.0 → 1.11.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/dist/agent/index.d.mts +301 -0
- package/dist/agent/index.d.ts +301 -0
- package/dist/agent/index.js +1468 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/index.mjs +1424 -0
- package/dist/agent/index.mjs.map +1 -0
- package/dist/{chunk-NFFB3DWW.js → chunk-2PD3YA5H.js} +17 -6
- package/dist/chunk-2PD3YA5H.js.map +1 -0
- package/dist/{chunk-HUMHSRVP.js → chunk-AJDFFRSW.js} +12 -12
- package/dist/{chunk-HUMHSRVP.js.map → chunk-AJDFFRSW.js.map} +1 -1
- package/dist/{chunk-4XQHESU7.mjs → chunk-BS5CNZ5S.mjs} +17 -6
- package/dist/chunk-BS5CNZ5S.mjs.map +1 -0
- package/dist/{chunk-A52LX4C4.mjs → chunk-VMNKKJVI.mjs} +2 -2
- package/dist/cli/bundle.js +722 -379
- package/dist/{implementation-BvwOB77X.d.ts → implementation-D58yPTJW.d.ts} +1 -1
- package/dist/{implementation-C1F0eCHp.d.mts → implementation-aczLxVpV.d.mts} +1 -1
- package/dist/index.d.mts +166 -3
- package/dist/index.d.ts +166 -3
- package/dist/index.js +292 -60
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +261 -29
- 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 +2 -2
- package/dist/observability-sdk/index.mjs +1 -1
- 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/setup/node/index.js +3 -3
- package/dist/observability-sdk/setup/node/index.mjs +2 -2
- package/dist/{types-C3NpCWi_.d.mts → types-BmMuUDrO.d.mts} +3858 -657
- package/dist/{types-jx13nj4M.d.ts → types-D_YNU-VL.d.ts} +3858 -657
- package/package.json +8 -1
- package/dist/chunk-4XQHESU7.mjs.map +0 -1
- package/dist/chunk-NFFB3DWW.js.map +0 -1
- /package/dist/{chunk-A52LX4C4.mjs.map → chunk-VMNKKJVI.mjs.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.26_tsx@4.22.4_typescript@6.0.3_yaml@2.9.0/node_modules/tsup/assets/esm_shims.js","../../src/logger/index.ts","../../src/agent/client.ts","../../src/agent/identity.ts","../../package.json","../../src/internal/constants.ts","../../src/internal/endpoint.ts","../../src/agent/protocol.ts","../../src/agent/schema.ts","../../src/agent/transport.ts","../../src/agent/define.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","// Logger utility for SDKs\n//\n// Usage:\n// - If you pass your own Logger implementation, the SDK will use it as-is (no log level filtering or prefixing applied).\n// - If you use ConsoleLogger, you can specify log level and prefix options.\n// - NoOpLogger disables all logging.\n//\n// Example:\n// const logger = new ConsoleLogger({ level: \"warn\", prefix: \"SDK\" });\n// logger.info(\"This will not show\");\n// logger.warn(\"This will show with prefix\");\n//\n// // If you pass your own logger, SDK will not filter logs:\n// const customLogger: Logger = { ... };\n// // SDK uses customLogger as-is\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nconst logLevelOrder: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n} as const;\n\nexport interface Logger {\n debug: (message: string, ...args: unknown[]) => void;\n info: (message: string, ...args: unknown[]) => void;\n warn: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n}\n\nexport class NoOpLogger implements Logger {\n debug: () => void = () => { /* noop */ }\n info: () => void = () => { /* noop */ }\n warn: () => void = () => { /* noop */ }\n error: () => void = () => { /* noop */ }\n}\n\ninterface ConsoleLoggerOptions {\n level: LogLevel;\n prefix?: string;\n}\n\n/**\n * ConsoleLogger applies log level filtering and optional prefixing.\n * If you pass your own Logger, the SDK will not apply log level filtering or prefixing.\n */\nexport class ConsoleLogger implements Logger {\n private level: LogLevel;\n private prefix?: string;\n\n constructor(options: ConsoleLoggerOptions = { level: \"warn\" }) {\n this.level = options.level;\n this.prefix = options.prefix;\n }\n\n private shouldLog(level: LogLevel): boolean {\n return logLevelOrder[level] >= logLevelOrder[this.level];\n }\n\n private format(message: string): string {\n return this.prefix ? `[${this.prefix}] ${message}` : message;\n }\n\n debug: (message: string, ...args: unknown[]) => void = (message: string, ...args: unknown[]): void => {\n if (this.shouldLog(\"debug\")) console.debug(this.format(message), ...args);\n };\n info: (message: string, ...args: unknown[]) => void = (message: string, ...args: unknown[]): void => {\n if (this.shouldLog(\"info\")) console.info(this.format(message), ...args);\n };\n warn: (message: string, ...args: unknown[]) => void = (message: string, ...args: unknown[]): void => {\n if (this.shouldLog(\"warn\")) console.warn(this.format(message), ...args);\n }\n error: (message: string, ...args: unknown[]) => void = (message: string, ...args: unknown[]): void => {\n if (this.shouldLog(\"error\")) console.error(this.format(message), ...args);\n }\n}\n","/**\n * One shared connection per process to `/api/v1/agents/connect`.\n *\n * The client holds every agent the process defined, registers them all on\n * one socket, answers `call` frames by running the agent's function, and\n * reconnects with backoff when the platform goes away. Nothing in here throws\n * into customer code: every frame is handled under a catch that logs, and a\n * failure on the LangWatch side produces one warning that names the fix and\n * leaves the application running as if the wrapper were absent.\n *\n * @see dev/docs/adr/128-connected-agents.md\n */\n\nimport { context, propagation, trace } from \"@opentelemetry/api\";\nimport type { Logger } from \"../logger\";\nimport type { AgentCall, AgentResult } from \"./define\";\nimport {\n buildConnectHeaders,\n buildInstance,\n resolveConnectUrl,\n resolveHttpConnectUrl,\n SDK_IDENTITY,\n} from \"./identity\";\nimport {\n parseServerFrame,\n PROTOCOL_VERSION,\n serializeFrame,\n traceIdFromTraceparent,\n type AgentParameterValue,\n type CallFrame,\n type ClientFrame,\n type RefusedFrame,\n type RegisterAgent,\n type RegisterInstance,\n type RegisteredFrame,\n} from \"./protocol\";\nimport { AgentParameterError, type ParameterReader } from \"./schema\";\nimport {\n type AgentTransport,\n defaultSocketFactory,\n HttpLongPollSocket,\n NoWebSocketError,\n resolveTransport,\n type SocketFactory,\n type SocketLike,\n} from \"./transport\";\n\n/** One defined agent as the client runs it. */\nexport interface AgentRuntime {\n name: string;\n environment: string;\n register: RegisterAgent;\n /** Defaults, coercion and the schema's own validation, before every call. */\n readParams: ParameterReader;\n concurrency: number;\n timeoutMs: number;\n run: (call: AgentCall<Record<string, AgentParameterValue>>) => Promise<AgentResult>;\n}\n\nexport interface AgentClientConfig {\n apiKey: string;\n endpoint?: string;\n projectId?: string;\n instanceLabel?: string;\n /** `websocket` (default) or `http`; also `LANGWATCH_AGENT_TRANSPORT`. */\n transport?: AgentTransport;\n logger: Logger;\n socketFactory?: SocketFactory;\n /** Reconnect delays, for tests. Defaults to 1 s doubling up to 30 s. */\n backoff?: { baseMs: number; maxMs: number };\n /** How often the same unreachable-endpoint warning may repeat, for tests. */\n failureNoticeIntervalMs?: number;\n}\n\nexport const RECONNECT_BASE_MS = 1_000;\nexport const RECONNECT_MAX_MS = 30_000;\n/** The unreachable-endpoint warning repeats at most this often. */\nexport const FAILURE_NOTICE_INTERVAL_MS = 5 * 60_000;\n\n/** The delay before reconnect attempt `attempt` (0-based), with jitter, in the 1 s to 30 s window. */\nexport function reconnectDelayMs({\n attempt,\n baseMs = RECONNECT_BASE_MS,\n maxMs = RECONNECT_MAX_MS,\n random = Math.random,\n}: {\n attempt: number;\n baseMs?: number;\n maxMs?: number;\n random?: () => number;\n}): number {\n const exponential = Math.min(maxMs, baseMs * 2 ** Math.min(attempt, 16));\n const jittered = exponential * (0.75 + random() * 0.5);\n return Math.round(Math.min(maxMs, Math.max(baseMs, jittered)));\n}\n\nconst NOT_CONNECTED = \"not connected to LangWatch\";\n\n/** The one line a refusal produces: what went wrong and what fixes it. */\nexport function refusalAdvice(frame: RefusedFrame): string {\n switch (frame.code) {\n case \"project_required\": {\n const projects = Array.isArray(frame.meta?.projects) ? frame.meta.projects : [];\n const listed = projects\n .map((project) => {\n const entry = project as { id?: unknown; name?: unknown };\n const id = typeof entry.id === \"string\" ? entry.id : \"\";\n const name = typeof entry.name === \"string\" ? entry.name : \"\";\n return name && id ? `${name} (${id})` : id || name;\n })\n .filter((line) => line !== \"\");\n return `the API key reaches more than one project. Set LANGWATCH_PROJECT_ID to one of: ${listed.length > 0 ? listed.join(\", \") : \"the projects the key reaches\"}.`;\n }\n case \"api_key_invalid\":\n return \"the API key is not valid. Set LANGWATCH_API_KEY to a key from the project settings.\";\n case \"key_type_not_allowed\":\n return \"this key type cannot connect agents. Set LANGWATCH_API_KEY to a personal or project API key.\";\n case \"permission_denied\":\n return \"the API key cannot manage scenarios. Use a key with the scenarios:manage permission.\";\n case \"protocol_invalid\":\n return `${frame.message} Update the langwatch package to a version that speaks protocol ${PROTOCOL_VERSION} or later.`;\n case \"replica_count_unsupported\":\n return `${frame.message} Connected agents on a LangWatch deployment without Redis need one app replica.`;\n case \"parameters_invalid\":\n case \"environment_invalid\":\n return frame.message;\n default:\n return `${frame.message} (${frame.code})`;\n }\n}\n\ninterface InFlightCall {\n runtime: AgentRuntime;\n /** True once the call was cancelled or timed out: a late result is dropped. */\n cancelled: boolean;\n /** The timer that ends the call on its deadline, cleared when the call ends. */\n timer: NodeJS.Timeout | null;\n}\n\nconst SHUTDOWN_SIGNALS = [\"SIGINT\", \"SIGTERM\"] as const;\ntype ShutdownSignal = (typeof SHUTDOWN_SIGNALS)[number];\n\nconst CLOSE_GRACE_MS = 500;\n\nconst describeError = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nexport class AgentClient {\n private readonly agents: AgentRuntime[] = [];\n private readonly byId = new Map<string, AgentRuntime>();\n private readonly inFlight = new Map<string, InFlightCall>();\n private readonly instance: RegisterInstance;\n private readonly url: string;\n private readonly httpUrl: string;\n private readonly headers: Record<string, string>;\n /** The transport in use: the configured one, or HTTP after a refused upgrade. */\n private activeTransport: AgentTransport;\n private upgradeStatus: number | null = null;\n private transportAnnounced = false;\n private readonly logger: Logger;\n private readonly openSocket: SocketFactory;\n private readonly backoff: { baseMs: number; maxMs: number };\n private readonly failureNoticeIntervalMs: number;\n\n private socket: SocketLike | null = null;\n private registered = false;\n private stopped = false;\n /** True while a socket is closed on purpose to register the full agent list again. */\n private restarting = false;\n private attempt = 0;\n private connectTimer: NodeJS.Timeout | null = null;\n private watchdog: NodeJS.Timeout | null = null;\n private heartbeatIntervalMs = 10_000;\n private closeWaiters: Array<() => void> = [];\n private lastError: string | null = null;\n private failureNoticeAt: number | null = null;\n private gaveUp = false;\n\n constructor(config: AgentClientConfig) {\n this.instance = buildInstance({ label: config.instanceLabel });\n this.url = resolveConnectUrl(config.endpoint);\n this.httpUrl = resolveHttpConnectUrl(config.endpoint);\n this.activeTransport = resolveTransport({ explicit: config.transport });\n this.headers = buildConnectHeaders({ apiKey: config.apiKey, projectId: config.projectId });\n this.logger = config.logger;\n this.openSocket = config.socketFactory ?? defaultSocketFactory;\n this.backoff = config.backoff ?? { baseMs: RECONNECT_BASE_MS, maxMs: RECONNECT_MAX_MS };\n this.failureNoticeIntervalMs = config.failureNoticeIntervalMs ?? FAILURE_NOTICE_INTERVAL_MS;\n }\n\n get instanceId(): string {\n return this.instance.id;\n }\n\n /** The transport the client speaks now. */\n get transport(): AgentTransport {\n return this.activeTransport;\n }\n\n get isRegistered(): boolean {\n return this.registered;\n }\n\n /** True once the client gave up: refused, or no socket implementation. No timer is left behind. */\n get isStopped(): boolean {\n return this.stopped;\n }\n\n /** True while a reconnect is scheduled with a timer that keeps the process up. */\n get hasPendingConnect(): boolean {\n return this.connectTimer?.hasRef() ?? false;\n }\n\n /** True while the client is between attempts or inside one, with the process kept up. */\n get isRetrying(): boolean {\n if (this.stopped) return false;\n return this.connectTimer ? this.connectTimer.hasRef() : this.socket !== null;\n }\n\n /** Adds an agent and connects on the next tick, or reconnects when a socket is already open. */\n addAgent(runtime: AgentRuntime): void {\n this.agents.push(runtime);\n if (this.gaveUp) {\n this.logger.debug(`agent \"${runtime.name}\" ${NOT_CONNECTED}: the connection gave up earlier in this process`);\n return;\n }\n this.stopped = false;\n if (this.socket) {\n // The platform ignores a second register on an open socket, whether the\n // first one is still on its way or already answered. A fresh socket\n // carries the complete list.\n this.restartSocket();\n return;\n }\n this.scheduleConnect(0);\n }\n\n /** Closes the socket and connects again at once, keeping the reconnect loop. */\n private restartSocket(): void {\n const socket = this.socket;\n if (!socket) return;\n this.restarting = true;\n try {\n socket.close(1000, \"agents changed\");\n } catch {\n this.restarting = false;\n this.socket = null;\n this.scheduleConnect(0);\n }\n }\n\n /** Removes an agent; the last one leaving deregisters and closes the socket. */\n async removeAgent(runtime: AgentRuntime): Promise<void> {\n const index = this.agents.indexOf(runtime);\n if (index !== -1) this.agents.splice(index, 1);\n for (const [id, agent] of this.byId) if (agent === runtime) this.byId.delete(id);\n if (this.agents.length === 0) {\n await this.disconnect();\n return;\n }\n // The open socket registered the agent that just left, and the platform\n // ignores a second register on it. A fresh socket carries the list as it\n // stands now.\n this.restartSocket();\n }\n\n /** Sends deregister, closes the socket and stops reconnecting. */\n async disconnect(): Promise<void> {\n this.stopped = true;\n this.clearTimers();\n const socket = this.socket;\n if (!socket) return;\n if (this.registered) this.send({ type: \"deregister\", protocol: PROTOCOL_VERSION });\n const closed = new Promise<void>((resolve) => this.closeWaiters.push(resolve));\n try {\n socket.close(1000, \"deregister\");\n } catch {\n // The socket is already gone.\n }\n const grace = new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n try {\n socket.terminate();\n } catch {\n // Already gone.\n }\n resolve();\n }, CLOSE_GRACE_MS);\n timer.unref();\n });\n await Promise.race([closed, grace]);\n }\n\n /** Deregister with no wait, for a process that is already exiting. */\n shutdownNow(): void {\n this.stopped = true;\n this.clearTimers();\n if (!this.socket) return;\n try {\n if (this.registered) this.send({ type: \"deregister\", protocol: PROTOCOL_VERSION });\n this.socket.close(1000, \"deregister\");\n } catch {\n // The socket is already gone.\n }\n }\n\n private agentNames(): string {\n return this.agents.map((agent) => `\"${agent.name}\"`).join(\", \") || \"the agent\";\n }\n\n /**\n * The reconnect timer keeps its ref on purpose: a script whose only job is\n * the agent must stay up while it retries. Giving up clears every timer.\n */\n private scheduleConnect(delayMs: number): void {\n if (this.stopped || this.connectTimer || this.socket) return;\n this.connectTimer = setTimeout(() => {\n this.connectTimer = null;\n this.connect();\n }, delayMs);\n }\n\n private clearTimers(): void {\n if (this.connectTimer) {\n clearTimeout(this.connectTimer);\n this.connectTimer = null;\n }\n if (this.watchdog) {\n clearTimeout(this.watchdog);\n this.watchdog = null;\n }\n }\n\n private giveUp(reason: string): void {\n this.stopped = true;\n this.gaveUp = true;\n this.clearTimers();\n this.logger.warn(`agent ${this.agentNames()} ${NOT_CONNECTED}: ${reason}`);\n }\n\n private connect(): void {\n if (this.stopped || this.socket) return;\n let socket: SocketLike;\n try {\n socket =\n this.activeTransport === \"http\"\n ? new HttpLongPollSocket({ url: this.httpUrl, headers: this.headers })\n : this.openSocket({ url: this.url, headers: this.headers });\n } catch (error) {\n if (error instanceof NoWebSocketError) {\n this.giveUp(\n \"the ws package is not installed. Run npm install ws; the platform reads the API key from a request header, and only ws can send it.\",\n );\n return;\n }\n this.lastError = describeError(error);\n this.onClosed();\n return;\n }\n this.socket = socket;\n socket.onOpen(() => this.guard(() => this.send(this.registerFrame())));\n socket.onMessage((data) => this.guard(() => this.onMessage(data)));\n socket.onError((error) => {\n this.lastError = describeError(error);\n });\n socket.onPing(() => this.armWatchdog());\n socket.onUpgradeRefused?.((status) => {\n this.upgradeStatus = status;\n });\n socket.onClose((code) => this.guard(() => this.onClosed(code)));\n }\n\n private onClosed(code?: number): void {\n const wasRegistered = this.registered;\n const restarting = this.restarting;\n this.restarting = false;\n this.socket = null;\n this.registered = false;\n if (this.watchdog) {\n clearTimeout(this.watchdog);\n this.watchdog = null;\n }\n for (const waiter of this.closeWaiters.splice(0)) waiter();\n if (this.stopped) return;\n if (this.upgradeStatus !== null && this.activeTransport === \"websocket\") {\n // A proxy answered the upgrade with a status: the socket can never\n // open here, and the same frames travel over plain HTTP.\n const status = this.upgradeStatus;\n this.upgradeStatus = null;\n this.activeTransport = \"http\";\n this.logger.warn(\n `the WebSocket upgrade to ${this.url} was answered with HTTP ${status}; using the HTTP transport at ${this.httpUrl} instead`,\n );\n this.scheduleConnect(0);\n return;\n }\n if (restarting) {\n this.scheduleConnect(0);\n return;\n }\n const delay = reconnectDelayMs({ attempt: this.attempt, ...this.backoff });\n this.attempt += 1;\n this.noteDisconnected({ wasRegistered, code });\n this.scheduleConnect(delay);\n }\n\n /**\n * One warning when the platform cannot be reached, one when a live\n * connection is lost, and silence while the retries run: the same notice\n * repeats only after the notice interval, and a reconnect resets it.\n */\n private noteDisconnected({ wasRegistered, code }: { wasRegistered: boolean; code?: number }): void {\n const now = Date.now();\n if (wasRegistered) {\n this.logger.warn(\n `lost the connection to LangWatch${code === undefined ? \"\" : ` (${code})`}, reconnecting with backoff`,\n );\n this.failureNoticeAt = now;\n return;\n }\n const stale =\n this.failureNoticeAt === null || now - this.failureNoticeAt >= this.failureNoticeIntervalMs;\n if (!stale) return;\n this.failureNoticeAt = now;\n const cause = this.lastError ? ` (${this.lastError})` : \"\";\n this.logger.warn(\n `agent ${this.agentNames()} ${NOT_CONNECTED}: could not reach ${this.url}${cause}. Check LANGWATCH_ENDPOINT and the network; retrying with backoff.`,\n );\n }\n\n private armWatchdog(): void {\n if (this.watchdog) clearTimeout(this.watchdog);\n const socket = this.socket;\n if (!socket) return;\n this.watchdog = setTimeout(() => {\n this.watchdog = null;\n this.logger.warn(\"no heartbeat from LangWatch, reconnecting\");\n try {\n socket.terminate();\n } catch {\n // The close event follows either way.\n }\n }, Math.max(15_000, this.heartbeatIntervalMs * 3));\n }\n\n private registerFrame(): ClientFrame {\n return {\n type: \"register\",\n protocol: PROTOCOL_VERSION,\n sdk: SDK_IDENTITY,\n instance: { ...this.instance, inFlightCallIds: [...this.inFlight.keys()] },\n agents: this.agents.map((agent) => agent.register),\n };\n }\n\n private send(frame: ClientFrame): void {\n const socket = this.socket;\n if (!socket) return;\n try {\n socket.send(serializeFrame(frame));\n } catch (error) {\n this.logger.debug(`could not send ${frame.type}: ${describeError(error)}`);\n }\n }\n\n private onMessage(data: string): void {\n const frame = parseServerFrame(data);\n if (!frame) {\n this.logger.debug(\"dropped a frame the SDK does not know\");\n return;\n }\n this.armWatchdog();\n switch (frame.type) {\n case \"registered\":\n this.onRegistered(frame);\n return;\n case \"refused\":\n this.onRefused(frame);\n return;\n case \"call\":\n void this.onCall(frame);\n return;\n case \"cancel\": {\n const call = this.inFlight.get(frame.callId);\n if (!call) return;\n call.cancelled = true;\n // The handler may run for as long as it wants; the slot it held is\n // free at once, so the next call is not refused as busy.\n this.releaseCall({ callId: frame.callId, entry: call });\n return;\n }\n }\n }\n\n private onRefused(frame: RefusedFrame): void {\n this.giveUp(refusalAdvice(frame));\n try {\n this.socket?.close(1000, frame.code);\n } catch {\n // The platform closes after refused either way.\n }\n }\n\n private onRegistered(frame: RegisteredFrame): void {\n this.registered = true;\n this.attempt = 0;\n if (this.failureNoticeAt !== null) {\n this.logger.info(\"connected to LangWatch\");\n this.failureNoticeAt = null;\n }\n if (this.activeTransport === \"http\" && !this.transportAnnounced) {\n this.transportAnnounced = true;\n this.logger.info(`connected to LangWatch over HTTP long polling at ${this.httpUrl}`);\n }\n this.heartbeatIntervalMs = frame.heartbeatIntervalMs;\n if (frame.instanceId && frame.instanceId !== this.instance.id) this.instance.id = frame.instanceId;\n this.byId.clear();\n for (const entry of frame.agents) {\n const runtime = this.agents.find(\n (agent) => agent.name === entry.name && agent.environment === entry.environment,\n );\n if (!runtime) continue;\n this.byId.set(entry.id, runtime);\n this.logger.info(\n `agent \"${entry.name}\" (${entry.environment}) is online${entry.url ? `: ${entry.url}` : \"\"}`,\n );\n for (const note of entry.parameterNotes) this.logger.warn(`agent \"${entry.name}\": ${note}`);\n }\n this.armWatchdog();\n }\n\n private async onCall(frame: CallFrame): Promise<void> {\n const runtime = this.byId.get(frame.agentId);\n if (!runtime) {\n this.sendError({\n callId: frame.callId,\n code: \"agent_call_failed\",\n message: `no agent registered as ${frame.agentId}`,\n });\n return;\n }\n const busy = [...this.inFlight.values()].filter((call) => call.runtime === runtime).length;\n if (busy >= runtime.concurrency) {\n this.sendError({\n callId: frame.callId,\n code: \"agent_busy\",\n message: `agent \"${runtime.name}\" has ${busy} call${busy === 1 ? \"\" : \"s\"} in flight, its limit`,\n });\n return;\n }\n if (frame.deadlineAt !== null && frame.deadlineAt <= Date.now()) {\n this.sendError({\n callId: frame.callId,\n code: \"agent_call_timeout\",\n message: \"the call deadline passed before it started\",\n });\n return;\n }\n\n // The slot is taken before the first await. Reading the parameters is\n // asynchronous, and a second call arriving inside that window would pass\n // the concurrency check above if the entry were written after it.\n const entry: InFlightCall = { runtime, cancelled: false, timer: null };\n this.inFlight.set(frame.callId, entry);\n\n let params: Record<string, AgentParameterValue>;\n try {\n params = await runtime.readParams(frame.params);\n } catch (error) {\n this.releaseCall({ callId: frame.callId, entry });\n this.sendError({\n callId: frame.callId,\n code: \"agent_parameter_invalid\",\n message: describeError(error),\n });\n return;\n }\n if (entry.cancelled) {\n this.releaseCall({ callId: frame.callId, entry });\n return;\n }\n\n // The ack means the function started: before it the platform may hand the\n // call to another instance, so it stays after the parameters are read.\n this.send({ type: \"ack\", protocol: PROTOCOL_VERSION, callId: frame.callId });\n this.armCallDeadline({ frame, entry, runtime });\n\n const parent = frame.traceparent\n ? propagation.extract(context.active(), { traceparent: frame.traceparent })\n : context.active();\n const traceId =\n trace.getSpanContext(parent)?.traceId ?? traceIdFromTraceparent(frame.traceparent) ?? \"\";\n\n const call: AgentCall<Record<string, AgentParameterValue>> = {\n messages: frame.messages,\n newMessages: frame.newMessages,\n threadId: frame.threadId,\n session: frame.session,\n params,\n traceId,\n };\n\n try {\n const result = await context.with(parent, () => runtime.run(call));\n if (entry.cancelled) return;\n this.send({\n type: \"result\",\n protocol: PROTOCOL_VERSION,\n callId: frame.callId,\n output: result.output,\n ...(result.session === undefined ? {} : { session: result.session }),\n });\n } catch (error) {\n if (entry.cancelled) return;\n const code = error instanceof AgentParameterError ? error.code : \"agent_call_failed\";\n const message = describeError(error);\n this.logger.warn(`agent \"${runtime.name}\" call ${frame.callId} failed: ${message}`);\n this.sendError({ callId: frame.callId, code, message });\n } finally {\n this.releaseCall({ callId: frame.callId, entry });\n }\n }\n\n /** Frees the slot the call holds and drops its deadline timer. */\n private releaseCall({ callId, entry }: { callId: string; entry: InFlightCall }): void {\n if (entry.timer) {\n clearTimeout(entry.timer);\n entry.timer = null;\n }\n if (this.inFlight.get(callId) === entry) this.inFlight.delete(callId);\n }\n\n /**\n * The call ends on its deadline: one timeout result, and the slot is free\n * from that moment. A handler that never returns then costs one call, not\n * every call after it.\n */\n private armCallDeadline({\n frame,\n entry,\n runtime,\n }: {\n frame: CallFrame;\n entry: InFlightCall;\n runtime: AgentRuntime;\n }): void {\n const fromDeadline = frame.deadlineAt === null ? Infinity : frame.deadlineAt - Date.now();\n const limit = Math.min(fromDeadline, runtime.timeoutMs);\n if (!Number.isFinite(limit)) return;\n const timer = setTimeout(() => {\n entry.timer = null;\n if (entry.cancelled) return;\n // The handler keeps running: a function cannot be stopped from here.\n // Its late result is dropped, because the platform has an answer.\n entry.cancelled = true;\n this.releaseCall({ callId: frame.callId, entry });\n this.logger.warn(\n `agent \"${runtime.name}\" call ${frame.callId} passed its ${limit} ms limit`,\n );\n this.sendError({\n callId: frame.callId,\n code: \"agent_call_timeout\",\n message: `the call passed the ${limit} ms limit of agent \"${runtime.name}\"`,\n });\n }, Math.max(0, limit));\n timer.unref();\n entry.timer = timer;\n }\n\n private sendError({ callId, code, message }: { callId: string; code: string; message: string }): void {\n this.send({ type: \"result\", protocol: PROTOCOL_VERSION, callId, error: { code, message } });\n }\n\n private guard(action: () => void): void {\n try {\n action();\n } catch (error) {\n this.logger.error(`agent client error: ${describeError(error)}`);\n }\n }\n}\n\nlet shared: AgentClient | null = null;\nlet sharedKey: string | null = null;\nlet hooksInstalled = false;\nconst noticesGiven = new Set<string>();\nlet testOverrides: Partial<AgentClientConfig> = {};\n\nconst signalHandlers = new Map<ShutdownSignal, () => void>();\n\nconst onShutdownSignal = (signal: ShutdownSignal): void => {\n const client = shared;\n const finish = () => {\n const handler = signalHandlers.get(signal);\n if (handler) process.removeListener(signal, handler);\n if (process.listenerCount(signal) === 0) process.kill(process.pid, signal);\n };\n if (!client) {\n finish();\n return;\n }\n void client.disconnect().finally(finish);\n};\n\nconst onBeforeExit = (): void => {\n shared?.shutdownNow();\n};\n\nconst installShutdownHooks = (): void => {\n if (hooksInstalled) return;\n hooksInstalled = true;\n for (const signal of SHUTDOWN_SIGNALS) {\n const handler = () => onShutdownSignal(signal);\n signalHandlers.set(signal, handler);\n process.on(signal, handler);\n }\n process.on(\"beforeExit\", onBeforeExit);\n};\n\nconst removeShutdownHooks = (): void => {\n if (!hooksInstalled) return;\n hooksInstalled = false;\n for (const [signal, handler] of signalHandlers) process.removeListener(signal, handler);\n signalHandlers.clear();\n process.removeListener(\"beforeExit\", onBeforeExit);\n};\n\n/** One warning per process for a condition every agent definition would repeat. */\nexport function warnOnce({ logger, key, message }: { logger: Logger; key: string; message: string }): void {\n if (noticesGiven.has(key)) {\n logger.debug(message);\n return;\n }\n noticesGiven.add(key);\n logger.warn(message);\n}\n\n/**\n * The one client of this process. The first agent's credentials and endpoint\n * are the ones used; a later agent that names different ones is told so and\n * shares the socket anyway.\n */\nexport function getSharedClient(config: AgentClientConfig): AgentClient {\n const key = `${config.endpoint ?? \"\"}|${config.projectId ?? \"\"}|${config.apiKey}`;\n if (shared) {\n if (sharedKey !== key) {\n warnOnce({\n logger: config.logger,\n key: \"credentials-differ\",\n message:\n \"connectAgent: this process already has an agent connection with other credentials or endpoint; the first ones are used\",\n });\n }\n return shared;\n }\n shared = new AgentClient({ ...config, ...testOverrides });\n sharedKey = key;\n installShutdownHooks();\n return shared;\n}\n\n/** Settings the next shared client is built with, on top of what the agent gave. For tests. */\nexport function overrideSharedClientForTests(overrides: Partial<AgentClientConfig>): void {\n testOverrides = overrides;\n}\n\n/** Drops the shared client so the next definition starts a new one. For tests. */\nexport async function resetSharedClient(): Promise<void> {\n const client = shared;\n shared = null;\n sharedKey = null;\n noticesGiven.clear();\n testOverrides = {};\n removeShutdownHooks();\n if (client) await client.disconnect();\n}\n\n/** The client the process shares right now, so a test can read its state. */\nexport function sharedClientForTests(): AgentClient | null {\n return shared;\n}\n\n/** The shutdown handlers as installed, so a test can drive a signal without raising it. */\nexport const shutdownForTests = { onShutdownSignal, onBeforeExit };\n","/**\n * Who and where a connected agent is: its environment, its instance identity\n * and the endpoint it connects to. Every read of the machine is defensive, so\n * a locked-down sandbox with no hostname or no passwd entry still connects.\n */\n\nimport * as os from \"node:os\";\nimport { randomUUID } from \"node:crypto\";\nimport { LANGWATCH_SDK_VERSION } from \"../internal/constants\";\nimport { resolveEndpoint } from \"../internal/endpoint\";\nimport type { RegisterInstance, RegisterSdk } from \"./protocol\";\n\nexport const DEFAULT_ENVIRONMENT = \"development\";\nconst ENVIRONMENT_MAX_LENGTH = 32;\n\n/** The environment variables read in order after the explicit option. */\nconst ENVIRONMENT_VARIABLES = [\n \"LANGWATCH_AGENT_ENVIRONMENT\",\n \"APP_ENV\",\n \"ENVIRONMENT\",\n \"NODE_ENV\",\n] as const;\n\nconst isSet = (value: string | undefined): value is string =>\n typeof value === \"string\" && value.trim() !== \"\";\n\n/**\n * An environment name as the platform stores it: lowercase, `[a-z0-9_-]`\n * only, at most 32 characters. Anything else collapses to a dash, and an\n * empty result is the default environment.\n */\nexport function sanitizeEnvironment(name: string): string {\n const cleaned = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, ENVIRONMENT_MAX_LENGTH)\n .replace(/-+$/g, \"\");\n return cleaned === \"\" ? DEFAULT_ENVIRONMENT : cleaned;\n}\n\n/**\n * The environment an agent registers under: the explicit option, then\n * `LANGWATCH_AGENT_ENVIRONMENT`, `APP_ENV`, `ENVIRONMENT`, `NODE_ENV`, else\n * `development`.\n */\nexport function resolveEnvironment({\n explicit,\n env = process.env,\n}: {\n explicit?: string;\n env?: NodeJS.ProcessEnv;\n}): string {\n if (isSet(explicit)) return sanitizeEnvironment(explicit);\n for (const name of ENVIRONMENT_VARIABLES) {\n const value = env[name];\n if (isSet(value)) return sanitizeEnvironment(value);\n }\n return DEFAULT_ENVIRONMENT;\n}\n\nconst isTruthy = (value: string | undefined): boolean => {\n if (!isSet(value)) return false;\n const lowered = value.trim().toLowerCase();\n return lowered !== \"0\" && lowered !== \"false\" && lowered !== \"no\" && lowered !== \"off\";\n};\n\n/**\n * Whether the agent connects at all. `LANGWATCH_AGENT_CONNECT=0` (or false)\n * always disables it; the explicit option wins next; otherwise the connection\n * is on, except when `CI` is truthy.\n */\nexport function resolveEnabled({\n explicit,\n env = process.env,\n}: {\n explicit?: boolean;\n env?: NodeJS.ProcessEnv;\n}): boolean {\n const flag = env.LANGWATCH_AGENT_CONNECT;\n if (isSet(flag) && !isTruthy(flag)) return false;\n if (explicit !== undefined) return explicit;\n return !isTruthy(env.CI);\n}\n\n/** The instance label: the option, then `LANGWATCH_AGENT_INSTANCE_LABEL`. */\nexport function resolveInstanceLabel({\n explicit,\n env = process.env,\n}: {\n explicit?: string;\n env?: NodeJS.ProcessEnv;\n}): string | undefined {\n if (isSet(explicit)) return explicit.trim();\n const fromEnv = env.LANGWATCH_AGENT_INSTANCE_LABEL;\n return isSet(fromEnv) ? fromEnv.trim() : undefined;\n}\n\n/** The two reads of the machine, replaceable so a test can make them fail. */\nexport interface MachineReader {\n hostname: () => string;\n userInfo: () => { username: string };\n}\n\nconst HOST_LABEL_MAX_LENGTH = 24;\n\n/**\n * A short label for this machine: lowercase, `[a-z0-9-]`, 24 characters.\n *\n * The platform scopes a development agent connected with a project key to\n * this label, and the Python SDK sends the same shape, so one machine reads\n * the same whichever SDK connected it.\n */\nexport function hostLabel(hostname: string): string {\n return hostname\n .toLowerCase()\n .replace(/\\.(local|lan|home|localdomain)$/i, \"\")\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, HOST_LABEL_MAX_LENGTH);\n}\n\nconst readHostname = (machine: MachineReader): string => {\n try {\n return hostLabel(machine.hostname());\n } catch {\n return \"\";\n }\n};\n\nconst readUsername = (machine: MachineReader): string => {\n try {\n return machine.userInfo().username;\n } catch {\n return \"\";\n }\n};\n\n/** The identity one process announces in `register`, built once. */\nexport function buildInstance({\n label,\n machine = os,\n}: {\n label?: string;\n machine?: MachineReader;\n}): RegisterInstance {\n return {\n id: `inst_${randomUUID().replace(/-/g, \"\")}`,\n hostname: readHostname(machine),\n username: readUsername(machine),\n pid: process.pid,\n startedAt: new Date().toISOString(),\n ...(label ? { label } : {}),\n inFlightCallIds: [],\n };\n}\n\n/** The SDK block of `register`. */\nexport const SDK_IDENTITY: RegisterSdk = {\n name: \"langwatch-typescript\",\n version: LANGWATCH_SDK_VERSION,\n language: \"typescript\",\n};\n\nexport const USER_AGENT = `langwatch-typescript/${LANGWATCH_SDK_VERSION}`;\n\nexport const CONNECT_PATH = \"/api/v1/agents/connect\";\n\n/**\n * The socket URL for an endpoint: `https://app.langwatch.ai` becomes\n * `wss://app.langwatch.ai/api/v1/agents/connect`, `http://localhost:5560`\n * becomes `ws://localhost:5560/api/v1/agents/connect`.\n */\nexport function resolveConnectUrl(endpoint?: string | null): string {\n const base = resolveEndpoint(endpoint);\n const socketBase = base.replace(/^http(s?):\\/\\//i, (_match, secure: string) =>\n secure ? \"wss://\" : \"ws://\",\n );\n return `${socketBase}${CONNECT_PATH}`;\n}\n\n/**\n * The base of the HTTP long-poll routes for an endpoint:\n * `https://app.langwatch.ai` becomes `https://app.langwatch.ai/api/v1/agents/connect`.\n */\nexport function resolveHttpConnectUrl(endpoint?: string | null): string {\n return `${resolveEndpoint(endpoint)}${CONNECT_PATH}`;\n}\n\n/** The headers the socket opens with. */\nexport function buildConnectHeaders({\n apiKey,\n projectId,\n}: {\n apiKey: string;\n projectId?: string;\n}): Record<string, string> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${apiKey}`,\n \"User-Agent\": USER_AGENT,\n };\n if (isSet(projectId)) headers[\"X-Project-Id\"] = projectId;\n return headers;\n}\n","{\n \"name\": \"langwatch\",\n \"version\": \"1.11.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 \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"author\": \"LangWatch\",\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=20\",\n \"pnpm\": \">=8\"\n },\n \"files\": [\n \"dist\",\n \"!dist/bin\",\n \"!dist/cli/*.map\",\n \"!dist/plugin\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"bin\": {\n \"lw\": \"./dist/cli/index.js\",\n \"langwatch\": \"./dist/cli/index.js\"\n },\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/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 \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/langwatch/langwatch.git\",\n \"directory\": \"typescript-sdk\"\n },\n \"scripts\": {\n \"generate\": \"pnpm run generate:server-types && pnpm run generate:openapi-types\",\n \"cli\": \"node dist/cli/index.js\",\n \"prelint\": \"pnpm run generate\",\n \"lint\": \"eslint .\",\n \"pretest\": \"pnpm run generate\",\n \"test\": \"vitest\",\n \"test:unit\": \"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 -- bash -c 'cd ../../platform/app && pnpm prisma:seed'\",\n \"prebuild\": \"pnpm run generate\",\n \"build\": \"tsc --noEmit && 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 \"build:plugin-hook\": \"tsup --config tsup.plugin-hook.config.ts\",\n \"tarball\": \"pnpm build && pnpm pack\",\n \"typecheck\": \"tsc --noEmit\",\n \"prepublish\": \"pnpm run build\",\n \"generate:openapi-types\": \"pnpm exec openapi-typescript ../../platform/app/src/app/api/openapiLangWatch.json -o ./src/internal/generated/openapi/api-client.ts && node scripts/patch-generated-openapi.mjs\",\n \"generate:server-types\": \"./copy-types.sh\"\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/langy\": \"workspace:*\",\n \"@opentelemetry/sdk-node\": \"0.221.0\",\n \"@opentelemetry/sdk-trace-node\": \"^2.0.1\",\n \"@opentelemetry/sdk-trace-web\": \">=2.0.1\",\n \"@types/debug\": \"^4.1.12\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/node\": \"^26.2.0\",\n \"@types/prompts\": \"^2.4.9\",\n \"@types/ws\": \"^8.18.1\",\n \"@vercel/otel\": \"^1.13.0\",\n \"@vitest/coverage-v8\": \"^4.1.0\",\n \"dotenv-cli\": \"^11.0.0\",\n \"esbuild\": \"^0.28.1\",\n \"eslint\": \"^9.32.0\",\n \"fets\": \"^0.8.5\",\n \"fishery\": \"^2.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 \"tsup\": \"^8.5.0\",\n \"typescript\": \"^6.0.3\",\n \"typescript-eslint\": \"^8.38.0\",\n \"vitest\": \"^4.1.0\",\n \"vitest-mock-extended\": \"^5.1.1\",\n \"yaml\": \"^2.8.1\"\n },\n \"dependencies\": {\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/api-logs\": \"0.221.0\",\n \"@opentelemetry/core\": \"^2.0.1\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"0.221.0\",\n \"@opentelemetry/exporter-trace-otlp-http\": \"0.221.0\",\n \"@opentelemetry/instrumentation\": \"0.221.0\",\n \"@opentelemetry/resources\": \"^2.0.1\",\n \"@opentelemetry/sdk-logs\": \"0.221.0\",\n \"@opentelemetry/sdk-metrics\": \"^2.0.1\",\n \"@opentelemetry/sdk-node\": \"^0.221.0\",\n \"@opentelemetry/sdk-trace-base\": \"^2.0.1\",\n \"@opentelemetry/semantic-conventions\": \"^1.36.0\",\n \"chalk\": \"^6.0.0\",\n \"cloudflared\": \"0.7.1\",\n \"commander\": \"^15.0.0\",\n \"dotenv\": \"^17.3.1\",\n \"js-yaml\": \"^5.2.0\",\n \"jsonc-parser\": \"^3.3.1\",\n \"liquidjs\": \"^10.27.0\",\n \"open\": \"^11.0.0\",\n \"openapi-fetch\": \"^0.17.0\",\n \"ora\": \"^9.3.0\",\n \"prompts\": \"^2.4.2\",\n \"ws\": \"^8.21.0\",\n \"xksuid\": \"^0.0.4\",\n \"zod\": \"^4.0.14\"\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/context-async-hooks\": \"^2.1.0\",\n \"@opentelemetry/context-zone\": \">=1.19.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-async-hooks\": {\n \"optional\": true\n },\n \"@opentelemetry/context-zone\": {\n \"optional\": true\n },\n \"@opentelemetry/sdk-trace-web\": {\n \"optional\": true\n },\n \"langchain\": {\n \"optional\": true\n }\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","/**\n * Single place where a configured LangWatch endpoint becomes a usable base URL.\n *\n * Most services build request URLs by concatenation — `${endpoint}/api/...` —\n * and every path already carries its own leading slash. A trailing slash on the\n * endpoint therefore yields `https://app.langwatch.ai//api/experiment/init`,\n * which the router does not match, and the caller gets an opaque\n * `{\"error\":\"Not Found\"}` with nothing pointing at the real cause. Normalizing\n * at the point of resolution keeps every call site free of that concern.\n */\n\nimport { DEFAULT_ENDPOINT } from \"./constants\";\n\nconst isSet = (value: string | null | undefined): value is string =>\n typeof value === \"string\" && value.trim() !== \"\";\n\n/**\n * Trim surrounding whitespace and drop any trailing slashes.\n *\n * Scanned rather than matched with `/\\/+$/`: a repeated character class bound\n * to an anchor backtracks from every start index, which is quadratic on a\n * string of many slashes. The endpoint is configuration rather than attacker\n * input, but a linear scan costs nothing and leaves no such edge to reason\n * about.\n */\nexport const normalizeEndpoint = (endpoint: string): string => {\n const trimmed = endpoint.trim();\n let end = trimmed.length;\n while (end > 0 && trimmed[end - 1] === \"/\") end--;\n return trimmed.slice(0, end);\n};\n\n/**\n * Resolve the endpoint from an explicit value, then `LANGWATCH_ENDPOINT`, then\n * the cloud default. Blank values are treated as unset so that an empty\n * `LANGWATCH_ENDPOINT=` in a `.env` falls through to the default rather than\n * producing relative request URLs.\n */\nexport const resolveEndpoint = (endpoint?: string | null): string => {\n for (const candidate of [endpoint, process.env.LANGWATCH_ENDPOINT]) {\n if (!isSet(candidate)) continue;\n const normalized = normalizeEndpoint(candidate);\n if (normalized !== \"\") return normalized;\n }\n return normalizeEndpoint(DEFAULT_ENDPOINT);\n};\n\n/**\n * The OTLP logs endpoint an environment asks for, per the OTel exporter spec:\n * the signal-specific variable wins and is used verbatim; the generic variable\n * is a base that `/v1/logs` hangs off. Null when neither is set, which means no\n * OTLP transport rather than a default one.\n *\n * It lives here rather than beside either of its callers because both need it\n * and their module graphs must stay apart. The CLI's live event channel loads\n * the OpenTelemetry logs pipeline and the card contract; the session context\n * hook is bundled into a zero-dependency single file that ships inside the\n * agent plugin. Reaching into the event channel for this one pure env read\n * would put the whole telemetry graph in that bundle.\n */\nexport const resolveLogsEndpoint = (\n env: NodeJS.ProcessEnv = process.env,\n): string | null => {\n const signal = env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT?.trim();\n if (signal) return signal;\n\n const generic = env.OTEL_EXPORTER_OTLP_ENDPOINT?.trim();\n if (generic) return `${normalizeEndpoint(generic)}/v1/logs`;\n\n return null;\n};\n","/**\n * The frames the SDK and the platform exchange over the agent socket.\n *\n * Every frame is one JSON text message with a `type` and the protocol\n * version. The shapes here match the contract table in ADR-128 and the\n * platform's own frame module; the validators are small and hand-written\n * because this file is part of the public `langwatch/agent` surface, where no\n * schema library may cross as a value.\n *\n * @see dev/docs/adr/128-connected-agents.md\n */\n\nexport const PROTOCOL_VERSION = 1;\n\n/** One conversation message, OpenAI style. Extra keys are carried as is. */\nexport interface AgentMessage {\n role: string;\n content?: unknown;\n [key: string]: unknown;\n}\n\n/** The value of one run parameter as the platform sends it. */\nexport type AgentParameterValue = string | number | boolean;\n\n/** A JSON Schema object as the SDK sends it in `register`. */\nexport type JsonSchemaObject = Record<string, unknown>;\n\nexport interface RegisterSdk {\n name: string;\n version: string;\n language: string;\n}\n\nexport interface RegisterInstance {\n id: string;\n hostname: string;\n username: string;\n pid: number;\n startedAt: string;\n label?: string;\n inFlightCallIds: string[];\n}\n\nexport interface RegisterAgent {\n name: string;\n environment: string;\n parameters: JsonSchemaObject;\n concurrency?: number;\n timeoutMs?: number;\n sticky?: boolean;\n}\n\nexport interface RegisterFrame {\n type: \"register\";\n protocol: typeof PROTOCOL_VERSION;\n sdk: RegisterSdk;\n instance: RegisterInstance;\n agents: RegisterAgent[];\n}\n\nexport interface AckFrame {\n type: \"ack\";\n protocol: typeof PROTOCOL_VERSION;\n callId: string;\n}\n\nexport interface CallError {\n code: string;\n message: string;\n}\n\nexport type ResultFrame =\n | {\n type: \"result\";\n protocol: typeof PROTOCOL_VERSION;\n callId: string;\n output: unknown;\n session?: unknown;\n }\n | {\n type: \"result\";\n protocol: typeof PROTOCOL_VERSION;\n callId: string;\n error: CallError;\n };\n\nexport interface DeregisterFrame {\n type: \"deregister\";\n protocol: typeof PROTOCOL_VERSION;\n}\n\n/** Everything the SDK sends. */\nexport type ClientFrame = RegisterFrame | AckFrame | ResultFrame | DeregisterFrame;\n\nexport interface RegisteredAgent {\n name: string;\n environment: string;\n id: string;\n url: string;\n parameterNotes: string[];\n}\n\nexport interface RegisteredFrame {\n type: \"registered\";\n protocol: number;\n agents: RegisteredAgent[];\n heartbeatIntervalMs: number;\n instanceId: string;\n}\n\nexport interface RefusedFrame {\n type: \"refused\";\n protocol: number;\n code: string;\n message: string;\n /** Extra data for one code, for example the projects a key reaches under `project_required`. */\n meta?: Record<string, unknown>;\n}\n\nexport interface CallRun {\n scenarioRunId?: string;\n scenarioName?: string;\n batchRunId?: string;\n}\n\nexport interface CallFrame {\n type: \"call\";\n protocol: number;\n callId: string;\n agentId: string;\n threadId: string;\n messages: AgentMessage[];\n newMessages: AgentMessage[];\n params: Record<string, AgentParameterValue>;\n session: unknown;\n traceparent: string | null;\n /** Epoch milliseconds, null when the platform sent none. */\n deadlineAt: number | null;\n run: CallRun;\n}\n\nexport interface CancelFrame {\n type: \"cancel\";\n protocol: number;\n callId: string;\n}\n\n/** Everything the platform sends. */\nexport type ServerFrame = RegisteredFrame | RefusedFrame | CallFrame | CancelFrame;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isString = (value: unknown): value is string => typeof value === \"string\";\n\nconst isMessageList = (value: unknown): value is AgentMessage[] =>\n Array.isArray(value) && value.every((item) => isRecord(item) && isString(item.role));\n\nconst isStringList = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(isString);\n\nconst readRegistered = (frame: Record<string, unknown>): RegisteredFrame | null => {\n if (!Array.isArray(frame.agents) || !isString(frame.instanceId)) return null;\n const agents: RegisteredAgent[] = [];\n for (const entry of frame.agents) {\n if (!isRecord(entry) || !isString(entry.name)) return null;\n const id = isString(entry.id) ? entry.id : isString(entry.agentId) ? entry.agentId : null;\n if (id === null) return null;\n agents.push({\n name: entry.name,\n environment: isString(entry.environment) ? entry.environment : \"\",\n id,\n url: isString(entry.url) ? entry.url : \"\",\n parameterNotes: isStringList(entry.parameterNotes) ? entry.parameterNotes : [],\n });\n }\n return {\n type: \"registered\",\n protocol: typeof frame.protocol === \"number\" ? frame.protocol : PROTOCOL_VERSION,\n agents,\n heartbeatIntervalMs:\n typeof frame.heartbeatIntervalMs === \"number\" ? frame.heartbeatIntervalMs : 10_000,\n instanceId: frame.instanceId,\n };\n};\n\nconst readRefused = (frame: Record<string, unknown>): RefusedFrame => ({\n type: \"refused\",\n protocol: typeof frame.protocol === \"number\" ? frame.protocol : PROTOCOL_VERSION,\n code: isString(frame.code) ? frame.code : \"agent_register_refused\",\n message: isString(frame.message) ? frame.message : \"The platform refused the registration.\",\n ...(isRecord(frame.meta) ? { meta: frame.meta } : {}),\n});\n\nconst readParams = (value: unknown): Record<string, AgentParameterValue> => {\n if (!isRecord(value)) return {};\n const params: Record<string, AgentParameterValue> = {};\n for (const [name, item] of Object.entries(value)) {\n if (typeof item === \"string\" || typeof item === \"number\" || typeof item === \"boolean\") {\n params[name] = item;\n }\n }\n return params;\n};\n\n/** A deadline as epoch milliseconds, from a number or an ISO string. */\nconst readDeadline = (value: unknown): number | null => {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (isString(value)) {\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? null : parsed;\n }\n return null;\n};\n\nconst readCall = (frame: Record<string, unknown>): CallFrame | null => {\n if (!isString(frame.callId) || !isString(frame.agentId)) return null;\n const messages = isMessageList(frame.messages) ? frame.messages : [];\n const run = isRecord(frame.run) ? frame.run : {};\n return {\n type: \"call\",\n protocol: typeof frame.protocol === \"number\" ? frame.protocol : PROTOCOL_VERSION,\n callId: frame.callId,\n agentId: frame.agentId,\n threadId: isString(frame.threadId) ? frame.threadId : \"\",\n messages,\n newMessages: isMessageList(frame.newMessages) ? frame.newMessages : messages,\n params: readParams(frame.params),\n session: frame.session === undefined ? null : frame.session,\n traceparent: isString(frame.traceparent) ? frame.traceparent : null,\n deadlineAt: readDeadline(frame.deadlineAt),\n run: {\n ...(isString(run.scenarioRunId) ? { scenarioRunId: run.scenarioRunId } : {}),\n ...(isString(run.scenarioName) ? { scenarioName: run.scenarioName } : {}),\n ...(isString(run.batchRunId) ? { batchRunId: run.batchRunId } : {}),\n },\n };\n};\n\n/**\n * Reads one text message from the platform into a typed frame, or null when\n * the message is not a frame this protocol version knows. Unknown types and\n * malformed frames are dropped rather than thrown, so a newer platform never\n * crashes an older SDK.\n */\nexport function parseServerFrame(raw: string): ServerFrame | null {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n if (!isRecord(parsed) || !isString(parsed.type)) return null;\n switch (parsed.type) {\n case \"registered\":\n return readRegistered(parsed);\n case \"refused\":\n return readRefused(parsed);\n case \"call\":\n return readCall(parsed);\n case \"cancel\":\n return isString(parsed.callId)\n ? {\n type: \"cancel\",\n protocol: typeof parsed.protocol === \"number\" ? parsed.protocol : PROTOCOL_VERSION,\n callId: parsed.callId,\n }\n : null;\n default:\n return null;\n }\n}\n\n/** One frame as the text the socket carries. */\nexport function serializeFrame(frame: ClientFrame): string {\n return JSON.stringify(frame);\n}\n\n/** The trace id of a W3C traceparent header, or null when it does not parse. */\nexport function traceIdFromTraceparent(traceparent: string | null | undefined): string | null {\n if (!traceparent) return null;\n const parts = traceparent.trim().split(\"-\");\n const traceId = parts[1];\n if (parts.length < 4 || !traceId || !/^[0-9a-f]{32}$/i.test(traceId)) return null;\n return traceId.toLowerCase();\n}\n","/**\n * The run parameters an agent declares, and the values a call supplies.\n *\n * Three forms are accepted: a definition map, any Standard JSON Schema object\n * (read through `\"~standard\".jsonSchema`, so zod 4, valibot and arktype work\n * without this package importing them), or a plain JSON Schema. A schema\n * library instance that offers no JSON Schema converter is refused with the\n * three forms named, because the SDK never takes a zod instance as a value.\n */\n\nimport type { AgentParameterValue, JsonSchemaObject } from \"./protocol\";\n\n/** The scalar types a run parameter may hold. */\nexport type ParameterType = \"string\" | \"number\" | \"boolean\";\n\n/** One entry of the definition map. */\nexport interface ParameterDefinition {\n /** The value type. Read from `options`, then `default`, else string. */\n type?: ParameterType;\n /** A closed list of accepted values. */\n options?: readonly string[];\n /** The value a run takes when it does not supply one. Without it the parameter is required. */\n default?: AgentParameterValue;\n description?: string;\n}\n\n/** Parameters declared by name. */\nexport type ParameterDefinitions = Record<string, ParameterDefinition>;\n\n/**\n * The Standard JSON Schema converter an object exposes under `\"~standard\"`.\n * Method syntax on purpose: a library narrows `target` to its own union, and\n * a method parameter is checked bivariantly, so zod 4, valibot and arktype\n * all fit without the SDK naming any of them.\n */\nexport interface StandardJsonSchemaConverter {\n input?(options: { readonly target: string }): Record<string, unknown>;\n output?(options: { readonly target: string }): Record<string, unknown>;\n}\n\n/** One problem a Standard Schema `validate` reports. */\nexport interface StandardSchemaIssue {\n readonly message: string;\n readonly path?: ReadonlyArray<PropertyKey | { readonly key: PropertyKey }> | undefined;\n}\n\nexport type StandardSchemaResult<O> =\n | { readonly value: O; readonly issues?: undefined }\n | { readonly issues: ReadonlyArray<StandardSchemaIssue> };\n\n/**\n * Any object that implements the Standard JSON Schema interface. When it also\n * implements Standard Schema (`validate`), the values of every call go\n * through it before the handler runs, so a zod 4 schema validates, fills its\n * defaults and types `params` in one place.\n */\nexport interface StandardJsonSchema<O = unknown> {\n readonly \"~standard\": {\n readonly jsonSchema: StandardJsonSchemaConverter;\n validate?(value: unknown): StandardSchemaResult<O> | Promise<StandardSchemaResult<O>>;\n /** Type-only, from Standard Schema: the parsed output type. */\n readonly types?: { readonly input: unknown; readonly output: O } | undefined;\n };\n}\n\n/** The `params` type a Standard Schema object gives the handler: its parsed output. */\nexport type InferStandardOutput<S> = S extends { readonly \"~standard\": { readonly types?: infer T } }\n ? [NonNullable<T>] extends [never]\n ? Record<string, AgentParameterValue>\n : NonNullable<T> extends { readonly output: infer O }\n ? O extends Record<string, unknown>\n ? O\n : Record<string, AgentParameterValue>\n : Record<string, AgentParameterValue>\n : Record<string, AgentParameterValue>;\n\n/** Every form `parameters` accepts. */\nexport type ParameterInput = ParameterDefinitions | StandardJsonSchema | JsonSchemaObject;\n\n/** One parameter as the platform lists it, derived from the schema. */\nexport interface ParameterSpec {\n name: string;\n type: ParameterType;\n options?: string[];\n default?: AgentParameterValue;\n description?: string;\n required?: boolean;\n}\n\n/** The refusal of a parameter definition or of a value a call supplied. */\nexport class AgentParameterError extends Error {\n readonly code = \"agent_parameter_invalid\";\n constructor(message: string) {\n super(message);\n this.name = \"AgentParameterError\";\n }\n}\n\nconst ACCEPTED_FORMS =\n \"parameters must be a definition map ({ model: { options: [...], default: '...' } }), a Standard JSON Schema object (one with \\\"~standard\\\".jsonSchema), or a JSON Schema object ({ type: 'object', properties })\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isStandardJsonSchema = (value: unknown): value is StandardJsonSchema => {\n if (!isRecord(value)) return false;\n const standard = value[\"~standard\"];\n return isRecord(standard) && isRecord(standard.jsonSchema);\n};\n\nconst isJsonSchemaObject = (value: unknown): value is JsonSchemaObject =>\n isRecord(value) && value.type === \"object\" && isRecord(value.properties);\n\nconst isDefinitionMap = (value: unknown): value is ParameterDefinitions =>\n isRecord(value) && Object.values(value).every(isRecord);\n\nconst definitionType = (definition: ParameterDefinition): ParameterType => {\n if (definition.type) return definition.type;\n if (definition.options) return \"string\";\n const value = definition.default;\n if (typeof value === \"number\") return \"number\";\n if (typeof value === \"boolean\") return \"boolean\";\n return \"string\";\n};\n\nconst definitionMapToSchema = (definitions: ParameterDefinitions): JsonSchemaObject => {\n const properties: Record<string, Record<string, unknown>> = {};\n const required: string[] = [];\n for (const [name, definition] of Object.entries(definitions)) {\n const property: Record<string, unknown> = { type: definitionType(definition) };\n if (definition.options) property.enum = [...definition.options];\n if (definition.default !== undefined) property.default = definition.default;\n else required.push(name);\n if (definition.description !== undefined) property.description = definition.description;\n properties[name] = property;\n }\n const schema: JsonSchemaObject = { type: \"object\", properties };\n if (required.length > 0) schema.required = required;\n return schema;\n};\n\nconst readStandardJsonSchema = (input: StandardJsonSchema): JsonSchemaObject => {\n const converter = input[\"~standard\"].jsonSchema;\n const options = { target: \"draft-2020-12\" };\n const schema = converter.input?.(options) ?? converter.output?.(options);\n if (schema === undefined) {\n throw new AgentParameterError(`the \"~standard\".jsonSchema converter has no input function; ${ACCEPTED_FORMS}`);\n }\n if (!isRecord(schema)) {\n throw new AgentParameterError(`the \"~standard\".jsonSchema converter returned no object; ${ACCEPTED_FORMS}`);\n }\n return schema;\n};\n\n/**\n * The parameter schema the `register` frame carries, from any accepted form.\n * No parameters is an object schema with no properties.\n */\nexport function toParameterSchema(input: ParameterInput | undefined): JsonSchemaObject {\n if (input === undefined) return { type: \"object\", properties: {} };\n if (isStandardJsonSchema(input)) return readStandardJsonSchema(input);\n if (isJsonSchemaObject(input)) return input;\n if (isDefinitionMap(input)) return definitionMapToSchema(input);\n throw new AgentParameterError(ACCEPTED_FORMS);\n}\n\nconst specType = (property: Record<string, unknown>): ParameterType => {\n const type = Array.isArray(property.type)\n ? property.type.find((item) => item !== \"null\")\n : property.type;\n if (type === \"number\" || type === \"integer\") return \"number\";\n if (type === \"boolean\") return \"boolean\";\n return \"string\";\n};\n\nconst scalar = (value: unknown): AgentParameterValue | undefined =>\n typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\"\n ? value\n : undefined;\n\n/**\n * The parameters a schema declares, one spec per property, the way the\n * platform lists them. Unsupported property types read as text.\n */\nexport function parameterSpecsFromSchema(schema: JsonSchemaObject): ParameterSpec[] {\n const properties = isRecord(schema.properties) ? schema.properties : {};\n const required = new Set(Array.isArray(schema.required) ? schema.required : []);\n const specs: ParameterSpec[] = [];\n for (const [name, raw] of Object.entries(properties)) {\n const property = isRecord(raw) ? raw : {};\n const spec: ParameterSpec = { name, type: specType(property) };\n const options = Array.isArray(property.enum)\n ? property.enum.filter((item): item is string => typeof item === \"string\")\n : undefined;\n if (options && options.length > 0) spec.options = options;\n const fallback = scalar(property.default);\n if (fallback !== undefined) spec.default = fallback;\n if (typeof property.description === \"string\") spec.description = property.description;\n spec.required = fallback === undefined && required.has(name);\n specs.push(spec);\n }\n return specs;\n}\n\nconst coerce = ({\n spec,\n value,\n}: {\n spec: ParameterSpec;\n value: AgentParameterValue;\n}): AgentParameterValue => {\n if (spec.type === \"number\") {\n const asNumber = typeof value === \"number\" ? value : Number(value);\n if (typeof value === \"boolean\" || !Number.isFinite(asNumber) || String(value).trim() === \"\") {\n throw new AgentParameterError(`parameter \"${spec.name}\" must be a number, got ${JSON.stringify(value)}`);\n }\n return asNumber;\n }\n if (spec.type === \"boolean\") {\n if (typeof value === \"boolean\") return value;\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n throw new AgentParameterError(`parameter \"${spec.name}\" must be true or false, got ${JSON.stringify(value)}`);\n }\n const asString = typeof value === \"string\" ? value : String(value);\n if (spec.options && !spec.options.includes(asString)) {\n throw new AgentParameterError(\n `parameter \"${spec.name}\" must be one of ${spec.options.join(\", \")}, got ${JSON.stringify(value)}`,\n );\n }\n return asString;\n};\n\n/**\n * The values the handler receives: every declared parameter, from the call or\n * from its default. A required parameter with no value, or a value of the\n * wrong type or outside the options, is refused with `agent_parameter_invalid`\n * before the handler runs. Names the schema does not declare pass through.\n */\nexport function resolveParameterValues({\n specs,\n supplied,\n}: {\n specs: ParameterSpec[];\n supplied: Record<string, AgentParameterValue> | undefined;\n}): Record<string, AgentParameterValue> {\n const values: Record<string, AgentParameterValue> = { ...(supplied ?? {}) };\n for (const spec of specs) {\n const value = values[spec.name];\n if (value === undefined) {\n if (spec.default !== undefined) {\n values[spec.name] = spec.default;\n continue;\n }\n if (!spec.required) continue;\n throw new AgentParameterError(`parameter \"${spec.name}\" is required and the run did not supply it`);\n }\n values[spec.name] = coerce({ spec, value });\n }\n return values;\n}\n\nconst issuePath = (issue: StandardSchemaIssue): string =>\n (issue.path ?? [])\n .map((segment) =>\n typeof segment === \"object\" && segment !== null ? String(segment.key) : String(segment),\n )\n .join(\".\");\n\n/**\n * The values after the schema's own `validate`: a zod 4 schema refines,\n * fills its defaults and strips what it does not declare. A refusal names\n * every issue with its path. Names the schema does not declare pass through\n * untouched, so a scenario-declared parameter still reaches the handler.\n */\nexport async function validateParameterValues({\n schema,\n values,\n}: {\n schema: StandardJsonSchema;\n values: Record<string, AgentParameterValue>;\n}): Promise<Record<string, AgentParameterValue>> {\n const standard = schema[\"~standard\"];\n const result = await standard.validate?.(values);\n if (result === undefined) return values;\n if (result.issues) {\n const detail = result.issues\n .map((issue) => {\n const path = issuePath(issue);\n return path ? `${path}: ${issue.message}` : issue.message;\n })\n .join(\"; \");\n throw new AgentParameterError(`parameters refused by the schema: ${detail}`);\n }\n const parsed = isRecord(result.value) ? (result.value as Record<string, AgentParameterValue>) : {};\n return { ...values, ...parsed };\n}\n\n/** What every call's parameters go through before the handler runs. */\nexport type ParameterReader = (\n supplied: Record<string, AgentParameterValue> | undefined,\n) => Promise<Record<string, AgentParameterValue>>;\n\n/**\n * The reader of one agent: defaults and coercion from the specs, then the\n * schema's own validation when the input carries one.\n */\nexport function createParameterReader({\n input,\n specs,\n}: {\n input: ParameterInput | undefined;\n specs: ParameterSpec[];\n}): ParameterReader {\n const schema = isStandardJsonSchema(input) ? input : undefined;\n return async (supplied) => {\n const values = resolveParameterValues({ specs, supplied });\n return schema ? validateParameterValues({ schema, values }) : values;\n };\n}\n","/**\n * The connection the client speaks over, behind one small interface so the\n * client never depends on how the frames travel.\n *\n * Two transports carry the same frames. The WebSocket is the default and it\n * needs the `ws` package: the platform authenticates from the request\n * headers of the upgrade, and no global `WebSocket` constructor can send\n * them. HTTP long polling is for a network that blocks WebSockets: one POST\n * registers, a GET waits for the next frames, a POST carries the answers. It\n * speaks through the global `fetch` (Node 20+).\n */\n\nimport { createRequire } from \"node:module\";\nimport type { WebSocket as WsWebSocket } from \"ws\";\n\nexport const AGENT_TRANSPORTS = [\"websocket\", \"http\"] as const;\nexport type AgentTransport = (typeof AGENT_TRANSPORTS)[number];\n\n/** The header the poll and frames requests carry the instance token in. */\nexport const INSTANCE_TOKEN_HEADER = \"X-Agent-Instance-Token\";\n\nconst isSet = (value: string | undefined): value is string =>\n typeof value === \"string\" && value.trim() !== \"\";\n\n/**\n * The transport to start with: the explicit option, then\n * `LANGWATCH_AGENT_TRANSPORT`, else the WebSocket. Anything that is not\n * `http` is the WebSocket, which falls back to HTTP on its own when the\n * upgrade is refused.\n */\nexport function resolveTransport({\n explicit,\n env = process.env,\n}: {\n explicit?: string;\n env?: NodeJS.ProcessEnv;\n}): AgentTransport {\n const candidate = isSet(explicit) ? explicit : env.LANGWATCH_AGENT_TRANSPORT;\n return isSet(candidate) && candidate.trim().toLowerCase() === \"http\" ? \"http\" : \"websocket\";\n}\n\nexport interface SocketLike {\n send: (data: string) => void;\n close: (code?: number, reason?: string) => void;\n /** Drop the connection without a close handshake. */\n terminate: () => void;\n onOpen: (listener: () => void) => void;\n onMessage: (listener: (data: string) => void) => void;\n onClose: (listener: (code: number) => void) => void;\n onError: (listener: (error: unknown) => void) => void;\n /** The platform pings for liveness; the pong is automatic, this only reports it. */\n onPing: (listener: () => void) => void;\n /**\n * The upgrade was answered with an HTTP status instead of a switch of\n * protocols: a proxy in the way. Only `ws` can tell; the close follows.\n */\n onUpgradeRefused?: (listener: (status: number) => void) => void;\n}\n\nexport type SocketFactory = (args: { url: string; headers: Record<string, string> }) => SocketLike;\n\n/** Thrown when the `ws` package is not installed. */\nexport class NoWebSocketError extends Error {\n constructor() {\n super(\"the ws package is not installed, so no socket can carry the API key header\");\n this.name = \"NoWebSocketError\";\n }\n}\n\nconst textOf = (data: unknown): string => {\n if (typeof data === \"string\") return data;\n if (Buffer.isBuffer(data)) return data.toString(\"utf8\");\n if (Array.isArray(data)) return Buffer.concat(data as Buffer[]).toString(\"utf8\");\n if (data instanceof ArrayBuffer) return Buffer.from(data).toString(\"utf8\");\n return String(data);\n};\n\nconst wrapWs = (socket: WsWebSocket): SocketLike => {\n const closeListeners: Array<(code: number) => void> = [];\n let closed = false;\n const emitClose = (code: number) => {\n if (closed) return;\n closed = true;\n for (const listener of closeListeners) listener(code);\n };\n socket.on(\"close\", (code) => emitClose(code));\n return {\n send: (data) => socket.send(data),\n close: (code, reason) => socket.close(code, reason),\n terminate: () => socket.terminate(),\n onOpen: (listener) => socket.on(\"open\", listener),\n onMessage: (listener) => socket.on(\"message\", (data) => listener(textOf(data))),\n onClose: (listener) => closeListeners.push(listener),\n onError: (listener) => socket.on(\"error\", listener),\n onPing: (listener) => socket.on(\"ping\", listener),\n onUpgradeRefused: (listener) =>\n socket.on(\"unexpected-response\", (request, response) => {\n listener(response.statusCode ?? 0);\n // With a listener attached, `ws` leaves the request open and emits\n // no close of its own; both are finished here.\n response.resume();\n request.destroy();\n emitClose(1006);\n }),\n };\n};\n\ntype WsConstructor = new (\n url: string,\n options: { headers: Record<string, string> },\n) => WsWebSocket;\n\n/**\n * The `ws` constructor, or null when the package cannot be loaded. It is\n * required rather than imported: a runtime or a bundle without `ws` must\n * reach the factory below and get one clear message, never fail while this\n * module loads.\n */\nconst wsConstructor = (): WsConstructor | null => {\n try {\n const loaded = createRequire(__filename)(\"ws\") as { WebSocket?: unknown };\n return typeof loaded.WebSocket === \"function\" ? (loaded.WebSocket as WsConstructor) : null;\n } catch {\n return null;\n }\n};\n\n/**\n * Opens a socket with `ws`. A global `WebSocket` is no substitute: it takes\n * no request headers, the API key never travels in the URL, and the platform\n * would refuse every socket it opened.\n */\nexport const defaultSocketFactory: SocketFactory = ({ url, headers }) => {\n const Ws = wsConstructor();\n if (!Ws) throw new NoWebSocketError();\n return wrapWs(new Ws(url, { headers }));\n};\n\n// ---------------------------------------------------------------------------\n// HTTP long polling\n// ---------------------------------------------------------------------------\n\n/** The close code the client reads as \"register again at once\". */\nexport const SESSION_LOST_CLOSE_CODE = 1012;\n\n/** How a failed post of a frame is retried before the session is dropped. */\nconst POST_RETRY_DELAYS_MS = [250, 500, 1000];\n\n/**\n * The shortest gap between a poll that answered no frames and the next one.\n * The platform holds a poll for its own wait, so this costs nothing there; it\n * bounds a proxy that answers at once, which would otherwise spin.\n */\nconst EMPTY_POLL_FLOOR_MS = 250;\n\n/**\n * How long a close waits for the queued frames to go out before it drops them.\n * A frames request has no deadline of its own, so a proxy that accepts the\n * request and never answers would otherwise keep the socket from ever\n * reporting its close, and the client that is waiting to open a replacement\n * would wait with it.\n */\nconst CLOSE_DEADLINE_MS = 500;\n\nconst describe = (error: unknown): string => (error instanceof Error ? error.message : String(error));\n\nconst wait = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms).unref());\n\nexport interface HttpLongPollOptions {\n /** `https://app.langwatch.ai/api/v1/agents/connect`, the base the three routes hang off. */\n url: string;\n headers: Record<string, string>;\n fetch?: typeof fetch;\n}\n\n/**\n * The same frames over three requests. `send` of a register frame posts it\n * and starts the poll loop on the registered answer; `send` of any other\n * frame posts it in order; every frame a poll answers with is a message.\n * A poll that is refused, that fails or that names an unknown session ends\n * the connection the way a dropped socket would, and the client reconnects\n * with its own backoff, registering again.\n */\nexport class HttpLongPollSocket implements SocketLike {\n private readonly url: string;\n private readonly headers: Record<string, string>;\n private readonly fetchImpl: typeof fetch;\n private readonly messageListeners: Array<(data: string) => void> = [];\n private readonly closeListeners: Array<(code: number) => void> = [];\n private readonly errorListeners: Array<(error: unknown) => void> = [];\n private readonly pingListeners: Array<() => void> = [];\n private readonly inFlight = new Set<string>();\n private readonly polls = new AbortController();\n private readonly frames = new AbortController();\n private outbox: Promise<void> = Promise.resolve();\n private token: string | null = null;\n private closed = false;\n private closeEmitted = false;\n /** Settled once the register was answered, so a frame sent before it waits. */\n private readonly registered: Promise<void>;\n private settleRegistered: () => void = () => undefined;\n\n constructor(options: HttpLongPollOptions) {\n this.url = options.url;\n this.headers = options.headers;\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== \"function\") {\n throw new Error(\"the HTTP transport needs a global fetch; run on Node 20 or later\");\n }\n this.fetchImpl = fetchImpl;\n this.registered = new Promise<void>((resolve) => {\n this.settleRegistered = resolve;\n });\n }\n\n send(data: string): void {\n let frame: { type?: unknown; callId?: unknown };\n try {\n frame = JSON.parse(data) as { type?: unknown; callId?: unknown };\n } catch {\n return;\n }\n if (frame.type === \"register\") {\n void this.register(data);\n return;\n }\n if (frame.type === \"ack\" && typeof frame.callId === \"string\") this.inFlight.add(frame.callId);\n if (frame.type === \"result\" && typeof frame.callId === \"string\") this.inFlight.delete(frame.callId);\n this.outbox = this.outbox\n .then(() => this.registered)\n .then(() => this.post(data))\n .catch(() => undefined);\n }\n\n /**\n * Stops polling, lets the frames already queued go out, then reports the\n * close. The wait is bounded: on the deadline the frame requests are aborted\n * and the close is reported anyway, so a request that never answers cannot\n * hold the connection open.\n */\n close(code = 1000): void {\n this.closed = true;\n this.polls.abort();\n const deadline = setTimeout(() => {\n this.frames.abort();\n this.emitClose(code);\n }, CLOSE_DEADLINE_MS);\n deadline.unref();\n void this.outbox.finally(() => {\n clearTimeout(deadline);\n this.emitClose(code);\n });\n }\n\n terminate(): void {\n this.closed = true;\n this.polls.abort();\n this.frames.abort();\n this.emitClose(1006);\n }\n\n onOpen(listener: () => void): void {\n // There is nothing to open: the register frame is the first request.\n setTimeout(() => {\n if (!this.closed) listener();\n }, 0);\n }\n\n onMessage(listener: (data: string) => void): void {\n this.messageListeners.push(listener);\n }\n\n onClose(listener: (code: number) => void): void {\n this.closeListeners.push(listener);\n }\n\n onError(listener: (error: unknown) => void): void {\n this.errorListeners.push(listener);\n }\n\n onPing(listener: () => void): void {\n this.pingListeners.push(listener);\n }\n\n private requestHeaders(): Record<string, string> {\n return {\n ...this.headers,\n \"Content-Type\": \"application/json\",\n ...(this.token ? { [INSTANCE_TOKEN_HEADER]: this.token } : {}),\n };\n }\n\n private async register(data: string): Promise<void> {\n let response: Response;\n try {\n response = await this.fetchImpl(`${this.url}/register`, {\n method: \"POST\",\n headers: this.requestHeaders(),\n body: data,\n signal: this.polls.signal,\n });\n } catch (error) {\n if (!this.closed) this.fail(`could not reach ${this.url}/register (${describe(error)})`, 1006);\n return;\n }\n const body = await this.jsonOf(response);\n const frame = body && typeof body.frame === \"object\" && body.frame !== null ? body.frame : null;\n if (!frame) {\n this.fail(`the register request was answered with HTTP ${response.status}`, 1006);\n return;\n }\n if (typeof body?.instanceToken === \"string\") this.token = body.instanceToken;\n this.settleRegistered();\n this.emitMessage(JSON.stringify(frame));\n if ((frame as { type?: unknown }).type !== \"registered\") return;\n if (!this.token) {\n // Registered with no token: no poll can be addressed, so the connection\n // is finished here. The close is what makes the client register again.\n this.fail(\"the register answer carried no instance token\", 1006);\n return;\n }\n void this.pollLoop();\n }\n\n private async pollLoop(): Promise<void> {\n while (!this.closed && this.token) {\n const query = this.inFlight.size > 0 ? `?inFlight=${encodeURIComponent([...this.inFlight].join(\",\"))}` : \"\";\n const startedAt = Date.now();\n let response: Response;\n try {\n response = await this.fetchImpl(`${this.url}/poll${query}`, {\n method: \"GET\",\n headers: this.requestHeaders(),\n signal: this.polls.signal,\n });\n } catch (error) {\n if (!this.closed) this.fail(`the poll failed (${describe(error)})`, 1006);\n return;\n }\n if (this.closed) return;\n if (response.status === 410) {\n this.fail(\"the platform no longer knows this instance, registering again\", SESSION_LOST_CLOSE_CODE);\n return;\n }\n const body = await this.jsonOf(response);\n if (!response.ok) {\n const answered = body && typeof body.frame === \"object\" && body.frame !== null ? body.frame : null;\n if (answered) this.emitMessage(JSON.stringify(answered));\n if ((answered as { type?: unknown } | null)?.type === \"refused\") {\n // The platform refused the credential: the client prints and gives\n // up, and closes the connection itself.\n return;\n }\n this.fail(`the poll was answered with HTTP ${response.status}`, 1006);\n return;\n }\n const frames = Array.isArray(body?.frames) ? (body.frames as unknown[]) : [];\n for (const frame of frames) {\n const entry = frame as { type?: unknown; callId?: unknown };\n if (entry.type === \"cancel\" && typeof entry.callId === \"string\") this.inFlight.delete(entry.callId);\n this.emitMessage(JSON.stringify(frame));\n }\n for (const listener of this.pingListeners) listener();\n if (frames.length === 0) {\n const elapsedMs = Date.now() - startedAt;\n if (elapsedMs < EMPTY_POLL_FLOOR_MS) await wait(EMPTY_POLL_FLOOR_MS - elapsedMs);\n }\n }\n }\n\n private async post(data: string): Promise<void> {\n if (!this.token) return;\n for (let attempt = 0; ; attempt += 1) {\n if (this.frames.signal.aborted) return;\n let response: Response | null = null;\n try {\n response = await this.fetchImpl(`${this.url}/frames`, {\n method: \"POST\",\n headers: this.requestHeaders(),\n body: `{\"frames\":[${data}]}`,\n signal: this.frames.signal,\n });\n } catch {\n if (this.frames.signal.aborted) return;\n response = null;\n }\n if (response?.ok) return;\n if (response?.status === 410) {\n this.fail(\"the platform no longer knows this instance, registering again\", SESSION_LOST_CLOSE_CODE);\n return;\n }\n if (response && response.status < 500) return;\n const delay = POST_RETRY_DELAYS_MS[attempt];\n if (delay === undefined) {\n this.fail(`a frame could not be posted after ${attempt} retries`, 1006);\n return;\n }\n await wait(delay);\n }\n }\n\n private async jsonOf(response: Response): Promise<Record<string, unknown> | null> {\n try {\n const parsed = (await response.json()) as unknown;\n return typeof parsed === \"object\" && parsed !== null ? (parsed as Record<string, unknown>) : null;\n } catch {\n return null;\n }\n }\n\n private fail(message: string, code: number): void {\n for (const listener of this.errorListeners) listener(new Error(message));\n this.closed = true;\n this.polls.abort();\n this.frames.abort();\n this.emitClose(code);\n }\n\n private emitMessage(data: string): void {\n for (const listener of this.messageListeners) listener(data);\n }\n\n private emitClose(code: number): void {\n if (this.closeEmitted) return;\n this.closeEmitted = true;\n // A frame still waiting for the register answer is released; with no\n // token it is dropped, the way a frame on a closed socket is.\n this.settleRegistered();\n for (const listener of this.closeListeners) listener(code);\n }\n}\n","/**\n * `connectAgent`: the function that runs an agent becomes a simulation target.\n *\n * The wrapper resolves the environment and the parameter schema at definition,\n * registers the agent with the process-wide client, and returns a function\n * that is directly callable (for unit tests and local runs) and exposes\n * `disconnect()`.\n *\n * @see specs/typescript-sdk/agent-wrapper.feature\n */\n\nimport { ConsoleLogger, type Logger } from \"../logger\";\nimport { getSharedClient, warnOnce, type AgentRuntime } from \"./client\";\nimport {\n resolveEnabled,\n resolveEnvironment,\n resolveInstanceLabel,\n DEFAULT_ENVIRONMENT,\n} from \"./identity\";\nimport type { AgentMessage, AgentParameterValue, JsonSchemaObject } from \"./protocol\";\nimport type { AgentTransport } from \"./transport\";\nimport {\n AgentParameterError,\n createParameterReader,\n parameterSpecsFromSchema,\n toParameterSchema,\n type InferStandardOutput,\n type ParameterDefinition,\n type ParameterDefinitions,\n type ParameterInput,\n type StandardJsonSchema,\n} from \"./schema\";\n\n/** The default call timeout, and the cap the platform enforces. */\nexport const DEFAULT_TIMEOUT_MS = 120_000;\nexport const MAX_TIMEOUT_MS = 300_000;\n\n/** What a handler may return: a string, one message, a list of messages, or an output with a session. */\nexport type AgentOutput = string | AgentMessage | AgentMessage[];\n\n/** The output of one turn plus the session the agent keeps for the next turn of the same thread. */\nexport interface AgentResult {\n output: AgentOutput;\n session?: unknown;\n}\n\nexport type AgentReply = AgentOutput | AgentResult;\n\n/** The one object a handler receives on every turn. */\nexport interface AgentCall<P = Record<string, AgentParameterValue>> {\n /** The full conversation, OpenAI style. */\n messages: AgentMessage[];\n /** The messages added since the last turn of this thread. */\n newMessages: AgentMessage[];\n /** The platform's conversation id. */\n threadId: string;\n /** The value the handler returned as `session` on the previous turn of this thread, null on the first. */\n session: unknown;\n /** The run parameters, validated and with defaults filled. */\n params: P;\n /** The trace id of the turn, so the agent's own spans join it. Empty when the call carries none. */\n traceId: string;\n}\n\nexport type AgentHandler<P> = (call: AgentCall<P>) => AgentReply | Promise<AgentReply>;\n\n/** What a direct call of the wrapped function takes: messages, and anything else is optional. */\nexport interface DirectAgentCall<P> {\n messages: AgentMessage[];\n newMessages?: AgentMessage[];\n threadId?: string;\n session?: unknown;\n params?: Partial<P>;\n traceId?: string;\n}\n\nexport interface ConnectAgentOptions<P extends ParameterInput = ParameterDefinitions> {\n /** The agent name. One row per name and environment on the platform. */\n name: string;\n /** Resolved from LANGWATCH_AGENT_ENVIRONMENT, APP_ENV, ENVIRONMENT, NODE_ENV, else development. */\n environment?: string;\n /** A definition map, a Standard JSON Schema object, or a JSON Schema object. */\n parameters?: P;\n /** Default true, except when CI is truthy. LANGWATCH_AGENT_CONNECT=0 always disables. */\n enabled?: boolean;\n /** Names this instance in the platform. Also LANGWATCH_AGENT_INSTANCE_LABEL. */\n instanceLabel?: string;\n /** Per call, default 120000, at most 300000. */\n timeoutMs?: number;\n /** Calls in flight per instance, default 1 in development and 4 elsewhere. */\n concurrency?: number;\n /** Keep every turn of a thread on the instance that answered the first one. */\n sticky?: boolean;\n apiKey?: string;\n endpoint?: string;\n projectId?: string;\n /** `websocket` (default, falls back to HTTP when the upgrade is refused) or `http`. Also LANGWATCH_AGENT_TRANSPORT. */\n transport?: AgentTransport;\n logger?: Logger;\n}\n\n/** The wrapped function: callable, and connected until `disconnect()`. */\nexport interface ConnectedAgent<P> {\n (call: DirectAgentCall<P>): Promise<AgentResult>;\n readonly name: string;\n readonly environment: string;\n /** The parameter schema as registered. */\n readonly parameters: JsonSchemaObject;\n /** Send deregister and close the socket when this was the last agent of the process. */\n disconnect: () => Promise<void>;\n}\n\ntype Widen<V> = V extends string ? string : V extends number ? number : V extends boolean ? boolean : V;\n\ntype ParameterValueOf<D extends ParameterDefinition> = D extends {\n options: readonly (infer O extends string)[];\n}\n ? O\n : D extends { type: \"number\" }\n ? number\n : D extends { type: \"boolean\" }\n ? boolean\n : D extends { type: \"string\" }\n ? string\n : D extends { default: infer V }\n ? Widen<V>\n : string;\n\n/** The `params` type a definition map gives the handler. */\nexport type InferParameters<P extends ParameterDefinitions> = {\n [K in keyof P]: ParameterValueOf<P[K]>;\n};\n\nconst isMessage = (value: unknown): value is AgentMessage =>\n typeof value === \"object\" && value !== null && !Array.isArray(value) && typeof (value as AgentMessage).role === \"string\";\n\n/** One of the four reply shapes as the `{ output, session }` the result frame carries. */\nexport function normalizeReply(reply: unknown): AgentResult {\n if (typeof reply === \"string\") return { output: reply };\n if (Array.isArray(reply) && reply.every(isMessage)) return { output: reply };\n if (isMessage(reply)) return { output: reply };\n if (typeof reply === \"object\" && reply !== null && \"output\" in reply) {\n const { output, session } = reply as { output: unknown; session?: unknown };\n const normalized = normalizeReply(output);\n return session === undefined ? normalized : { output: normalized.output, session };\n }\n throw new Error(\n \"the agent handler must return a string, a message, a list of messages, or { output, session }\",\n );\n}\n\nconst clampTimeout = ({ timeoutMs, logger, name }: { timeoutMs: number | undefined; logger: Logger; name: string }): number => {\n if (timeoutMs === undefined) return DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) return DEFAULT_TIMEOUT_MS;\n if (timeoutMs > MAX_TIMEOUT_MS) {\n logger.warn(`agent \"${name}\": timeoutMs ${timeoutMs} is above the ${MAX_TIMEOUT_MS} cap, using the cap`);\n return MAX_TIMEOUT_MS;\n }\n return Math.floor(timeoutMs);\n};\n\nconst readApiKey = (explicit: string | undefined): string | undefined => {\n const candidate = explicit ?? process.env.LANGWATCH_API_KEY;\n return typeof candidate === \"string\" && candidate.trim() !== \"\" ? candidate.trim() : undefined;\n};\n\nconst readProjectId = (explicit: string | undefined): string | undefined => {\n const candidate = explicit ?? process.env.LANGWATCH_PROJECT_ID;\n return typeof candidate === \"string\" && candidate.trim() !== \"\" ? candidate.trim() : undefined;\n};\n\n/**\n * A schema library object (zod 4, valibot, arktype: anything with Standard\n * Schema and Standard JSON Schema) types `params` as its parsed output and\n * validates every call's values before the handler runs.\n */\nexport function connectAgent<const S extends StandardJsonSchema>(\n options: ConnectAgentOptions<S> & { parameters: S },\n handler: AgentHandler<InferStandardOutput<S>>,\n): ConnectedAgent<InferStandardOutput<S>>;\nexport function connectAgent<const P extends ParameterDefinitions = Record<string, never>>(\n options: ConnectAgentOptions<P>,\n handler: AgentHandler<InferParameters<P>>,\n): ConnectedAgent<InferParameters<P>>;\nexport function connectAgent(\n options: ConnectAgentOptions<JsonSchemaObject>,\n handler: AgentHandler<Record<string, AgentParameterValue>>,\n): ConnectedAgent<Record<string, AgentParameterValue>>;\nexport function connectAgent(\n options: ConnectAgentOptions<ParameterInput>,\n handler: AgentHandler<Record<string, AgentParameterValue>>,\n): ConnectedAgent<Record<string, AgentParameterValue>> {\n const logger = options.logger ?? new ConsoleLogger({ level: \"info\", prefix: \"LangWatch\" });\n const name = options.name?.trim();\n if (!name) throw new Error(\"connectAgent needs a name\");\n\n const environment = resolveEnvironment({ explicit: options.environment });\n const parameters = toParameterSchema(options.parameters);\n const specs = parameterSpecsFromSchema(parameters);\n const timeoutMs = clampTimeout({ timeoutMs: options.timeoutMs, logger, name });\n const concurrency = Math.max(\n 1,\n Math.floor(options.concurrency ?? (environment === DEFAULT_ENVIRONMENT ? 1 : 4)),\n );\n\n const runHandler = async (call: AgentCall<Record<string, AgentParameterValue>>): Promise<AgentResult> =>\n normalizeReply(await handler(call));\n\n const readParams = createParameterReader({ input: options.parameters, specs });\n\n const invoke = async (call: DirectAgentCall<Record<string, AgentParameterValue>>): Promise<AgentResult> => {\n const params = await readParams(call.params as Record<string, AgentParameterValue> | undefined);\n return runHandler({\n messages: call.messages,\n newMessages: call.newMessages ?? call.messages,\n threadId: call.threadId ?? `local_${Date.now().toString(36)}`,\n session: call.session ?? null,\n params,\n traceId: call.traceId ?? \"\",\n });\n };\n\n const runtime: AgentRuntime = {\n name,\n environment,\n register: {\n name,\n environment,\n parameters,\n concurrency,\n timeoutMs,\n ...(options.sticky ? { sticky: true } : {}),\n },\n readParams,\n concurrency,\n timeoutMs,\n run: runHandler,\n };\n\n let detach: (() => Promise<void>) | undefined;\n\n if (!resolveEnabled({ explicit: options.enabled })) {\n logger.debug(`agent \"${name}\" not connected to LangWatch: the connection is disabled`);\n } else {\n const apiKey = readApiKey(options.apiKey);\n if (!apiKey) {\n warnOnce({\n logger,\n key: \"no-api-key\",\n message: `agent \"${name}\" not connected to LangWatch: no API key. Set LANGWATCH_API_KEY to run simulations against it.`,\n });\n } else {\n const client = getSharedClient({\n apiKey,\n endpoint: options.endpoint,\n projectId: readProjectId(options.projectId),\n instanceLabel: resolveInstanceLabel({ explicit: options.instanceLabel }),\n transport: options.transport,\n logger,\n });\n client.addAgent(runtime);\n detach = () => client.removeAgent(runtime);\n }\n }\n\n const connected = Object.assign(invoke, {\n environment,\n parameters,\n disconnect: async (): Promise<void> => {\n if (!detach) return;\n const release = detach;\n detach = undefined;\n await release();\n },\n });\n // A function's own `name` is read-only but configurable, so it is defined rather than assigned.\n Object.defineProperty(connected, \"name\", { value: name, configurable: true });\n\n return connected as ConnectedAgent<Record<string, AgentParameterValue>>;\n}\n\nexport { AgentParameterError };\n"],"mappings":"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","names":["isSet","isRecord","path","isSet","call","readParams"]}
|
|
@@ -8,7 +8,7 @@ var _chunkLCG5Y2EGjs = require('./chunk-LCG5Y2EG.js');
|
|
|
8
8
|
var _exportertraceotlphttp = require('@opentelemetry/exporter-trace-otlp-http');
|
|
9
9
|
|
|
10
10
|
// package.json
|
|
11
|
-
var version = "1.
|
|
11
|
+
var version = "1.11.0";
|
|
12
12
|
|
|
13
13
|
// src/internal/runtime.ts
|
|
14
14
|
var _runtime;
|
|
@@ -158,11 +158,22 @@ function isVercelAiSpan(span) {
|
|
|
158
158
|
const scope = (_d = (_c = (_b = (_a = span.instrumentationScope) == null ? void 0 : _a.name) == null ? void 0 : _b.toLowerCase) == null ? void 0 : _c.call(_b)) != null ? _d : "";
|
|
159
159
|
return scope === "ai";
|
|
160
160
|
}
|
|
161
|
+
var HTTP_INSTRUMENTATION_SCOPES = /* @__PURE__ */ new Set([
|
|
162
|
+
"@opentelemetry/instrumentation-http",
|
|
163
|
+
"@opentelemetry/instrumentation-undici",
|
|
164
|
+
"@opentelemetry/instrumentation-fetch"
|
|
165
|
+
]);
|
|
161
166
|
function isHttpRequestSpan(span) {
|
|
162
|
-
var _a;
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
|
|
167
|
+
var _a, _b, _c, _d;
|
|
168
|
+
const scopeName = (_b = (_a = span.instrumentationScope) == null ? void 0 : _a.name) != null ? _b : "";
|
|
169
|
+
if (HTTP_INSTRUMENTATION_SCOPES.has(scopeName)) return true;
|
|
170
|
+
const attributes = (_c = span.attributes) != null ? _c : {};
|
|
171
|
+
if (attributes["http.request.method"] !== void 0 || attributes["http.method"] !== void 0) {
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
return /^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD|CONNECT|TRACE)( |$)/.test(
|
|
175
|
+
(_d = span.name) != null ? _d : ""
|
|
176
|
+
);
|
|
166
177
|
}
|
|
167
178
|
|
|
168
179
|
// src/observability-sdk/exporters/langwatch-trace-exporter.ts
|
|
@@ -389,4 +400,4 @@ function createLangWatchLogger(logger) {
|
|
|
389
400
|
|
|
390
401
|
|
|
391
402
|
exports.version = version; exports.LANGWATCH_SDK_RUNTIME = LANGWATCH_SDK_RUNTIME; exports.LANGWATCH_SDK_NAME_OBSERVABILITY = LANGWATCH_SDK_NAME_OBSERVABILITY; exports.LANGWATCH_SDK_NAME_CLIENT = LANGWATCH_SDK_NAME_CLIENT; exports.LANGWATCH_SDK_LANGUAGE = LANGWATCH_SDK_LANGUAGE; exports.LANGWATCH_SDK_VERSION = LANGWATCH_SDK_VERSION; exports.DEFAULT_ENDPOINT = DEFAULT_ENDPOINT; exports.DEFAULT_SERVICE_NAME = DEFAULT_SERVICE_NAME; exports.buildAuthHeaders = buildAuthHeaders; exports.LangWatchTraceExporter = LangWatchTraceExporter; exports.LangWatchLogsExporter = LangWatchLogsExporter; exports.setLangWatchLoggerProvider = setLangWatchLoggerProvider; exports.getLangWatchLogger = getLangWatchLogger; exports.getLangWatchLoggerFromProvider = getLangWatchLoggerFromProvider;
|
|
392
|
-
//# sourceMappingURL=chunk-
|
|
403
|
+
//# sourceMappingURL=chunk-2PD3YA5H.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/sdks/typescript/dist/chunk-2PD3YA5H.js","../src/observability-sdk/exporters/langwatch-trace-exporter.ts","../package.json","../src/internal/runtime.ts","../src/internal/constants.ts","../src/internal/api/auth.ts","../src/observability-sdk/exporters/trace-filters.ts","../src/observability-sdk/exporters/langwatch-logs-exporter.ts","../src/observability-sdk/semconv/events.ts","../src/observability-sdk/logger/index.ts","../src/observability-sdk/logger/implementation.ts"],"names":[],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/sdks/typescript/dist/chunk-2PD3YA5H.js","sourcesContent":[null,"import { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\nimport { type ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\nimport { type ExportResult } from '@opentelemetry/core';\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 { buildAuthHeaders } from \"../../internal/api/auth\";\nimport {\n type TraceFilter,\n type Criteria,\n type Match,\n applyFilters,\n} from \"./trace-filters\";\n\n/**\n * Configuration options for the LangWatchTraceExporter.\n *\n * @property endpoint - Custom LangWatch endpoint URL. Falls back to LANGWATCH_ENDPOINT env var or default.\n * @property apiKey - API key for authentication. Falls back to LANGWATCH_API_KEY env var.\n * @property filters - Array of filters applied sequentially to spans before export.\n * Default: `[{ preset: \"excludeHttpRequests\" }]` to reduce framework noise.\n * Pass `null` or `[]` to disable all filtering.\n */\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}\n\nexport type { TraceFilter, Criteria, Match };\n\n/**\n * LangWatchTraceExporter extends the OpenTelemetry OTLP HTTP trace exporter\n * to send trace data to LangWatch with proper authentication and metadata headers.\n *\n * ## Features\n * - Automatic authorization header configuration via API key\n * - SDK version and runtime identification headers\n * - Proper endpoint URL construction for LangWatch ingestion\n * - Intent-based span filtering with presets and custom criteria\n *\n * ## Filtering Behavior\n * - **Default**: HTTP request spans are excluded to reduce framework noise\n * - **Pipeline**: Filters are applied sequentially with AND semantics\n * - **Matching**: All string comparisons are case-sensitive by default\n * - **Array Syntax**: All criteria require arrays of Match objects for explicit filtering\n *\n * ## Filter Types\n * - **Presets**: Pre-configured common filters (`vercelAIOnly`, `excludeHttpRequests`)\n * - **Include**: Keep only spans matching criteria (OR within field, AND across fields)\n * - **Exclude**: Remove spans matching criteria (OR within field, AND across fields)\n *\n * @example Basic usage with default filtering\n * ```typescript\n * import { LangWatchTraceExporter } from '@langwatch/observability';\n *\n * // Default: excludes HTTP request spans\n * const exporter = new LangWatchTraceExporter();\n * ```\n *\n * @example Using presets\n * ```typescript\n * // Keep only Vercel AI SDK spans\n * const exporterAI = new LangWatchTraceExporter({\n * filters: [{ preset: 'vercelAIOnly' }],\n * });\n *\n * // Explicitly exclude HTTP requests (same as default)\n * const exporterNoHttp = new LangWatchTraceExporter({\n * filters: [{ preset: 'excludeHttpRequests' }],\n * });\n *\n * // No filtering at all (send all spans)\n * const exporterAll = new LangWatchTraceExporter({\n * filters: null, // or filters: []\n * });\n * ```\n *\n * @example Custom filtering with criteria\n * ```typescript\n * // Include only spans with specific scope\n * const exporter1 = new LangWatchTraceExporter({\n * filters: [\n * { include: { instrumentationScopeName: [{ equals: 'ai' }] } }\n * ],\n * });\n *\n * // Exclude spans by name pattern\n * const exporter2 = new LangWatchTraceExporter({\n * filters: [\n * { exclude: { name: [{ startsWith: 'internal.' }] } }\n * ],\n * });\n *\n * // Case-insensitive matching\n * const exporter3 = new LangWatchTraceExporter({\n * filters: [\n * { include: { name: [{ equals: 'chat.completion', ignoreCase: true }] } }\n * ],\n * });\n * ```\n *\n * @example Filter pipelines (AND semantics)\n * ```typescript\n * // Keep AI spans, then remove HTTP requests\n * const exporter = new LangWatchTraceExporter({\n * filters: [\n * { include: { instrumentationScopeName: [{ equals: 'ai' }] } },\n * { preset: 'excludeHttpRequests' },\n * ],\n * });\n * ```\n *\n * @example OR semantics within a field\n * ```typescript\n * // Include spans with name starting with 'chat.' OR 'llm.'\n * const exporter = new LangWatchTraceExporter({\n * filters: [\n * {\n * include: {\n * name: [\n * { startsWith: 'chat.' },\n * { startsWith: 'llm.' }\n * ]\n * }\n * }\n * ],\n * });\n * ```\n *\n * @example Using regex patterns\n * ```typescript\n * const exporter = new LangWatchTraceExporter({\n * filters: [\n * {\n * include: {\n * name: [{ matches: /^(chat|llm)\\./i }]\n * }\n * }\n * ],\n * });\n * ```\n */\nexport class LangWatchTraceExporter extends OTLPTraceExporter {\n private readonly filters: TraceFilter[];\n /**\n * Creates a new LangWatchTraceExporter instance.\n *\n * @param opts - Configuration options for the exporter\n * @param opts.apiKey - API key for LangWatch authentication.\n * Falls back to `LANGWATCH_API_KEY` environment variable, then empty string.\n * @param opts.endpoint - Custom endpoint URL for LangWatch ingestion.\n * Falls back to `LANGWATCH_ENDPOINT` environment variable, then default endpoint.\n * @param opts.filters - Array of filters applied sequentially to spans before export (AND semantics).\n * When omitted, defaults to `[{ preset: \"excludeHttpRequests\" }]`.\n * Pass `null` or `[]` to disable all filtering and send all spans.\n *\n * @example\n * ```typescript\n * // With API key and default filtering\n * const exporter = new LangWatchTraceExporter({\n * apiKey: 'your-api-key'\n * });\n *\n * // With custom endpoint and no filtering\n * const exporter = new LangWatchTraceExporter({\n * endpoint: 'https://custom.langwatch.ai',\n * filters: null\n * });\n * ```\n */\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 =\n opts?.endpoint ??\n process.env.LANGWATCH_ENDPOINT ??\n 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 });\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 \"name\": \"langwatch\",\n \"version\": \"1.11.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 \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"author\": \"LangWatch\",\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=20\",\n \"pnpm\": \">=8\"\n },\n \"files\": [\n \"dist\",\n \"!dist/bin\",\n \"!dist/cli/*.map\",\n \"!dist/plugin\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"bin\": {\n \"lw\": \"./dist/cli/index.js\",\n \"langwatch\": \"./dist/cli/index.js\"\n },\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/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 \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/langwatch/langwatch.git\",\n \"directory\": \"typescript-sdk\"\n },\n \"scripts\": {\n \"generate\": \"pnpm run generate:server-types && pnpm run generate:openapi-types\",\n \"cli\": \"node dist/cli/index.js\",\n \"prelint\": \"pnpm run generate\",\n \"lint\": \"eslint .\",\n \"pretest\": \"pnpm run generate\",\n \"test\": \"vitest\",\n \"test:unit\": \"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 -- bash -c 'cd ../../platform/app && pnpm prisma:seed'\",\n \"prebuild\": \"pnpm run generate\",\n \"build\": \"tsc --noEmit && 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 \"build:plugin-hook\": \"tsup --config tsup.plugin-hook.config.ts\",\n \"tarball\": \"pnpm build && pnpm pack\",\n \"typecheck\": \"tsc --noEmit\",\n \"prepublish\": \"pnpm run build\",\n \"generate:openapi-types\": \"pnpm exec openapi-typescript ../../platform/app/src/app/api/openapiLangWatch.json -o ./src/internal/generated/openapi/api-client.ts && node scripts/patch-generated-openapi.mjs\",\n \"generate:server-types\": \"./copy-types.sh\"\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/langy\": \"workspace:*\",\n \"@opentelemetry/sdk-node\": \"0.221.0\",\n \"@opentelemetry/sdk-trace-node\": \"^2.0.1\",\n \"@opentelemetry/sdk-trace-web\": \">=2.0.1\",\n \"@types/debug\": \"^4.1.12\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/node\": \"^26.2.0\",\n \"@types/prompts\": \"^2.4.9\",\n \"@types/ws\": \"^8.18.1\",\n \"@vercel/otel\": \"^1.13.0\",\n \"@vitest/coverage-v8\": \"^4.1.0\",\n \"dotenv-cli\": \"^11.0.0\",\n \"esbuild\": \"^0.28.1\",\n \"eslint\": \"^9.32.0\",\n \"fets\": \"^0.8.5\",\n \"fishery\": \"^2.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 \"tsup\": \"^8.5.0\",\n \"typescript\": \"^6.0.3\",\n \"typescript-eslint\": \"^8.38.0\",\n \"vitest\": \"^4.1.0\",\n \"vitest-mock-extended\": \"^5.1.1\",\n \"yaml\": \"^2.8.1\"\n },\n \"dependencies\": {\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/api-logs\": \"0.221.0\",\n \"@opentelemetry/core\": \"^2.0.1\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"0.221.0\",\n \"@opentelemetry/exporter-trace-otlp-http\": \"0.221.0\",\n \"@opentelemetry/instrumentation\": \"0.221.0\",\n \"@opentelemetry/resources\": \"^2.0.1\",\n \"@opentelemetry/sdk-logs\": \"0.221.0\",\n \"@opentelemetry/sdk-metrics\": \"^2.0.1\",\n \"@opentelemetry/sdk-node\": \"^0.221.0\",\n \"@opentelemetry/sdk-trace-base\": \"^2.0.1\",\n \"@opentelemetry/semantic-conventions\": \"^1.36.0\",\n \"chalk\": \"^6.0.0\",\n \"cloudflared\": \"0.7.1\",\n \"commander\": \"^15.0.0\",\n \"dotenv\": \"^17.3.1\",\n \"js-yaml\": \"^5.2.0\",\n \"jsonc-parser\": \"^3.3.1\",\n \"liquidjs\": \"^10.27.0\",\n \"open\": \"^11.0.0\",\n \"openapi-fetch\": \"^0.17.0\",\n \"ora\": \"^9.3.0\",\n \"prompts\": \"^2.4.2\",\n \"ws\": \"^8.21.0\",\n \"xksuid\": \"^0.0.4\",\n \"zod\": \"^4.0.14\"\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/context-async-hooks\": \"^2.1.0\",\n \"@opentelemetry/context-zone\": \">=1.19.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-async-hooks\": {\n \"optional\": true\n },\n \"@opentelemetry/context-zone\": {\n \"optional\": true\n },\n \"@opentelemetry/sdk-trace-web\": {\n \"optional\": true\n },\n \"langchain\": {\n \"optional\": true\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) Optionally override the global object for environment simulation. Only used if NODE_ENV === 'test'.\n */\nexport function detectRuntime(globals?: any): JsRuntime {\n let g = globalThis;\n if (globals) {\n if (process.env.NODE_ENV === \"test\") {\n g = globals;\n } else {\n console.warn(\"[LangWatch Observability] overriding detectRuntime is only supported when running in NODE_ENV=test\");\n }\n }\n\n try {\n if (\n \"Deno\" in g &&\n typeof g.Deno === \"object\" &&\n g.Deno &&\n 'version' in g.Deno &&\n typeof g.Deno.version === \"object\"\n ) {\n return \"deno\";\n }\n if (\n \"Bun\" in g &&\n typeof g.Bun === \"object\" &&\n g.Bun &&\n 'version' in g.Bun &&\n typeof g.Bun.version === \"string\"\n ) {\n return \"bun\";\n }\n if (\n \"process\" in g &&\n typeof g.process === \"object\" &&\n g.process &&\n typeof g.process.versions === \"object\" &&\n typeof g.process.versions.node === \"string\"\n ) {\n return \"node\";\n }\n if (\n typeof g.window?.document !== \"undefined\" &&\n g === g.window\n ) {\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","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","/**\n * Authentication header assembly for LangWatch SDK clients.\n *\n * Supports two token families that share the same HTTP surface:\n *\n * 1. `sk-lw-{random}` — legacy project API keys. The token itself carries\n * the project identity, so we emit both `Authorization: Bearer <token>`\n * and `X-Auth-Token: <token>` for backwards compatibility.\n *\n * 2. `sk-lw-{lookupId}_{secret}` or `pat-lw-{lookupId}_{secret}` — API\n * keys (user-scoped). Must be paired with a `projectId` so the server\n * can resolve the correct role binding. When a `projectId` is available\n * we encode both into `Authorization: Basic base64(projectId:token)`.\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 * Returns `true` when the supplied credential is a user-scoped API key\n * (as opposed to a legacy project key).\n *\n * Detection heuristics:\n * - `pat-lw-*` → always a user-scoped key (old format)\n * - `sk-lw-{chars}_{chars}` → user-scoped key (new format, has underscore)\n * - `sk-lw-{chars}` (no underscore) → legacy project key\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/** @deprecated Use `isUserScopedApiKey` instead. Kept for backward compat. */\nexport const isPersonalAccessToken = isUserScopedApiKey;\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 =\n 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(\n `${resolvedProjectId}:${apiKey}`,\n \"utf-8\",\n ).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","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 a sequence of filters to an array of spans using AND semantics.\n * Each filter in the sequence is applied to the result of the previous filter,\n * progressively narrowing down the set of spans.\n *\n * @param filters - Array of filter rules to apply sequentially\n * @param spans - Array of spans to filter\n * @returns Filtered array of spans that match all filter criteria\n *\n * @example\n * ```typescript\n * const filters: TraceFilter[] = [\n * { include: { instrumentationScopeName: [{ equals: 'ai' }] } },\n * { preset: 'excludeHttpRequests' }\n * ];\n * const filtered = applyFilters(filters, spans);\n * // Returns only AI spans that are not HTTP requests\n * ```\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 to an array of spans.\n * Handles three types of filters: presets, include rules, and exclude rules.\n *\n * @param rule - Single filter rule (preset, include, or exclude)\n * @param spans - Array of spans to filter\n * @returns Filtered array of spans based on the rule\n *\n * @example\n * ```typescript\n * // Using preset\n * const filtered1 = applyFilterRule({ preset: 'vercelAIOnly' }, spans);\n *\n * // Using include\n * const filtered2 = applyFilterRule(\n * { include: { name: [{ startsWith: 'llm.' }] } },\n * spans\n * );\n *\n * // Using exclude\n * const filtered3 = applyFilterRule(\n * { exclude: { instrumentationScopeName: [{ equals: 'http' }] } },\n * spans\n * );\n * ```\n */\nexport function applyFilterRule(rule: TraceFilter, spans: ReadableSpan[]): ReadableSpan[] {\n if (\"preset\" in rule && rule.preset) {\n return applyPreset(\n (rule as { preset: TraceFilter extends { preset: infer P } ? P : never }).preset as any,\n spans\n );\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 to an array of spans.\n * Presets are predefined common filtering patterns.\n *\n * Available presets:\n * - `vercelAIOnly`: Keeps only spans from the Vercel AI SDK (instrumentationScope.name === 'ai')\n * - `excludeHttpRequests`: Removes spans emitted by HTTP instrumentations (identified by scope,\n * method attribute, or an uppercase-verb span name)\n *\n * @param preset - Name of the preset filter to apply\n * @param spans - Array of spans to filter\n * @returns Filtered array of spans based on the preset\n *\n * @example\n * ```typescript\n * // Keep only Vercel AI spans\n * const aiSpans = applyPreset('vercelAIOnly', spans);\n *\n * // Remove HTTP request spans\n * const noHttpSpans = applyPreset('excludeHttpRequests', spans);\n * ```\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 the given criteria.\n * All specified criteria fields must match (AND semantics within a criteria object).\n * Within each field, matchers are evaluated with OR semantics (any matcher can match).\n *\n * @param span - Span to evaluate\n * @param criteria - Criteria to match against (instrumentationScopeName and/or name)\n * @returns True if the span matches all specified criteria, false otherwise\n *\n * @example\n * ```typescript\n * const criteria: Criteria = {\n * instrumentationScopeName: [{ equals: 'ai' }],\n * name: [{ startsWith: 'llm.' }, { startsWith: 'chat.' }]\n * };\n * const matches = matchesCriteria(span, criteria);\n * // Returns true if scope is 'ai' AND name starts with 'llm.' OR 'chat.'\n * ```\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 value matches a given match rule.\n * Supports three types of matching: exact equality, prefix matching, and regex matching.\n * All matching is case-sensitive by default unless `ignoreCase` is explicitly set to true.\n *\n * @param value - String value to evaluate\n * @param rule - Match rule specifying the matching criteria\n * @returns True if the value matches the rule, false otherwise\n *\n * @example\n * ```typescript\n * // Exact match (case-sensitive by default)\n * valueMatches('GET /api/users', { equals: 'GET /api/users' }); // true\n * valueMatches('get /api/users', { equals: 'GET /api/users' }); // false\n *\n * // Case-insensitive exact match\n * valueMatches('get /api/users', { equals: 'GET /api/users', ignoreCase: true }); // true\n *\n * // Prefix match\n * valueMatches('GET /api/users', { startsWith: 'GET' }); // true\n * valueMatches('POST /api/users', { startsWith: 'GET' }); // false\n *\n * // Regex match\n * valueMatches('GET /api/users', { matches: /^(GET|POST)\\b/ }); // true\n *\n * // Case-insensitive regex\n * valueMatches('get /api/users', { matches: /^GET\\b/, ignoreCase: true }); // true\n * ```\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 re =\n ignoreCase && !rule.matches.flags.includes(\"i\")\n ? new RegExp(rule.matches.source, (rule.matches.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.\n * A span is considered a Vercel AI span if its instrumentation scope name is 'ai' (case-insensitive).\n *\n * @param span - Span to check\n * @returns True if the span is from the Vercel AI SDK, false otherwise\n *\n * @example\n * ```typescript\n * if (isVercelAiSpan(span)) {\n * console.log('This is a Vercel AI operation');\n * }\n * ```\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 *\n * The exact signals come first: the emitting instrumentation scope, or the\n * semantic-convention method attribute. Only when neither is present does the\n * name heuristic apply, and it matches only the shape OpenTelemetry's HTTP\n * instrumentations actually emit — an uppercase verb alone or followed by a\n * space. User spans like \"post-publish-smoke\" or \"get-user-profile\" never\n * match it.\n *\n * @param span - Span to check\n * @returns True if the span is an HTTP request span, false otherwise\n *\n * @example\n * ```typescript\n * // These return true:\n * // scope \"@opentelemetry/instrumentation-http\", name \"GET /api/users\"\n * // attributes { \"http.request.method\": \"POST\" }, any name\n * // unknown scope, name \"POST /v1/traces\" (uppercase-verb fallback)\n * //\n * // These return false:\n * // name \"post-publish-smoke\", \"get-user-profile\", \"postgres-query\"\n *\n * if (isHttpRequestSpan(span)) {\n * console.log('This is an HTTP request span');\n * }\n * ```\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 (\n attributes[\"http.request.method\"] !== undefined ||\n attributes[\"http.method\"] !== undefined\n ) {\n return true;\n }\n\n return /^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD|CONNECT|TRACE)( |$)/.test(\n span.name ?? \"\",\n );\n}\n","import { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-http\";\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\";\n\nexport interface LangWatchLogsExporterOptions {\n endpoint?: string;\n apiKey?: string;\n}\n\n/**\n * LangWatchLogsExporter extends the OpenTelemetry OTLP HTTP logs exporter\n * to send logs to LangWatch with proper authentication and metadata headers.\n *\n * This exporter automatically configures:\n * - Authorization headers using the provided API key or environment variables/fallback\n * - SDK version and language identification headers\n * - Proper endpoint configuration for LangWatch ingestion using provided URL or environment variables/fallback\n *\n * @example\n * ```typescript\n * import { LangWatchLogsExporter } from '@langwatch/observability';\n *\n * // Using environment variables/fallback configuration\n * const exporter = new LangWatchLogsExporter();\n *\n * // Using custom options\n * const exporter = new LangWatchLogsExporter({\n * apiKey: 'your-api-key',\n * endpoint: 'https://custom.langwatch.com'\n * });\n * ```\n */\nexport class LangWatchLogsExporter extends OTLPLogExporter {\n /**\n * Creates a new LangWatchLogsExporter instance.\n *\n * @param opts - Optional configuration options for the exporter.\n * @param opts.apiKey - Optional API key for LangWatch authentication. If not provided,\n * will use environment variables or fallback configuration.\n * @param opts.endpoint - Optional custom endpoint URL for LangWatch ingestion.\n * If not provided, will use environment variables or fallback configuration.\n */\n constructor(opts?: LangWatchLogsExporterOptions) {\n const apiKey = opts?.apiKey ?? process.env.LANGWATCH_API_KEY ?? \"\";\n const endpoint =\n opts?.endpoint ??\n process.env.LANGWATCH_ENDPOINT ??\n 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 });\n }\n}\n","/*\n This file contains the values for the OpenTelemetry semantic conventions for GenAI log\n record event names.\n\n 👉 https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-events/\n*/\n\n/**\n * GenAI system message event name\n * Used for log records representing system messages in AI conversations\n */\nexport const LOG_EVNT_GEN_AI_SYSTEM_MESSAGE = \"gen.ai.system_message\";\n\n/**\n * GenAI user message event name\n * Used for log records representing user messages in AI conversations\n */\nexport const LOG_EVNT_GEN_AI_USER_MESSAGE = \"gen.ai.user_message\";\n\n/**\n * GenAI assistant message event name\n * Used for log records representing assistant responses in AI conversations\n */\nexport const LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE = \"gen.ai.assistant_message\";\n\n/**\n * GenAI tool message event name\n * Used for log records representing tool calls or responses in AI conversations\n */\nexport const LOG_EVNT_GEN_AI_TOOL_MESSAGE = \"gen.ai.tool_message\";\n\n/**\n * GenAI choice event name\n * Used for log records representing choices made by AI models\n */\nexport const LOG_EVNT_GEN_AI_CHOICE = \"gen.ai.choice\";\n\n/**\n * LangWatch LangChain callback event name\n * Used for log records representing LangChain callback events\n */\nexport const EVNT_LANGWATCH_LANGCHAIN_CALLBACK = \"langwatch.langchain.callback\";\n","import {\n type Logger,\n type LoggerOptions,\n type LoggerProvider,\n createNoopLogger,\n} from \"@opentelemetry/api-logs\";\nimport {\n type LangWatchLogger,\n} from \"./types\";\nimport { LangWatchLoggerInternal } from \"./implementation\";\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) =>\n createNoopLogger(),\n};\n\n/**\n * The LangWatch-specific global logger provider. It may not be the same as the current\n * OpenTelemetry global logger provider, but it's the last one the `setupObservability`\n * knows about.\n * @internal\n */\nlet currentLoggerProvider: LoggerProvider = NOOP_LOGGER_PROVIDER;\n\n/**\n * @module observability/logger\n * @description\n * Provides LangWatch logger integration with OpenTelemetry, including logger provider\n * management and logger creation utilities.\n *\n * @remarks\n * This module allows you to set a global logger provider, retrieve LangWatch loggers,\n * and wrap OpenTelemetry loggers with LangWatch-specific functionality.\n *\n * @see {@link setLangWatchLoggerProvider}\n * @see {@link getLangWatchLogger}\n * @see {@link getLangWatchLoggerFromProvider}\n * @see {@link createLangWatchLogger}\n */\nexport function setLangWatchLoggerProvider(\n loggerProvider: LoggerProvider,\n): void {\n currentLoggerProvider = loggerProvider;\n}\n\n/**\n * Retrieves a LangWatch logger with the specified name and optional version.\n *\n * @param name - The name of the logger (typically your service or module name).\n * @param version - (Optional) The version of the logger.\n * @returns A {@link LangWatchLogger} instance.\n *\n * @remarks\n * Uses the logger provider set during observability setup. If no provider is set, returns\n * a NoOp logger.\n *\n * @example\n * ```ts\n * const logger = getLangWatchLogger(\"my-service\");\n * logger.info(\"Service started\");\n * ```\n *\n * @see {@link setLangWatchLoggerProvider}\n */\nexport function getLangWatchLogger(\n name: string,\n version?: string,\n): LangWatchLogger {\n return getLangWatchLoggerFromProvider(currentLoggerProvider, name, version);\n}\n\n/**\n * Retrieves a LangWatch logger from a specific OpenTelemetry logger provider.\n *\n * @param loggerProvider - The OpenTelemetry logger provider to use.\n * @param name - The name of the logger.\n * @param version - (Optional) The version of the logger.\n * @returns A {@link LangWatchLogger} instance.\n *\n * @remarks\n * Use this function if you want to use a custom logger provider instead of the global one.\n *\n * @example\n * ```ts\n * const customProvider = new LoggerProvider();\n * const logger = getLangWatchLoggerFromProvider(customProvider, \"custom-service\");\n * ```\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 *\n * @param logger - The OpenTelemetry logger to wrap.\n * @returns A {@link LangWatchLogger} instance.\n *\n * @example\n * ```ts\n * import { Logger } from \"@opentelemetry/api-logs\";\n * const otelLogger = new Logger();\n * const lwLogger = createLangWatchLogger(otelLogger);\n * lwLogger.info(\"Wrapped logger\");\n * ```\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 {\n type AnyValue,\n type Logger,\n} from \"@opentelemetry/api-logs\";\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\";\nimport { shouldCaptureOutput } from \"../config\";\nimport * as intSemconv from \"../semconv\";\nimport { type SemConvLogRecordAttributes } from \"../semconv\";\nimport { context } from \"@opentelemetry/api\";\n\n/**\n * Internal implementation of {@link LangWatchLogger}.\n *\n * @remarks\n * This class wraps an OpenTelemetry logger and adds LangWatch-specific functionality for\n * structured logging and event emission.\n * Not intended for direct use; use {@link getLangWatchLogger} or\n * {@link createLangWatchLogger} instead.\n */\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 { ...body, role: body.role ?? \"system\" } 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 { ...body, role: body.role ?? \"user\" } 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 { ...body, role: body.role ?? \"assistant\" } 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"]}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _chunk2PD3YA5Hjs = require('./chunk-2PD3YA5H.js');
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
|
|
@@ -29,12 +29,12 @@ var _resources = require('@opentelemetry/resources');
|
|
|
29
29
|
var _incubating = require('@opentelemetry/semantic-conventions/incubating'); var semconv = _interopRequireWildcard(_incubating);
|
|
30
30
|
function createMergedResource(attributes, serviceName, givenResource) {
|
|
31
31
|
const langwatchResource = _resources.resourceFromAttributes.call(void 0, {
|
|
32
|
-
[_chunkLCG5Y2EGjs.ATTR_LANGWATCH_SDK_NAME]:
|
|
33
|
-
[_chunkLCG5Y2EGjs.ATTR_LANGWATCH_SDK_LANGUAGE]:
|
|
34
|
-
[_chunkLCG5Y2EGjs.ATTR_LANGWATCH_SDK_VERSION]:
|
|
32
|
+
[_chunkLCG5Y2EGjs.ATTR_LANGWATCH_SDK_NAME]: _chunk2PD3YA5Hjs.LANGWATCH_SDK_NAME_OBSERVABILITY,
|
|
33
|
+
[_chunkLCG5Y2EGjs.ATTR_LANGWATCH_SDK_LANGUAGE]: _chunk2PD3YA5Hjs.LANGWATCH_SDK_LANGUAGE,
|
|
34
|
+
[_chunkLCG5Y2EGjs.ATTR_LANGWATCH_SDK_VERSION]: _chunk2PD3YA5Hjs.LANGWATCH_SDK_VERSION
|
|
35
35
|
});
|
|
36
36
|
const userResource = _resources.resourceFromAttributes.call(void 0, _chunkLCG5Y2EGjs.__spreadValues.call(void 0, {
|
|
37
|
-
[semconv.ATTR_SERVICE_NAME]: serviceName != null ? serviceName :
|
|
37
|
+
[semconv.ATTR_SERVICE_NAME]: serviceName != null ? serviceName : _chunk2PD3YA5Hjs.DEFAULT_SERVICE_NAME
|
|
38
38
|
}, attributes != null ? attributes : {}));
|
|
39
39
|
return (givenResource != null ? givenResource : _resources.defaultResource.call(void 0, )).merge(langwatchResource).merge(userResource);
|
|
40
40
|
}
|
|
@@ -109,7 +109,7 @@ var resolveEndpoint = (endpoint) => {
|
|
|
109
109
|
const normalized = normalizeEndpoint(candidate);
|
|
110
110
|
if (normalized !== "") return normalized;
|
|
111
111
|
}
|
|
112
|
-
return normalizeEndpoint(
|
|
112
|
+
return normalizeEndpoint(_chunk2PD3YA5Hjs.DEFAULT_ENDPOINT);
|
|
113
113
|
};
|
|
114
114
|
|
|
115
115
|
// src/observability-sdk/setup/node/setup.ts
|
|
@@ -316,7 +316,7 @@ function setupDedicatedProvider(provider, options, logger) {
|
|
|
316
316
|
}
|
|
317
317
|
};
|
|
318
318
|
if (!langwatch.disabled) {
|
|
319
|
-
const traceExporter = new (0,
|
|
319
|
+
const traceExporter = new (0, _chunk2PD3YA5Hjs.LangWatchTraceExporter)({
|
|
320
320
|
apiKey: langwatch.apiKey,
|
|
321
321
|
endpoint: langwatch.endpoint
|
|
322
322
|
});
|
|
@@ -387,7 +387,7 @@ function attachToExistingProvider(provider, options, logger) {
|
|
|
387
387
|
const langwatch = getLangWatchConfig(options);
|
|
388
388
|
const addedProcessors = [];
|
|
389
389
|
if (!langwatch.disabled) {
|
|
390
|
-
const traceExporter = new (0,
|
|
390
|
+
const traceExporter = new (0, _chunk2PD3YA5Hjs.LangWatchTraceExporter)({
|
|
391
391
|
apiKey: langwatch.apiKey,
|
|
392
392
|
endpoint: langwatch.endpoint
|
|
393
393
|
});
|
|
@@ -454,11 +454,11 @@ function createAndStartNodeSdk(options, logger, resource) {
|
|
|
454
454
|
logger.debug("Console recording of logs enabled; adding console log record processor");
|
|
455
455
|
}
|
|
456
456
|
if (!langwatch.disabled) {
|
|
457
|
-
const traceExporter = new (0,
|
|
457
|
+
const traceExporter = new (0, _chunk2PD3YA5Hjs.LangWatchTraceExporter)({
|
|
458
458
|
apiKey: langwatch.apiKey,
|
|
459
459
|
endpoint: langwatch.endpoint
|
|
460
460
|
});
|
|
461
|
-
const logExporter = new (0,
|
|
461
|
+
const logExporter = new (0, _chunk2PD3YA5Hjs.LangWatchLogsExporter)({
|
|
462
462
|
apiKey: langwatch.apiKey,
|
|
463
463
|
endpoint: langwatch.endpoint
|
|
464
464
|
});
|
|
@@ -528,7 +528,7 @@ function createAndStartNodeSdk(options, logger, resource) {
|
|
|
528
528
|
});
|
|
529
529
|
}
|
|
530
530
|
if (loggerProvider) {
|
|
531
|
-
|
|
531
|
+
_chunk2PD3YA5Hjs.setLangWatchLoggerProvider.call(void 0, loggerProvider);
|
|
532
532
|
logger.debug("Set LangWatch logger provider");
|
|
533
533
|
}
|
|
534
534
|
if (!((_e = options.advanced) == null ? void 0 : _e.disableAutoShutdown)) {
|
|
@@ -563,4 +563,4 @@ var ensureSetup = () => {
|
|
|
563
563
|
|
|
564
564
|
|
|
565
565
|
exports.resolveEndpoint = resolveEndpoint; exports.setupObservability = setupObservability; exports.ensureSetup = ensureSetup;
|
|
566
|
-
//# sourceMappingURL=chunk-
|
|
566
|
+
//# sourceMappingURL=chunk-AJDFFRSW.js.map
|