tracelet-cli 0.1.0 → 0.1.1
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/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/program.ts","../src/agents.ts","../src/clear.ts","../src/paths.ts","../../../packages/shared/src/headers.ts","../../../packages/shared/src/ids.ts","../../../packages/shared/src/time.ts","../../../packages/server/src/server.ts","../../../packages/proxy/src/proxy.ts","../../../packages/proxy/src/headers.ts","../../../packages/proxy/src/target.ts","../../../node_modules/.pnpm/fzstd@0.1.1/node_modules/fzstd/esm/index.mjs","../../../packages/protocols/src/body.ts","../../../packages/protocols/src/request.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/internal/tslib.mjs","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/stainless-helper-header.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/errors.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/core/error.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/utils/values.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/shims.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/utils/bytes.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/decoders/line.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/utils/log.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/request-signal.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/core/streaming.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/lib/parser.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/_vendor/partial-json-parser/parser.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/message-stream-utils.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/lib/MessageStream.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/internal/tslib.mjs","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/errors.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/core/error.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/lib/EventStream.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/utils/values.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/utils/bytes.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/utils/log.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/responses/output-text-index.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/responses/canonical-output-text.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/responses/response-accumulator.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/lib/parser.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/lib/ResponsesParser.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/shims.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/decoders/line.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/core/streaming.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/lib/responses/ResponseStream.ts","../../../packages/protocols/src/sdk-stream.ts","../../../packages/recorder/src/session.ts","../../../packages/recorder/src/sse.ts","../../../packages/recorder/src/recorder.ts","../../../packages/storage/src/reader.ts","../../../packages/storage/src/files.ts","../../../packages/storage/src/conversation.ts","../../../packages/storage/src/store.ts","../../../packages/storage/src/writer.ts","../../../packages/server/src/api.ts","../../../packages/server/src/live.ts","../../../packages/server/src/static.ts","../src/settings.ts","../src/spawn.ts","../src/system-proxy.ts","../src/run.ts","../src/bin.ts"],"sourcesContent":["/** 本文件负责定义 Commander 命令和无参数时的交互菜单。 */\r\n\r\nimport { confirm, select } from \"@inquirer/prompts\";\r\nimport type { AgentType } from \"@tracelet/shared\";\r\nimport { Command, Option } from \"commander\";\r\nimport { agents } from \"./agents.js\";\r\nimport { clearData } from \"./clear.js\";\r\nimport { dataDir } from \"./paths.js\";\r\nimport { runAgent, runDashboard, type RunOptions } from \"./run.js\";\r\nimport { loadSettings, saveProxy, type ProxyMode } from \"./settings.js\";\r\n\r\n/** 将端口字符串转换为合法整数。 */\r\nfunction parsePort(value: string): number {\r\n const port = Number.parseInt(value, 10);\r\n if (!Number.isInteger(port) || port < 0 || port > 65_535) {\r\n throw new Error(`Invalid port: ${value}`);\r\n }\r\n return port;\r\n}\r\n\r\n/** 从 Commander 根命令读取共享运行参数。 */\r\nfunction getOptions(program: Command): RunOptions {\r\n const options = program.opts<{ port: number; dataDir?: string }>();\r\n return {\r\n port: options.port,\r\n ...(options.dataDir ? { dataDir: options.dataDir } : {}),\r\n };\r\n}\r\n\r\n/** 展示可用 agent 菜单并运行用户选择项。 */\r\nasync function interactive(program: Command): Promise<void> {\r\n if (!process.stdin.isTTY) {\r\n throw new Error(\"Use tracelet claude or tracelet codex in a non-interactive environment.\");\r\n }\r\n\r\n const [claudeReady, codexReady] = await Promise.all([\r\n agents.claude.detect(),\r\n agents.codex.detect(),\r\n ]);\r\n const agent = await select<AgentType>({\r\n message: \"Select an agent to trace\",\r\n choices: [\r\n {\r\n name: \"Claude Code\",\r\n value: \"claude\",\r\n ...(!claudeReady ? { disabled: \"claude command not found\" } : {}),\r\n },\r\n {\r\n name: \"Codex\",\r\n value: \"codex\",\r\n ...(!codexReady ? { disabled: \"codex command not found\" } : {}),\r\n },\r\n ],\r\n });\r\n process.exitCode = await runAgent(agent, [], getOptions(program));\r\n}\r\n\r\n/** 确认后清除当前数据目录中的全部历史记录。 */\r\nasync function clearRecords(program: Command, yes: boolean): Promise<void> {\r\n const root = dataDir(getOptions(program).dataDir);\r\n\r\n if (!yes) {\r\n if (!process.stdin.isTTY) {\r\n throw new Error(\"Use tracelet clear --yes in a non-interactive environment.\");\r\n }\r\n\r\n const accepted = await confirm({\r\n message: `This will permanently delete all Tracelet records in ${root}. Continue?`,\r\n default: false,\r\n });\r\n if (!accepted) {\r\n console.log(\"Clear cancelled.\");\r\n return;\r\n }\r\n }\r\n\r\n await clearData(root);\r\n console.log(`All Tracelet records cleared: ${root}`);\r\n}\r\n\r\n/** 通过 On/Off 菜单配置 Tracelet 是否使用系统代理。 */\r\nasync function configureProxy(): Promise<void> {\r\n if (!process.stdin.isTTY) {\r\n throw new Error(\"The proxy command requires an interactive terminal.\");\r\n }\r\n\r\n const current = (await loadSettings()).proxy.mode;\r\n const mode = await select<ProxyMode>({\r\n message: \"Use the system proxy for upstream requests?\",\r\n choices: [\r\n { name: \"On\", value: \"system\" },\r\n { name: \"Off\", value: \"direct\" },\r\n ],\r\n default: current,\r\n });\r\n await saveProxy(mode);\r\n console.log(mode === \"system\" ? \"System proxy enabled.\" : \"System proxy disabled.\");\r\n}\r\n\r\n/** 创建并配置 Tracelet Commander 程序。 */\r\nexport function createProgram(): Command {\r\n const program = new Command();\r\n program\r\n .name(\"tracelet\")\r\n .description(\"Record LLM requests and streaming responses from Claude Code and Codex\")\r\n .version(\"0.1.0\")\r\n .enablePositionalOptions()\r\n .addOption(new Option(\"-p, --port <port>\", \"Local server port\").default(4318).argParser(parsePort))\r\n .option(\"--data-dir <path>\", \"Local trace directory\")\r\n .action(() => interactive(program));\r\n\r\n for (const agentId of [\"claude\", \"codex\"] as const) {\r\n program\r\n .command(`${agentId} [args...]`)\r\n .description(`Start and trace ${agents[agentId].label}`)\r\n .allowUnknownOption()\r\n .passThroughOptions()\r\n .action(async (args: string[]) => {\r\n process.exitCode = await runAgent(agentId, args, getOptions(program));\r\n });\r\n }\r\n\r\n program\r\n .command(\"dashboard\")\r\n .description(\"View local Tracelet history\")\r\n .action(() => runDashboard(getOptions(program)));\r\n\r\n program\r\n .command(\"proxy\")\r\n .description(\"Configure system proxy usage\")\r\n .action(configureProxy);\r\n\r\n const clear = program\r\n .command(\"clear\")\r\n .description(\"Clear all local Tracelet history\")\r\n .option(\"-y, --yes\", \"Skip confirmation\");\r\n\r\n /** 读取 clear 子命令参数并执行清理。 */\r\n clear.action(async () => {\r\n const options = clear.opts<{ yes?: boolean }>();\r\n await clearRecords(program, options.yes === true);\r\n });\r\n\r\n return program;\r\n}\r\n","/** 本文件负责检测 Claude Code 与 Codex,并生成无全局副作用的启动参数。 */\r\n\r\nimport { access, readFile } from \"node:fs/promises\";\r\nimport { constants } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { delimiter, join } from \"node:path\";\r\nimport { execFile } from \"node:child_process\";\r\nimport { promisify } from \"node:util\";\r\nimport type { AgentType, Protocol } from \"@tracelet/shared\";\r\n\r\nconst exec = promisify(execFile);\r\nconst codexProvider = \"tracelet\";\r\n\r\nexport interface LaunchInfo {\r\n command: string;\r\n args: string[];\r\n env: NodeJS.ProcessEnv;\r\n}\r\n\r\nexport interface AgentAdapter {\r\n id: AgentType;\r\n label: string;\r\n command: string;\r\n protocol: Protocol;\r\n /** 检测本机是否安装当前 agent。 */\r\n detect(): Promise<boolean>;\r\n /** 获取当前 agent 原本使用的上游地址。 */\r\n upstream(): Promise<string>;\r\n /** 生成只对本次子进程生效的代理启动参数。 */\r\n launch(proxyUrl: string, args: string[]): LaunchInfo;\r\n}\r\n\r\ninterface ClaudeSettings {\r\n env?: Record<string, unknown>;\r\n}\r\n\r\n/** 将 Tracelet 本地地址加入子进程的代理绕过列表。 */\r\nfunction launchEnv(env: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {\r\n const values = [env.NO_PROXY, env.no_proxy, \"127.0.0.1\", \"localhost\", \"::1\"]\r\n .flatMap((value) => value?.split(\",\") ?? [])\r\n .map((value) => value.trim())\r\n .filter(Boolean);\r\n const noProxy = [...new Set(values)].join(\",\");\r\n return { ...env, NO_PROXY: noProxy, no_proxy: noProxy };\r\n}\r\n\r\n/** 检查命令是否存在于当前 PATH。 */\r\nasync function hasBin(command: string): Promise<boolean> {\r\n const paths = process.env.PATH?.split(delimiter) ?? [];\r\n\r\n for (const path of paths) {\r\n try {\r\n await access(join(path, command), constants.X_OK);\r\n return true;\r\n } catch {\r\n // 当前目录未命中时继续检查 PATH 的下一项。\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/** 判断 Codex 当前是否使用 ChatGPT 登录。 */\r\nasync function usesChatGpt(): Promise<boolean> {\r\n try {\r\n const result = await exec(\"codex\", [\"login\", \"status\"]);\r\n return result.stderr.includes(\"ChatGPT\");\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/** 从单个 Claude Code 配置文件读取上游地址。 */\r\nasync function readClaudeUrl(path: string): Promise<string | undefined> {\r\n try {\r\n const settings = JSON.parse(await readFile(path, \"utf8\")) as ClaudeSettings;\r\n const url = settings.env?.ANTHROPIC_BASE_URL;\r\n return typeof url === \"string\" && url ? url : undefined;\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\r\n return undefined;\r\n }\r\n\r\n throw new Error(`Failed to read Claude Code configuration: ${path}`, { cause: error });\r\n }\r\n}\r\n\r\n/** 按 Claude Code 配置作用域返回从高到低的配置文件路径。 */\r\nfunction claudeFiles(cwd: string, env: NodeJS.ProcessEnv): string[] {\r\n const userDir = env.CLAUDE_CONFIG_DIR ?? join(homedir(), \".claude\");\r\n return [\r\n join(cwd, \".claude\", \"settings.local.json\"),\r\n join(cwd, \".claude\", \"settings.json\"),\r\n join(userDir, \"settings.json\"),\r\n ];\r\n}\r\n\r\n/** 按显式覆盖、配置文件和官方地址的顺序确定 Claude 上游。 */\r\nexport async function claudeUpstream(\r\n cwd = process.cwd(),\r\n env: NodeJS.ProcessEnv = process.env,\r\n): Promise<string> {\r\n if (env.TRACELET_CLAUDE_UPSTREAM) {\r\n return env.TRACELET_CLAUDE_UPSTREAM;\r\n }\r\n\r\n for (const path of claudeFiles(cwd, env)) {\r\n const url = await readClaudeUrl(path);\r\n if (url) {\r\n return url;\r\n }\r\n }\r\n\r\n return \"https://api.anthropic.com\";\r\n}\r\n\r\n/** 根据 Codex 登录方式选择原始 OpenAI 上游地址。 */\r\nasync function codexUpstream(): Promise<string> {\r\n if (process.env.TRACELET_CODEX_UPSTREAM) {\r\n return process.env.TRACELET_CODEX_UPSTREAM;\r\n }\r\n\r\n return (await usesChatGpt())\r\n ? \"https://chatgpt.com/backend-api/codex\"\r\n : \"https://api.openai.com/v1\";\r\n}\r\n\r\n/** 生成 Claude Code 的临时 settings 和环境变量。 */\r\nfunction launchClaude(proxyUrl: string, args: string[]): LaunchInfo {\r\n // Claude 配置中的 env 会在启动时生效,因此用 CLI settings 再次覆盖 Base URL。\r\n const settings = JSON.stringify({ env: { ANTHROPIC_BASE_URL: proxyUrl } });\r\n return {\r\n command: \"claude\",\r\n args: [\"--settings\", settings, ...args],\r\n env: { ...launchEnv(), ANTHROPIC_BASE_URL: proxyUrl },\r\n };\r\n}\r\n\r\n/** 生成禁用 WebSocket 的 Codex 临时 Provider 配置。 */\r\nfunction providerConfig(proxyUrl: string): string {\r\n return `{ name = \"Tracelet\", base_url = ${JSON.stringify(proxyUrl)}, wire_api = \"responses\", requires_openai_auth = true, supports_websockets = false }`;\r\n}\r\n\r\n/** 生成只对当前进程生效的 Codex Provider 覆盖参数。 */\r\nfunction launchCodex(proxyUrl: string, args: string[]): LaunchInfo {\r\n return {\r\n command: \"codex\",\r\n // 参数通过 spawn 数组传递,不经过 shell 展开。\r\n args: [\r\n \"-c\",\r\n `model_provider=${JSON.stringify(codexProvider)}`,\r\n \"-c\",\r\n `model_providers.${codexProvider}=${providerConfig(proxyUrl)}`,\r\n ...args,\r\n ],\r\n env: launchEnv(),\r\n };\r\n}\r\n\r\nexport const agents: Record<AgentType, AgentAdapter> = {\r\n claude: {\r\n id: \"claude\",\r\n label: \"Claude Code\",\r\n command: \"claude\",\r\n protocol: \"anthropic\",\r\n detect: () => hasBin(\"claude\"),\r\n upstream: claudeUpstream,\r\n launch: launchClaude,\r\n },\r\n codex: {\r\n id: \"codex\",\r\n label: \"Codex\",\r\n command: \"codex\",\r\n protocol: \"openai\",\r\n detect: () => hasBin(\"codex\"),\r\n upstream: codexUpstream,\r\n launch: launchCodex,\r\n },\r\n};\r\n","/** 本文件负责安全清除 Tracelet 已记录的全部运行与会话数据。 */\r\n\r\nimport { mkdir, rm } from \"node:fs/promises\";\r\nimport { homedir } from \"node:os\";\r\nimport { join, parse, resolve } from \"node:path\";\r\n\r\n/** 校验数据目录并返回其运行记录目录。 */\r\nfunction runsDir(root: string): string {\r\n const data = resolve(root);\r\n\r\n // 禁止将文件系统根目录或用户目录直接作为清理目标。\r\n if (data === parse(data).root || data === resolve(homedir())) {\r\n throw new Error(`Refusing to clear unsafe data directory: ${data}`);\r\n }\r\n\r\n return join(data, \"runs\");\r\n}\r\n\r\n/** 删除全部运行记录,并重新创建空的运行记录目录。 */\r\nexport async function clearData(root: string): Promise<void> {\r\n const runs = runsDir(root);\r\n\r\n // 只删除 runs,保留数据根目录及其中可能存在的其他文件。\r\n await rm(runs, { recursive: true, force: true });\r\n await mkdir(runs, { recursive: true });\r\n}\r\n","/** 本文件负责确定 CLI 使用的数据目录和 Dashboard 构建目录。 */\r\n\r\nimport { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { resolve } from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\n\r\n/** 返回用户指定或默认的 Tracelet 数据目录。 */\r\nexport function dataDir(value?: string): string {\r\n return resolve(value ?? process.env.TRACELET_DATA_DIR ?? resolve(homedir(), \".tracelet\", \"data\"));\r\n}\r\n\r\n/** 返回当前用户的 Tracelet 配置文件路径。 */\r\nexport function settingsFile(): string {\r\n return resolve(homedir(), \".tracelet\", \"settings.json\");\r\n}\r\n\r\n/** 查找开发环境或构建产物中的 Dashboard 目录。 */\r\nexport function dashboardDir(): string {\r\n const bundled = fileURLToPath(new URL(\"./dashboard\", import.meta.url));\r\n const workspace = resolve(process.cwd(), \"apps/dashboard/dist\");\r\n return existsSync(bundled) ? bundled : workspace;\r\n}\r\n","/** 本文件负责规范化并脱敏需要持久化的 HTTP Header。 */\r\n\r\nimport type { IncomingHttpHeaders } from \"node:http\";\r\nimport type { HeaderMap } from \"./types.js\";\r\n\r\nconst secrets = new Set([\r\n \"authorization\",\r\n \"proxy-authorization\",\r\n \"x-api-key\",\r\n \"cookie\",\r\n \"set-cookie\",\r\n]);\r\n\r\n/** 把 Node Header 转成可序列化对象,并隐藏认证信息。 */\r\nexport function redactHeaders(headers: IncomingHttpHeaders): HeaderMap {\r\n const result: HeaderMap = {};\r\n\r\n for (const [name, value] of Object.entries(headers)) {\r\n if (value === undefined) {\r\n continue;\r\n }\r\n\r\n // 认证 Header 只保留存在性,避免令牌进入记录文件。\r\n result[name] = secrets.has(name.toLowerCase()) ? \"[REDACTED]\" : value;\r\n }\r\n\r\n return result;\r\n}\r\n","/** 本文件负责生成 Tracelet 内部使用的唯一标识。 */\r\n\r\nimport { randomUUID } from \"node:crypto\";\r\n\r\n/** 生成带业务前缀的唯一标识。 */\r\nexport function makeId(prefix: string): string {\r\n return `${prefix}_${randomUUID().replaceAll(\"-\", \"\")}`;\r\n}\r\n","/** 本文件负责提供记录流量时使用的时间工具。 */\r\n\r\n/** 获取当前 ISO 时间。 */\r\nexport function nowIso(): string {\r\n return new Date().toISOString();\r\n}\r\n\r\n/** 将高精度时间差转换为微秒。 */\r\nexport function elapsedUs(start: bigint): number {\r\n return Number((process.hrtime.bigint() - start) / 1_000n);\r\n}\r\n","/** 本文件负责组合 HTTP 代理、记录器、文件存储和 Dashboard 服务。 */\r\n\r\nimport http, { type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\r\nimport { ProxyServer } from \"@tracelet/proxy\";\r\nimport { Recorder } from \"@tracelet/recorder\";\r\nimport type { Protocol, RouteInfo, RunMeta } from \"@tracelet/shared\";\r\nimport { FileStore } from \"@tracelet/storage\";\r\nimport { serveApi } from \"./api.js\";\r\nimport { LiveBus } from \"./live.js\";\r\nimport { serveStatic } from \"./static.js\";\r\n\r\nexport interface ServerOptions {\r\n dataDir: string;\r\n dashboardDir: string;\r\n host?: string;\r\n}\r\n\r\nexport class TraceletServer {\r\n readonly dataDir: string;\r\n private readonly host: string;\r\n private readonly dashboardDir: string;\r\n private readonly store: FileStore;\r\n private readonly recorder: Recorder;\r\n private readonly proxy: ProxyServer;\r\n private readonly live = new LiveBus();\r\n private readonly routes = new Map<string, RouteInfo>();\r\n private readonly server: Server;\r\n private port = 0;\r\n\r\n /** 创建本地 Tracelet HTTP 服务。 */\r\n constructor(options: ServerOptions) {\r\n this.dataDir = options.dataDir;\r\n this.host = options.host ?? \"127.0.0.1\";\r\n this.dashboardDir = options.dashboardDir;\r\n this.store = new FileStore(this.dataDir);\r\n this.recorder = new Recorder(this.store, (meta) => this.live.publish(\"change\", { id: meta.id }));\r\n this.proxy = new ProxyServer(this.recorder);\r\n this.server = http.createServer((req, res) => {\r\n this.handle(req, res).catch((error: unknown) => {\r\n if (!res.headersSent) {\r\n res.writeHead(500, { \"content-type\": \"application/json; charset=utf-8\" });\r\n res.end(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }));\r\n } else {\r\n res.destroy();\r\n }\r\n });\r\n });\r\n }\r\n\r\n /** 初始化文件存储并监听本地端口。 */\r\n async listen(port: number): Promise<void> {\r\n await this.store.init();\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n /** 监听成功后记录系统实际分配的端口。 */\r\n const onListen = (): void => {\r\n const address = this.server.address();\r\n this.port = typeof address === \"object\" && address ? address.port : port;\r\n resolve();\r\n };\r\n\r\n this.server.once(\"error\", reject);\r\n this.server.listen(port, this.host, onListen);\r\n });\r\n }\r\n\r\n /** 返回当前 Dashboard 地址。 */\r\n url(): string {\r\n return `http://${this.host}:${this.port}`;\r\n }\r\n\r\n /** 注册一次 agent 运行及其固定上游地址。 */\r\n async addRun(run: RunMeta, protocol: Protocol, upstream: string, proxy?: string): Promise<string> {\r\n await this.store.startRun(run);\r\n const prefix = `/_tracelet/p/${run.id}/${protocol}`;\r\n this.routes.set(prefix, { runId: run.id, protocol, upstream, prefix, ...(proxy ? { proxy } : {}) });\r\n return `${this.url()}${prefix}`;\r\n }\r\n\r\n /** 更新运行结束信息并广播 Dashboard。 */\r\n async finishRun(run: RunMeta): Promise<void> {\r\n await this.store.finishRun(run);\r\n this.live.publish(\"change\", { runId: run.id });\r\n }\r\n\r\n /** 等待记录写入完成并关闭 HTTP 服务。 */\r\n async close(): Promise<void> {\r\n await this.recorder.drain();\r\n this.live.close();\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n /** 将 Node 回调式 close 转换为 Promise。 */\r\n function onClose(error?: Error): void {\r\n if (error) {\r\n reject(error);\r\n } else {\r\n resolve();\r\n }\r\n }\r\n\r\n this.server.close(onClose);\r\n });\r\n this.proxy.close();\r\n }\r\n\r\n /** 将请求分发到代理、Dashboard API 或静态资源。 */\r\n private async handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\r\n const url = new URL(req.url ?? \"/\", this.url());\r\n const route = this.findRoute(url.pathname);\r\n\r\n if (route) {\r\n await this.proxy.handle(req, res, route);\r\n return;\r\n }\r\n\r\n if (url.pathname.startsWith(\"/api/\") && (await serveApi(req, res, url.pathname, this.dataDir, this.live))) {\r\n return;\r\n }\r\n\r\n if (req.method !== \"GET\") {\r\n res.writeHead(404);\r\n res.end();\r\n return;\r\n }\r\n\r\n await serveStatic(this.dashboardDir, url.pathname, res);\r\n }\r\n\r\n /** 查找一个本地代理路径对应的运行路由。 */\r\n private findRoute(path: string): RouteInfo | undefined {\r\n return [...this.routes.values()].find(\r\n (item) => path === item.prefix || path.startsWith(`${item.prefix}/`),\r\n );\r\n }\r\n\r\n}\r\n","/** 本文件负责透明转发 HTTP 请求与流式响应,并把流量副本交给 Recorder。 */\r\n\r\nimport http, { type ClientRequest, type IncomingMessage, type ServerResponse } from \"node:http\";\r\nimport https from \"node:https\";\r\nimport { HttpProxyAgent } from \"http-proxy-agent\";\r\nimport { HttpsProxyAgent } from \"https-proxy-agent\";\r\nimport type { Capture, Recorder } from \"@tracelet/recorder\";\r\nimport type { RouteInfo } from \"@tracelet/shared\";\r\nimport { requestHeaders, responseHeaders } from \"./headers.js\";\r\nimport { targetUrl } from \"./target.js\";\r\n\r\n/** 将记录任务交给 Recorder 后台收尾。 */\r\nfunction finishCapture(recorder: Recorder, capture: Capture | undefined): void {\r\n if (capture) {\r\n recorder.track(capture.end());\r\n }\r\n}\r\n\r\n/** 在记录器可用时标记捕获失败。 */\r\nfunction failCapture(recorder: Recorder, capture: Capture | undefined, error: Error): void {\r\n if (capture) {\r\n recorder.track(capture.fail(error));\r\n }\r\n}\r\n\r\nexport class ProxyServer {\r\n private readonly recorder: Recorder;\r\n private readonly agents = new Map<string, HttpProxyAgent<string> | HttpsProxyAgent<string>>();\r\n\r\n /** 创建共享 Recorder 的透明代理。 */\r\n constructor(recorder: Recorder) {\r\n this.recorder = recorder;\r\n }\r\n\r\n /** 返回当前上游协议可复用的代理 Agent。 */\r\n private agent(target: URL, proxy: string | undefined): HttpProxyAgent<string> | HttpsProxyAgent<string> | undefined {\r\n if (!proxy) {\r\n return undefined;\r\n }\r\n\r\n const key = `${target.protocol}:${proxy}`;\r\n const cached = this.agents.get(key);\r\n if (cached) {\r\n return cached;\r\n }\r\n\r\n const agent = target.protocol === \"https:\"\r\n ? new HttpsProxyAgent(proxy, { keepAlive: true })\r\n : new HttpProxyAgent(proxy, { keepAlive: true });\r\n this.agents.set(key, agent);\r\n return agent;\r\n }\r\n\r\n /** 关闭全部系统代理连接。 */\r\n close(): void {\r\n for (const agent of this.agents.values()) {\r\n agent.destroy();\r\n }\r\n this.agents.clear();\r\n }\r\n\r\n /** 转发一次请求,并同步记录请求体与响应流。 */\r\n async handle(req: IncomingMessage, res: ServerResponse, route: RouteInfo): Promise<void> {\r\n const target = targetUrl(route, req.url ?? \"/\");\r\n const recorder = this.recorder;\r\n let capture: Capture | undefined;\r\n let upstreamReq: ClientRequest | undefined;\r\n let settled = false;\r\n\r\n try {\r\n capture = await this.recorder.start({\r\n runId: route.runId,\r\n protocol: route.protocol,\r\n method: req.method ?? \"GET\",\r\n path: `${target.pathname}${target.search}`,\r\n headers: req.headers,\r\n });\r\n } catch (error) {\r\n // 记录器不可用时仍继续转发,避免改变 agent 的执行结果。\r\n console.error(\"Tracelet failed to start recording:\", error);\r\n }\r\n\r\n const transport = target.protocol === \"https:\" ? https : http;\r\n upstreamReq = transport.request(\r\n target,\r\n {\r\n method: req.method,\r\n headers: requestHeaders(req.headers, target.host),\r\n // Proxy Agent 只改变上游连接路径,不修改请求内容。\r\n agent: this.agent(target, route.proxy),\r\n },\r\n (upstreamRes) => {\r\n capture?.resStart(upstreamRes.statusCode ?? 502, upstreamRes.headers);\r\n res.writeHead(upstreamRes.statusCode ?? 502, responseHeaders(upstreamRes.headers));\r\n\r\n /** 立即转发响应 chunk,同时保留其原始副本。 */\r\n function onData(chunk: Buffer): void {\r\n capture?.resChunk(chunk);\r\n if (!res.write(chunk)) {\r\n upstreamRes.pause();\r\n res.once(\"drain\", () => upstreamRes.resume());\r\n }\r\n }\r\n\r\n /** 正常结束下游响应与捕获任务。 */\r\n function onEnd(): void {\r\n settled = true;\r\n res.end();\r\n finishCapture(recorder, capture);\r\n }\r\n\r\n /** 将上游响应流错误传递给客户端并终止捕获。 */\r\n function onError(error: Error): void {\r\n settled = true;\r\n res.destroy(error);\r\n failCapture(recorder, capture, error);\r\n }\r\n\r\n upstreamRes.on(\"data\", onData);\r\n upstreamRes.once(\"end\", onEnd);\r\n upstreamRes.once(\"error\", onError);\r\n },\r\n );\r\n\r\n /** 转发并记录请求 body chunk。 */\r\n function onReqData(chunk: Buffer): void {\r\n capture?.reqChunk(chunk);\r\n upstreamReq?.write(chunk);\r\n }\r\n\r\n /** 请求体结束后完成解析并关闭上游写入端。 */\r\n function onReqEnd(): void {\r\n capture?.reqEnd();\r\n upstreamReq?.end();\r\n }\r\n\r\n /** 处理建立上游连接时发生的错误。 */\r\n const onUpstreamError = (error: Error): void => {\r\n if (settled) {\r\n return;\r\n }\r\n\r\n settled = true;\r\n if (!res.headersSent) {\r\n res.writeHead(502, { \"content-type\": \"application/json; charset=utf-8\" });\r\n res.end(JSON.stringify({ error: \"upstream_unavailable\" }));\r\n } else {\r\n res.destroy(error);\r\n }\r\n failCapture(this.recorder, capture, error);\r\n };\r\n\r\n /** 客户端提前断开时同步取消上游请求。 */\r\n function onClientClose(): void {\r\n if (!res.writableEnded && !settled) {\r\n upstreamReq?.destroy(new Error(\"Client disconnected\"));\r\n }\r\n }\r\n\r\n upstreamReq.once(\"error\", onUpstreamError);\r\n req.on(\"data\", onReqData);\r\n req.once(\"end\", onReqEnd);\r\n res.once(\"close\", onClientClose);\r\n }\r\n}\r\n","/** 本文件负责过滤代理转发时不能逐跳传递的 HTTP Header。 */\r\n\r\nimport type { IncomingHttpHeaders, OutgoingHttpHeaders } from \"node:http\";\r\n\r\nconst hopHeaders = new Set([\r\n \"connection\",\r\n \"keep-alive\",\r\n \"proxy-authenticate\",\r\n \"proxy-authorization\",\r\n \"te\",\r\n \"trailer\",\r\n \"transfer-encoding\",\r\n \"upgrade\",\r\n]);\r\n\r\n/** 复制端到端 Header,并为上游请求设置正确 Host。 */\r\nexport function requestHeaders(headers: IncomingHttpHeaders, host: string): OutgoingHttpHeaders {\r\n const result: OutgoingHttpHeaders = {};\r\n\r\n for (const [name, value] of Object.entries(headers)) {\r\n if (!hopHeaders.has(name.toLowerCase()) && value !== undefined) {\r\n result[name] = value;\r\n }\r\n }\r\n\r\n result.host = host;\r\n return result;\r\n}\r\n\r\n/** 过滤上游响应中的逐跳 Header。 */\r\nexport function responseHeaders(headers: IncomingHttpHeaders): OutgoingHttpHeaders {\r\n const result: OutgoingHttpHeaders = {};\r\n\r\n for (const [name, value] of Object.entries(headers)) {\r\n if (!hopHeaders.has(name.toLowerCase()) && value !== undefined) {\r\n result[name] = value;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n","/** 本文件负责把 Tracelet 代理路径转换为上游地址。 */\r\n\r\nimport type { RouteInfo } from \"@tracelet/shared\";\r\n\r\n/** 将本地代理路径转换为最终上游 URL。 */\r\nexport function targetUrl(route: RouteInfo, input: string): URL {\r\n const local = new URL(input, \"http://127.0.0.1\");\r\n const target = new URL(route.upstream);\r\n const suffix = local.pathname.slice(route.prefix.length).replace(/^\\//, \"\");\r\n const basePath = target.pathname.replace(/\\/$/, \"\");\r\n\r\n target.pathname = `${basePath}/${suffix}`;\r\n target.search = local.search;\r\n return target;\r\n}\r\n","// Some numerical data is initialized as -1 even when it doesn't need initialization to help the JIT infer types\n// aliases for shorter compressed code (most minifers don't do this)\nvar ab = ArrayBuffer, u8 = Uint8Array, u16 = Uint16Array, i16 = Int16Array, u32 = Uint32Array, i32 = Int32Array;\nvar slc = function (v, s, e) {\n if (u8.prototype.slice)\n return u8.prototype.slice.call(v, s, e);\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n var n = new u8(e - s);\n n.set(v.subarray(s, e));\n return n;\n};\nvar fill = function (v, n, s, e) {\n if (u8.prototype.fill)\n return u8.prototype.fill.call(v, n, s, e);\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n for (; s < e; ++s)\n v[s] = n;\n return v;\n};\nvar cpw = function (v, t, s, e) {\n if (u8.prototype.copyWithin)\n return u8.prototype.copyWithin.call(v, t, s, e);\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n while (s < e) {\n v[t++] = v[s++];\n }\n};\n/**\n * Codes for errors generated within this library\n */\nexport var ZstdErrorCode = {\n InvalidData: 0,\n WindowSizeTooLarge: 1,\n InvalidBlockType: 2,\n FSEAccuracyTooHigh: 3,\n DistanceTooFarBack: 4,\n UnexpectedEOF: 5\n};\n// error codes\nvar ec = [\n 'invalid zstd data',\n 'window size too large (>2046MB)',\n 'invalid block type',\n 'FSE accuracy too high',\n 'match distance too far back',\n 'unexpected EOF'\n];\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\nvar rb = function (d, b, n) {\n var i = 0, o = 0;\n for (; i < n; ++i)\n o |= d[b++] << (i << 3);\n return o;\n};\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\n// read Zstandard frame header\nvar rzfh = function (dat, w) {\n var n3 = dat[0] | (dat[1] << 8) | (dat[2] << 16);\n if (n3 == 0x2FB528 && dat[3] == 253) {\n // Zstandard\n var flg = dat[4];\n // single segment checksum dict flag frame content flag\n var ss = (flg >> 5) & 1, cc = (flg >> 2) & 1, df = flg & 3, fcf = flg >> 6;\n if (flg & 8)\n err(0);\n // byte\n var bt = 6 - ss;\n // dict bytes\n var db = df == 3 ? 4 : df;\n // dictionary id\n var di = rb(dat, bt, db);\n bt += db;\n // frame size bytes\n var fsb = fcf ? (1 << fcf) : ss;\n // frame source size\n var fss = rb(dat, bt, fsb) + ((fcf == 1) && 256);\n // window size\n var ws = fss;\n if (!ss) {\n // window descriptor\n var wb = 1 << (10 + (dat[5] >> 3));\n ws = wb + (wb >> 3) * (dat[5] & 7);\n }\n if (ws > 2145386496)\n err(1);\n var buf = new u8((w == 1 ? (fss || ws) : w ? 0 : ws) + 12);\n buf[0] = 1, buf[4] = 4, buf[8] = 8;\n return {\n b: bt + fsb,\n y: 0,\n l: 0,\n d: di,\n w: (w && w != 1) ? w : buf.subarray(12),\n e: ws,\n o: new i32(buf.buffer, 0, 3),\n u: fss,\n c: cc,\n m: Math.min(131072, ws)\n };\n }\n else if (((n3 >> 4) | (dat[3] << 20)) == 0x184D2A5) {\n // skippable\n return b4(dat, 4) + 8;\n }\n err(0);\n};\n// most significant bit for nonzero\nvar msb = function (val) {\n var bits = 0;\n for (; (1 << bits) <= val; ++bits)\n ;\n return bits - 1;\n};\n// read finite state entropy\nvar rfse = function (dat, bt, mal) {\n // table pos\n var tpos = (bt << 3) + 4;\n // accuracy log\n var al = (dat[bt] & 15) + 5;\n if (al > mal)\n err(3);\n // size\n var sz = 1 << al;\n // probabilities symbols repeat index high threshold\n var probs = sz, sym = -1, re = -1, i = -1, ht = sz;\n // optimization: single allocation is much faster\n var buf = new ab(512 + (sz << 2));\n var freq = new i16(buf, 0, 256);\n // same view as freq\n var dstate = new u16(buf, 0, 256);\n var nstate = new u16(buf, 512, sz);\n var bb1 = 512 + (sz << 1);\n var syms = new u8(buf, bb1, sz);\n var nbits = new u8(buf, bb1 + sz);\n while (sym < 255 && probs > 0) {\n var bits = msb(probs + 1);\n var cbt = tpos >> 3;\n // mask\n var msk = (1 << (bits + 1)) - 1;\n var val = ((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (tpos & 7)) & msk;\n // mask (1 fewer bit)\n var msk1fb = (1 << bits) - 1;\n // max small value\n var msv = msk - probs - 1;\n // small value\n var sval = val & msk1fb;\n if (sval < msv)\n tpos += bits, val = sval;\n else {\n tpos += bits + 1;\n if (val > msk1fb)\n val -= msv;\n }\n freq[++sym] = --val;\n if (val == -1) {\n probs += val;\n syms[--ht] = sym;\n }\n else\n probs -= val;\n if (!val) {\n do {\n // repeat byte\n var rbt = tpos >> 3;\n re = ((dat[rbt] | (dat[rbt + 1] << 8)) >> (tpos & 7)) & 3;\n tpos += 2;\n sym += re;\n } while (re == 3);\n }\n }\n if (sym > 255 || probs)\n err(0);\n var sympos = 0;\n // sym step (coprime with sz - formula from zstd source)\n var sstep = (sz >> 1) + (sz >> 3) + 3;\n // sym mask\n var smask = sz - 1;\n for (var s = 0; s <= sym; ++s) {\n var sf = freq[s];\n if (sf < 1) {\n dstate[s] = -sf;\n continue;\n }\n // This is split into two loops in zstd to avoid branching, but as JS is higher-level that is unnecessary\n for (i = 0; i < sf; ++i) {\n syms[sympos] = s;\n do {\n sympos = (sympos + sstep) & smask;\n } while (sympos >= ht);\n }\n }\n // After spreading symbols, should be zero again\n if (sympos)\n err(0);\n for (i = 0; i < sz; ++i) {\n // next state\n var ns = dstate[syms[i]]++;\n // num bits\n var nb = nbits[i] = al - msb(ns);\n nstate[i] = (ns << nb) - sz;\n }\n return [(tpos + 7) >> 3, {\n b: al,\n s: syms,\n n: nbits,\n t: nstate\n }];\n};\n// read huffman\nvar rhu = function (dat, bt) {\n // index weight count\n var i = 0, wc = -1;\n // buffer header byte\n var buf = new u8(292), hb = dat[bt];\n // huffman weights\n var hw = buf.subarray(0, 256);\n // rank count\n var rc = buf.subarray(256, 268);\n // rank index\n var ri = new u16(buf.buffer, 268);\n // NOTE: at this point bt is 1 less than expected\n if (hb < 128) {\n // end byte, fse decode table\n var _a = rfse(dat, bt + 1, 6), ebt = _a[0], fdt = _a[1];\n bt += hb;\n var epos = ebt << 3;\n // last byte\n var lb = dat[bt];\n if (!lb)\n err(0);\n // state1 state2 state1 bits state2 bits\n var st1 = 0, st2 = 0, btr1 = fdt.b, btr2 = btr1;\n // fse pos\n // pre-increment to account for original deficit of 1\n var fpos = (++bt << 3) - 8 + msb(lb);\n for (;;) {\n fpos -= btr1;\n if (fpos < epos)\n break;\n var cbt = fpos >> 3;\n st1 += ((dat[cbt] | (dat[cbt + 1] << 8)) >> (fpos & 7)) & ((1 << btr1) - 1);\n hw[++wc] = fdt.s[st1];\n fpos -= btr2;\n if (fpos < epos)\n break;\n cbt = fpos >> 3;\n st2 += ((dat[cbt] | (dat[cbt + 1] << 8)) >> (fpos & 7)) & ((1 << btr2) - 1);\n hw[++wc] = fdt.s[st2];\n btr1 = fdt.n[st1];\n st1 = fdt.t[st1];\n btr2 = fdt.n[st2];\n st2 = fdt.t[st2];\n }\n if (++wc > 255)\n err(0);\n }\n else {\n wc = hb - 127;\n for (; i < wc; i += 2) {\n var byte = dat[++bt];\n hw[i] = byte >> 4;\n hw[i + 1] = byte & 15;\n }\n ++bt;\n }\n // weight exponential sum\n var wes = 0;\n for (i = 0; i < wc; ++i) {\n var wt = hw[i];\n // bits must be at most 11, same as weight\n if (wt > 11)\n err(0);\n wes += wt && (1 << (wt - 1));\n }\n // max bits\n var mb = msb(wes) + 1;\n // table size\n var ts = 1 << mb;\n // remaining sum\n var rem = ts - wes;\n // must be power of 2\n if (rem & (rem - 1))\n err(0);\n hw[wc++] = msb(rem) + 1;\n for (i = 0; i < wc; ++i) {\n var wt = hw[i];\n ++rc[hw[i] = wt && (mb + 1 - wt)];\n }\n // huf buf\n var hbuf = new u8(ts << 1);\n // symbols num bits\n var syms = hbuf.subarray(0, ts), nb = hbuf.subarray(ts);\n ri[mb] = 0;\n for (i = mb; i > 0; --i) {\n var pv = ri[i];\n fill(nb, i, pv, ri[i - 1] = pv + rc[i] * (1 << (mb - i)));\n }\n if (ri[0] != ts)\n err(0);\n for (i = 0; i < wc; ++i) {\n var bits = hw[i];\n if (bits) {\n var code = ri[bits];\n fill(syms, i, code, ri[bits] = code + (1 << (mb - bits)));\n }\n }\n return [bt, {\n n: nb,\n b: mb,\n s: syms\n }];\n};\n// Tables generated using this:\n// https://gist.github.com/101arrowz/a979452d4355992cbf8f257cbffc9edd\n// default literal length table\nvar dllt = /*#__PURE__*/ rfse(/*#__PURE__*/ new u8([\n 81, 16, 99, 140, 49, 198, 24, 99, 12, 33, 196, 24, 99, 102, 102, 134, 70, 146, 4\n]), 0, 6)[1];\n// default match length table\nvar dmlt = /*#__PURE__*/ rfse(/*#__PURE__*/ new u8([\n 33, 20, 196, 24, 99, 140, 33, 132, 16, 66, 8, 33, 132, 16, 66, 8, 33, 68, 68, 68, 68, 68, 68, 68, 68, 36, 9\n]), 0, 6)[1];\n// default offset code table\nvar doct = /*#__PURE__ */ rfse(/*#__PURE__*/ new u8([\n 32, 132, 16, 66, 102, 70, 68, 68, 68, 68, 36, 73, 2\n]), 0, 5)[1];\n// bits to baseline\nvar b2bl = function (b, s) {\n var len = b.length, bl = new i32(len);\n for (var i = 0; i < len; ++i) {\n bl[i] = s;\n s += 1 << b[i];\n }\n return bl;\n};\n// literal length bits\nvar llb = /*#__PURE__ */ new u8(( /*#__PURE__ */new i32([\n 0, 0, 0, 0, 16843009, 50528770, 134678020, 202050057, 269422093\n])).buffer, 0, 36);\n// literal length baseline\nvar llbl = /*#__PURE__ */ b2bl(llb, 0);\n// match length bits\nvar mlb = /*#__PURE__ */ new u8(( /*#__PURE__ */new i32([\n 0, 0, 0, 0, 0, 0, 0, 0, 16843009, 50528770, 117769220, 185207048, 252579084, 16\n])).buffer, 0, 53);\n// match length baseline\nvar mlbl = /*#__PURE__ */ b2bl(mlb, 3);\n// decode huffman stream\nvar dhu = function (dat, out, hu) {\n var len = dat.length, ss = out.length, lb = dat[len - 1], msk = (1 << hu.b) - 1, eb = -hu.b;\n if (!lb)\n err(0);\n var st = 0, btr = hu.b, pos = (len << 3) - 8 + msb(lb) - btr, i = -1;\n for (; pos > eb && i < ss;) {\n var cbt = pos >> 3;\n var val = (dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (pos & 7);\n st = ((st << btr) | val) & msk;\n out[++i] = hu.s[st];\n pos -= (btr = hu.n[st]);\n }\n if (pos != eb || i + 1 != ss)\n err(0);\n};\n// decode huffman stream 4x\n// TODO: use workers to parallelize\nvar dhu4 = function (dat, out, hu) {\n var bt = 6;\n var ss = out.length, sz1 = (ss + 3) >> 2, sz2 = sz1 << 1, sz3 = sz1 + sz2;\n dhu(dat.subarray(bt, bt += dat[0] | (dat[1] << 8)), out.subarray(0, sz1), hu);\n dhu(dat.subarray(bt, bt += dat[2] | (dat[3] << 8)), out.subarray(sz1, sz2), hu);\n dhu(dat.subarray(bt, bt += dat[4] | (dat[5] << 8)), out.subarray(sz2, sz3), hu);\n dhu(dat.subarray(bt), out.subarray(sz3), hu);\n};\n// read Zstandard block\nvar rzb = function (dat, st, out) {\n var _a;\n var bt = st.b;\n // byte 0 block type\n var b0 = dat[bt], btype = (b0 >> 1) & 3;\n st.l = b0 & 1;\n var sz = (b0 >> 3) | (dat[bt + 1] << 5) | (dat[bt + 2] << 13);\n // end byte for block\n var ebt = (bt += 3) + sz;\n if (btype == 1) {\n if (bt >= dat.length)\n return;\n st.b = bt + 1;\n if (out) {\n fill(out, dat[bt], st.y, st.y += sz);\n return out;\n }\n return fill(new u8(sz), dat[bt]);\n }\n if (ebt > dat.length)\n return;\n if (btype == 0) {\n st.b = ebt;\n if (out) {\n out.set(dat.subarray(bt, ebt), st.y);\n st.y += sz;\n return out;\n }\n return slc(dat, bt, ebt);\n }\n if (btype == 2) {\n // byte 3 lit btype size format\n var b3 = dat[bt], lbt = b3 & 3, sf = (b3 >> 2) & 3;\n // lit src size lit cmp sz 4 streams\n var lss = b3 >> 4, lcs = 0, s4 = 0;\n if (lbt < 2) {\n if (sf & 1)\n lss |= (dat[++bt] << 4) | ((sf & 2) && (dat[++bt] << 12));\n else\n lss = b3 >> 3;\n }\n else {\n s4 = sf;\n if (sf < 2)\n lss |= ((dat[++bt] & 63) << 4), lcs = (dat[bt] >> 6) | (dat[++bt] << 2);\n else if (sf == 2)\n lss |= (dat[++bt] << 4) | ((dat[++bt] & 3) << 12), lcs = (dat[bt] >> 2) | (dat[++bt] << 6);\n else\n lss |= (dat[++bt] << 4) | ((dat[++bt] & 63) << 12), lcs = (dat[bt] >> 6) | (dat[++bt] << 2) | (dat[++bt] << 10);\n }\n ++bt;\n // add literals to end - can never overlap with backreferences because unused literals always appended\n var buf = out ? out.subarray(st.y, st.y + st.m) : new u8(st.m);\n // starting point for literals\n var spl = buf.length - lss;\n if (lbt == 0)\n buf.set(dat.subarray(bt, bt += lss), spl);\n else if (lbt == 1)\n fill(buf, dat[bt++], spl);\n else {\n // huffman table\n var hu = st.h;\n if (lbt == 2) {\n var hud = rhu(dat, bt);\n // subtract description length\n lcs += bt - (bt = hud[0]);\n st.h = hu = hud[1];\n }\n else if (!hu)\n err(0);\n (s4 ? dhu4 : dhu)(dat.subarray(bt, bt += lcs), buf.subarray(spl), hu);\n }\n // num sequences\n var ns = dat[bt++];\n if (ns) {\n if (ns == 255)\n ns = (dat[bt++] | (dat[bt++] << 8)) + 0x7F00;\n else if (ns > 127)\n ns = ((ns - 128) << 8) | dat[bt++];\n // symbol compression modes\n var scm = dat[bt++];\n if (scm & 3)\n err(0);\n var dts = [dmlt, doct, dllt];\n for (var i = 2; i > -1; --i) {\n var md = (scm >> ((i << 1) + 2)) & 3;\n if (md == 1) {\n // rle buf\n var rbuf = new u8([0, 0, dat[bt++]]);\n dts[i] = {\n s: rbuf.subarray(2, 3),\n n: rbuf.subarray(0, 1),\n t: new u16(rbuf.buffer, 0, 1),\n b: 0\n };\n }\n else if (md == 2) {\n // accuracy log 8 for offsets, 9 for others\n _a = rfse(dat, bt, 9 - (i & 1)), bt = _a[0], dts[i] = _a[1];\n }\n else if (md == 3) {\n if (!st.t)\n err(0);\n dts[i] = st.t[i];\n }\n }\n var _b = st.t = dts, mlt = _b[0], oct = _b[1], llt = _b[2];\n var lb = dat[ebt - 1];\n if (!lb)\n err(0);\n var spos = (ebt << 3) - 8 + msb(lb) - llt.b, cbt = spos >> 3, oubt = 0;\n var lst = ((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << llt.b) - 1);\n cbt = (spos -= oct.b) >> 3;\n var ost = ((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << oct.b) - 1);\n cbt = (spos -= mlt.b) >> 3;\n var mst = ((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << mlt.b) - 1);\n for (++ns; --ns;) {\n var llc = llt.s[lst];\n var lbtr = llt.n[lst];\n var mlc = mlt.s[mst];\n var mbtr = mlt.n[mst];\n var ofc = oct.s[ost];\n var obtr = oct.n[ost];\n cbt = (spos -= ofc) >> 3;\n var ofp = 1 << ofc;\n var off = ofp + (((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16) | (dat[cbt + 3] << 24)) >>> (spos & 7)) & (ofp - 1));\n cbt = (spos -= mlb[mlc]) >> 3;\n var ml = mlbl[mlc] + (((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (spos & 7)) & ((1 << mlb[mlc]) - 1));\n cbt = (spos -= llb[llc]) >> 3;\n var ll = llbl[llc] + (((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (spos & 7)) & ((1 << llb[llc]) - 1));\n cbt = (spos -= lbtr) >> 3;\n lst = llt.t[lst] + (((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << lbtr) - 1));\n cbt = (spos -= mbtr) >> 3;\n mst = mlt.t[mst] + (((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << mbtr) - 1));\n cbt = (spos -= obtr) >> 3;\n ost = oct.t[ost] + (((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << obtr) - 1));\n if (off > 3) {\n st.o[2] = st.o[1];\n st.o[1] = st.o[0];\n st.o[0] = off -= 3;\n }\n else {\n var idx = off - (ll != 0);\n if (idx) {\n off = idx == 3 ? st.o[0] - 1 : st.o[idx];\n if (idx > 1)\n st.o[2] = st.o[1];\n st.o[1] = st.o[0];\n st.o[0] = off;\n }\n else\n off = st.o[0];\n }\n for (var i = 0; i < ll; ++i) {\n buf[oubt + i] = buf[spl + i];\n }\n oubt += ll, spl += ll;\n var stin = oubt - off;\n if (stin < 0) {\n var len = -stin;\n var bs = st.e + stin;\n if (len > ml)\n len = ml;\n for (var i = 0; i < len; ++i) {\n buf[oubt + i] = st.w[bs + i];\n }\n oubt += len, ml -= len, stin = 0;\n }\n for (var i = 0; i < ml; ++i) {\n buf[oubt + i] = buf[stin + i];\n }\n oubt += ml;\n }\n if (oubt != spl) {\n while (spl < buf.length) {\n buf[oubt++] = buf[spl++];\n }\n }\n else\n oubt = buf.length;\n if (out)\n st.y += oubt;\n else\n buf = slc(buf, 0, oubt);\n }\n else if (out) {\n st.y += lss;\n if (spl) {\n for (var i = 0; i < lss; ++i) {\n buf[i] = buf[spl + i];\n }\n }\n }\n else if (spl)\n buf = slc(buf, spl);\n st.b = ebt;\n return buf;\n }\n err(2);\n};\n// concat\nvar cct = function (bufs, ol) {\n if (bufs.length == 1)\n return bufs[0];\n var buf = new u8(ol);\n for (var i = 0, b = 0; i < bufs.length; ++i) {\n var chk = bufs[i];\n buf.set(chk, b);\n b += chk.length;\n }\n return buf;\n};\n/**\n * Decompresses Zstandard data\n * @param dat The input data\n * @param buf The output buffer. If unspecified, the function will allocate\n * exactly enough memory to fit the decompressed data. If your\n * data has multiple frames and you know the output size, specifying\n * it will yield better performance.\n * @returns The decompressed data\n */\nexport function decompress(dat, buf) {\n var bufs = [], nb = +!buf;\n var bt = 0, ol = 0;\n for (; dat.length;) {\n var st = rzfh(dat, nb || buf);\n if (typeof st == 'object') {\n if (nb) {\n buf = null;\n if (st.w.length == st.u) {\n bufs.push(buf = st.w);\n ol += st.u;\n }\n }\n else {\n bufs.push(buf);\n st.e = 0;\n }\n for (; !st.l;) {\n var blk = rzb(dat, st, buf);\n if (!blk)\n err(5);\n if (buf)\n st.e = st.y;\n else {\n bufs.push(blk);\n ol += blk.length;\n cpw(st.w, 0, blk.length);\n st.w.set(blk, st.w.length - blk.length);\n }\n }\n bt = st.b + (st.c * 4);\n }\n else\n bt = st;\n dat = dat.subarray(bt);\n }\n return cct(bufs, ol);\n}\n/**\n * Decompressor for Zstandard streamed data\n */\nvar Decompress = /*#__PURE__*/ (function () {\n /**\n * Creates a Zstandard decompressor\n * @param ondata The handler for stream data\n */\n function Decompress(ondata) {\n this.ondata = ondata;\n this.c = [];\n this.l = 0;\n this.z = 0;\n }\n /**\n * Pushes data to be decompressed\n * @param chunk The chunk of data to push\n * @param final Whether or not this is the last chunk in the stream\n */\n Decompress.prototype.push = function (chunk, final) {\n if (typeof this.s == 'number') {\n var sub = Math.min(chunk.length, this.s);\n chunk = chunk.subarray(sub);\n this.s -= sub;\n }\n var sl = chunk.length;\n var ncs = sl + this.l;\n if (!this.s) {\n if (final) {\n if (!ncs) {\n this.ondata(new u8(0), true);\n return;\n }\n // min for frame + one block\n if (ncs < 5)\n err(5);\n }\n else if (ncs < 18) {\n this.c.push(chunk);\n this.l = ncs;\n return;\n }\n if (this.l) {\n this.c.push(chunk);\n chunk = cct(this.c, ncs);\n this.c = [];\n this.l = 0;\n }\n if (typeof (this.s = rzfh(chunk)) == 'number')\n return this.push(chunk, final);\n }\n if (typeof this.s != 'number') {\n if (ncs < (this.z || 3)) {\n if (final)\n err(5);\n this.c.push(chunk);\n this.l = ncs;\n return;\n }\n if (this.l) {\n this.c.push(chunk);\n chunk = cct(this.c, ncs);\n this.c = [];\n this.l = 0;\n }\n if (!this.z && ncs < (this.z = (chunk[this.s.b] & 2) ? 4 : 3 + ((chunk[this.s.b] >> 3) | (chunk[this.s.b + 1] << 5) | (chunk[this.s.b + 2] << 13)))) {\n if (final)\n err(5);\n this.c.push(chunk);\n this.l = ncs;\n return;\n }\n else\n this.z = 0;\n for (;;) {\n var blk = rzb(chunk, this.s);\n if (!blk) {\n if (final)\n err(5);\n var adc = chunk.subarray(this.s.b);\n this.s.b = 0;\n this.c.push(adc), this.l += adc.length;\n return;\n }\n else {\n this.ondata(blk, false);\n cpw(this.s.w, 0, blk.length);\n this.s.w.set(blk, this.s.w.length - blk.length);\n }\n if (this.s.l) {\n var rest = chunk.subarray(this.s.b);\n this.s = this.s.c * 4;\n this.push(rest, final);\n return;\n }\n }\n }\n else if (final)\n err(5);\n };\n return Decompress;\n}());\nexport { Decompress };\n","/** 本文件负责解码代理保留的 HTTP 请求体副本。 */\r\n\r\nimport type { HeaderValue } from \"@tracelet/shared\";\r\nimport { decompress } from \"fzstd\";\r\n\r\n/** 返回规范化后的单一 Content-Encoding。 */\r\nfunction encoding(value: HeaderValue | undefined): string {\r\n return (Array.isArray(value) ? value[0] : value)?.trim().toLowerCase() ?? \"identity\";\r\n}\r\n\r\n/** 按 Content-Encoding 解码请求体,且不修改传入的原始字节。 */\r\nexport function decodeBody(body: Uint8Array, value?: HeaderValue): Uint8Array {\r\n const name = encoding(value);\r\n if (name === \"identity\") {\r\n return body;\r\n }\r\n if (name === \"zstd\") {\r\n return decompress(body);\r\n }\r\n\r\n throw new Error(`暂不支持的 Content-Encoding:${name}`);\r\n}\r\n","/** 本文件负责解析代理捕获到的完整 LLM 请求体。 */\r\n\r\nimport type { ParsedRequest } from \"@tracelet/shared\";\r\n\r\n/** 解析请求 JSON,并提取 Dashboard 常用字段。 */\r\nexport function parseRequest(text: string): ParsedRequest {\r\n const body = JSON.parse(text) as Record<string, unknown>;\r\n const model = typeof body?.model === \"string\" ? body.model : undefined;\r\n\r\n return {\r\n ...(model ? { model } : {}),\r\n stream: body?.stream === true,\r\n body,\r\n };\r\n}\r\n","function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\")\n throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f)\n throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver))\n throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return kind === \"a\" ? f.call(receiver, value) : f ? (f.value = value) : state.set(receiver, value), value;\n}\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f)\n throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver))\n throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\nexport { __classPrivateFieldSet, __classPrivateFieldGet };\n","/**\n * Single source of truth for the `x-stainless-helper` telemetry header — the\n * key, the closed value vocabulary, and per-object helper tagging. The\n * append-don't-clobber merge for the header itself lives in\n * {@link import('../internal/headers').buildHeaders} via `APPEND_HEADERS`.\n */\n\n/**\n * Telemetry header naming the SDK helper(s) a request came from. Always this\n * lowercase form; `buildHeaders` matches it case-insensitively for its append\n * semantics, but a single canonical casing keeps every call site greppable.\n */\nexport const STAINLESS_HELPER_HEADER = 'x-stainless-helper';\n\n/** Telemetry header naming the SDK method (e.g. `stream`) in use. */\nexport const STAINLESS_HELPER_METHOD_HEADER = 'x-stainless-helper-method';\n\n/**\n * The closed set of helper telemetry tags, shared verbatim across SDKs. A\n * typo at any call site is a type error rather than silently mistagged\n * telemetry. Existing values keep their original spellings — telemetry\n * consumers match on them, so renames lose history. New tags are hyphenated\n * lowercase.\n */\nexport type StainlessHelperHeaderValue =\n | 'BetaToolRunner'\n | 'betaZodTool'\n | 'compaction'\n | 'environments-work-poller'\n | 'environments-worker'\n | 'fallback-refusal-middleware'\n | 'mcpContent'\n | 'mcpMessage'\n | 'mcpResourceToContent'\n | 'mcpResourceToFile'\n | 'mcpTool'\n | 'session-tool-runner';\n\n/**\n * The `{ 'x-stainless-helper': value }` header dict, for passing into\n * `buildHeaders` (which comma-appends `x-stainless-helper` across sources)\n * or as `defaultHeaders`/per-request `headers`.\n */\nexport function helperHeader(value: StainlessHelperHeaderValue): { [STAINLESS_HELPER_HEADER]: string } {\n return { [STAINLESS_HELPER_HEADER]: value };\n}\n\n/**\n * Symbol used to mark objects created by SDK helpers for tracking.\n * The value is the helper name (e.g., 'mcpTool', 'betaZodTool').\n */\nexport const SDK_HELPER_SYMBOL = Symbol('anthropic.sdk.stainlessHelper');\n\ntype StainlessHelperObject = { [SDK_HELPER_SYMBOL]: string };\n\nexport function wasCreatedByStainlessHelper(value: unknown): value is StainlessHelperObject {\n return typeof value === 'object' && value !== null && SDK_HELPER_SYMBOL in value;\n}\n\n/**\n * Collects helper names from tools and messages arrays.\n * Returns a deduplicated array of helper names found.\n */\nexport function collectStainlessHelpers(\n tools: readonly unknown[] | undefined,\n messages: readonly unknown[] | undefined,\n): string[] {\n const helpers = new Set<string>();\n\n // Collect from tools\n if (tools) {\n for (const tool of tools) {\n if (wasCreatedByStainlessHelper(tool)) {\n helpers.add(tool[SDK_HELPER_SYMBOL]);\n }\n }\n }\n\n // Collect from messages and their content blocks\n if (messages) {\n for (const message of messages) {\n if (wasCreatedByStainlessHelper(message)) {\n helpers.add(message[SDK_HELPER_SYMBOL]);\n }\n\n const content = (message as { content?: unknown }).content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (wasCreatedByStainlessHelper(block)) {\n helpers.add(block[SDK_HELPER_SYMBOL]);\n }\n }\n }\n }\n }\n\n return Array.from(helpers);\n}\n\n/**\n * Builds x-stainless-helper header value from tools and messages.\n * Returns an empty object if no helpers are found.\n */\nexport function stainlessHelperHeader(\n tools: readonly unknown[] | undefined,\n messages: readonly unknown[] | undefined,\n): { 'x-stainless-helper'?: string } {\n const helpers = collectStainlessHelpers(tools, messages);\n if (helpers.length === 0) return {};\n return { [STAINLESS_HELPER_HEADER]: helpers.join(', ') };\n}\n\n/**\n * Builds x-stainless-helper header value from a file object.\n * Returns an empty object if the file is not marked with a helper.\n */\nexport function stainlessHelperHeaderFromFile(file: unknown): { 'x-stainless-helper'?: string } {\n if (wasCreatedByStainlessHelper(file)) {\n return { [STAINLESS_HELPER_HEADER]: file[SDK_HELPER_SYMBOL] };\n }\n return {};\n}\n","export function isAbortError(err: unknown) {\n return (\n typeof err === 'object' &&\n err !== null &&\n // Spec-compliant fetch implementations\n (('name' in err && (err as any).name === 'AbortError') ||\n // Expo fetch\n ('message' in err && String((err as any).message).includes('FetchRequestCanceledException')))\n );\n}\n\nexport const castToError = (err: any): Error => {\n if (err instanceof Error) return err;\n if (typeof err === 'object' && err !== null) {\n try {\n const tag = Object.prototype.toString.call(err);\n // cross-realm errors (e.g. undici's abort `DOMException` under jest) fail `instanceof Error`\n if (tag === '[object Error]' || tag === '[object DOMException]') {\n // @ts-ignore - not all envs have native support for cause yet\n const error = new Error(err.message, err.cause ? { cause: err.cause } : {});\n if (err.stack) error.stack = err.stack;\n // @ts-ignore - not all envs have native support for cause yet\n if (err.cause && !error.cause) error.cause = err.cause;\n if (err.name) error.name = err.name;\n return error;\n }\n } catch {}\n try {\n return new Error(JSON.stringify(err));\n } catch {}\n }\n return new Error(err);\n};\n","import { castToError } from '../internal/errors';\nimport type { ErrorType } from '../resources/shared';\n\nexport class AnthropicError extends Error {}\n\nexport class APIError<\n TStatus extends number | undefined = number | undefined,\n THeaders extends Headers | undefined = Headers | undefined,\n TError extends Object | undefined = Object | undefined,\n> extends AnthropicError {\n /** HTTP status for the response that caused the error */\n readonly status: TStatus;\n /** HTTP headers for the response that caused the error */\n readonly headers: THeaders;\n /** JSON body of the response that caused the error */\n readonly error: TError;\n\n readonly requestID: string | null | undefined;\n readonly workspaceID: string | null | undefined;\n\n /** The `error.type` from the API response body, e.g. `\"rate_limit_error\"` */\n readonly type: ErrorType | null;\n\n constructor(\n status: TStatus,\n error: TError,\n message: string | undefined,\n headers: THeaders,\n type?: ErrorType | null,\n ) {\n super(`${APIError.makeMessage(status, error, message)}`);\n this.status = status;\n this.headers = headers;\n this.requestID = headers?.get('request-id');\n this.workspaceID = headers?.get('anthropic-workspace-id');\n this.error = error;\n this.type = type ?? null;\n }\n\n private static makeMessage(status: number | undefined, error: any, message: string | undefined) {\n const msg =\n error?.message ?\n typeof error.message === 'string' ?\n error.message\n : JSON.stringify(error.message)\n : error ? JSON.stringify(error)\n : message;\n\n if (status && msg) {\n return `${status} ${msg}`;\n }\n if (status) {\n return `${status} status code (no body)`;\n }\n if (msg) {\n return msg;\n }\n return '(no status code or body)';\n }\n\n static generate(\n status: number | undefined,\n errorResponse: Object | undefined,\n message: string | undefined,\n headers: Headers | undefined,\n ): APIError {\n if (!status || !headers) {\n return new APIConnectionError({ message, cause: castToError(errorResponse) });\n }\n\n const error = errorResponse as Record<string, any>;\n const type = error?.['error']?.['type'] as ErrorType | undefined;\n\n if (status === 400) {\n return new BadRequestError(status, error, message, headers, type);\n }\n\n if (status === 401) {\n return new AuthenticationError(status, error, message, headers, type);\n }\n\n if (status === 403) {\n return new PermissionDeniedError(status, error, message, headers, type);\n }\n\n if (status === 404) {\n return new NotFoundError(status, error, message, headers, type);\n }\n\n if (status === 409) {\n return new ConflictError(status, error, message, headers, type);\n }\n\n if (status === 422) {\n return new UnprocessableEntityError(status, error, message, headers, type);\n }\n\n if (status === 429) {\n return new RateLimitError(status, error, message, headers, type);\n }\n\n if (status >= 500) {\n return new InternalServerError(status, error, message, headers, type);\n }\n\n return new APIError(status, error, message, headers, type);\n }\n}\n\nexport class APIUserAbortError extends APIError<undefined, undefined, undefined> {\n constructor({ message }: { message?: string } = {}) {\n super(undefined, undefined, message || 'Request was aborted.', undefined);\n }\n}\n\nexport class APIConnectionError extends APIError<undefined, undefined, undefined> {\n constructor({ message, cause }: { message?: string | undefined; cause?: Error | undefined }) {\n super(undefined, undefined, message || 'Connection error.', undefined);\n // in some environments the 'cause' property is already declared\n // @ts-ignore\n if (cause) this.cause = cause;\n }\n}\n\nexport class APIConnectionTimeoutError extends APIConnectionError {\n constructor({ message }: { message?: string } = {}) {\n super({ message: message ?? 'Request timed out.' });\n }\n}\n\n/**\n * An error that opts into the SDK's retry policy: throw it (e.g. from\n * middleware) to have the attempt retried.\n *\n * Note that the request will only be retried when `maxRetries` has not been exhausted.\n */\nexport class RetryableError extends AnthropicError {\n constructor(message?: string, { cause }: { cause?: unknown } = {}) {\n super(message ?? 'Retryable error.');\n // in some environments the 'cause' property is already declared\n // @ts-ignore\n if (cause !== undefined) this.cause = cause;\n }\n}\n\nexport class BadRequestError extends APIError<400, Headers> {}\n\nexport class AuthenticationError extends APIError<401, Headers> {}\n\nexport class PermissionDeniedError extends APIError<403, Headers> {}\n\nexport class NotFoundError extends APIError<404, Headers> {}\n\nexport class ConflictError extends APIError<409, Headers> {}\n\nexport class UnprocessableEntityError extends APIError<422, Headers> {}\n\nexport class RateLimitError extends APIError<429, Headers> {}\n\nexport class InternalServerError extends APIError<number, Headers> {}\n","import { AnthropicError } from '../../core/error';\n\n// https://url.spec.whatwg.org/#url-scheme-string\nconst startsWithSchemeRegexp = /^[a-z][a-z0-9+.-]*:/i;\n\nexport const isAbsoluteURL = (url: string): boolean => {\n return startsWithSchemeRegexp.test(url);\n};\n\nexport let isArray = (val: unknown): val is unknown[] => ((isArray = Array.isArray), isArray(val));\nexport let isReadonlyArray = isArray as (val: unknown) => val is readonly unknown[];\n\n/** Returns an object if the given value isn't an object, otherwise returns as-is */\nexport function maybeObj(x: unknown): object {\n if (typeof x !== 'object') {\n return {};\n }\n\n return x ?? {};\n}\n\n// https://stackoverflow.com/a/34491287\nexport function isEmptyObj(obj: Object | null | undefined): boolean {\n if (!obj) return true;\n for (const _k in obj) return false;\n return true;\n}\n\n// https://eslint.org/docs/latest/rules/no-prototype-builtins\nexport function hasOwn<T extends object = object>(obj: T, key: PropertyKey): key is keyof T {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexport function isObj(obj: unknown): obj is Record<string, unknown> {\n return obj != null && typeof obj === 'object' && !Array.isArray(obj);\n}\n\nexport const ensurePresent = <T>(value: T | null | undefined): T => {\n if (value == null) {\n throw new AnthropicError(`Expected a value to be given but received ${value} instead.`);\n }\n\n return value;\n};\n\nexport const validatePositiveInteger = (name: string, n: unknown): number => {\n if (typeof n !== 'number' || !Number.isInteger(n)) {\n throw new AnthropicError(`${name} must be an integer`);\n }\n if (n < 0) {\n throw new AnthropicError(`${name} must be a positive integer`);\n }\n return n;\n};\n\nexport const coerceInteger = (value: unknown): number => {\n if (typeof value === 'number') return Math.round(value);\n if (typeof value === 'string') return parseInt(value, 10);\n\n throw new AnthropicError(`Could not coerce ${value} (type: ${typeof value}) into a number`);\n};\n\nexport const coerceFloat = (value: unknown): number => {\n if (typeof value === 'number') return value;\n if (typeof value === 'string') return parseFloat(value);\n\n throw new AnthropicError(`Could not coerce ${value} (type: ${typeof value}) into a number`);\n};\n\nexport const coerceBoolean = (value: unknown): boolean => {\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') return value === 'true';\n return Boolean(value);\n};\n\nexport const maybeCoerceInteger = (value: unknown): number | undefined => {\n if (value == null) {\n return undefined;\n }\n return coerceInteger(value);\n};\n\nexport const maybeCoerceFloat = (value: unknown): number | undefined => {\n if (value == null) {\n return undefined;\n }\n return coerceFloat(value);\n};\n\nexport const maybeCoerceBoolean = (value: unknown): boolean | undefined => {\n if (value == null) {\n return undefined;\n }\n return coerceBoolean(value);\n};\n\nexport const safeJSON = (text: string) => {\n try {\n return JSON.parse(text);\n } catch (err) {\n return undefined;\n }\n};\n\n// Gets a value from an object, deletes the key, and returns the value (or undefined if not found)\nexport const pop = <T extends Record<string, any>, K extends string>(obj: T, key: K): T[K] => {\n const value = obj[key];\n delete obj[key];\n return value;\n};\n\n/**\n * Compile-time exhaustiveness check: passing a value here only type-checks once every\n * member of its union has been handled. Does nothing at runtime, so unknown values from a\n * newer API version fall through instead of throwing.\n */\nexport function checkNever(_value: never): void {}\n","/**\n * This module provides internal shims and utility functions for environments where certain Node.js or global types may not be available.\n *\n * These are used to ensure we can provide a consistent behaviour between different JavaScript environments and good error\n * messages in cases where an environment isn't fully supported.\n */\n\nimport type { Fetch } from './builtin-types';\nimport type { ReadableStream } from './shim-types';\n\nexport function getDefaultFetch(): Fetch {\n if (typeof fetch !== 'undefined') {\n return fetch as any;\n }\n\n throw new Error(\n '`fetch` is not defined as a global; Either pass `fetch` to the client, `new Anthropic({ fetch })` or polyfill the global, `globalThis.fetch = fetch`',\n );\n}\n\ntype ReadableStreamArgs = ConstructorParameters<typeof ReadableStream>;\n\nexport function makeReadableStream(...args: ReadableStreamArgs): ReadableStream {\n const ReadableStream = (globalThis as any).ReadableStream;\n if (typeof ReadableStream === 'undefined') {\n // Note: All of the platforms / runtimes we officially support already define\n // `ReadableStream` as a global, so this should only ever be hit on unsupported runtimes.\n throw new Error(\n '`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`',\n );\n }\n\n return new ReadableStream(...args);\n}\n\nexport function ReadableStreamFrom<T>(iterable: Iterable<T> | AsyncIterable<T>): ReadableStream<T> {\n let iter: AsyncIterator<T> | Iterator<T> =\n Symbol.asyncIterator in iterable ? iterable[Symbol.asyncIterator]() : iterable[Symbol.iterator]();\n\n return makeReadableStream({\n start() {},\n async pull(controller: any) {\n const { done, value } = await iter.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n async cancel() {\n await iter.return?.();\n },\n });\n}\n\n/**\n * Most browsers don't yet have async iterable support for ReadableStream,\n * and Node has a very different way of reading bytes from its \"ReadableStream\".\n *\n * This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490\n */\nexport function ReadableStreamToAsyncIterable<T>(stream: any): AsyncIterableIterator<T> {\n if (stream[Symbol.asyncIterator]) return stream;\n\n const reader = stream.getReader();\n return {\n async next() {\n try {\n const result = await reader.read();\n if (result?.done) reader.releaseLock(); // release lock when stream becomes closed\n return result;\n } catch (e) {\n reader.releaseLock(); // release lock when stream becomes errored\n throw e;\n }\n },\n async return() {\n const cancelPromise = reader.cancel();\n reader.releaseLock();\n await cancelPromise;\n return { done: true, value: undefined };\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n}\n\n/**\n * Cancels a ReadableStream we don't need to consume.\n * See https://undici.nodejs.org/#/?id=garbage-collection\n */\nexport async function CancelReadableStream(stream: any): Promise<void> {\n if (stream === null || typeof stream !== 'object') return;\n\n if (stream[Symbol.asyncIterator]) {\n await stream[Symbol.asyncIterator]().return?.();\n return;\n }\n\n const reader = stream.getReader();\n const cancelPromise = reader.cancel();\n reader.releaseLock();\n await cancelPromise;\n}\n","export function concatBytes(buffers: Uint8Array[]): Uint8Array {\n let length = 0;\n for (const buffer of buffers) {\n length += buffer.length;\n }\n const output = new Uint8Array(length);\n let index = 0;\n for (const buffer of buffers) {\n output.set(buffer, index);\n index += buffer.length;\n }\n\n return output;\n}\n\nlet encodeUTF8_: (str: string) => Uint8Array;\nexport function encodeUTF8(str: string) {\n let encoder;\n return (\n encodeUTF8_ ??\n ((encoder = new (globalThis as any).TextEncoder()), (encodeUTF8_ = encoder.encode.bind(encoder)))\n )(str);\n}\n\nlet decodeUTF8_: (bytes: Uint8Array) => string;\nexport function decodeUTF8(bytes: Uint8Array) {\n let decoder;\n return (\n decodeUTF8_ ??\n ((decoder = new (globalThis as any).TextDecoder()), (decodeUTF8_ = decoder.decode.bind(decoder)))\n )(bytes);\n}\n","import { concatBytes, decodeUTF8, encodeUTF8 } from '../utils/bytes';\n\nexport type Bytes = string | ArrayBuffer | Uint8Array | null | undefined;\n\n/**\n * A re-implementation of httpx's `LineDecoder` in Python that handles incrementally\n * reading lines from text.\n *\n * https://github.com/encode/httpx/blob/920333ea98118e9cf617f246905d7b202510941c/httpx/_decoders.py#L258\n */\nexport class LineDecoder {\n // prettier-ignore\n static NEWLINE_CHARS = new Set(['\\n', '\\r']);\n static NEWLINE_REGEXP = /\\r\\n|[\\n\\r]/g;\n\n #buffer: Uint8Array;\n #carriageReturnIndex: number | null;\n\n constructor() {\n this.#buffer = new Uint8Array();\n this.#carriageReturnIndex = null;\n }\n\n decode(chunk: Bytes): string[] {\n if (chunk == null) {\n return [];\n }\n\n const binaryChunk =\n chunk instanceof ArrayBuffer ? new Uint8Array(chunk)\n : typeof chunk === 'string' ? encodeUTF8(chunk)\n : chunk;\n\n this.#buffer = concatBytes([this.#buffer, binaryChunk]);\n\n const lines: string[] = [];\n let patternIndex;\n while ((patternIndex = findNewlineIndex(this.#buffer, this.#carriageReturnIndex)) != null) {\n if (patternIndex.carriage && this.#carriageReturnIndex == null) {\n // skip until we either get a corresponding `\\n`, a new `\\r` or nothing\n this.#carriageReturnIndex = patternIndex.index;\n continue;\n }\n\n // we got double \\r or \\rtext\\n\n if (\n this.#carriageReturnIndex != null &&\n (patternIndex.index !== this.#carriageReturnIndex + 1 || patternIndex.carriage)\n ) {\n lines.push(decodeUTF8(this.#buffer.subarray(0, this.#carriageReturnIndex - 1)));\n this.#buffer = this.#buffer.subarray(this.#carriageReturnIndex);\n this.#carriageReturnIndex = null;\n continue;\n }\n\n const endIndex =\n this.#carriageReturnIndex !== null ? patternIndex.preceding - 1 : patternIndex.preceding;\n\n const line = decodeUTF8(this.#buffer.subarray(0, endIndex));\n lines.push(line);\n\n this.#buffer = this.#buffer.subarray(patternIndex.index);\n this.#carriageReturnIndex = null;\n }\n\n return lines;\n }\n\n flush(): string[] {\n if (!this.#buffer.length) {\n return [];\n }\n return this.decode('\\n');\n }\n}\n\n/**\n * This function searches the buffer for the end patterns, (\\r or \\n)\n * and returns an object with the index preceding the matched newline and the\n * index after the newline char. `null` is returned if no new line is found.\n *\n * ```ts\n * findNewLineIndex('abc\\ndef') -> { preceding: 2, index: 3 }\n * ```\n */\nfunction findNewlineIndex(\n buffer: Uint8Array,\n startIndex: number | null,\n): { preceding: number; index: number; carriage: boolean } | null {\n const newline = 0x0a; // \\n\n const carriage = 0x0d; // \\r\n\n for (let i = startIndex ?? 0; i < buffer.length; i++) {\n if (buffer[i] === newline) {\n return { preceding: i, index: i + 1, carriage: false };\n }\n\n if (buffer[i] === carriage) {\n return { preceding: i, index: i + 1, carriage: true };\n }\n }\n\n return null;\n}\n\nexport function findDoubleNewlineIndex(buffer: Uint8Array): number {\n // This function searches the buffer for the end patterns (\\r\\r, \\n\\n, \\r\\n\\r\\n)\n // and returns the index right after the first occurrence of any pattern,\n // or -1 if none of the patterns are found.\n const newline = 0x0a; // \\n\n const carriage = 0x0d; // \\r\n\n for (let i = 0; i < buffer.length - 1; i++) {\n if (buffer[i] === newline && buffer[i + 1] === newline) {\n // \\n\\n\n return i + 2;\n }\n if (buffer[i] === carriage && buffer[i + 1] === carriage) {\n // \\r\\r\n return i + 2;\n }\n if (\n buffer[i] === carriage &&\n buffer[i + 1] === newline &&\n i + 3 < buffer.length &&\n buffer[i + 2] === carriage &&\n buffer[i + 3] === newline\n ) {\n // \\r\\n\\r\\n\n return i + 4;\n }\n }\n\n return -1;\n}\n","import { hasOwn } from './values';\nimport { readEnv } from './env';\nimport { type BaseAnthropic } from '../../client';\nimport { RequestOptions } from '../request-options';\n\ntype LogFn = (message: string, ...rest: unknown[]) => void;\nexport type Logger = {\n error: LogFn;\n warn: LogFn;\n info: LogFn;\n debug: LogFn;\n};\nexport type LogLevel = 'off' | 'error' | 'warn' | 'info' | 'debug';\n\nexport const defaultLogLevel: LogLevel = 'warn';\n\nconst levelNumbers = {\n off: 0,\n error: 200,\n warn: 300,\n info: 400,\n debug: 500,\n};\n\nexport const parseLogLevel = (\n maybeLevel: string | undefined,\n sourceName: string,\n logger: Logger,\n): LogLevel | undefined => {\n if (!maybeLevel) {\n return undefined;\n }\n if (hasOwn(levelNumbers, maybeLevel)) {\n return maybeLevel;\n }\n logger.warn(\n `${sourceName} was set to ${JSON.stringify(maybeLevel)}, expected one of ${JSON.stringify(\n Object.keys(levelNumbers),\n )}`,\n );\n return undefined;\n};\n\nfunction noop() {}\n\nfunction makeLogFn(fnLevel: keyof Logger, logger: Logger | undefined, logLevel: LogLevel) {\n if (!logger || levelNumbers[fnLevel] > levelNumbers[logLevel]) {\n return noop;\n } else {\n // Don't wrap logger functions, we want the stacktrace intact!\n return logger[fnLevel].bind(logger);\n }\n}\n\nconst noopLogger = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n};\n\nlet cachedLoggers = /* @__PURE__ */ new WeakMap<Logger, [LogLevel, Logger]>();\n\nfunction filterLogger(logger: Logger, logLevel: LogLevel): Logger {\n const cachedLogger = cachedLoggers.get(logger);\n if (cachedLogger && cachedLogger[0] === logLevel) {\n return cachedLogger[1];\n }\n\n const levelLogger = {\n error: makeLogFn('error', logger, logLevel),\n warn: makeLogFn('warn', logger, logLevel),\n info: makeLogFn('info', logger, logLevel),\n debug: makeLogFn('debug', logger, logLevel),\n };\n\n cachedLoggers.set(logger, [logLevel, levelLogger]);\n\n return levelLogger;\n}\n\nexport function loggerFor(client: BaseAnthropic): Logger {\n const logger = client.logger;\n const logLevel = client.logLevel ?? 'off';\n if (!logger) {\n return noopLogger;\n }\n return filterLogger(logger, logLevel);\n}\n\nlet lastEnvLevel: string | undefined;\nlet cachedDefaultLogger: Logger | undefined;\n\n/**\n * A logger matching the client defaults — `console`, filtered to\n * `ANTHROPIC_LOG` or {@link defaultLogLevel} — for contexts with no client to\n * read the configured `logger`/`logLevel` from.\n *\n * Cached per `ANTHROPIC_LOG` value so an invalid value warns once, like a\n * client construction does, rather than on every request.\n */\nexport function defaultLogger(): Logger {\n const envLevel = readEnv('ANTHROPIC_LOG');\n if (!cachedDefaultLogger || envLevel !== lastEnvLevel) {\n lastEnvLevel = envLevel;\n cachedDefaultLogger = filterLogger(\n console,\n parseLogLevel(envLevel, \"process.env['ANTHROPIC_LOG']\", filterLogger(console, defaultLogLevel)) ??\n defaultLogLevel,\n );\n }\n return cachedDefaultLogger;\n}\n\nexport const formatRequestDetails = (details: {\n options?: RequestOptions | undefined;\n headers?: Headers | Record<string, string> | undefined;\n retryOfRequestLogID?: string | undefined;\n retryOf?: string | undefined;\n url?: string | undefined;\n status?: number | undefined;\n method?: string | undefined;\n durationMs?: number | undefined;\n message?: unknown;\n body?: unknown;\n}) => {\n if (details.options) {\n details.options = { ...details.options };\n delete details.options['headers']; // redundant + leaks internals\n }\n if (details.headers) {\n details.headers = Object.fromEntries(\n (details.headers instanceof Headers ? [...details.headers] : Object.entries(details.headers)).map(\n ([name, value]) => [\n name,\n (\n name.toLowerCase() === 'authorization' ||\n name.toLowerCase() === 'api-key' ||\n name.toLowerCase() === 'x-api-key' ||\n name.toLowerCase() === 'cookie' ||\n name.toLowerCase() === 'set-cookie'\n ) ?\n '***'\n : value,\n ],\n ),\n );\n }\n if ('retryOfRequestLogID' in details) {\n if (details.retryOfRequestLogID) {\n details.retryOf = details.retryOfRequestLogID;\n }\n delete details.retryOfRequestLogID;\n }\n return details;\n};\n","/**\n * Tracks the removal of the per-request abort listener that\n * `fetchWithTimeout` attaches to a caller-provided signal, so the listener's\n * lifetime matches the request instead of the signal.\n *\n * Without removal, a long-lived signal (e.g. one AbortController reused for\n * a whole session) accumulates one `{ once: true }` listener plus its bound\n * AbortController per HTTP attempt until the signal fires or is collected,\n * and Node warns at the 11th listener. The listener must survive until the\n * response body is settled - removing it when fetch resolves (headers) would\n * break aborting an in-flight body read - so the code that finishes the body\n * (response parsing, stream teardown, retry/error handling) calls\n * `releaseRequestSignal` with the request's controller.\n */\nconst cleanups = new WeakMap<AbortController, () => void>();\n\n// Backstop for requests that never reach an explicit release point: a caller\n// that partially iterates a stream (or receives a raw binary Response) and\n// drops the reference never completes, errors, or cancels it, so the only\n// remaining lifecycle event is the response being collected. Finalization\n// timing is GC-driven and not guaranteed, so this only bounds abandonment -\n// the explicit release calls stay the primary cleanup. The held value must\n// not reference the response, or it could never be collected. Typed\n// structurally because the compiler lib is es2020.\ntype AbandonmentRegistry = {\n register(target: object, heldValue: AbortController, token: object): void;\n unregister(token: object): void;\n};\n\nconst registry: AbandonmentRegistry | null =\n typeof (globalThis as any).FinalizationRegistry === 'function' ?\n new (globalThis as any).FinalizationRegistry((controller: AbortController) =>\n releaseRequestSignal(controller),\n )\n : null;\n\n// Module-scope factory so the cleanup closure captures exactly the signal and\n// the listener - built at the `fetchWithTimeout` call site it would share that\n// scope's context and retain the request body for as long as the cleanup is\n// held (same reason `_makeAbort` exists in client.ts).\nfunction makeCleanup(signal: AbortSignal, listener: () => void): () => void {\n return () => signal.removeEventListener('abort', listener);\n}\n\nexport function registerRequestSignalCleanup(\n controller: AbortController,\n signal: AbortSignal,\n listener: () => void,\n): void {\n cleanups.set(controller, makeCleanup(signal, listener));\n}\n\n// The registered target is the response BODY, not the Response: a caller can\n// keep a reader on the body and drop the Response wrapper (`.asResponse()`),\n// and the listener must survive for as long as anything can still read - the\n// body is what a live read keeps alive.\nexport function armAbandonmentBackstop(body: object, controller: AbortController): void {\n if (cleanups.has(controller)) registry?.register(body, controller, controller);\n}\n\nexport function releaseRequestSignal(controller: AbortController): void {\n const cleanup = cleanups.get(controller);\n if (cleanup) {\n cleanups.delete(controller);\n registry?.unregister(controller);\n cleanup();\n }\n}\n","import { AnthropicError } from './error';\nimport { type ReadableStream } from '../internal/shim-types';\nimport { makeReadableStream } from '../internal/shims';\nimport { findDoubleNewlineIndex, LineDecoder } from '../internal/decoders/line';\nimport { ReadableStreamToAsyncIterable } from '../internal/shims';\nimport { isAbortError } from '../internal/errors';\nimport { safeJSON } from '../internal/utils/values';\nimport { encodeUTF8 } from '../internal/utils/bytes';\nimport { loggerFor } from '../internal/utils/log';\nimport type { BaseAnthropic } from '../client';\n\nimport { APIError } from './error';\nimport type { ErrorType } from '../resources/shared';\nimport { releaseRequestSignal } from '../internal/request-signal';\n\ntype Bytes = string | ArrayBuffer | Uint8Array | null | undefined;\n\nexport type ServerSentEvent = {\n event: string | null;\n data: string;\n raw: string[];\n};\n\nexport class Stream<Item> implements AsyncIterable<Item> {\n controller: AbortController;\n #client: BaseAnthropic | undefined;\n\n constructor(\n private iterator: () => AsyncIterator<Item>,\n controller: AbortController,\n client?: BaseAnthropic,\n ) {\n this.controller = controller;\n this.#client = client;\n }\n\n /**\n * Iterate the raw Server-Sent Events from `response` — `{event, data, raw}`\n * objects, before any JSON parsing or event-name filtering.\n *\n * This reads `response.body` directly (not a clone), so the response is\n * consumed. Use this in middleware that fully replaces the stream body; for\n * read-only observation of parsed events, use `ctx.parse()` instead.\n */\n static rawEvents(\n response: Response,\n controller: AbortController = new AbortController(),\n ): AsyncGenerator<ServerSentEvent, void, unknown> {\n return _iterSSEMessages(response, controller);\n }\n\n static fromSSEResponse<Item>(\n response: Response,\n controller: AbortController,\n client?: BaseAnthropic,\n ): Stream<Item> {\n let consumed = false;\n const logger = client ? loggerFor(client) : console;\n\n async function* iterator(): AsyncIterator<Item, any, undefined> {\n if (consumed) {\n throw new AnthropicError('Cannot iterate over a consumed stream, use `.tee()` to split the stream.');\n }\n consumed = true;\n let done = false;\n try {\n for await (const sse of _iterSSEMessages(response, controller)) {\n if (sse.event === 'completion') {\n try {\n yield JSON.parse(sse.data) as Item;\n } catch (e) {\n logger.error(`Could not parse message into JSON:`, sse.data);\n logger.error(`From chunk:`, sse.raw);\n throw e;\n }\n }\n\n if (\n sse.event === 'message_start' ||\n sse.event === 'message_delta' ||\n sse.event === 'message_stop' ||\n sse.event === 'content_block_start' ||\n sse.event === 'content_block_delta' ||\n sse.event === 'content_block_stop' ||\n sse.event === 'message' ||\n sse.event === 'user.message' ||\n sse.event === 'user.interrupt' ||\n sse.event === 'user.tool_confirmation' ||\n sse.event === 'user.custom_tool_result' ||\n sse.event === 'user.tool_result' ||\n sse.event === 'agent.message' ||\n sse.event === 'agent.thinking' ||\n sse.event === 'agent.tool_use' ||\n sse.event === 'agent.tool_result' ||\n sse.event === 'agent.mcp_tool_use' ||\n sse.event === 'agent.mcp_tool_result' ||\n sse.event === 'agent.custom_tool_use' ||\n sse.event === 'agent.thread_context_compacted' ||\n sse.event === 'session.status_running' ||\n sse.event === 'session.status_idle' ||\n sse.event === 'session.status_rescheduled' ||\n sse.event === 'session.status_terminated' ||\n sse.event === 'session.error' ||\n sse.event === 'session.deleted' ||\n sse.event === 'session.updated' ||\n sse.event === 'span.model_request_start' ||\n sse.event === 'span.model_request_end' ||\n sse.event === 'span.outcome_evaluation_start' ||\n sse.event === 'span.outcome_evaluation_ongoing' ||\n sse.event === 'span.outcome_evaluation_end' ||\n sse.event === 'user.define_outcome' ||\n sse.event === 'agent.thread_message_received' ||\n sse.event === 'agent.thread_message_sent' ||\n sse.event === 'agent.session_thread_message_received' ||\n sse.event === 'agent.session_thread_message_sent' ||\n sse.event === 'session.thread_created' ||\n sse.event === 'session.thread_status_created' ||\n sse.event === 'session.thread_status_running' ||\n sse.event === 'session.thread_status_idle' ||\n sse.event === 'session.thread_status_rescheduled' ||\n sse.event === 'session.thread_status_terminated' ||\n sse.event === 'event_start' ||\n sse.event === 'event_delta' ||\n sse.event === 'system.message'\n ) {\n try {\n yield JSON.parse(sse.data) as Item;\n } catch (e) {\n logger.error(`Could not parse message into JSON:`, sse.data);\n logger.error(`From chunk:`, sse.raw);\n throw e;\n }\n }\n\n if (sse.event === 'ping') {\n continue;\n }\n\n if (sse.event === 'error') {\n const body = safeJSON(sse.data) ?? sse.data;\n const type = body?.error?.type as ErrorType | undefined;\n throw new APIError(undefined, body, undefined, response.headers, type);\n }\n }\n done = true;\n } catch (e) {\n // If the user calls `stream.controller.abort()`, we should exit without throwing.\n if (isAbortError(e)) return;\n throw e;\n } finally {\n // If the user `break`s, abort the ongoing request.\n if (!done) controller.abort();\n releaseRequestSignal(controller);\n }\n }\n\n return new Stream(iterator, controller, client);\n }\n\n /**\n * Generates a Stream from a newline-separated ReadableStream\n * where each item is a JSON value.\n */\n static fromReadableStream<Item>(\n readableStream: ReadableStream,\n controller: AbortController,\n client?: BaseAnthropic,\n ): Stream<Item> {\n let consumed = false;\n\n async function* iterLines(): AsyncGenerator<string, void, unknown> {\n const lineDecoder = new LineDecoder();\n\n const iter = ReadableStreamToAsyncIterable<Bytes>(readableStream);\n for await (const chunk of iter) {\n for (const line of lineDecoder.decode(chunk)) {\n yield line;\n }\n }\n\n for (const line of lineDecoder.flush()) {\n yield line;\n }\n }\n\n async function* iterator(): AsyncIterator<Item, any, undefined> {\n if (consumed) {\n throw new AnthropicError('Cannot iterate over a consumed stream, use `.tee()` to split the stream.');\n }\n consumed = true;\n let done = false;\n try {\n for await (const line of iterLines()) {\n if (done) continue;\n if (line) yield JSON.parse(line) as Item;\n }\n done = true;\n } catch (e) {\n // If the user calls `stream.controller.abort()`, we should exit without throwing.\n if (isAbortError(e)) return;\n throw e;\n } finally {\n // If the user `break`s, abort the ongoing request.\n if (!done) controller.abort();\n releaseRequestSignal(controller);\n }\n }\n\n return new Stream(iterator, controller, client);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<Item> {\n return this.iterator();\n }\n\n /**\n * Splits the stream into two streams which can be\n * independently read from at different speeds.\n */\n tee(): [Stream<Item>, Stream<Item>] {\n const left: Array<Promise<IteratorResult<Item>>> = [];\n const right: Array<Promise<IteratorResult<Item>>> = [];\n const iterator = this.iterator();\n\n const teeIterator = (queue: Array<Promise<IteratorResult<Item>>>): AsyncIterator<Item> => {\n return {\n next: () => {\n if (queue.length === 0) {\n const result = iterator.next();\n left.push(result);\n right.push(result);\n }\n return queue.shift()!;\n },\n };\n };\n\n return [\n new Stream(() => teeIterator(left), this.controller, this.#client),\n new Stream(() => teeIterator(right), this.controller, this.#client),\n ];\n }\n\n /**\n * Converts this stream to a newline-separated ReadableStream of\n * JSON stringified values in the stream\n * which can be turned back into a Stream with `Stream.fromReadableStream()`.\n */\n toReadableStream(): ReadableStream {\n const self = this;\n let iter: AsyncIterator<Item>;\n\n return makeReadableStream({\n async start() {\n iter = self[Symbol.asyncIterator]();\n },\n async pull(ctrl: any) {\n try {\n const { value, done } = await iter.next();\n if (done) return ctrl.close();\n\n const bytes = encodeUTF8(JSON.stringify(value) + '\\n');\n\n ctrl.enqueue(bytes);\n } catch (err) {\n ctrl.error(err);\n }\n },\n async cancel() {\n await iter.return?.();\n },\n });\n }\n}\n\nexport async function* _iterSSEMessages(\n response: Response,\n controller: AbortController,\n): AsyncGenerator<ServerSentEvent, void, unknown> {\n if (!response.body) {\n controller.abort();\n if (\n typeof (globalThis as any).navigator !== 'undefined' &&\n (globalThis as any).navigator.product === 'ReactNative'\n ) {\n throw new AnthropicError(\n `The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api`,\n );\n }\n throw new AnthropicError(`Attempted to iterate over a response with no body`);\n }\n\n const sseDecoder = new SSEDecoder();\n const lineDecoder = new LineDecoder();\n\n const iter = ReadableStreamToAsyncIterable<Bytes>(response.body);\n for await (const sseChunk of iterSSEChunks(iter)) {\n for (const line of lineDecoder.decode(sseChunk)) {\n const sse = sseDecoder.decode(line);\n if (sse) yield sse;\n }\n }\n\n for (const line of lineDecoder.flush()) {\n const sse = sseDecoder.decode(line);\n if (sse) yield sse;\n }\n}\n\n/**\n * Given an async iterable iterator, iterates over it and yields full\n * SSE chunks, i.e. yields when a double new-line is encountered.\n */\nasync function* iterSSEChunks(iterator: AsyncIterableIterator<Bytes>): AsyncGenerator<Uint8Array> {\n let data = new Uint8Array();\n\n for await (const chunk of iterator) {\n if (chunk == null) {\n continue;\n }\n\n const binaryChunk =\n chunk instanceof ArrayBuffer ? new Uint8Array(chunk)\n : typeof chunk === 'string' ? encodeUTF8(chunk)\n : chunk;\n\n let newData = new Uint8Array(data.length + binaryChunk.length);\n newData.set(data);\n newData.set(binaryChunk, data.length);\n data = newData;\n\n // Yield views, not copies, so a chunk holding many events is not re-copied\n // once per event. This relies on newData never being written again.\n let patternIndex;\n while ((patternIndex = findDoubleNewlineIndex(data)) !== -1) {\n yield data.subarray(0, patternIndex);\n data = data.subarray(patternIndex);\n }\n }\n\n if (data.length > 0) {\n yield data;\n }\n}\n\nclass SSEDecoder {\n private data: string[];\n private event: string | null;\n private chunks: string[];\n\n constructor() {\n this.event = null;\n this.data = [];\n this.chunks = [];\n }\n\n decode(line: string) {\n if (line.endsWith('\\r')) {\n line = line.substring(0, line.length - 1);\n }\n\n if (!line) {\n // empty line and we didn't previously encounter any messages\n if (!this.event && !this.data.length) return null;\n\n const sse: ServerSentEvent = {\n event: this.event,\n data: this.data.join('\\n'),\n raw: this.chunks,\n };\n\n this.event = null;\n this.data = [];\n this.chunks = [];\n\n return sse;\n }\n\n this.chunks.push(line);\n\n if (line.startsWith(':')) {\n return null;\n }\n\n let [fieldname, _, value] = partition(line, ':');\n\n if (value.startsWith(' ')) {\n value = value.substring(1);\n }\n\n if (fieldname === 'event') {\n this.event = value;\n } else if (fieldname === 'data') {\n this.data.push(value);\n }\n\n return null;\n }\n}\n\nfunction partition(str: string, delimiter: string): [string, string, string] {\n const index = str.indexOf(delimiter);\n if (index !== -1) {\n return [str.substring(0, index), delimiter, str.substring(index + delimiter.length)];\n }\n\n return [str, '', ''];\n}\n","import type { Logger } from '../client';\nimport { AnthropicError } from '../core/error';\nimport {\n ContentBlock,\n JSONOutputFormat,\n Message,\n OutputConfig,\n TextBlock,\n MessageCreateParams,\n} from '../resources/messages/messages';\n\n// vendored from typefest just to make things look a bit nicer on hover\ntype Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {};\n\ntype AutoParseableOutputConfig = Omit<OutputConfig, 'format'> & {\n format?: JSONOutputFormat | AutoParseableOutputFormat<any> | null;\n};\n\nexport type ParseableMessageCreateParams = Simplify<\n Omit<MessageCreateParams, 'output_config'> & {\n output_config?: AutoParseableOutputConfig | null;\n }\n>;\n\nexport type ExtractParsedContentFromParams<Params extends ParseableMessageCreateParams> =\n Params['output_config'] extends { format: AutoParseableOutputFormat<infer P> } ? P : null;\n\nexport type AutoParseableOutputFormat<ParsedT> = JSONOutputFormat & {\n parse(content: string): ParsedT;\n};\n\nexport type ParsedMessage<ParsedT> = Message & {\n content: Array<ParsedContentBlock<ParsedT>>;\n parsed_output: ParsedT | null;\n};\n\nexport type ParsedContentBlock<ParsedT> =\n | (TextBlock & { parsed_output: ParsedT | null })\n | Exclude<ContentBlock, TextBlock>;\n\nfunction getOutputFormat(\n params: ParseableMessageCreateParams | null,\n): JSONOutputFormat | AutoParseableOutputFormat<any> | null | undefined {\n return params?.output_config?.format;\n}\n\nexport function maybeParseMessage<Params extends ParseableMessageCreateParams | null>(\n message: Message,\n params: Params,\n opts: { logger: Logger },\n): ParsedMessage<ExtractParsedContentFromParams<NonNullable<Params>>> {\n const outputFormat = getOutputFormat(params);\n if (!params || !('parse' in (outputFormat ?? {}))) {\n return {\n ...message,\n content: message.content.map((block) => {\n if (block.type === 'text') {\n const parsedBlock = Object.defineProperty({ ...block }, 'parsed_output', {\n value: null,\n enumerable: false,\n }) as ParsedContentBlock<ExtractParsedContentFromParams<NonNullable<Params>>>;\n\n return parsedBlock;\n }\n return block;\n }),\n parsed_output: null,\n } as ParsedMessage<ExtractParsedContentFromParams<NonNullable<Params>>>;\n }\n\n return parseMessage(message, params, opts);\n}\n\nexport function parseMessage<Params extends ParseableMessageCreateParams>(\n message: Message,\n params: Params,\n opts: { logger: Logger },\n): ParsedMessage<ExtractParsedContentFromParams<Params>> {\n let firstParsedOutput: ReturnType<typeof parseOutputFormat<Params>> | null = null;\n\n const content: Array<ParsedContentBlock<ExtractParsedContentFromParams<Params>>> = message.content.map(\n (block) => {\n if (block.type === 'text') {\n const parsedOutput = parseOutputFormat(params, block.text);\n\n if (firstParsedOutput === null) {\n firstParsedOutput = parsedOutput;\n }\n\n const parsedBlock = Object.defineProperty({ ...block }, 'parsed_output', {\n value: parsedOutput,\n enumerable: false,\n }) as ParsedContentBlock<ExtractParsedContentFromParams<Params>>;\n return parsedBlock;\n }\n return block;\n },\n );\n\n return {\n ...message,\n content,\n parsed_output: firstParsedOutput,\n } as ParsedMessage<ExtractParsedContentFromParams<Params>>;\n}\n\nfunction parseOutputFormat<Params extends ParseableMessageCreateParams>(\n params: Params,\n content: string,\n): ExtractParsedContentFromParams<Params> | null {\n const outputFormat = getOutputFormat(params);\n if (outputFormat?.type !== 'json_schema') {\n return null;\n }\n\n try {\n if ('parse' in outputFormat) {\n return outputFormat.parse(content);\n }\n\n return JSON.parse(content);\n } catch (error) {\n throw new AnthropicError(`Failed to parse structured output: ${error}`);\n }\n}\n","type Token = {\n type: string;\n value: string;\n};\n\nconst tokenize = (input: string): Token[] => {\n let current = 0;\n let tokens: Token[] = [];\n\n while (current < input.length) {\n let char = input[current];\n\n if (char === '\\\\') {\n current++;\n continue;\n }\n\n if (char === '{') {\n tokens.push({\n type: 'brace',\n value: '{',\n });\n\n current++;\n continue;\n }\n\n if (char === '}') {\n tokens.push({\n type: 'brace',\n value: '}',\n });\n\n current++;\n continue;\n }\n\n if (char === '[') {\n tokens.push({\n type: 'paren',\n value: '[',\n });\n\n current++;\n continue;\n }\n\n if (char === ']') {\n tokens.push({\n type: 'paren',\n value: ']',\n });\n\n current++;\n continue;\n }\n\n if (char === ':') {\n tokens.push({\n type: 'separator',\n value: ':',\n });\n\n current++;\n continue;\n }\n\n if (char === ',') {\n tokens.push({\n type: 'delimiter',\n value: ',',\n });\n\n current++;\n continue;\n }\n\n if (char === '\"') {\n let value = '';\n let danglingQuote = false;\n\n char = input[++current];\n\n while (char !== '\"') {\n if (current === input.length) {\n danglingQuote = true;\n break;\n }\n\n if (char === '\\\\') {\n current++;\n if (current === input.length) {\n danglingQuote = true;\n break;\n }\n value += char + input[current];\n char = input[++current];\n } else {\n value += char;\n char = input[++current];\n }\n }\n\n char = input[++current];\n\n if (!danglingQuote) {\n tokens.push({\n type: 'string',\n value,\n });\n }\n continue;\n }\n\n let WHITESPACE = /\\s/;\n if (char && WHITESPACE.test(char)) {\n current++;\n continue;\n }\n\n let NUMBERS = /[0-9]/;\n if ((char && NUMBERS.test(char)) || char === '-' || char === '.') {\n let value = '';\n\n if (char === '-') {\n value += char;\n char = input[++current];\n }\n\n while (\n char &&\n (NUMBERS.test(char) ||\n char === '.' ||\n // exponent marker, e.g. `1e10` or `1.5E-9`\n char === 'e' ||\n char === 'E' ||\n // exponent sign, only valid immediately after the exponent marker\n ((char === '-' || char === '+') &&\n (value[value.length - 1] === 'e' || value[value.length - 1] === 'E')))\n ) {\n value += char;\n char = input[++current];\n }\n\n tokens.push({\n type: 'number',\n value,\n });\n continue;\n }\n\n let LETTERS = /[a-z]/i;\n if (char && LETTERS.test(char)) {\n let value = '';\n\n while (char && LETTERS.test(char)) {\n if (current === input.length) {\n break;\n }\n value += char;\n char = input[++current];\n }\n\n if (value == 'true' || value == 'false' || value === 'null') {\n tokens.push({\n type: 'name',\n value,\n });\n } else {\n // unknown token, e.g. `nul` which isn't quite `null`\n current++;\n continue;\n }\n continue;\n }\n\n current++;\n }\n\n return tokens;\n },\n strip = (tokens: Token[]): Token[] => {\n if (tokens.length === 0) {\n return tokens;\n }\n\n let lastToken = tokens[tokens.length - 1]!;\n\n switch (lastToken.type) {\n case 'separator':\n tokens = tokens.slice(0, tokens.length - 1);\n return strip(tokens);\n break;\n case 'number':\n let lastCharacterOfLastToken = lastToken.value[lastToken.value.length - 1];\n if (\n lastCharacterOfLastToken === '.' ||\n lastCharacterOfLastToken === '-' ||\n lastCharacterOfLastToken === '+' ||\n lastCharacterOfLastToken === 'e' ||\n lastCharacterOfLastToken === 'E'\n ) {\n tokens = tokens.slice(0, tokens.length - 1);\n return strip(tokens);\n }\n case 'string':\n let tokenBeforeTheLastToken = tokens[tokens.length - 2];\n if (tokenBeforeTheLastToken?.type === 'delimiter') {\n tokens = tokens.slice(0, tokens.length - 1);\n return strip(tokens);\n } else if (tokenBeforeTheLastToken?.type === 'brace' && tokenBeforeTheLastToken.value === '{') {\n tokens = tokens.slice(0, tokens.length - 1);\n return strip(tokens);\n }\n break;\n case 'delimiter':\n tokens = tokens.slice(0, tokens.length - 1);\n return strip(tokens);\n break;\n }\n\n return tokens;\n },\n unstrip = (tokens: Token[]): Token[] => {\n let tail: string[] = [];\n\n tokens.map((token) => {\n if (token.type === 'brace') {\n if (token.value === '{') {\n tail.push('}');\n } else {\n tail.splice(tail.lastIndexOf('}'), 1);\n }\n }\n if (token.type === 'paren') {\n if (token.value === '[') {\n tail.push(']');\n } else {\n tail.splice(tail.lastIndexOf(']'), 1);\n }\n }\n });\n\n if (tail.length > 0) {\n tail.reverse().map((item) => {\n if (item === '}') {\n tokens.push({\n type: 'brace',\n value: '}',\n });\n } else if (item === ']') {\n tokens.push({\n type: 'paren',\n value: ']',\n });\n }\n });\n }\n\n return tokens;\n },\n generate = (tokens: Token[]): string => {\n let output = '';\n\n tokens.map((token) => {\n switch (token.type) {\n case 'string':\n output += '\"' + token.value + '\"';\n break;\n default:\n output += token.value;\n break;\n }\n });\n\n return output;\n },\n partialParse = (input: string): unknown => JSON.parse(generate(unstrip(strip(tokenize(input)))));\n\nexport { partialParse };\n","import { partialParse } from '../_vendor/partial-json-parser/parser';\n\nexport const JSON_BUF_PROPERTY = '__json_buf';\n\n/**\n * Copies a tool-use block with an updated `__json_buf`, installing `.input` as\n * a memoized getter so the partial-JSON parse happens on first read instead of\n * on every delta.\n */\nexport function withLazyInput<T extends { input: unknown }>(prev: T, jsonBuf: string): T {\n const next = {} as T;\n for (const key of Object.keys(prev) as (keyof T)[]) {\n if (key !== 'input') next[key] = prev[key];\n }\n Object.defineProperty(next, JSON_BUF_PROPERTY, { value: jsonBuf, enumerable: false, writable: true });\n let input: unknown;\n let parsed = false;\n Object.defineProperty(next, 'input', {\n enumerable: true,\n configurable: true,\n get() {\n if (!parsed) {\n input = jsonBuf ? partialParse(jsonBuf) : {};\n parsed = true;\n }\n return input;\n },\n });\n return next;\n}\n","import { STAINLESS_HELPER_METHOD_HEADER } from '../internal/stainless-helper-header';\nimport { isAbortError } from '../internal/errors';\nimport { checkNever } from '../internal/utils/values';\nimport { AnthropicError, APIUserAbortError } from '../error';\nimport {\n type ContentBlock,\n Messages,\n type Message,\n type MessageStreamEvent,\n type MessageParam,\n type MessageCreateParams,\n type MessageCreateParamsBase,\n type TextBlock,\n type TextCitation,\n type ToolUseBlock,\n type ServerToolUseBlock,\n} from '../resources/messages';\nimport { Stream } from '../streaming';\nimport { RequestOptions } from '../internal/request-options';\nimport type { Logger } from '../client';\nimport { maybeParseMessage, type ParsedMessage } from './parser';\nimport { JSON_BUF_PROPERTY, withLazyInput } from '../internal/message-stream-utils';\n\nexport interface MessageStreamEvents<ParsedT = null> {\n connect: () => void;\n streamEvent: (event: MessageStreamEvent, snapshot: Message) => void;\n text: (textDelta: string, textSnapshot: string) => void;\n citation: (citation: TextCitation, citationsSnapshot: TextCitation[]) => void;\n inputJson: (partialJson: string, jsonSnapshot: unknown) => void;\n thinking: (thinkingDelta: string, thinkingSnapshot: string) => void;\n signature: (signature: string) => void;\n message: (message: ParsedMessage<ParsedT>) => void;\n contentBlock: (content: ContentBlock) => void;\n finalMessage: (message: ParsedMessage<ParsedT>) => void;\n error: (error: AnthropicError) => void;\n abort: (error: APIUserAbortError) => void;\n end: () => void;\n}\n\ntype MessageStreamEventListeners<ParsedT, Event extends keyof MessageStreamEvents<ParsedT>> = {\n listener: MessageStreamEvents<ParsedT>[Event];\n once?: boolean;\n}[];\n\nexport type TracksToolInput = ToolUseBlock | ServerToolUseBlock;\n\nfunction tracksToolInput(content: ContentBlock): content is TracksToolInput {\n return content.type === 'tool_use' || content.type === 'server_tool_use';\n}\n\nexport class MessageStream<ParsedT = null> implements AsyncIterable<MessageStreamEvent> {\n messages: MessageParam[] = [];\n receivedMessages: ParsedMessage<ParsedT>[] = [];\n #currentMessageSnapshot: Message | undefined;\n #params: MessageCreateParams | null = null;\n\n controller: AbortController = new AbortController();\n\n #connectedPromise: Promise<Response | null>;\n #resolveConnectedPromise: (response: Response | null) => void = () => {};\n #rejectConnectedPromise: (error: AnthropicError) => void = () => {};\n\n #endPromise: Promise<void>;\n #resolveEndPromise: () => void = () => {};\n #rejectEndPromise: (error: AnthropicError) => void = () => {};\n\n #listeners: {\n [Event in keyof MessageStreamEvents<ParsedT>]?: MessageStreamEventListeners<ParsedT, Event>;\n } = {};\n\n #ended = false;\n #errored = false;\n #aborted = false;\n #catchingPromiseCreated = false;\n #response: Response | null | undefined;\n #request_id: string | null | undefined;\n #workspace_id: string | null | undefined;\n #logger: Logger;\n\n constructor(params: MessageCreateParamsBase | null, opts?: { logger?: Logger | undefined }) {\n this.#connectedPromise = new Promise<Response | null>((resolve, reject) => {\n this.#resolveConnectedPromise = resolve;\n this.#rejectConnectedPromise = reject;\n });\n\n this.#endPromise = new Promise<void>((resolve, reject) => {\n this.#resolveEndPromise = resolve;\n this.#rejectEndPromise = reject;\n });\n\n // Don't let these promises cause unhandled rejection errors.\n // we will manually cause an unhandled rejection error later\n // if the user hasn't registered any error listener or called\n // any promise-returning method.\n this.#connectedPromise.catch(() => {});\n this.#endPromise.catch(() => {});\n\n this.#params = params;\n this.#logger = opts?.logger ?? console;\n }\n\n get response(): Response | null | undefined {\n return this.#response;\n }\n\n get request_id(): string | null | undefined {\n return this.#request_id;\n }\n\n get workspace_id(): string | null | undefined {\n return this.#workspace_id;\n }\n\n /**\n * Returns the `MessageStream` data, the raw `Response` instance and the ID of the request,\n * returned vie the `request-id` header which is useful for debugging requests and resporting\n * issues to Anthropic.\n *\n * This is the same as the `APIPromise.withResponse()` method.\n *\n * This method will raise an error if you created the stream using `MessageStream.fromReadableStream`\n * as no `Response` is available.\n */\n async withResponse(): Promise<{\n data: MessageStream<ParsedT>;\n response: Response;\n request_id: string | null | undefined;\n workspace_id: string | null | undefined;\n }> {\n this.#catchingPromiseCreated = true;\n\n const response = await this.#connectedPromise;\n if (!response) {\n throw new Error('Could not resolve a `Response` object');\n }\n\n return {\n data: this,\n response,\n request_id: response.headers.get('request-id'),\n workspace_id: response.headers.get('anthropic-workspace-id'),\n };\n }\n\n /**\n * Intended for use on the frontend, consuming a stream produced with\n * `.toReadableStream()` on the backend.\n *\n * Note that messages sent to the model do not appear in `.on('message')`\n * in this context.\n */\n static fromReadableStream(stream: ReadableStream): MessageStream {\n const runner = new MessageStream(null);\n runner._run(() => runner._fromReadableStream(stream));\n return runner;\n }\n\n static createMessage<ParsedT>(\n messages: Messages,\n params: MessageCreateParamsBase,\n options?: RequestOptions,\n { logger }: { logger?: Logger | undefined } = {},\n ): MessageStream<ParsedT> {\n const runner = new MessageStream<ParsedT>(params, { logger });\n for (const message of params.messages) {\n runner._addMessageParam(message);\n }\n runner.#params = { ...params, stream: true };\n runner._run(() =>\n runner._createMessage(\n messages,\n { ...params, stream: true },\n { ...options, headers: { ...options?.headers, [STAINLESS_HELPER_METHOD_HEADER]: 'stream' } },\n ),\n );\n return runner;\n }\n\n protected _run(executor: () => Promise<any>) {\n executor().then(() => {\n this._emitFinal();\n this._emit('end');\n }, this.#handleError);\n }\n\n protected _addMessageParam(message: MessageParam) {\n this.messages.push(message);\n }\n\n protected _addMessage(message: ParsedMessage<ParsedT>, emit = true) {\n this.receivedMessages.push(message);\n if (emit) {\n this._emit('message', message);\n }\n }\n\n protected async _createMessage(\n messages: Messages,\n params: MessageCreateParams,\n options?: RequestOptions,\n ): Promise<void> {\n const signal = options?.signal;\n let abortHandler: (() => void) | undefined;\n if (signal) {\n if (signal.aborted) this.controller.abort();\n abortHandler = this.controller.abort.bind(this.controller);\n signal.addEventListener('abort', abortHandler);\n }\n try {\n this.#beginRequest();\n const { response, data: stream } = await messages\n .create({ ...params, stream: true }, { ...options, signal: this.controller.signal })\n .withResponse();\n this._connected(response);\n for await (const event of stream) {\n this.#addStreamEvent(event);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n this.#endRequest();\n } finally {\n if (signal && abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n }\n\n protected _connected(response: Response | null) {\n if (this.ended) return;\n this.#response = response;\n this.#request_id = response?.headers.get('request-id');\n this.#workspace_id = response?.headers.get('anthropic-workspace-id');\n this.#resolveConnectedPromise(response);\n this._emit('connect');\n }\n\n get ended(): boolean {\n return this.#ended;\n }\n\n get errored(): boolean {\n return this.#errored;\n }\n\n get aborted(): boolean {\n return this.#aborted;\n }\n\n abort() {\n this.controller.abort();\n }\n\n /**\n * Adds the listener function to the end of the listeners array for the event.\n * No checks are made to see if the listener has already been added. Multiple calls passing\n * the same combination of event and listener will result in the listener being added, and\n * called, multiple times.\n * @returns this MessageStream, so that calls can be chained\n */\n on<Event extends keyof MessageStreamEvents<ParsedT>>(\n event: Event,\n listener: MessageStreamEvents<ParsedT>[Event],\n ): this {\n const listeners: MessageStreamEventListeners<ParsedT, Event> =\n this.#listeners[event] || (this.#listeners[event] = []);\n listeners.push({ listener });\n return this;\n }\n\n /**\n * Removes the specified listener from the listener array for the event.\n * off() will remove, at most, one instance of a listener from the listener array. If any single\n * listener has been added multiple times to the listener array for the specified event, then\n * off() must be called multiple times to remove each instance.\n * @returns this MessageStream, so that calls can be chained\n */\n off<Event extends keyof MessageStreamEvents<ParsedT>>(\n event: Event,\n listener: MessageStreamEvents<ParsedT>[Event],\n ): this {\n const listeners = this.#listeners[event];\n if (!listeners) return this;\n const index = listeners.findIndex((l) => l.listener === listener);\n if (index >= 0) listeners.splice(index, 1);\n return this;\n }\n\n /**\n * Adds a one-time listener function for the event. The next time the event is triggered,\n * this listener is removed and then invoked.\n * @returns this MessageStream, so that calls can be chained\n */\n once<Event extends keyof MessageStreamEvents<ParsedT>>(\n event: Event,\n listener: MessageStreamEvents<ParsedT>[Event],\n ): this {\n const listeners: MessageStreamEventListeners<ParsedT, Event> =\n this.#listeners[event] || (this.#listeners[event] = []);\n listeners.push({ listener, once: true });\n return this;\n }\n\n /**\n * This is similar to `.once()`, but returns a Promise that resolves the next time\n * the event is triggered, instead of calling a listener callback.\n * @returns a Promise that resolves the next time given event is triggered,\n * or rejects if an error is emitted. (If you request the 'error' event,\n * returns a promise that resolves with the error).\n *\n * Example:\n *\n * const message = await stream.emitted('message') // rejects if the stream errors\n */\n emitted<Event extends keyof MessageStreamEvents<ParsedT>>(\n event: Event,\n ): Promise<\n Parameters<MessageStreamEvents<ParsedT>[Event]> extends [infer Param] ? Param\n : Parameters<MessageStreamEvents<ParsedT>[Event]> extends [] ? void\n : Parameters<MessageStreamEvents<ParsedT>[Event]>\n > {\n return new Promise((resolve, reject) => {\n this.#catchingPromiseCreated = true;\n if (event !== 'error') this.once('error', reject);\n this.once(event, resolve as any);\n });\n }\n\n async done(): Promise<void> {\n this.#catchingPromiseCreated = true;\n await this.#endPromise;\n }\n\n get currentMessage(): Message | undefined {\n return this.#currentMessageSnapshot;\n }\n\n #getFinalMessage(): ParsedMessage<ParsedT> {\n if (this.receivedMessages.length === 0) {\n throw new AnthropicError('stream ended without producing a Message with role=assistant');\n }\n return this.receivedMessages.at(-1)!;\n }\n\n /**\n * @returns a promise that resolves with the the final assistant Message response,\n * or rejects if an error occurred or the stream ended prematurely without producing a Message.\n * If structured outputs were used, this will be a ParsedMessage with a `parsed_output` field.\n */\n async finalMessage(): Promise<ParsedMessage<ParsedT>> {\n await this.done();\n return this.#getFinalMessage();\n }\n\n #getFinalText(): string {\n if (this.receivedMessages.length === 0) {\n throw new AnthropicError('stream ended without producing a Message with role=assistant');\n }\n const textBlocks = this.receivedMessages\n .at(-1)!\n .content.filter((block): block is TextBlock => block.type === 'text')\n .map((block) => block.text);\n if (textBlocks.length === 0) {\n throw new AnthropicError('stream ended without producing a content block with type=text');\n }\n return textBlocks.join(' ');\n }\n\n /**\n * @returns a promise that resolves with the the final assistant Message's text response, concatenated\n * together if there are more than one text blocks.\n * Rejects if an error occurred or the stream ended prematurely without producing a Message.\n */\n async finalText(): Promise<string> {\n await this.done();\n return this.#getFinalText();\n }\n\n #handleError = (error: unknown) => {\n this.#errored = true;\n if (isAbortError(error)) {\n error = new APIUserAbortError();\n }\n if (error instanceof APIUserAbortError) {\n this.#aborted = true;\n return this._emit('abort', error);\n }\n if (error instanceof AnthropicError) {\n return this._emit('error', error);\n }\n if (error instanceof Error) {\n const anthropicError: AnthropicError = new AnthropicError(error.message);\n // @ts-ignore\n anthropicError.cause = error;\n return this._emit('error', anthropicError);\n }\n return this._emit('error', new AnthropicError(String(error)));\n };\n\n protected _emit<Event extends keyof MessageStreamEvents<ParsedT>>(\n event: Event,\n ...args: Parameters<MessageStreamEvents<ParsedT>[Event]>\n ) {\n // make sure we don't emit any MessageStreamEvents after end\n if (this.#ended) return;\n\n if (event === 'end') {\n this.#ended = true;\n this.#resolveEndPromise();\n }\n\n const listeners: MessageStreamEventListeners<ParsedT, Event> | undefined = this.#listeners[event];\n if (listeners) {\n this.#listeners[event] = listeners.filter((l: { once?: boolean }) => !l.once) as any;\n listeners.forEach(({ listener }: any) => listener(...args));\n }\n\n if (event === 'abort') {\n const error = args[0] as APIUserAbortError;\n if (!this.#catchingPromiseCreated && !listeners?.length) {\n Promise.reject(error);\n }\n this.#rejectConnectedPromise(error);\n this.#rejectEndPromise(error);\n this._emit('end');\n return;\n }\n\n if (event === 'error') {\n // NOTE: _emit('error', error) should only be called from #handleError().\n\n const error = args[0] as AnthropicError;\n if (!this.#catchingPromiseCreated && !listeners?.length) {\n // Trigger an unhandled rejection if the user hasn't registered any error handlers.\n // If you are seeing stack traces here, make sure to handle errors via either:\n // - runner.on('error', () => ...)\n // - await runner.done()\n // - await runner.final...()\n // - etc.\n Promise.reject(error);\n }\n this.#rejectConnectedPromise(error);\n this.#rejectEndPromise(error);\n this._emit('end');\n }\n }\n\n protected _emitFinal() {\n const finalMessage = this.receivedMessages.at(-1);\n if (finalMessage) {\n this._emit('finalMessage', this.#getFinalMessage());\n }\n }\n\n #beginRequest() {\n if (this.ended) return;\n this.#currentMessageSnapshot = undefined;\n }\n #addStreamEvent(event: MessageStreamEvent) {\n if (this.ended) return;\n const messageSnapshot = this.#accumulateMessage(event);\n this._emit('streamEvent', event, messageSnapshot);\n\n switch (event.type) {\n case 'content_block_delta': {\n const content = messageSnapshot.content.at(-1)!;\n switch (event.delta.type) {\n case 'text_delta': {\n if (content.type === 'text') {\n this._emit('text', event.delta.text, content.text || '');\n }\n break;\n }\n case 'citations_delta': {\n if (content.type === 'text') {\n this._emit('citation', event.delta.citation, content.citations ?? []);\n }\n break;\n }\n case 'input_json_delta': {\n if (tracksToolInput(content) && this.#listeners.inputJson?.length) {\n this._emit('inputJson', event.delta.partial_json, content.input);\n }\n break;\n }\n case 'thinking_delta': {\n if (content.type === 'thinking') {\n this._emit('thinking', event.delta.thinking, content.thinking);\n }\n break;\n }\n case 'signature_delta': {\n if (content.type === 'thinking') {\n this._emit('signature', content.signature);\n }\n break;\n }\n default:\n checkNever(event.delta);\n }\n break;\n }\n case 'message_stop': {\n this._addMessageParam(messageSnapshot);\n this._addMessage(maybeParseMessage(messageSnapshot, this.#params, { logger: this.#logger }), true);\n break;\n }\n case 'content_block_stop': {\n this._emit('contentBlock', messageSnapshot.content.at(-1)!);\n break;\n }\n case 'message_start': {\n this.#currentMessageSnapshot = messageSnapshot;\n break;\n }\n case 'content_block_start':\n case 'message_delta':\n break;\n }\n }\n #endRequest(): ParsedMessage<ParsedT> {\n if (this.ended) {\n throw new AnthropicError(`stream has ended, this shouldn't happen`);\n }\n const snapshot = this.#currentMessageSnapshot;\n if (!snapshot) {\n throw new AnthropicError(`request ended without sending any chunks`);\n }\n this.#currentMessageSnapshot = undefined;\n return maybeParseMessage(snapshot, this.#params, { logger: this.#logger });\n }\n\n protected async _fromReadableStream(\n readableStream: ReadableStream,\n options?: RequestOptions,\n ): Promise<void> {\n const signal = options?.signal;\n let abortHandler: (() => void) | undefined;\n if (signal) {\n if (signal.aborted) this.controller.abort();\n abortHandler = this.controller.abort.bind(this.controller);\n signal.addEventListener('abort', abortHandler);\n }\n try {\n this.#beginRequest();\n this._connected(null);\n const stream = Stream.fromReadableStream<MessageStreamEvent>(readableStream, this.controller);\n for await (const event of stream) {\n this.#addStreamEvent(event);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n this.#endRequest();\n } finally {\n if (signal && abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n }\n\n /**\n * Mutates this.#currentMessage with the current event. Handling the accumulation of multiple messages\n * will be needed to be handled by the caller, this method will throw if you try to accumulate for multiple\n * messages.\n */\n #accumulateMessage(event: MessageStreamEvent): Message {\n let snapshot = this.#currentMessageSnapshot;\n\n if (event.type === 'message_start') {\n if (snapshot) {\n throw new AnthropicError(`Unexpected event order, got ${event.type} before receiving \"message_stop\"`);\n }\n return event.message;\n }\n\n if (!snapshot) {\n throw new AnthropicError(`Unexpected event order, got ${event.type} before \"message_start\"`);\n }\n\n switch (event.type) {\n case 'message_stop':\n return snapshot;\n case 'message_delta':\n snapshot.stop_reason = event.delta.stop_reason;\n snapshot.stop_sequence = event.delta.stop_sequence;\n snapshot.stop_details = event.delta.stop_details;\n snapshot.usage.output_tokens = event.usage.output_tokens;\n\n if (event.delta.container != null) {\n snapshot.container = event.delta.container;\n }\n\n // The remaining usage counters are cumulative whole-message totals that are\n // omitted when they don't apply, so overwrite when present and never add.\n if (event.usage.input_tokens != null) {\n snapshot.usage.input_tokens = event.usage.input_tokens;\n }\n\n if (event.usage.cache_creation_input_tokens != null) {\n snapshot.usage.cache_creation_input_tokens = event.usage.cache_creation_input_tokens;\n }\n\n if (event.usage.cache_read_input_tokens != null) {\n snapshot.usage.cache_read_input_tokens = event.usage.cache_read_input_tokens;\n }\n\n if (event.usage.server_tool_use != null) {\n snapshot.usage.server_tool_use = event.usage.server_tool_use;\n }\n\n if (event.usage.output_tokens_details != null) {\n snapshot.usage.output_tokens_details = event.usage.output_tokens_details;\n }\n\n return snapshot;\n case 'content_block_start':\n snapshot.content.push({ ...event.content_block });\n return snapshot;\n case 'content_block_delta': {\n const snapshotContent = snapshot.content.at(event.index);\n\n switch (event.delta.type) {\n case 'text_delta': {\n if (snapshotContent?.type === 'text') {\n snapshot.content[event.index] = {\n ...snapshotContent,\n text: (snapshotContent.text || '') + event.delta.text,\n };\n }\n break;\n }\n case 'citations_delta': {\n if (snapshotContent?.type === 'text') {\n snapshot.content[event.index] = {\n ...snapshotContent,\n citations: [...(snapshotContent.citations ?? []), event.delta.citation],\n };\n }\n break;\n }\n case 'input_json_delta': {\n if (snapshotContent && tracksToolInput(snapshotContent)) {\n const jsonBuf = ((snapshotContent as any)[JSON_BUF_PROPERTY] || '') + event.delta.partial_json;\n snapshot.content[event.index] = withLazyInput(snapshotContent, jsonBuf);\n }\n break;\n }\n case 'thinking_delta': {\n if (snapshotContent?.type === 'thinking') {\n snapshot.content[event.index] = {\n ...snapshotContent,\n thinking: snapshotContent.thinking + event.delta.thinking,\n };\n }\n break;\n }\n case 'signature_delta': {\n if (snapshotContent?.type === 'thinking') {\n snapshot.content[event.index] = {\n ...snapshotContent,\n signature: event.delta.signature,\n };\n }\n break;\n }\n default:\n checkNever(event.delta);\n }\n\n return snapshot;\n }\n case 'content_block_stop': {\n const snapshotContent = snapshot.content.at(event.index);\n if (snapshotContent && tracksToolInput(snapshotContent) && JSON_BUF_PROPERTY in snapshotContent) {\n Object.defineProperty(snapshotContent, 'input', {\n value: snapshotContent.input,\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n return snapshot;\n }\n }\n }\n\n [Symbol.asyncIterator](): AsyncIterator<MessageStreamEvent> {\n const pushQueue: MessageStreamEvent[] = [];\n const readQueue: {\n resolve: (chunk: MessageStreamEvent | undefined) => void;\n reject: (error: unknown) => void;\n }[] = [];\n let done = false;\n\n this.on('streamEvent', (event) => {\n const reader = readQueue.shift();\n if (reader) {\n reader.resolve(event);\n } else {\n pushQueue.push(event);\n }\n });\n\n this.on('end', () => {\n done = true;\n for (const reader of readQueue) {\n reader.resolve(undefined);\n }\n readQueue.length = 0;\n });\n\n this.on('abort', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n\n this.on('error', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n\n return {\n next: async (): Promise<IteratorResult<MessageStreamEvent>> => {\n if (!pushQueue.length) {\n if (done) {\n return { value: undefined, done: true };\n }\n return new Promise<MessageStreamEvent | undefined>((resolve, reject) =>\n readQueue.push({ resolve, reject }),\n ).then((chunk) => (chunk ? { value: chunk, done: false } : { value: undefined, done: true }));\n }\n const chunk = pushQueue.shift()!;\n return { value: chunk, done: false };\n },\n return: async () => {\n this.abort();\n return { value: undefined, done: true };\n },\n };\n }\n\n toReadableStream(): ReadableStream {\n const stream = new Stream(this[Symbol.asyncIterator].bind(this), this.controller);\n return stream.toReadableStream();\n }\n}\n","function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\")\n throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f)\n throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver))\n throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return kind === \"a\" ? f.call(receiver, value) : f ? (f.value = value) : state.set(receiver, value), value;\n}\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f)\n throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver))\n throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\nfunction __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\"))\n throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\nexport { __classPrivateFieldSet, __classPrivateFieldGet, __classPrivateFieldIn };\n","export function isAbortError(err: unknown) {\n return (\n typeof err === 'object' &&\n err !== null &&\n // Spec-compliant fetch implementations\n (('name' in err && (err as any).name === 'AbortError') ||\n // Expo fetch\n ('message' in err && String((err as any).message).includes('FetchRequestCanceledException')))\n );\n}\n\nexport const castToError = (err: any): Error => {\n if (err instanceof Error) return err;\n if (typeof err === 'object' && err !== null) {\n try {\n if (Object.prototype.toString.call(err) === '[object Error]') {\n const hasCause = 'cause' in err;\n // @ts-ignore - not all envs have native support for cause yet\n const error = new Error(err.message, hasCause ? { cause: err.cause } : {});\n if (err.stack) error.stack = err.stack;\n // @ts-ignore - not all envs have native support for cause yet\n if (hasCause && !Object.prototype.hasOwnProperty.call(error, 'cause')) error.cause = err.cause;\n if (err.name) error.name = err.name;\n return error;\n }\n } catch {}\n try {\n return new Error(JSON.stringify(err));\n } catch {}\n }\n return new Error(err);\n};\n","import { castToError } from '../internal/errors';\nimport type { OAuthErrorCode } from '../resources/shared';\n\nexport class OpenAIError extends Error {}\n\nexport class APIError<\n TStatus extends number | undefined = number | undefined,\n THeaders extends Headers | undefined = Headers | undefined,\n TError extends Object | undefined = Object | undefined,\n> extends OpenAIError {\n /** HTTP status for the response that caused the error */\n readonly status: TStatus;\n /** HTTP headers for the response that caused the error */\n readonly headers: THeaders;\n /** JSON body of the response that caused the error */\n readonly error: TError;\n\n readonly code: string | null | undefined;\n readonly param: string | null | undefined;\n readonly type: string | undefined;\n\n readonly requestID: string | null | undefined;\n\n constructor(status: TStatus, error: TError, message: string | undefined, headers: THeaders) {\n super(`${APIError.makeMessage(status, error, message)}`);\n this.status = status;\n this.headers = headers;\n this.requestID = headers?.get('x-request-id');\n this.error = error;\n\n const data = error as Record<string, any>;\n this.code = data?.['code'];\n this.param = data?.['param'];\n this.type = data?.['type'];\n }\n\n private static makeMessage(status: number | undefined, error: any, message: string | undefined) {\n const msg = error?.message\n ? typeof error.message === 'string'\n ? error.message\n : JSON.stringify(error.message)\n : error\n ? JSON.stringify(error)\n : message;\n\n if (status && msg) {\n return `${status} ${msg}`;\n }\n if (status) {\n return `${status} status code (no body)`;\n }\n if (msg) {\n return msg;\n }\n return '(no status code or body)';\n }\n\n static generate(\n status: number | undefined,\n errorResponse: Object | undefined,\n message: string | undefined,\n headers: Headers | undefined,\n ): APIError {\n if (!status || !headers) {\n return new APIConnectionError({ message, cause: castToError(errorResponse) });\n }\n\n const error = (errorResponse as Record<string, any>)?.['error'];\n\n if (status === 400) {\n return new BadRequestError(status, error, message, headers);\n }\n\n if (status === 401) {\n return new AuthenticationError(status, error, message, headers);\n }\n\n if (status === 403) {\n return new PermissionDeniedError(status, error, message, headers);\n }\n\n if (status === 404) {\n return new NotFoundError(status, error, message, headers);\n }\n\n if (status === 409) {\n return new ConflictError(status, error, message, headers);\n }\n\n if (status === 422) {\n return new UnprocessableEntityError(status, error, message, headers);\n }\n\n if (status === 429) {\n return new RateLimitError(status, error, message, headers);\n }\n\n if (status >= 500) {\n return new InternalServerError(status, error, message, headers);\n }\n\n return new APIError(status, error, message, headers);\n }\n}\n\nexport class APIUserAbortError extends APIError<undefined, undefined, undefined> {\n constructor({ message }: { message?: string } = {}) {\n super(undefined, undefined, message || 'Request was aborted.', undefined);\n }\n}\n\nexport class APIConnectionError extends APIError<undefined, undefined, undefined> {\n constructor({ message, cause }: { message?: string | undefined; cause?: Error | undefined }) {\n super(undefined, undefined, message || 'Connection error.', undefined);\n // in some environments the 'cause' property is already declared\n // @ts-ignore\n if (cause) this.cause = cause;\n }\n}\n\nexport class APIConnectionTimeoutError extends APIConnectionError {\n constructor({ message }: { message?: string } = {}) {\n super({ message: message ?? 'Request timed out.' });\n }\n}\n\nexport class BadRequestError extends APIError<400, Headers> {}\n\nexport class AuthenticationError extends APIError<401, Headers> {}\n\nexport class PermissionDeniedError extends APIError<403, Headers> {}\n\nexport class NotFoundError extends APIError<404, Headers> {}\n\nexport class ConflictError extends APIError<409, Headers> {}\n\nexport class UnprocessableEntityError extends APIError<422, Headers> {}\n\nexport class RateLimitError extends APIError<429, Headers> {}\n\nexport class InternalServerError extends APIError<number, Headers> {}\n\nexport class LengthFinishReasonError extends OpenAIError {\n constructor() {\n super(`Could not parse response content as the length limit was reached`);\n }\n}\n\nexport class ContentFilterFinishReasonError extends OpenAIError {\n constructor() {\n super(`Could not parse response content as the request was rejected by the content filter`);\n }\n}\n\nexport class InvalidWebhookSignatureError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\n/**\n * Error thrown by the API server during OAuth token exchange.\n * Can have status codes 400, 401, or 403.\n * Other status codes from OAuth endpoints are raised as normal APIError types.\n */\nexport class OAuthError extends APIError<400 | 401 | 403, Headers> {\n readonly error_code: OAuthErrorCode | undefined;\n\n constructor(status: 400 | 401 | 403, error: Object | undefined, headers: Headers) {\n let finalMessage = 'OAuth2 authentication error';\n let error_code: OAuthErrorCode | undefined = undefined;\n\n if (error && typeof error === 'object') {\n const errorData = error as Record<string, any>;\n error_code = errorData['error'];\n const description = errorData['error_description'];\n if (description && typeof description === 'string') {\n finalMessage = description;\n } else if (error_code) {\n finalMessage = error_code;\n }\n }\n\n super(status, error, finalMessage, headers);\n this.error_code = error_code;\n }\n}\n\nexport class SubjectTokenProviderError extends OpenAIError {\n readonly provider: string;\n readonly cause: Error | undefined;\n\n constructor(message: string, provider: string, cause?: Error) {\n super(message);\n this.provider = provider;\n this.cause = cause;\n }\n}\n","import {\n APIConnectionError,\n APIConnectionTimeoutError,\n APIError,\n APIUserAbortError,\n AuthenticationError,\n BadRequestError,\n ConflictError,\n ContentFilterFinishReasonError,\n InternalServerError,\n InvalidWebhookSignatureError,\n LengthFinishReasonError,\n NotFoundError,\n OAuthError,\n OpenAIError,\n PermissionDeniedError,\n RateLimitError,\n SubjectTokenProviderError,\n UnprocessableEntityError,\n} from '../error';\nimport type { EmittedEventResult } from './EventEmitter';\n\nconst MAX_BUFFERED_ITERATOR_EVENTS = 4096;\nconst MAX_BUFFERED_ITERATOR_BYTES = 8 * 1024 * 1024;\n// Typed-array own-key enumeration materializes every dense index before custom keys.\nconst MAX_INSPECTABLE_TYPED_ARRAY_ELEMENTS = 4096;\n// Structured JSON may nest 128 levels before stream-event wrappers are added.\nconst MAX_BUFFERED_EVENT_DEPTH = 256;\nconst bufferedJSONStringify = JSON.stringify;\nconst bufferedJSONParse = JSON.parse;\nconst sdkOwnedBufferedEventArguments = new WeakSet<object>();\n\nconst typedArrayBufferGetter = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(Uint8Array.prototype) as object,\n 'buffer',\n)?.get;\nconst typedArrayLengthGetter = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(Uint8Array.prototype) as object,\n 'length',\n)?.get;\nconst dataViewBufferGetter = Object.getOwnPropertyDescriptor(DataView.prototype, 'buffer')?.get;\nconst symbolDescriptionGetter = Object.getOwnPropertyDescriptor(Symbol.prototype, 'description')?.get;\nconst dateTimestampGetter = Date.prototype.getTime;\nconst arrayBufferByteLengthGetter = Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'byteLength')?.get;\nconst sharedArrayBufferByteLengthGetter =\n typeof SharedArrayBuffer === 'function'\n ? Object.getOwnPropertyDescriptor(SharedArrayBuffer.prototype, 'byteLength')?.get\n : undefined;\n// V8 uses the same trusted lazy-stack accessor pair for native Error instances.\nconst errorStackDescriptor = Object.getOwnPropertyDescriptor(new Error('native stack descriptor'), 'stack');\nconst functionToString = Function.prototype.toString;\nconst objectToString = Object.prototype.toString;\nconst errorBrandDescriptor = Object.getOwnPropertyDescriptor(Error, 'isError');\nconst nativeErrorBrand =\n errorBrandDescriptor && 'value' in errorBrandDescriptor && typeof errorBrandDescriptor.value === 'function'\n ? (errorBrandDescriptor.value as (value: unknown) => boolean)\n : undefined;\nconst nativeErrorConstructorSource = functionToString.call(Error);\nconst nativeDateConstructorSource = functionToString.call(Date);\nconst nativeFunctionConstructorSource = functionToString.call(Function);\nconst trustedIntrinsicPrototypes = new Set<object>([\n APIConnectionError.prototype,\n APIConnectionTimeoutError.prototype,\n APIError.prototype,\n OpenAIError.prototype,\n APIUserAbortError.prototype,\n AuthenticationError.prototype,\n BadRequestError.prototype,\n ConflictError.prototype,\n ContentFilterFinishReasonError.prototype,\n InternalServerError.prototype,\n InvalidWebhookSignatureError.prototype,\n LengthFinishReasonError.prototype,\n NotFoundError.prototype,\n OAuthError.prototype,\n PermissionDeniedError.prototype,\n RateLimitError.prototype,\n SubjectTokenProviderError.prototype,\n UnprocessableEntityError.prototype,\n]);\nconst trustedNativeConstructorSources = new Set<string>();\nconst canonicalIntrinsicDescriptors = new Map<string, ReadonlyMap<PropertyKey, PropertyDescriptor>>();\nconst foreignErrorStackDescriptors = new WeakMap<object, PropertyDescriptor>();\n\ntype NativeErrorConstructor = (...args: never[]) => unknown;\n\nfunction captureNativeProxyDetector(): ((value: object) => boolean) | undefined {\n if (typeof process === 'undefined') {\n return undefined;\n }\n\n try {\n const loader = Object.getOwnPropertyDescriptor(process, 'getBuiltinModule');\n if (!loader || !('value' in loader) || typeof loader.value !== 'function') {\n return undefined;\n }\n const util: unknown = Reflect.apply(loader.value, process, ['node:util']);\n if (typeof util !== 'object' || util === null) {\n return undefined;\n }\n const types = Object.getOwnPropertyDescriptor(util, 'types');\n if (!types || !('value' in types) || typeof types.value !== 'object' || types.value === null) {\n return undefined;\n }\n const detector = Object.getOwnPropertyDescriptor(types.value, 'isProxy');\n if (!detector || !('value' in detector) || typeof detector.value !== 'function') {\n return undefined;\n }\n return detector.value as (value: object) => boolean;\n } catch {\n return undefined;\n }\n}\n\n// Transparent proxies have no portable ECMAScript brand. Newer Node runtimes\n// expose one without adding a Node-only import to browser-compatible bundles.\nconst nativeProxyDetector = captureNativeProxyDetector();\n\nfunction rememberTrustedIntrinsic(constructor: unknown): void {\n if (typeof constructor !== 'function') {\n return;\n }\n\n const prototypeDescriptor = Object.getOwnPropertyDescriptor(constructor, 'prototype');\n if (\n !prototypeDescriptor ||\n !('value' in prototypeDescriptor) ||\n (typeof prototypeDescriptor.value !== 'object' && typeof prototypeDescriptor.value !== 'function')\n ) {\n return;\n }\n\n trustedIntrinsicPrototypes.add(prototypeDescriptor.value as object);\n const source = functionToString.call(constructor);\n if (\n /^function [A-Za-z_$][\\w$]*\\(\\) \\{ \\[native code\\] \\}$/u.test(source) &&\n prototypeDescriptor.configurable === false &&\n prototypeDescriptor.writable === false\n ) {\n trustedNativeConstructorSources.add(source);\n const descriptors = new Map<PropertyKey, PropertyDescriptor>();\n for (const key of Reflect.ownKeys(prototypeDescriptor.value)) {\n const descriptor = Object.getOwnPropertyDescriptor(prototypeDescriptor.value, key);\n if (descriptor) {\n descriptors.set(key, descriptor);\n }\n }\n canonicalIntrinsicDescriptors.set(source, descriptors);\n }\n}\n\nfor (const constructor of [\n Object,\n Function,\n Array,\n Date,\n Map,\n Set,\n ArrayBuffer,\n DataView,\n Error,\n EvalError,\n RangeError,\n ReferenceError,\n SyntaxError,\n TypeError,\n URIError,\n Uint8Array,\n Uint8ClampedArray,\n Uint16Array,\n Uint32Array,\n Int8Array,\n Int16Array,\n Int32Array,\n Float32Array,\n Float64Array,\n]) {\n rememberTrustedIntrinsic(constructor);\n}\n\nfor (const name of [\n 'SharedArrayBuffer',\n 'AggregateError',\n 'Float16Array',\n 'BigInt64Array',\n 'BigUint64Array',\n 'Blob',\n 'File',\n 'Headers',\n] as const) {\n const descriptor = Object.getOwnPropertyDescriptor(globalThis, name);\n if (descriptor && 'value' in descriptor) {\n rememberTrustedIntrinsic(descriptor.value);\n }\n}\n\nconst typedArrayConstructorDescriptor = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(Uint8Array.prototype) as object,\n 'constructor',\n);\nif (typedArrayConstructorDescriptor && 'value' in typedArrayConstructorDescriptor) {\n rememberTrustedIntrinsic(typedArrayConstructorDescriptor.value);\n}\n\nif (typeof Buffer === 'function') {\n rememberTrustedIntrinsic(Buffer);\n}\n\nconst blobInternalHandlePrototype = (() => {\n if (typeof Blob !== 'function') {\n return undefined;\n }\n\n try {\n const blob = new Blob([]);\n for (const key of Object.getOwnPropertySymbols(blob)) {\n const descriptor = Object.getOwnPropertyDescriptor(blob, key);\n if (descriptor && 'value' in descriptor && typeof descriptor.value === 'object' && descriptor.value) {\n return Object.getPrototypeOf(descriptor.value) as object;\n }\n }\n } catch {\n return undefined;\n }\n\n return undefined;\n})();\nconst mapEntries = Map.prototype.entries;\nconst setValues = Set.prototype.values;\nconst headersEntriesDescriptor =\n typeof Headers === 'function' ? Object.getOwnPropertyDescriptor(Headers.prototype, 'entries') : undefined;\nconst headersEntries =\n headersEntriesDescriptor &&\n 'value' in headersEntriesDescriptor &&\n typeof headersEntriesDescriptor.value === 'function'\n ? (headersEntriesDescriptor.value as typeof Headers.prototype.entries)\n : undefined;\nconst retainedStorageBrands = new Set([\n 'ArrayBuffer',\n 'SharedArrayBuffer',\n 'Blob',\n 'File',\n 'Map',\n 'Date',\n 'Set',\n 'Headers',\n]);\n\ninterface TrustedForeignIntrinsic {\n constructor: NativeErrorConstructor;\n descriptors: ReadonlyMap<PropertyKey, PropertyDescriptor>;\n functionPrototype: object;\n}\n\nfunction getTrustedForeignIntrinsic(prototype: object): TrustedForeignIntrinsic | undefined {\n const descriptor = Object.getOwnPropertyDescriptor(prototype, 'constructor');\n if (!descriptor || !('value' in descriptor) || typeof descriptor.value !== 'function') {\n return undefined;\n }\n\n const constructor = descriptor.value as NativeErrorConstructor;\n const source = functionToString.call(constructor);\n const descriptors = canonicalIntrinsicDescriptors.get(source);\n if (!trustedNativeConstructorSources.has(source) || !descriptors) {\n return undefined;\n }\n\n const constructorPrototype = Object.getOwnPropertyDescriptor(constructor, 'prototype');\n if (\n !constructorPrototype ||\n !('value' in constructorPrototype) ||\n constructorPrototype.value !== prototype ||\n constructorPrototype.configurable !== false ||\n constructorPrototype.writable !== false\n ) {\n return undefined;\n }\n\n return { constructor, descriptors, functionPrototype: Object.getPrototypeOf(constructor) as object };\n}\n\nfunction isTrustedIntrinsicPrototype(prototype: object): boolean {\n return trustedIntrinsicPrototypes.has(prototype) || getTrustedForeignIntrinsic(prototype) !== undefined;\n}\n\nfunction isCanonicalIntrinsicFunction(\n value: unknown,\n canonical: unknown,\n functionPrototype: object,\n): boolean {\n if (canonical === undefined) {\n return value === undefined;\n }\n\n if (typeof value !== 'function' || typeof canonical !== 'function') {\n return false;\n }\n\n const source = functionToString.call(canonical);\n if (functionToString.call(value) !== source) {\n return false;\n }\n\n const actualFunctionPrototype = Object.getPrototypeOf(value) as object;\n if (actualFunctionPrototype === functionPrototype) {\n return true;\n }\n if (!/^function [A-Za-z_$][\\w$]*\\(\\) \\{ \\[native code\\] \\}$/u.test(source)) {\n return false;\n }\n\n const intrinsic = getTrustedForeignIntrinsic(actualFunctionPrototype);\n return (\n intrinsic !== undefined &&\n functionToString.call(intrinsic.constructor) === nativeFunctionConstructorSource\n );\n}\n\nfunction isCanonicalIntrinsicDescriptor(\n descriptor: PropertyDescriptor,\n canonical: PropertyDescriptor | undefined,\n functionPrototype: object,\n): boolean {\n if (\n !canonical ||\n descriptor.configurable !== canonical.configurable ||\n descriptor.enumerable !== canonical.enumerable ||\n 'value' in descriptor !== 'value' in canonical\n ) {\n return false;\n }\n\n if ('value' in descriptor && 'value' in canonical) {\n if (descriptor.writable !== canonical.writable) {\n return false;\n }\n if (typeof canonical.value === 'function') {\n return isCanonicalIntrinsicFunction(descriptor.value, canonical.value, functionPrototype);\n }\n if (canonical.value !== null && typeof canonical.value === 'object') {\n return false;\n }\n return Object.is(descriptor.value, canonical.value);\n }\n\n return (\n isCanonicalIntrinsicFunction(descriptor.get, canonical.get, functionPrototype) &&\n isCanonicalIntrinsicFunction(descriptor.set, canonical.set, functionPrototype)\n );\n}\n\nfunction hasNativeErrorBrand(current: object): boolean {\n if (nativeErrorBrand) {\n return nativeErrorBrand.call(Error, current);\n }\n\n let prototype: object | null = current;\n for (let depth = 0; prototype !== null && depth < MAX_BUFFERED_EVENT_DEPTH; depth += 1) {\n if (Object.getOwnPropertyDescriptor(prototype, Symbol.toStringTag)) {\n return false;\n }\n prototype = Object.getPrototypeOf(prototype) as object | null;\n }\n\n return prototype === null && objectToString.call(current) === '[object Error]';\n}\n\nfunction getVerifiedForeignErrorConstructor(\n current: object,\n stackDescriptor: PropertyDescriptor,\n): { constructor: NativeErrorConstructor; prototype: object } | undefined {\n if (typeof stackDescriptor.get !== 'function' || typeof stackDescriptor.set !== 'function') {\n return undefined;\n }\n\n let prototype = Object.getPrototypeOf(current) as object | null;\n for (let depth = 0; prototype !== null && depth < MAX_BUFFERED_EVENT_DEPTH; depth += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(prototype, 'constructor');\n if (descriptor && 'value' in descriptor && typeof descriptor.value === 'function') {\n const constructor = descriptor.value as NativeErrorConstructor;\n if (\n functionToString.call(constructor) === nativeErrorConstructorSource &&\n isTrustedIntrinsicPrototype(prototype)\n ) {\n const functionPrototype = Object.getPrototypeOf(constructor) as object;\n if (\n Object.getPrototypeOf(stackDescriptor.get) === functionPrototype &&\n Object.getPrototypeOf(stackDescriptor.set) === functionPrototype\n ) {\n return { constructor, prototype };\n }\n return undefined;\n }\n }\n prototype = Object.getPrototypeOf(prototype) as object | null;\n }\n\n return undefined;\n}\n\nfunction isTrustedNativeErrorStack(current: object, descriptor: PropertyDescriptor): boolean {\n if (!hasNativeErrorBrand(current)) {\n return false;\n }\n\n if (\n errorStackDescriptor &&\n !('value' in errorStackDescriptor) &&\n typeof errorStackDescriptor.get === 'function' &&\n Object.prototype.isPrototypeOf.call(Error.prototype, current) &&\n descriptor.get === errorStackDescriptor.get &&\n descriptor.set === errorStackDescriptor.set\n ) {\n return true;\n }\n\n const verified = getVerifiedForeignErrorConstructor(current, descriptor);\n if (!verified) {\n return false;\n }\n\n let canonicalDescriptor = foreignErrorStackDescriptors.get(verified.prototype);\n if (!canonicalDescriptor) {\n const canonical = Reflect.construct(verified.constructor, []) as unknown;\n if (\n typeof canonical !== 'object' ||\n canonical === null ||\n !hasNativeErrorBrand(canonical) ||\n Object.getPrototypeOf(canonical) !== verified.prototype\n ) {\n return false;\n }\n\n canonicalDescriptor = Object.getOwnPropertyDescriptor(canonical, 'stack');\n if (\n !canonicalDescriptor ||\n 'value' in canonicalDescriptor ||\n typeof canonicalDescriptor.get !== 'function' ||\n typeof canonicalDescriptor.set !== 'function'\n ) {\n return false;\n }\n foreignErrorStackDescriptors.set(verified.prototype, canonicalDescriptor);\n }\n\n return descriptor.get === canonicalDescriptor.get && descriptor.set === canonicalDescriptor.set;\n}\n\ntype RetainedStorage = {\n bytes: number;\n kind: 'typed-array' | 'data-view' | 'buffer' | 'blob' | 'map' | 'date' | 'set' | 'headers';\n};\n\ntype EventQueue<Value> = {\n readonly length: number;\n enqueue: (value: Value) => void;\n dequeue: () => Value | undefined;\n clear: () => void;\n};\n\nfunction createEventQueue<Value>(): EventQueue<Value> {\n let entries: (Value | undefined)[] = [];\n let head = 0;\n\n return {\n get length() {\n return entries.length - head;\n },\n enqueue(value) {\n entries.push(value);\n },\n dequeue() {\n if (head === entries.length) {\n return undefined;\n }\n\n const value = entries[head];\n entries[head] = undefined;\n head += 1;\n\n if (head === entries.length) {\n entries = [];\n head = 0;\n } else if (head >= 1024 && head * 2 >= entries.length) {\n entries = entries.slice(head);\n head = 0;\n }\n\n return value;\n },\n clear() {\n entries = [];\n head = 0;\n },\n };\n}\n\nfunction getRetainedStorageBrand(current: object): string | undefined {\n let prototype = Object.getPrototypeOf(current) as object | null;\n\n for (let depth = 0; prototype !== null && depth < MAX_BUFFERED_EVENT_DEPTH; depth += 1) {\n if (prototype === Date.prototype) {\n return 'Date';\n }\n if (!trustedIntrinsicPrototypes.has(prototype)) {\n const constructor = Object.getOwnPropertyDescriptor(prototype, 'constructor');\n if (\n constructor &&\n 'value' in constructor &&\n typeof constructor.value === 'function' &&\n functionToString.call(constructor.value) === nativeDateConstructorSource &&\n getTrustedForeignIntrinsic(prototype)\n ) {\n return 'Date';\n }\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(prototype, Symbol.toStringTag);\n if (\n descriptor &&\n 'value' in descriptor &&\n typeof descriptor.value === 'string' &&\n retainedStorageBrands.has(descriptor.value)\n ) {\n return descriptor.value;\n }\n prototype = Object.getPrototypeOf(prototype) as object | null;\n }\n\n return undefined;\n}\n\nfunction estimateRetainedBufferBytes(\n current: object,\n visit: (value: unknown, depth: number) => void,\n depth: number,\n): RetainedStorage | undefined {\n if (ArrayBuffer.isView(current)) {\n let buffer: unknown;\n let kind: RetainedStorage['kind'] = 'typed-array';\n\n try {\n buffer = typedArrayBufferGetter?.call(current) as unknown;\n } catch {\n kind = 'data-view';\n buffer = dataViewBufferGetter?.call(current) as unknown;\n }\n\n if (typeof buffer !== 'object' || buffer === null) {\n return { bytes: Number.POSITIVE_INFINITY, kind };\n }\n\n // Even a one-byte cross-realm view retains its complete backing allocation.\n visit(buffer, depth + 1);\n return { bytes: 0, kind };\n }\n\n const brand = getRetainedStorageBrand(current);\n if (!brand) {\n return undefined;\n }\n\n let getter: (() => unknown) | undefined;\n const kind: RetainedStorage['kind'] = 'buffer';\n switch (brand) {\n case 'ArrayBuffer': {\n getter = arrayBufferByteLengthGetter;\n break;\n }\n case 'SharedArrayBuffer': {\n getter = sharedArrayBufferByteLengthGetter;\n break;\n }\n case 'Blob':\n case 'File': {\n // Blob slices can retain an arbitrarily larger native backing allocation,\n // and neither browser nor Node exposes its extent or ownership. Detached\n // queues must fail closed; waiting readers bypass retained-size inspection.\n return { bytes: Number.POSITIVE_INFINITY, kind: 'blob' };\n }\n case 'Map': {\n return { bytes: 0, kind: 'map' };\n }\n case 'Date': {\n Reflect.apply(dateTimestampGetter, current, []);\n return { bytes: 8, kind: 'date' };\n }\n case 'Set': {\n return { bytes: 0, kind: 'set' };\n }\n case 'Headers': {\n return { bytes: 0, kind: 'headers' };\n }\n default: {\n return undefined;\n }\n }\n\n const bytes = getter?.call(current);\n return {\n bytes:\n typeof bytes === 'number' && Number.isSafeInteger(bytes) && bytes >= 0\n ? bytes\n : Number.POSITIVE_INFINITY,\n kind,\n };\n}\n\nfunction visitHiddenEventValues(\n current: object,\n kind: RetainedStorage['kind'] | undefined,\n visit: (value: unknown, overhead: number) => boolean,\n): boolean {\n if (kind === 'map') {\n for (const [key, entry] of mapEntries.call(current)) {\n if (!visit(key, 8) || !visit(entry, 8)) {\n return false;\n }\n }\n }\n\n if (kind === 'set') {\n for (const entry of setValues.call(current)) {\n if (!visit(entry, 8)) {\n return false;\n }\n }\n }\n\n if (kind === 'headers') {\n if (!headersEntries) {\n return false;\n }\n for (const [name, value] of headersEntries.call(current as Headers)) {\n if (!visit(name, 8) || !visit(value, 8)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\nfunction getInspectableEventKeys(\n current: object,\n kind: RetainedStorage['kind'] | undefined,\n availableBytes: number,\n): (string | symbol)[] | undefined {\n if (Array.isArray(current)) {\n const descriptor = Object.getOwnPropertyDescriptor(current, 'length');\n const length: unknown = descriptor && 'value' in descriptor ? descriptor.value : undefined;\n if (\n typeof length !== 'number' ||\n !Number.isSafeInteger(length) ||\n length < 0 ||\n length > Math.floor(availableBytes / 16)\n ) {\n return undefined;\n }\n }\n\n if (kind !== 'typed-array') {\n return Reflect.ownKeys(current);\n }\n\n const length: unknown = typedArrayLengthGetter?.call(current);\n if (\n typeof length !== 'number' ||\n !Number.isSafeInteger(length) ||\n length < 0 ||\n length > MAX_INSPECTABLE_TYPED_ARRAY_ELEMENTS\n ) {\n return undefined;\n }\n\n return Reflect.ownKeys(current).filter((key) => {\n if (typeof key !== 'string') {\n return true;\n }\n\n const index = Number(key);\n return !Number.isInteger(index) || index < 0 || index >= length || String(index) !== key;\n });\n}\n\nfunction visitInspectableEventProperties(\n current: object,\n kind: RetainedStorage['kind'] | undefined,\n depth: number,\n availableBytes: () => number,\n charge: (bytes: number) => boolean,\n visit: (value: unknown, depth: number, isBlobInternalHandle?: boolean) => void,\n): boolean {\n const keys = getInspectableEventKeys(current, kind, availableBytes());\n if (keys === undefined) {\n return false;\n }\n\n for (const key of keys) {\n if (!charge(typeof key === 'string' ? key.length * 2 + 8 : 8)) {\n return false;\n }\n if (typeof key === 'symbol') {\n visit(key, depth + 1);\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(current, key);\n if (!descriptor) {\n return false;\n }\n if (!('value' in descriptor)) {\n if (key === 'stack' && isTrustedNativeErrorStack(current, descriptor)) {\n continue;\n }\n return false;\n }\n visit(descriptor.value, depth + 1, kind === 'blob');\n }\n\n return true;\n}\n\nfunction visitRetainedEventPrototypes(\n current: object,\n depth: number,\n isBlobInternalHandle: boolean,\n visited: WeakSet<object>,\n availableBytes: () => number,\n charge: (bytes: number) => boolean,\n visit: (value: unknown, depth: number, isBlobInternalHandle?: boolean) => void,\n retainPrototype: (prototype: object, inspect: () => boolean) => boolean,\n): boolean {\n let prototype = Object.getPrototypeOf(current) as object | null;\n\n for (let prototypeDepth = depth + 1; prototype !== null; prototypeDepth += 1) {\n if (prototypeDepth >= MAX_BUFFERED_EVENT_DEPTH) {\n return false;\n }\n if (\n trustedIntrinsicPrototypes.has(prototype) ||\n (isBlobInternalHandle && prototype === blobInternalHandlePrototype)\n ) {\n return true;\n }\n if (visited.has(prototype)) {\n visit(prototype, prototypeDepth);\n return availableBytes() >= 0;\n }\n\n visited.add(prototype);\n const retainedPrototype = prototype;\n const retained = retainPrototype(retainedPrototype, () => {\n if (!charge(16)) {\n return false;\n }\n\n const intrinsic = getTrustedForeignIntrinsic(retainedPrototype);\n if (!intrinsic) {\n return visitInspectableEventProperties(\n retainedPrototype,\n undefined,\n prototypeDepth,\n availableBytes,\n charge,\n visit,\n );\n }\n\n for (const key of Reflect.ownKeys(retainedPrototype)) {\n const descriptor = Object.getOwnPropertyDescriptor(retainedPrototype, key);\n if (!descriptor) {\n return false;\n }\n if (\n isCanonicalIntrinsicDescriptor(\n descriptor,\n intrinsic.descriptors.get(key),\n intrinsic.functionPrototype,\n )\n ) {\n continue;\n }\n if (!charge(typeof key === 'string' ? key.length * 2 + 8 : 8) || !('value' in descriptor)) {\n return false;\n }\n if (typeof key === 'symbol') {\n visit(key, prototypeDepth + 1);\n }\n visit(descriptor.value, prototypeDepth + 1);\n }\n\n return availableBytes() >= 0;\n });\n if (!retained) {\n return false;\n }\n\n prototype = Object.getPrototypeOf(retainedPrototype) as object | null;\n }\n\n return true;\n}\n\ntype BufferedRetainedIdentity = object | symbol;\n\ntype BufferedInspectedNode = {\n bytes: number;\n edges: Set<BufferedRetainedIdentity>;\n};\n\ntype BufferedInspectedGraph = {\n scalarBytes: number;\n roots: Set<BufferedRetainedIdentity>;\n nodes: Map<BufferedRetainedIdentity, BufferedInspectedNode>;\n};\n\ntype BufferedLedgerEntry = {\n scalarBytes: number;\n roots: Set<BufferedRetainedIdentity>;\n identities: Set<BufferedRetainedIdentity>;\n};\n\ntype BufferedLedgerRecord = BufferedInspectedNode & {\n owners: Set<BufferedLedgerEntry>;\n};\n\ntype BufferedLedgerChange = {\n node: BufferedInspectedNode;\n ownerDelta: number;\n};\n\nconst BUFFERED_LEDGER_ENTRY_BYTES = 32;\nconst BUFFERED_LEDGER_NODE_BYTES = 32;\nconst BUFFERED_LEDGER_EDGE_BYTES = 8;\nconst BUFFERED_LEDGER_OWNER_BYTES = 16;\nconst MAX_BUFFERED_LEDGER_RECONCILIATION_WORK = 128 * 1024;\n\nfunction inspectBufferedEventGraph(\n value: unknown,\n remainingBytes: number,\n): BufferedInspectedGraph | undefined {\n let bytes = 0;\n let scalarBytes = 0;\n const visited = new WeakSet<object>();\n const visitedSymbols = new Set<symbol>();\n const roots = new Set<BufferedRetainedIdentity>();\n const nodes = new Map<BufferedRetainedIdentity, BufferedInspectedNode>();\n let activeNode: BufferedInspectedNode | undefined;\n const availableBytes = (): number => remainingBytes - bytes;\n const charge = (amount: number): boolean => {\n if (!Number.isSafeInteger(amount) || amount < 0) {\n bytes = remainingBytes + 1;\n return false;\n }\n\n bytes += amount;\n if (activeNode) {\n activeNode.bytes += amount;\n } else {\n scalarBytes += amount;\n }\n return bytes <= remainingBytes;\n };\n const addIdentity = (identity: BufferedRetainedIdentity): void => {\n if (activeNode) {\n activeNode.edges.add(identity);\n } else {\n roots.add(identity);\n }\n };\n const retainIdentity = (identity: BufferedRetainedIdentity, inspect: () => boolean): boolean => {\n addIdentity(identity);\n const node: BufferedInspectedNode = { bytes: 0, edges: new Set() };\n nodes.set(identity, node);\n const previous = activeNode;\n activeNode = node;\n try {\n return inspect();\n } finally {\n activeNode = previous;\n }\n };\n\n const visitSymbol = (current: symbol): void => {\n if (visitedSymbols.has(current)) {\n addIdentity(current);\n charge(8);\n return;\n }\n visitedSymbols.add(current);\n\n if (\n !retainIdentity(current, () => {\n if (!symbolDescriptionGetter) {\n return false;\n }\n const description = Reflect.apply(symbolDescriptionGetter, current, []) as string | undefined;\n return charge(8 + (description?.length ?? 0) * 2);\n })\n ) {\n bytes = remainingBytes + 1;\n }\n };\n\n const visit = (current: unknown, depth: number, isBlobInternalHandle = false): void => {\n if (bytes > remainingBytes) {\n return;\n }\n\n if (typeof current === 'string') {\n charge(current.length * 2);\n return;\n }\n\n if (typeof current === 'symbol') {\n visitSymbol(current);\n return;\n }\n\n if (typeof current === 'function') {\n bytes = remainingBytes + 1;\n return;\n }\n\n if (current === null || typeof current !== 'object') {\n charge(8);\n return;\n }\n\n if (nativeProxyDetector?.(current)) {\n bytes = remainingBytes + 1;\n return;\n }\n\n if (depth >= MAX_BUFFERED_EVENT_DEPTH) {\n bytes = remainingBytes + 1;\n return;\n }\n\n if (visited.has(current)) {\n addIdentity(current);\n charge(8);\n return;\n }\n visited.add(current);\n\n if (\n !retainIdentity(current, () => {\n if (!charge(16)) {\n return false;\n }\n\n const retainedStorage = estimateRetainedBufferBytes(current, visit, depth);\n if (\n !visitRetainedEventPrototypes(\n current,\n depth,\n isBlobInternalHandle,\n visited,\n availableBytes,\n charge,\n visit,\n retainIdentity,\n )\n ) {\n return false;\n }\n if (retainedStorage !== undefined && !charge(retainedStorage.bytes)) {\n return false;\n }\n\n if (\n !visitHiddenEventValues(current, retainedStorage?.kind, (hiddenValue, overhead) => {\n if (!charge(overhead)) {\n return false;\n }\n visit(hiddenValue, depth + 1);\n return bytes <= remainingBytes;\n })\n ) {\n return false;\n }\n\n return visitInspectableEventProperties(\n current,\n retainedStorage?.kind,\n depth,\n availableBytes,\n charge,\n visit,\n );\n })\n ) {\n bytes = remainingBytes + 1;\n }\n };\n\n try {\n visit(value, 0);\n } catch {\n return undefined;\n }\n\n return bytes <= remainingBytes ? { scalarBytes, roots, nodes } : undefined;\n}\n\nfunction areBufferedRetainedEdgesEqual(\n first: Set<BufferedRetainedIdentity>,\n second: Set<BufferedRetainedIdentity>,\n): boolean {\n if (first.size !== second.size) {\n return false;\n }\n for (const identity of first) {\n if (!second.has(identity)) {\n return false;\n }\n }\n return true;\n}\n\nfunction getBufferedLedgerNodeBytes(node: BufferedInspectedNode, owners: number): number {\n return (\n node.bytes +\n BUFFERED_LEDGER_NODE_BYTES +\n node.edges.size * BUFFERED_LEDGER_EDGE_BYTES +\n owners * BUFFERED_LEDGER_OWNER_BYTES\n );\n}\n\nfunction getBufferedLedgerEntryBytes(entry: Pick<BufferedLedgerEntry, 'scalarBytes' | 'roots'>): number {\n return BUFFERED_LEDGER_ENTRY_BYTES + entry.scalarBytes + entry.roots.size * BUFFERED_LEDGER_EDGE_BYTES;\n}\n\nfunction collectBufferedLedgerIdentities(\n roots: Set<BufferedRetainedIdentity>,\n candidate: Map<BufferedRetainedIdentity, BufferedInspectedNode>,\n records: Map<BufferedRetainedIdentity, BufferedLedgerRecord>,\n work: { remaining: number },\n): Set<BufferedRetainedIdentity> | undefined {\n const identities = new Set<BufferedRetainedIdentity>();\n const pending = [...roots];\n\n while (pending.length) {\n work.remaining -= 1;\n if (work.remaining < 0) {\n return undefined;\n }\n\n const identity = pending.pop()!;\n if (identities.has(identity)) {\n continue;\n }\n const node = candidate.get(identity) ?? records.get(identity);\n if (!node) {\n return undefined;\n }\n identities.add(identity);\n for (const edge of node.edges) {\n pending.push(edge);\n }\n }\n\n return identities;\n}\n\nfunction getBufferedLedgerChange(\n identity: BufferedRetainedIdentity,\n graph: BufferedInspectedGraph,\n records: Map<BufferedRetainedIdentity, BufferedLedgerRecord>,\n changes: Map<BufferedRetainedIdentity, BufferedLedgerChange>,\n node?: BufferedInspectedNode,\n): BufferedLedgerChange | undefined {\n const existing = changes.get(identity);\n if (existing) {\n if (node) {\n existing.node = node;\n }\n return existing;\n }\n\n const current = node ?? graph.nodes.get(identity) ?? records.get(identity);\n if (!current) {\n return undefined;\n }\n const update = { node: current, ownerDelta: 0 };\n changes.set(identity, update);\n return update;\n}\n\nfunction findBufferedLedgerAffectedOwners(\n entry: BufferedLedgerEntry,\n graph: BufferedInspectedGraph,\n records: Map<BufferedRetainedIdentity, BufferedLedgerRecord>,\n changes: Map<BufferedRetainedIdentity, BufferedLedgerChange>,\n work: { remaining: number },\n): Set<BufferedLedgerEntry> | undefined {\n const affected = new Set<BufferedLedgerEntry>([entry]);\n\n for (const [identity, node] of graph.nodes) {\n work.remaining -= 1;\n if (work.remaining < 0) {\n return undefined;\n }\n\n const previous = records.get(identity);\n if (!previous) {\n continue;\n }\n const changedEdges = !areBufferedRetainedEdgesEqual(previous.edges, node.edges);\n if (previous.bytes !== node.bytes || changedEdges) {\n getBufferedLedgerChange(identity, graph, records, changes, node);\n }\n if (!changedEdges) {\n continue;\n }\n for (const owner of previous.owners) {\n work.remaining -= 1;\n if (work.remaining < 0) {\n return undefined;\n }\n affected.add(owner);\n }\n }\n\n return affected;\n}\n\nfunction updateBufferedLedgerMembershipChanges(\n owner: BufferedLedgerEntry,\n next: Set<BufferedRetainedIdentity>,\n graph: BufferedInspectedGraph,\n records: Map<BufferedRetainedIdentity, BufferedLedgerRecord>,\n changes: Map<BufferedRetainedIdentity, BufferedLedgerChange>,\n work: { remaining: number },\n): boolean {\n for (const identity of owner.identities) {\n work.remaining -= 1;\n if (work.remaining < 0) {\n return false;\n }\n if (!next.has(identity)) {\n const update = getBufferedLedgerChange(identity, graph, records, changes);\n if (!update) {\n return false;\n }\n update.ownerDelta -= 1;\n }\n }\n\n for (const identity of next) {\n work.remaining -= 1;\n if (work.remaining < 0) {\n return false;\n }\n if (!owner.identities.has(identity)) {\n const update = getBufferedLedgerChange(identity, graph, records, changes);\n if (!update) {\n return false;\n }\n update.ownerDelta += 1;\n }\n }\n\n return true;\n}\n\nfunction collectBufferedLedgerMemberships(\n entry: BufferedLedgerEntry,\n graph: BufferedInspectedGraph,\n affected: Set<BufferedLedgerEntry>,\n records: Map<BufferedRetainedIdentity, BufferedLedgerRecord>,\n changes: Map<BufferedRetainedIdentity, BufferedLedgerChange>,\n work: { remaining: number },\n): Map<BufferedLedgerEntry, Set<BufferedRetainedIdentity>> | undefined {\n const memberships = new Map<BufferedLedgerEntry, Set<BufferedRetainedIdentity>>();\n\n for (const owner of affected) {\n const roots = owner === entry ? graph.roots : owner.roots;\n const next = collectBufferedLedgerIdentities(roots, graph.nodes, records, work);\n if (!next || !updateBufferedLedgerMembershipChanges(owner, next, graph, records, changes, work)) {\n return undefined;\n }\n memberships.set(owner, next);\n }\n\n return memberships;\n}\n\nfunction projectBufferedLedgerBytes(\n currentBytes: number,\n entry: BufferedLedgerEntry,\n graph: BufferedInspectedGraph,\n isNew: boolean,\n changes: Map<BufferedRetainedIdentity, BufferedLedgerChange>,\n records: Map<BufferedRetainedIdentity, BufferedLedgerRecord>,\n): number | undefined {\n let projected =\n currentBytes - (isNew ? 0 : getBufferedLedgerEntryBytes(entry)) + getBufferedLedgerEntryBytes(graph);\n\n for (const [identity, update] of changes) {\n const previous = records.get(identity);\n const owners = (previous?.owners.size ?? 0) + update.ownerDelta;\n if (owners < 0) {\n return undefined;\n }\n if (previous) {\n projected -= getBufferedLedgerNodeBytes(previous, previous.owners.size);\n }\n if (owners) {\n projected += getBufferedLedgerNodeBytes(update.node, owners);\n }\n }\n\n return Number.isSafeInteger(projected) && projected >= 0 && projected <= MAX_BUFFERED_ITERATOR_BYTES\n ? projected\n : undefined;\n}\n\nfunction applyBufferedLedgerChanges(\n records: Map<BufferedRetainedIdentity, BufferedLedgerRecord>,\n changes: Map<BufferedRetainedIdentity, BufferedLedgerChange>,\n memberships: Map<BufferedLedgerEntry, Set<BufferedRetainedIdentity>>,\n): void {\n for (const [identity, update] of changes) {\n const previous = records.get(identity);\n const owners = (previous?.owners.size ?? 0) + update.ownerDelta;\n if (!owners) {\n continue;\n }\n if (previous) {\n previous.bytes = update.node.bytes;\n previous.edges = update.node.edges;\n } else {\n records.set(identity, {\n bytes: update.node.bytes,\n edges: update.node.edges,\n owners: new Set(),\n });\n }\n }\n\n for (const [owner, next] of memberships) {\n for (const identity of owner.identities) {\n if (!next.has(identity)) {\n records.get(identity)?.owners.delete(owner);\n }\n }\n for (const identity of next) {\n if (!owner.identities.has(identity)) {\n records.get(identity)!.owners.add(owner);\n }\n }\n owner.identities = next;\n }\n\n for (const identity of changes.keys()) {\n if (records.get(identity)?.owners.size === 0) {\n records.delete(identity);\n }\n }\n}\n\n/**\n * Account for queue-owned identities once while charging bounded ownership and\n * edge metadata. Shared topology changes are reconciled for every queued owner.\n */\nfunction createBufferedEventLedger(): {\n retain: (graph: BufferedInspectedGraph) => BufferedLedgerEntry | undefined;\n refresh: (entry: BufferedLedgerEntry, graph: BufferedInspectedGraph) => boolean;\n release: (entry: BufferedLedgerEntry) => void;\n clear: () => void;\n} {\n const records = new Map<BufferedRetainedIdentity, BufferedLedgerRecord>();\n let bytes = 0;\n\n const reconcile = (entry: BufferedLedgerEntry, graph: BufferedInspectedGraph, isNew: boolean): boolean => {\n const work = { remaining: MAX_BUFFERED_LEDGER_RECONCILIATION_WORK };\n const changes = new Map<BufferedRetainedIdentity, BufferedLedgerChange>();\n const affected = findBufferedLedgerAffectedOwners(entry, graph, records, changes, work);\n if (!affected) {\n return false;\n }\n const memberships = collectBufferedLedgerMemberships(entry, graph, affected, records, changes, work);\n if (!memberships) {\n return false;\n }\n const projectedBytes = projectBufferedLedgerBytes(bytes, entry, graph, isNew, changes, records);\n if (projectedBytes === undefined) {\n return false;\n }\n\n applyBufferedLedgerChanges(records, changes, memberships);\n entry.scalarBytes = graph.scalarBytes;\n entry.roots = graph.roots;\n bytes = projectedBytes;\n return true;\n };\n\n const release = (entry: BufferedLedgerEntry): void => {\n bytes -= getBufferedLedgerEntryBytes(entry);\n for (const identity of entry.identities) {\n const record = records.get(identity);\n if (!record?.owners.delete(entry)) {\n continue;\n }\n bytes -= BUFFERED_LEDGER_OWNER_BYTES;\n if (record.owners.size === 0) {\n bytes -= getBufferedLedgerNodeBytes(record, 0);\n records.delete(identity);\n }\n }\n entry.identities.clear();\n };\n\n return {\n retain(graph) {\n const entry: BufferedLedgerEntry = { scalarBytes: 0, roots: new Set(), identities: new Set() };\n return reconcile(entry, graph, true) ? entry : undefined;\n },\n refresh(entry, graph) {\n return reconcile(entry, graph, false);\n },\n release,\n clear() {\n records.clear();\n bytes = 0;\n },\n };\n}\n\n/** An abortable event stream with typed listeners, asynchronous iteration, and lifecycle state. */\nexport class EventStream<EventTypes extends BaseEvents> {\n /** Controls the underlying request; aborting this controller cancels the stream. */\n controller: AbortController = new AbortController();\n\n #connectedPromise: Promise<void>;\n // oxlint-disable class-methods-use-this -- Deferred promise resolvers are intentionally per-instance mutable callbacks.\n #resolveConnectedPromise: () => void = () => undefined;\n #rejectConnectedPromise: (error: OpenAIError) => void = () => undefined;\n\n #endPromise: Promise<void>;\n #resolveEndPromise: () => void = () => undefined;\n #rejectEndPromise: (error: OpenAIError) => void = () => undefined;\n // oxlint-enable class-methods-use-this\n\n #listeners: {\n [Event in keyof EventTypes]?: EventListeners<EventTypes, Event>;\n } = Object.create(null);\n #abortListeners: { signal: AbortSignal; listener: () => void }[] = [];\n #emittedListenerRegistrations = new WeakMap<\n object,\n { event: PropertyKey; registration: { removed?: boolean; detached?: boolean } }\n >();\n #pendingListenerCleanup = new Set<PropertyKey>();\n #pendingBufferedEventChecks = new Set<() => void>();\n #listenerDispatchDepth = 0;\n\n #ended = false;\n #errored = false;\n #aborted = false;\n #catchingPromiseCreated = false;\n // Terminal failure recorded during settlement, before `end` is emitted, so\n // iterators can surface it even when a throwing user listener prevented\n // their internal failure listeners from running.\n #terminalFailure: { kind: 'error' | 'abort'; error: OpenAIError } | undefined;\n\n /** Creates an unstarted stream with independent connection and completion lifecycle promises. */\n constructor() {\n this.#connectedPromise = new Promise<void>((resolve, reject) => {\n this.#resolveConnectedPromise = resolve;\n this.#rejectConnectedPromise = reject;\n });\n\n this.#endPromise = new Promise<void>((resolve, reject) => {\n this.#resolveEndPromise = resolve;\n this.#rejectEndPromise = reject;\n });\n\n // Don't let these promises cause unhandled rejection errors.\n // we will manually cause an unhandled rejection error later\n // if the user hasn't registered any error listener or called\n // any promise-returning method.\n this.#connectedPromise.catch(() => undefined);\n this.#endPromise.catch(() => undefined);\n }\n\n protected _run(this: EventStream<EventTypes>, executor: () => Promise<any>) {\n // Unfortunately if we call `executor()` immediately we get runtime errors about\n // references to `this` before the `super()` constructor call returns.\n setTimeout(() => {\n let failed = false;\n\n Promise.resolve()\n .then(executor)\n .catch((error) => {\n failed = true;\n this.#handleError(error);\n })\n .then(() => {\n if (failed) {\n return;\n }\n\n try {\n this._emitFinal();\n } catch (error) {\n this.#handleError(error);\n return;\n }\n this._emit('end');\n });\n }, 0);\n }\n\n protected _connected(this: EventStream<EventTypes>) {\n if (this.ended) {\n return;\n }\n this.#resolveConnectedPromise();\n this._emit('connect');\n }\n\n /** Whether the stream has finished successfully, failed, or been aborted. */\n get ended(): boolean {\n return this.#ended;\n }\n\n /** Whether an error or user cancellation has been observed. */\n get errored(): boolean {\n return this.#errored;\n }\n\n /** Whether the stream ended because its request was cancelled. */\n get aborted(): boolean {\n return this.#aborted;\n }\n\n /**\n * Cancels the underlying request; {@link done} and {@link events} observe cancellation.\n * Promises returned by {@link emitted} for other events may remain pending.\n */\n abort() {\n this.controller.abort();\n }\n\n protected _listenForAbort(signal: AbortSignal | null | undefined) {\n if (!signal || this.ended) {\n return;\n }\n if (signal.aborted) {\n this.controller.abort();\n return;\n }\n if (this.#abortListeners.some((registration) => registration.signal === signal)) {\n return;\n }\n\n const listener = () => this.controller.abort();\n signal.addEventListener('abort', listener, { once: true });\n this.#abortListeners.push({ signal, listener });\n }\n\n #removeAbortListeners() {\n for (const { signal, listener } of this.#abortListeners.splice(0)) {\n signal.removeEventListener('abort', listener);\n }\n }\n\n /**\n * Adds the listener function to the end of the listeners array for the event.\n * No checks are made to see if the listener has already been added. Multiple calls passing\n * the same combination of event and listener will result in the listener being added, and\n * called, multiple times.\n * @returns This stream, so that listener registration calls can be chained.\n */\n on<Event extends keyof EventTypes>(event: Event, listener: EventListener<EventTypes, Event>): this {\n const listeners: EventListeners<EventTypes, Event> = (this.#listeners[event] ||= []);\n listeners.push({ listener });\n return this;\n }\n\n /**\n * Removes the specified listener from the listener array for the event.\n * off() will remove, at most, one instance of a listener from the listener array. If any single\n * listener has been added multiple times to the listener array for the specified event, then\n * off() must be called multiple times to remove each instance.\n * @returns This stream, so that listener registration calls can be chained.\n */\n off<Event extends keyof EventTypes>(event: Event, listener: EventListener<EventTypes, Event>): this {\n const listeners = this.#listeners[event];\n if (!listeners) {\n return this;\n }\n\n const emittedRegistration = this.#emittedListenerRegistrations.get(listener as object);\n if (\n emittedRegistration?.event === event &&\n !emittedRegistration.registration.removed &&\n !emittedRegistration.registration.detached\n ) {\n this.#removeEmittedListener(\n event,\n emittedRegistration.registration as EventListeners<EventTypes, Event>[number],\n );\n return this;\n }\n\n const index = listeners.findIndex((l) => !l.removed && l.listener === listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n /**\n * Adds a one-time listener function for the event. The next time the event is triggered,\n * this listener is removed and then invoked.\n * @returns This stream, so that listener registration calls can be chained.\n */\n once<Event extends keyof EventTypes>(event: Event, listener: EventListener<EventTypes, Event>): this {\n const listeners: EventListeners<EventTypes, Event> = (this.#listeners[event] ||= []);\n listeners.push({ listener, once: true });\n return this;\n }\n\n #onceForEmitted<Event extends keyof EventTypes>(\n event: Event,\n listener: EventListener<EventTypes, Event>,\n ): void {\n const previousListeners = this.#listeners[event];\n const previousLength = previousListeners?.length ?? 0;\n this.once(event, listener);\n const listeners = this.#listeners[event];\n const [registration] = listeners?.slice(-1) ?? [];\n if (\n (previousListeners === undefined || listeners === previousListeners) &&\n listeners?.length === previousLength + 1 &&\n registration?.listener === listener &&\n registration.once\n ) {\n this.#emittedListenerRegistrations.set(listener as object, { event, registration });\n }\n }\n\n #removeEmittedListener<Event extends keyof EventTypes>(\n event: Event,\n registration: EventListeners<EventTypes, Event>[number],\n ): void {\n if (registration.removed) {\n return;\n }\n\n registration.removed = true;\n this.#emittedListenerRegistrations.delete(registration.listener as object);\n this.#pendingListenerCleanup.add(event);\n if (this.#listenerDispatchDepth === 0) {\n this.#cleanupEmittedListeners();\n }\n }\n\n #cleanupEmittedListeners(): void {\n for (const event of this.#pendingListenerCleanup) {\n const eventType = event as keyof EventTypes;\n const listeners = this.#listeners[eventType];\n if (listeners) {\n this.#listeners[eventType] = listeners.filter((listener) => !listener.removed) as any;\n }\n }\n this.#pendingListenerCleanup.clear();\n }\n\n /**\n * This is similar to `.once()`, but returns a Promise that resolves the next time\n * the event is triggered, instead of calling a listener callback.\n * Events without arguments resolve to `undefined`, single-argument events resolve\n * to that argument, and events with multiple arguments resolve to an argument tuple.\n *\n * @returns A promise for the next event, or a rejection if an error occurs first.\n * Requesting the `error` event resolves with the emitted error instead.\n *\n * Example:\n *\n * const message = await stream.emitted('message') // rejects if the stream errors\n */\n emitted<Event extends keyof EventTypes>(\n event: Event,\n ): Promise<EmittedEventResult<EventParameters<EventTypes, Event>>> {\n return new Promise((resolve, reject) => {\n this.#catchingPromiseCreated = true;\n const onError = (error: OpenAIError) => {\n this.off(event, onEvent as EventListener<EventTypes, Event>);\n reject(error);\n };\n const onEvent = (...values: unknown[]) => {\n if (event !== 'error') {\n this.off('error', onError);\n }\n resolve((values.length > 1 ? values : values[0]) as any);\n };\n\n if (event !== 'error') {\n this.#onceForEmitted('error', onError as EventListener<EventTypes, 'error'>);\n }\n this.#onceForEmitted(event, onEvent as EventListener<EventTypes, Event>);\n });\n }\n\n /**\n * Returns an async iterator that yields every time the event is triggered.\n * The iterator ends when the stream ends and rejects if the stream errors\n * or is aborted. If you request the 'error' or 'abort' event, the iterator\n * yields that event instead of rejecting.\n *\n * Example:\n *\n * for await (const [message] of stream.events('message')) {\n * await processMessage(message);\n * }\n */\n events<Event extends keyof EventTypes>(\n event: Event,\n ): AsyncIterableIterator<EventParameters<EventTypes, Event>> {\n type Parameters = EventParameters<EventTypes, Event>;\n return this._createIterator<Parameters>(\n (push) => {\n const onEvent = (...args: Parameters) => {\n sdkOwnedBufferedEventArguments.add(args);\n try {\n push(args);\n } finally {\n sdkOwnedBufferedEventArguments.delete(args);\n }\n };\n this.on(event, onEvent as EventListener<EventTypes, Event>);\n return () => this.off(event, onEvent as EventListener<EventTypes, Event>);\n },\n {\n // When iterating the 'error' or 'abort' event itself, yield it as a\n // value instead of rejecting the iterator.\n rejectOnError: event !== 'error',\n rejectOnAbort: event !== 'abort',\n },\n );\n }\n\n /**\n * Shared buffered async-iterator adapter over this stream's events.\n *\n * `attach` registers the producer listener(s) with the given `push` and\n * returns a cleanup function that removes them. Termination is handled\n * here: the iterator ends when the stream ends, listeners are removed on\n * end/return, and a terminal error is retained until buffered values have\n * drained so it is surfaced even when no reader was waiting when it fired.\n * Detached consumers have bounded event and byte queues; exceeding either\n * limit fails the stream and aborts its underlying request. Detached queues\n * also reject accessor-backed payloads because getter closures cannot be\n * safely sized without executing untrusted code.\n */\n protected _createIterator<T>(\n attach: (push: (value: T) => void) => () => void,\n {\n rejectOnError = true,\n rejectOnAbort = true,\n onReturn,\n }: { rejectOnError?: boolean; rejectOnAbort?: boolean; onReturn?: () => void } = {},\n ): AsyncIterableIterator<T> {\n type Result = IteratorResult<T>;\n type Reader = {\n resolve: (result: Result) => void;\n reject: (error: OpenAIError) => void;\n };\n type BufferedEvent = {\n retention: BufferedLedgerEntry;\n active: boolean;\n check: (() => void) | undefined;\n };\n\n const pushQueue = createEventQueue<T>();\n const bufferedEventSizes = createEventQueue<BufferedEvent>();\n const readQueue = createEventQueue<Reader>();\n const bufferedLedger = createBufferedEventLedger();\n let ended = this.ended;\n let failure: OpenAIError | undefined;\n let failureDelivered = false;\n let detach: () => void = () => undefined;\n\n const doneResult = (): Result => ({ value: undefined as never, done: true });\n const finishReaders = () => {\n while (readQueue.length) {\n readQueue.dequeue()!.resolve(doneResult());\n }\n };\n const rejectReader = () => {\n if (!failure || failureDelivered || !readQueue.length) {\n return;\n }\n failureDelivered = true;\n readQueue.dequeue()!.reject(failure);\n };\n const cleanup = () => {\n detach();\n this.off('end', onEnd);\n if (rejectOnError) {\n this.off('error', onFailure);\n }\n if (rejectOnAbort) {\n this.off('abort', onFailure);\n }\n };\n const deactivateBufferedEvent = (entry: BufferedEvent): void => {\n entry.active = false;\n if (entry.check) {\n this.#pendingBufferedEventChecks.delete(entry.check);\n entry.check = undefined;\n }\n };\n const failBufferedEvents = (discardRetained = false): OpenAIError => {\n if (discardRetained) {\n while (bufferedEventSizes.length) {\n deactivateBufferedEvent(bufferedEventSizes.dequeue()!);\n }\n pushQueue.clear();\n bufferedLedger.clear();\n }\n\n const error = new OpenAIError(\n `Event stream iterator buffer limit exceeded (${MAX_BUFFERED_ITERATOR_EVENTS} events or ${MAX_BUFFERED_ITERATOR_BYTES} bytes); consume events as they arrive.`,\n );\n try {\n this.#handleError(error);\n } finally {\n this.controller.abort();\n }\n return error;\n };\n\n const revalidateBufferedEvent = (value: T, entry: BufferedEvent): void => {\n if (!entry.active || this.#ended) {\n return;\n }\n\n const graph = inspectBufferedEventGraph(value, MAX_BUFFERED_ITERATOR_BYTES);\n if (!graph || !bufferedLedger.refresh(entry.retention, graph)) {\n failBufferedEvents(true);\n }\n };\n\n const push = (value: T) => {\n if (ended) {\n return;\n }\n const reader = readQueue.dequeue();\n if (reader) {\n reader.resolve({ value, done: false });\n } else {\n if (pushQueue.length >= MAX_BUFFERED_ITERATOR_EVENTS) {\n failBufferedEvents();\n return;\n }\n const graph = inspectBufferedEventGraph(value, MAX_BUFFERED_ITERATOR_BYTES);\n const retention = graph && bufferedLedger.retain(graph);\n if (!retention) {\n failBufferedEvents();\n return;\n }\n\n if (typeof value === 'object' && value !== null && sdkOwnedBufferedEventArguments.has(value)) {\n const argumentsTuple = value as unknown[];\n for (let index = 0; index < argumentsTuple.length; index += 1) {\n const argument = argumentsTuple[index];\n if (typeof argument === 'string') {\n argumentsTuple[index] = bufferedJSONParse(bufferedJSONStringify(argument)) as string;\n }\n }\n }\n\n const entry: BufferedEvent = { retention, active: true, check: undefined };\n pushQueue.enqueue(value);\n bufferedEventSizes.enqueue(entry);\n const check = () => {\n entry.check = undefined;\n revalidateBufferedEvent(value, entry);\n };\n entry.check = check;\n this.#pendingBufferedEventChecks.add(check);\n }\n };\n const onFailure = (error: OpenAIError) => {\n failure = error;\n if (!pushQueue.length) {\n rejectReader();\n }\n };\n // A throwing user listener registered before this iterator stops dispatch\n // before onFailure runs; adopt the failure the stream recorded during\n // settlement so terminal errors are never converted into clean completion.\n const adoptTerminalFailure = () => {\n if (failure) {\n return;\n }\n const terminal = this.#terminalFailure;\n if (!terminal) {\n return;\n }\n if (terminal.kind === 'error' ? rejectOnError : rejectOnAbort) {\n failure = terminal.error;\n }\n };\n const onEnd = () => {\n ended = true;\n adoptTerminalFailure();\n cleanup();\n if (!pushQueue.length) {\n rejectReader();\n finishReaders();\n }\n };\n\n if (!ended) {\n detach = attach(push);\n this.on('end', onEnd);\n if (rejectOnError) {\n this.on('error', onFailure);\n }\n if (rejectOnAbort) {\n this.on('abort', onFailure);\n }\n }\n\n return {\n next: (): Promise<Result> => {\n if (pushQueue.length) {\n const value = pushQueue.dequeue()!;\n const entry = bufferedEventSizes.dequeue()!;\n deactivateBufferedEvent(entry);\n const graph = inspectBufferedEventGraph(value, MAX_BUFFERED_ITERATOR_BYTES);\n if (!graph || !bufferedLedger.refresh(entry.retention, graph)) {\n const error = failBufferedEvents(true);\n failureDelivered = true;\n return Promise.reject(error);\n }\n bufferedLedger.release(entry.retention);\n return Promise.resolve({ value, done: false });\n }\n\n if (ended || this.ended) {\n adoptTerminalFailure();\n }\n if (failure && !failureDelivered) {\n failureDelivered = true;\n return Promise.reject(failure);\n }\n\n if (ended) {\n return Promise.resolve(doneResult());\n }\n\n return new Promise<Result>((resolve, reject) => {\n readQueue.enqueue({ resolve, reject });\n });\n },\n return: () => {\n ended = true;\n // The consumer walked away; terminal failures recorded later must not\n // resurface through this iterator.\n failureDelivered = true;\n while (bufferedEventSizes.length) {\n deactivateBufferedEvent(bufferedEventSizes.dequeue()!);\n }\n pushQueue.clear();\n bufferedLedger.clear();\n cleanup();\n finishReaders();\n if (onReturn) {\n // The consumer explicitly ended iteration, so any failure the\n // onReturn callback triggers (e.g. aborting the stream) is\n // self-inflicted; mark the stream's terminal promise as handled so\n // it does not surface as an unhandled rejection.\n void this.done().catch(() => undefined);\n onReturn();\n }\n return Promise.resolve(doneResult());\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n\n /** Resolves when the stream ends successfully or rejects when it fails or is aborted. */\n async done(): Promise<void> {\n this.#catchingPromiseCreated = true;\n await this.#endPromise;\n }\n\n #handleError(this: EventStream<EventTypes>, error: unknown) {\n this.#errored = true;\n if (error instanceof Error && error.name === 'AbortError') {\n error = new APIUserAbortError();\n }\n if (error instanceof APIUserAbortError) {\n this.#aborted = true;\n return this._emit('abort', error);\n }\n if (error instanceof OpenAIError) {\n return this._emit('error', error);\n }\n if (error instanceof Error) {\n const openAIError: OpenAIError = new OpenAIError(error.message);\n // @ts-ignore\n openAIError.cause = error;\n return this._emit('error', openAIError);\n }\n return this._emit('error', new OpenAIError(String(error)));\n }\n\n /** Returns whether an event currently has one or more registered listeners. */\n protected _hasListeners<Event extends keyof EventTypes>(event: Event): boolean {\n return Boolean(this.#listeners[event]?.some((listener) => !listener.removed));\n }\n\n #settleTerminalEvent<Event extends keyof EventTypes>(\n event: Event,\n args: EventParameters<EventTypes, Event>,\n hasListeners: boolean,\n ): void {\n if (event === 'abort') {\n const error = args[0] as APIUserAbortError;\n this.#terminalFailure ??= { kind: 'abort', error };\n if (!this.#catchingPromiseCreated && !hasListeners) {\n Promise.reject(error);\n }\n this.#rejectConnectedPromise(error);\n this.#rejectEndPromise(error);\n this._emit('end');\n return;\n }\n\n if (event === 'error') {\n // NOTE: _emit('error', error) should only be called from #handleError().\n\n const error = args[0] as OpenAIError;\n this.#terminalFailure ??= { kind: 'error', error };\n if (!this.#catchingPromiseCreated && !hasListeners) {\n // Trigger an unhandled rejection if the user hasn't registered any error handlers.\n // If you are seeing stack traces here, make sure to handle errors via either:\n // - runner.on('error', () => ...)\n // - await runner.done()\n // - await runner.finalChatCompletion()\n // - etc.\n Promise.reject(error);\n }\n this.#rejectConnectedPromise(error);\n this.#rejectEndPromise(error);\n this._emit('end');\n }\n }\n\n /** Dispatches a connection, failure, cancellation, or completion lifecycle event. */\n _emit<Event extends keyof BaseEvents>(event: Event, ...args: EventParameters<BaseEvents, Event>): void;\n /** Dispatches a typed stream event to all listeners registered for that event. */\n _emit<Event extends keyof EventTypes>(event: Event, ...args: EventParameters<EventTypes, Event>): void;\n /** Dispatches a stream event and performs the associated lifecycle transitions. */\n _emit<Event extends keyof EventTypes>(\n this: EventStream<EventTypes>,\n event: Event,\n ...args: EventParameters<EventTypes, Event>\n ) {\n // make sure we don't emit any events after end\n if (this.#ended) {\n return;\n }\n\n if (event === 'end') {\n this.#removeAbortListeners();\n this.#ended = true;\n this.#resolveEndPromise();\n }\n\n const listeners: EventListeners<EventTypes, Event> | undefined = this.#listeners[event];\n let dispatchError: unknown;\n let dispatchThrew = false;\n try {\n if (listeners) {\n this.#listeners[event] = listeners.filter((listener) => {\n if (listener.once) {\n listener.detached = true;\n }\n return !listener.once && !listener.removed;\n }) as any;\n this.#listenerDispatchDepth += 1;\n try {\n for (const registration of listeners as any) {\n if (!registration.removed) {\n const { listener } = registration;\n listener(...(args as any));\n }\n }\n } finally {\n this.#listenerDispatchDepth -= 1;\n if (this.#listenerDispatchDepth === 0) {\n this.#cleanupEmittedListeners();\n for (const check of this.#pendingBufferedEventChecks) {\n this.#pendingBufferedEventChecks.delete(check);\n if (!this.#ended) {\n check();\n }\n }\n }\n }\n }\n } catch (error) {\n dispatchError = error;\n dispatchThrew = true;\n }\n\n try {\n this.#settleTerminalEvent(event, args, Boolean(listeners?.length));\n } catch (error) {\n if (!dispatchThrew) {\n dispatchError = error;\n dispatchThrew = true;\n }\n }\n\n if (dispatchThrew) {\n throw dispatchError;\n }\n }\n\n // oxlint-disable-next-line class-methods-use-this -- Subclasses override this instance hook.\n protected _emitFinal(): void {\n // Hook for subclasses.\n }\n}\n\n/** The listener callback associated with one event name in a stream event map. */\ntype EventListener<Events, EventType extends keyof Events> = Events[EventType];\n\ntype EventListeners<Events, EventType extends keyof Events> = {\n listener: EventListener<Events, EventType>;\n once?: boolean;\n removed?: boolean;\n detached?: boolean;\n}[];\n\n/** The positional listener arguments associated with a named event. */\nexport type EventParameters<Events, EventType extends keyof Events> = Record<\n EventType,\n EventListener<Events, EventType> extends (...args: infer P) => any ? P : never\n>[EventType];\n\n/** Lifecycle events shared by all SDK streaming helpers. */\nexport interface BaseEvents {\n /** Called when the underlying request or readable stream is ready to produce events. */\n connect: () => void;\n /** Called when the stream fails for a reason other than user cancellation. */\n error: (error: OpenAIError) => void;\n /** Called when the underlying request is cancelled. */\n abort: (error: APIUserAbortError) => void;\n /** Called after a successful completion, failure, or cancellation. */\n end: () => void;\n}\n","import { OpenAIError } from '../../core/error';\n\n// https://url.spec.whatwg.org/#url-scheme-string\nconst startsWithSchemeRegexp = /^[a-z][a-z0-9+.-]*:/i;\n\nexport const isAbsoluteURL = (url: string): boolean => {\n return startsWithSchemeRegexp.test(url);\n};\n\nexport let isArray = (val: unknown): val is unknown[] => ((isArray = Array.isArray), isArray(val));\nexport let isReadonlyArray = isArray as (val: unknown) => val is readonly unknown[];\n\n/** Returns an object if the given value isn't an object, otherwise returns as-is */\nexport function maybeObj(x: unknown): object {\n if (typeof x !== 'object') {\n return {};\n }\n\n return x ?? {};\n}\n\n// https://stackoverflow.com/a/34491287\nexport function isEmptyObj(obj: Object | null | undefined): boolean {\n if (!obj) return true;\n for (const _k in obj) return false;\n return true;\n}\n\n// https://eslint.org/docs/latest/rules/no-prototype-builtins\nexport function hasOwn<T extends object = object>(obj: T, key: PropertyKey): key is keyof T {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexport function isObj(obj: unknown): obj is Record<string, unknown> {\n return obj != null && typeof obj === 'object' && !Array.isArray(obj);\n}\n\nexport const ensurePresent = <T>(value: T | null | undefined): T => {\n if (value == null) {\n throw new OpenAIError(`Expected a value to be given but received ${value} instead.`);\n }\n\n return value;\n};\n\nexport const validatePositiveInteger = (name: string, n: unknown): number => {\n if (typeof n !== 'number' || !Number.isInteger(n)) {\n throw new OpenAIError(`${name} must be an integer`);\n }\n if (n < 0) {\n throw new OpenAIError(`${name} must be a positive integer`);\n }\n return n;\n};\n\nexport const coerceInteger = (value: unknown): number => {\n if (typeof value === 'number') return Math.round(value);\n if (typeof value === 'string') return parseInt(value, 10);\n\n throw new OpenAIError(`Could not coerce ${value} (type: ${typeof value}) into a number`);\n};\n\nexport const coerceFloat = (value: unknown): number => {\n if (typeof value === 'number') return value;\n if (typeof value === 'string') return parseFloat(value);\n\n throw new OpenAIError(`Could not coerce ${value} (type: ${typeof value}) into a number`);\n};\n\nexport const coerceBoolean = (value: unknown): boolean => {\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') return value === 'true';\n return Boolean(value);\n};\n\nexport const maybeCoerceInteger = (value: unknown): number | undefined => {\n if (value == null) {\n return undefined;\n }\n return coerceInteger(value);\n};\n\nexport const maybeCoerceFloat = (value: unknown): number | undefined => {\n if (value == null) {\n return undefined;\n }\n return coerceFloat(value);\n};\n\nexport const maybeCoerceBoolean = (value: unknown): boolean | undefined => {\n if (value == null) {\n return undefined;\n }\n return coerceBoolean(value);\n};\n\nexport const safeJSON = (text: string) => {\n try {\n return JSON.parse(text);\n } catch (err) {\n return undefined;\n }\n};\n","/** Copies byte arrays into one contiguous `Uint8Array` while preserving their order. */\nexport function concatBytes(buffers: Uint8Array[]): Uint8Array {\n let length = 0;\n for (const buffer of buffers) {\n length += buffer.length;\n }\n const output = new Uint8Array(length);\n let index = 0;\n for (const buffer of buffers) {\n output.set(buffer, index);\n index += buffer.length;\n }\n\n return output;\n}\n\nlet encodeUTF8_: (str: string) => Uint8Array;\n\n/** Encodes text as UTF-8 bytes, reusing the platform encoder after its first call. */\nexport function encodeUTF8(str: string) {\n let encoder;\n return (\n encodeUTF8_ ??\n ((encoder = new (globalThis as any).TextEncoder()), (encodeUTF8_ = encoder.encode.bind(encoder)))\n )(str);\n}\n\nlet decodeUTF8_: (bytes: Uint8Array) => string;\n\n/** Decodes UTF-8 bytes as text, reusing the platform decoder after its first call. */\nexport function decodeUTF8(bytes: Uint8Array) {\n let decoder;\n return (\n decodeUTF8_ ??\n ((decoder = new (globalThis as any).TextDecoder()), (decodeUTF8_ = decoder.decode.bind(decoder)))\n )(bytes);\n}\n","import { hasOwn } from './values';\nimport { type OpenAI } from '../../client';\nimport { RequestOptions } from '../request-options';\n\ntype LogFn = (message: string, ...rest: unknown[]) => void;\nexport type Logger = {\n error: LogFn;\n warn: LogFn;\n info: LogFn;\n debug: LogFn;\n};\nexport type LogLevel = 'off' | 'error' | 'warn' | 'info' | 'debug';\n\nconst levelNumbers = {\n off: 0,\n error: 200,\n warn: 300,\n info: 400,\n debug: 500,\n};\n\nexport const parseLogLevel = (\n maybeLevel: string | undefined,\n sourceName: string,\n client: OpenAI,\n): LogLevel | undefined => {\n if (!maybeLevel) {\n return undefined;\n }\n if (hasOwn(levelNumbers, maybeLevel)) {\n return maybeLevel;\n }\n loggerFor(client).warn(\n `${sourceName} was set to ${JSON.stringify(maybeLevel)}, expected one of ${JSON.stringify(\n Object.keys(levelNumbers),\n )}`,\n );\n return undefined;\n};\n\nfunction noop() {}\n\nfunction makeLogFn(fnLevel: keyof Logger, logger: Logger | undefined, logLevel: LogLevel) {\n if (!logger || levelNumbers[fnLevel] > levelNumbers[logLevel]) {\n return noop;\n } else {\n // Don't wrap logger functions, we want the stacktrace intact!\n return logger[fnLevel].bind(logger);\n }\n}\n\nconst noopLogger = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n};\n\nlet cachedLoggers = /* @__PURE__ */ new WeakMap<Logger, [LogLevel, Logger]>();\n\nexport function loggerFor(client: OpenAI): Logger {\n const logger = client.logger;\n const logLevel = client.logLevel ?? 'off';\n if (!logger) {\n return noopLogger;\n }\n\n const cachedLogger = cachedLoggers.get(logger);\n if (cachedLogger && cachedLogger[0] === logLevel) {\n return cachedLogger[1];\n }\n\n const levelLogger = {\n error: makeLogFn('error', logger, logLevel),\n warn: makeLogFn('warn', logger, logLevel),\n info: makeLogFn('info', logger, logLevel),\n debug: makeLogFn('debug', logger, logLevel),\n };\n\n cachedLoggers.set(logger, [logLevel, levelLogger]);\n\n return levelLogger;\n}\n\nconst sensitiveQueryNames = new Set([\n 'apikey',\n 'accesstoken',\n 'refreshtoken',\n 'sessiontoken',\n 'sessionid',\n 'idtoken',\n 'authtoken',\n 'authorization',\n 'token',\n 'password',\n 'clientsecret',\n 'xamzsecuritytoken',\n 'xamzsignature',\n 'xamzcredential',\n]);\n\n/** Recognizes credential-bearing query names across ordinary and provider authentication. */\nexport function isSensitiveQueryParameter(name: string): boolean {\n const normalized = name.toLowerCase().replace(/[-_]/gu, '');\n return sensitiveQueryNames.has(normalized) || sensitiveQueryNames.has(normalized.replace(/^x/u, ''));\n}\n\nconst sensitiveHeaderNames = new Set([\n 'authorization',\n 'proxy-authorization',\n 'api-key',\n 'x-api-key',\n 'x-amz-security-token',\n 'cookie',\n 'set-cookie',\n 'x-session-token',\n 'x-session-id',\n 'x-auth-token',\n 'x-id-token',\n]);\n\n/** Recognizes credential-bearing request headers across provider and workload authentication. */\nexport function isSensitiveHeader(name: string): boolean {\n return sensitiveHeaderNames.has(name.toLowerCase().replace(/_/gu, '-')) || isSensitiveQueryParameter(name);\n}\n\n/** Removes credential-valued query parameters before a request URL reaches any logger. */\nexport function redactURL(value: string): string {\n const url = new URL(value);\n url.username = '';\n url.password = '';\n url.hash = '';\n for (const name of url.searchParams.keys()) {\n if (isSensitiveQueryParameter(name)) {\n url.searchParams.set(name, '***');\n }\n }\n return url.href;\n}\n\nexport const formatRequestDetails = (details: {\n options?: RequestOptions | undefined;\n headers?: Headers | Record<string, string> | undefined;\n retryOfRequestLogID?: string | undefined;\n retryOf?: string | undefined;\n url?: string | undefined;\n status?: number | undefined;\n method?: string | undefined;\n durationMs?: number | undefined;\n message?: unknown;\n body?: unknown;\n}) => {\n if (details.options) {\n details.options = { ...details.options };\n delete details.options['headers']; // redundant + leaks internals\n if (details.options.path) {\n const path = details.options.path;\n const redacted = new URL(redactURL(new URL(path, 'https://redacted.invalid').href));\n details.options.path =\n redacted.origin === 'https://redacted.invalid'\n ? `${path.startsWith('/') ? '/' : ''}${redacted.pathname.slice(1)}${redacted.search}`\n : redacted.href;\n }\n if (details.options.query) {\n details.options.query = Object.fromEntries(\n Object.entries(details.options.query).map(([name, value]) => [\n name,\n isSensitiveQueryParameter(name) ? '***' : value,\n ]),\n );\n }\n }\n if (details.url) {\n details.url = redactURL(details.url);\n }\n if (details.headers) {\n details.headers = Object.fromEntries(\n (details.headers instanceof Headers ? [...details.headers] : Object.entries(details.headers)).map(\n ([name, value]) => [name, isSensitiveHeader(name) ? '***' : value],\n ),\n );\n }\n if ('retryOfRequestLogID' in details) {\n if (details.retryOfRequestLogID) {\n details.retryOf = details.retryOfRequestLogID;\n }\n delete details.retryOfRequestLogID;\n }\n return details;\n};\n","/**\n * Stores output text lengths in a complete binary segment tree.\n *\n * Leaves begin at `capacity`; each parent contains the sum of its children.\n * Rebuilding when capacity doubles preserves every existing contribution and\n * makes growth linear in the total number of appended outputs.\n */\nexport class OutputTextIndex {\n private capacity = 1;\n private values: number[] = [0, 0];\n private size = 0;\n\n get length(): number {\n return this.size;\n }\n\n append(value: number): void {\n if (this.size === this.capacity) {\n this.grow();\n }\n\n const index = this.size;\n this.size += 1;\n this.update(index, value);\n }\n\n update(index: number, value: number): void {\n if (!Number.isSafeInteger(index) || index < 0 || index >= this.size) {\n throw new RangeError(`missing output at index ${index}`);\n }\n\n let node = this.capacity + index;\n const difference = value - (this.values[node] ?? 0);\n if (difference === 0) {\n return;\n }\n\n while (node >= 1) {\n this.values[node] = (this.values[node] ?? 0) + difference;\n node = Math.floor(node / 2);\n }\n }\n\n prefixSum(end: number): number {\n if (!Number.isSafeInteger(end) || end < 0 || end > this.size) {\n throw new RangeError(`missing output at index ${end}`);\n }\n\n let start = this.capacity;\n let stop = this.capacity + end;\n let sum = 0;\n\n while (start < stop) {\n if (start % 2 === 1) {\n sum += this.values[start] ?? 0;\n start += 1;\n }\n if (stop % 2 === 1) {\n stop -= 1;\n sum += this.values[stop] ?? 0;\n }\n start = Math.floor(start / 2);\n stop = Math.floor(stop / 2);\n }\n\n return sum;\n }\n\n private grow(): void {\n const previousCapacity = this.capacity;\n this.capacity *= 2;\n const values = Array.from({ length: this.capacity * 2 }, () => 0);\n\n for (let index = 0; index < this.size; index += 1) {\n values[this.capacity + index] = this.values[previousCapacity + index] ?? 0;\n }\n\n for (let index = this.capacity - 1; index > 0; index -= 1) {\n values[index] = (values[index * 2] ?? 0) + (values[index * 2 + 1] ?? 0);\n }\n\n this.values = values;\n }\n}\n","import type { Response } from '../../resources/responses/responses';\nimport { OutputTextIndex } from './output-text-index';\n\ntype ResponseOutput = Response['output'][number];\n\nexport interface ResponseAccumulatorContext {\n canonicalSnapshot: Response | undefined;\n outputTextLengths: WeakMap<ResponseOutput, number>;\n outputTextIndex: OutputTextIndex;\n}\n\nexport function createCanonicalResponseContext(): ResponseAccumulatorContext {\n return {\n canonicalSnapshot: undefined,\n outputTextLengths: new WeakMap(),\n outputTextIndex: new OutputTextIndex(),\n };\n}\n\nexport function getOutputText(context: ResponseAccumulatorContext, output: ResponseOutput): string {\n if (output.type !== 'message') {\n return '';\n }\n\n let text = '';\n for (const content of output.content) {\n if (content.type === 'output_text') {\n text += content.text;\n }\n }\n context.outputTextLengths.set(output, text.length);\n return text;\n}\n\nexport function ensureCanonicalOutputText(context: ResponseAccumulatorContext, snapshot: Response): void {\n if (context.canonicalSnapshot === snapshot) {\n return;\n }\n\n const outputTextIndex = new OutputTextIndex();\n let text = '';\n for (const output of snapshot.output) {\n const outputText = getOutputText(context, output);\n text += outputText;\n outputTextIndex.append(outputText.length);\n }\n // Comparing independently accumulated strings can scan all preceding text on\n // every delta. The recount is authoritative, so assign it without comparing.\n snapshot.output_text = text;\n context.outputTextIndex = outputTextIndex;\n context.canonicalSnapshot = snapshot;\n}\n\nexport function cloneResponse(context: ResponseAccumulatorContext, response: Response): Response {\n context.canonicalSnapshot = undefined;\n context.outputTextLengths = new WeakMap();\n context.outputTextIndex = new OutputTextIndex();\n const snapshot = structuredClone(response);\n if (\n !Object.getOwnPropertyDescriptor(snapshot, 'output_text') ||\n snapshot.output_text === null ||\n snapshot.output_text === undefined\n ) {\n ensureCanonicalOutputText(context, snapshot);\n } else if (snapshot.output.length === 0 && snapshot.output_text === '') {\n context.canonicalSnapshot = snapshot;\n }\n return snapshot;\n}\n\nexport function updateCachedOutputTextLength(\n context: ResponseAccumulatorContext,\n output: ResponseOutput,\n outputIndex: number,\n previousText: string,\n nextText: string,\n): void {\n const length = context.outputTextLengths.get(output);\n if (length !== undefined) {\n const nextLength = length - previousText.length + nextText.length;\n context.outputTextLengths.set(output, nextLength);\n context.outputTextIndex.update(outputIndex, nextLength);\n }\n}\n\nfunction replaceOutputTextSuffix(snapshot: Response, previousText: string, nextText: string): void {\n if (previousText.length === 0) {\n snapshot.output_text += nextText;\n return;\n }\n\n snapshot.output_text =\n snapshot.output_text.slice(0, snapshot.output_text.length - previousText.length) + nextText;\n}\n\nfunction getPrecedingContentTextLength(\n context: ResponseAccumulatorContext,\n output: ResponseOutput | undefined,\n contentIndex: number | undefined,\n nextText: string,\n): number {\n if (contentIndex === undefined || output?.type !== 'message') {\n return 0;\n }\n\n if (contentIndex < output.content.length - contentIndex - 1) {\n let precedingContentLength = 0;\n for (let index = 0; index < contentIndex; index += 1) {\n const precedingContent = output.content[index];\n if (precedingContent?.type === 'output_text') {\n precedingContentLength += precedingContent.text.length;\n }\n }\n return precedingContentLength;\n }\n\n let followingContentLength = 0;\n for (let index = contentIndex + 1; index < output.content.length; index += 1) {\n const followingContent = output.content[index];\n if (followingContent?.type === 'output_text') {\n followingContentLength += followingContent.text.length;\n }\n }\n const outputTextLength = context.outputTextLengths.get(output) ?? getOutputText(context, output).length;\n return outputTextLength - followingContentLength - nextText.length;\n}\n\nexport function updateOutputText(\n context: ResponseAccumulatorContext,\n snapshot: Response,\n outputIndex: number,\n previousText: string,\n nextText: string,\n contentIndex?: number,\n): void {\n if (previousText === nextText) {\n return;\n }\n\n const output = snapshot.output[outputIndex];\n if (\n outputIndex === snapshot.output.length - 1 &&\n (contentIndex === undefined || (output?.type === 'message' && contentIndex === output.content.length - 1))\n ) {\n replaceOutputTextSuffix(snapshot, previousText, nextText);\n return;\n }\n\n const precedingContentLength = getPrecedingContentTextLength(context, output, contentIndex, nextText);\n const offset = context.outputTextIndex.prefixSum(outputIndex) + precedingContentLength;\n if (offset + previousText.length === snapshot.output_text.length) {\n replaceOutputTextSuffix(snapshot, previousText, nextText);\n return;\n }\n\n snapshot.output_text =\n snapshot.output_text.slice(0, offset) +\n nextText +\n snapshot.output_text.slice(offset + previousText.length);\n}\n","import type { Response, ResponseOutputText, ResponseStreamEvent } from '../../resources/responses/responses';\nimport type { ResponseAccumulatorContext } from './canonical-output-text';\nimport { OpenAIError } from '../../error';\nimport { hasOwn } from '../utils';\nimport {\n cloneResponse,\n createCanonicalResponseContext,\n ensureCanonicalOutputText,\n getOutputText,\n updateCachedOutputTextLength,\n updateOutputText,\n} from './canonical-output-text';\n\ninterface ResponseKeepAliveEvent {\n type: 'keepalive';\n sequence_number: number;\n}\n\ntype ResponseAccumulatorEvent = ResponseStreamEvent | ResponseKeepAliveEvent;\ntype ResponseItemScopedEvent = Extract<ResponseAccumulatorEvent, { item_id: string; output_index: number }>;\ntype ResponseOutputItemEvent = Extract<\n ResponseAccumulatorEvent,\n { type: 'response.output_item.added' | 'response.output_item.done' }\n>;\ntype ResponseContentPartAddedEvent = Extract<\n ResponseAccumulatorEvent,\n { type: 'response.content_part.added' }\n>;\ntype ResponseContentPartDoneEvent = Extract<ResponseAccumulatorEvent, { type: 'response.content_part.done' }>;\ntype ResponseOutputTextEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.output_text.delta'\n | 'response.output_text.done'\n | 'response.output_text.annotation.added';\n }\n>;\ntype ResponseRefusalAndArgumentsEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.refusal.delta'\n | 'response.refusal.done'\n | 'response.function_call_arguments.delta'\n | 'response.function_call_arguments.done'\n | 'response.custom_tool_call_input.delta'\n | 'response.custom_tool_call_input.done'\n | 'response.mcp_call_arguments.delta'\n | 'response.mcp_call_arguments.done';\n }\n>;\ntype ResponseShellEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.shell_call_command.added'\n | 'response.shell_call_command.delta'\n | 'response.shell_call_command.done'\n | 'response.shell_call_output_content.delta'\n | 'response.shell_call_output_content.done';\n }\n>;\ntype ResponseReasoningEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.reasoning_text.delta'\n | 'response.reasoning_text.done'\n | 'response.reasoning_summary_part.added'\n | 'response.reasoning_summary_part.done'\n | 'response.reasoning_summary_text.delta'\n | 'response.reasoning_summary_text.done';\n }\n>;\ntype ResponseCodeInterpreterEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.code_interpreter_call_code.delta'\n | 'response.code_interpreter_call_code.done'\n | 'response.code_interpreter_call.in_progress'\n | 'response.code_interpreter_call.interpreting'\n | 'response.code_interpreter_call.completed';\n }\n>;\ntype ResponseSearchStatusEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.file_search_call.in_progress'\n | 'response.file_search_call.searching'\n | 'response.file_search_call.completed'\n | 'response.web_search_call.in_progress'\n | 'response.web_search_call.searching'\n | 'response.web_search_call.completed';\n }\n>;\ntype ResponseImageAndMcpStatusEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.image_generation_call.in_progress'\n | 'response.image_generation_call.generating'\n | 'response.image_generation_call.completed'\n | 'response.mcp_call.in_progress'\n | 'response.mcp_call.completed'\n | 'response.mcp_call.failed';\n }\n>;\ntype ResponseLifecycleEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.created'\n | 'response.queued'\n | 'response.in_progress'\n | 'response.completed'\n | 'response.failed'\n | 'response.incomplete';\n }\n>;\ntype ResponseIgnoredEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.audio.delta'\n | 'response.audio.done'\n | 'response.audio.transcript.delta'\n | 'response.audio.transcript.done'\n | 'response.image_generation_call.partial_image'\n | 'response.mcp_list_tools.in_progress'\n | 'response.mcp_list_tools.completed'\n | 'response.mcp_list_tools.failed'\n | 'keepalive'\n | 'error';\n }\n>;\n\ninterface ResponseOutputIdentityIndex {\n snapshot: Response;\n output: Response['output'];\n length: number;\n identities: Set<string>;\n}\n\nconst responseOutputIdentityIndexes = new WeakMap<ResponseAccumulatorContext, ResponseOutputIdentityIndex>();\n\nfunction validateArrayIndex(\n collection: readonly unknown[],\n index: number,\n kind: 'output' | 'content' | 'annotation' | 'command',\n allowAppend = false,\n): void {\n if (\n !Array.isArray(collection) ||\n !Number.isSafeInteger(index) ||\n index < 0 ||\n index > collection.length ||\n (index === collection.length ? !allowAppend || index in collection : !hasOwn(collection, index))\n ) {\n throw new OpenAIError(`missing ${kind} at index ${index}`);\n }\n}\n\nfunction validateArrayAppend(\n collection: readonly unknown[],\n index: number,\n kind: 'output' | 'content',\n): void {\n if (index !== collection.length) {\n throw new OpenAIError(`missing ${kind} at index ${index}`);\n }\n validateArrayIndex(collection, index, kind, true);\n}\n\nfunction getOutput(snapshot: Response, outputIndex: number): Response['output'][number] {\n validateArrayIndex(snapshot.output, outputIndex, 'output');\n const output = snapshot.output[outputIndex];\n if (!output) {\n throw new OpenAIError(`missing output at index ${outputIndex}`);\n }\n return output;\n}\n\nfunction hasRoutedOutputCallIdentity(\n output: Response['output'][number],\n): output is Extract<\n Response['output'][number],\n { type: 'function_call' | 'custom_tool_call' | 'shell_call' | 'shell_call_output' }\n> {\n return (\n output.type === 'function_call' ||\n output.type === 'custom_tool_call' ||\n output.type === 'shell_call' ||\n output.type === 'shell_call_output'\n );\n}\n\nfunction getOutputItemIdentityKeys(output: Response['output'][number], eventType: string): string[] {\n if (!hasOwn(output, 'type') || typeof output.type !== 'string') {\n throw new OpenAIError(`expected an own output item type for ${eventType}`);\n }\n\n const optionalPlatformID = output.type === 'function_call' || output.type === 'custom_tool_call';\n const identities: string[] = [];\n\n if (hasOwn(output, 'id')) {\n if (typeof output.id !== 'string' || output.id.length === 0) {\n throw new OpenAIError(`expected a non-empty output item id for ${eventType}`);\n }\n identities.push(`id:${output.id}`);\n } else if (!optionalPlatformID) {\n throw new OpenAIError(`expected a non-empty output item id for ${eventType}`);\n }\n\n if (hasRoutedOutputCallIdentity(output)) {\n if (!hasOwn(output, 'call_id') || typeof output.call_id !== 'string' || output.call_id.length === 0) {\n throw new OpenAIError(`expected a non-empty output item call_id for ${eventType}`);\n }\n identities.push(`call:${output.type}:${output.call_id}`);\n }\n\n return identities;\n}\n\nfunction assertOutputItemIdentitiesAvailable(identities: Set<string>, keys: readonly string[]): void {\n for (const key of keys) {\n if (identities.has(key)) {\n throw new OpenAIError(`duplicate output item identity '${key}'`);\n }\n }\n}\n\nfunction addOutputItemIdentities(identities: Set<string>, keys: readonly string[]): void {\n assertOutputItemIdentitiesAvailable(identities, keys);\n for (const key of keys) {\n identities.add(key);\n }\n}\n\nfunction createResponseOutputIdentityIndex(snapshot: Response): ResponseOutputIdentityIndex {\n const identityIndex: ResponseOutputIdentityIndex = {\n snapshot,\n output: snapshot.output,\n length: snapshot.output.length,\n identities: new Set(),\n };\n\n for (let index = 0; index < snapshot.output.length; index += 1) {\n const output = getOutput(snapshot, index);\n addOutputItemIdentities(identityIndex.identities, getOutputItemIdentityKeys(output, 'response snapshot'));\n }\n\n return identityIndex;\n}\n\nfunction getResponseOutputIdentityIndex(\n context: ResponseAccumulatorContext,\n snapshot: Response,\n): ResponseOutputIdentityIndex {\n const cached = responseOutputIdentityIndexes.get(context);\n if (\n cached &&\n cached.snapshot === snapshot &&\n cached.output === snapshot.output &&\n cached.length === snapshot.output.length\n ) {\n return cached;\n }\n\n const identityIndex = createResponseOutputIdentityIndex(snapshot);\n responseOutputIdentityIndexes.set(context, identityIndex);\n return identityIndex;\n}\n\nfunction cloneValidatedResponse(context: ResponseAccumulatorContext, response: Response): Response {\n const nextContext = createCanonicalResponseContext();\n const snapshot = cloneResponse(nextContext, response);\n const identityIndex = createResponseOutputIdentityIndex(snapshot);\n\n context.canonicalSnapshot = nextContext.canonicalSnapshot;\n context.outputTextLengths = nextContext.outputTextLengths;\n context.outputTextIndex = nextContext.outputTextIndex;\n responseOutputIdentityIndexes.set(context, identityIndex);\n\n return snapshot;\n}\n\nconst expectedOutputItemTypes = {\n 'response.output_text.delta': 'message',\n 'response.output_text.done': 'message',\n 'response.output_text.annotation.added': 'message',\n 'response.refusal.delta': 'message',\n 'response.refusal.done': 'message',\n 'response.function_call_arguments.delta': 'function_call',\n 'response.function_call_arguments.done': 'function_call',\n 'response.custom_tool_call_input.delta': 'custom_tool_call',\n 'response.custom_tool_call_input.done': 'custom_tool_call',\n 'response.mcp_call_arguments.delta': 'mcp_call',\n 'response.mcp_call_arguments.done': 'mcp_call',\n 'response.mcp_call.in_progress': 'mcp_call',\n 'response.mcp_call.completed': 'mcp_call',\n 'response.mcp_call.failed': 'mcp_call',\n 'response.shell_call_output_content.delta': 'shell_call_output',\n 'response.shell_call_output_content.done': 'shell_call_output',\n 'response.reasoning_text.delta': 'reasoning',\n 'response.reasoning_text.done': 'reasoning',\n 'response.reasoning_summary_part.added': 'reasoning',\n 'response.reasoning_summary_part.done': 'reasoning',\n 'response.reasoning_summary_text.delta': 'reasoning',\n 'response.reasoning_summary_text.done': 'reasoning',\n 'response.code_interpreter_call_code.delta': 'code_interpreter_call',\n 'response.code_interpreter_call_code.done': 'code_interpreter_call',\n 'response.code_interpreter_call.in_progress': 'code_interpreter_call',\n 'response.code_interpreter_call.interpreting': 'code_interpreter_call',\n 'response.code_interpreter_call.completed': 'code_interpreter_call',\n 'response.file_search_call.in_progress': 'file_search_call',\n 'response.file_search_call.searching': 'file_search_call',\n 'response.file_search_call.completed': 'file_search_call',\n 'response.web_search_call.in_progress': 'web_search_call',\n 'response.web_search_call.searching': 'web_search_call',\n 'response.web_search_call.completed': 'web_search_call',\n 'response.image_generation_call.in_progress': 'image_generation_call',\n 'response.image_generation_call.generating': 'image_generation_call',\n 'response.image_generation_call.completed': 'image_generation_call',\n 'response.image_generation_call.partial_image': 'image_generation_call',\n 'response.mcp_list_tools.in_progress': 'mcp_list_tools',\n 'response.mcp_list_tools.completed': 'mcp_list_tools',\n 'response.mcp_list_tools.failed': 'mcp_list_tools',\n} satisfies Record<\n Exclude<ResponseItemScopedEvent['type'], 'response.content_part.added' | 'response.content_part.done'>,\n Response['output'][number]['type']\n>;\n\nfunction getExpectedOutputItemType(event: ResponseItemScopedEvent): Response['output'][number]['type'] {\n if (event.type === 'response.content_part.added' || event.type === 'response.content_part.done') {\n return event.part.type === 'reasoning_text' ? 'reasoning' : 'message';\n }\n\n return expectedOutputItemTypes[event.type];\n}\n\nfunction validateCompletedOutputItemIdentity(\n event: Extract<ResponseOutputItemEvent, { type: 'response.output_item.done' }>,\n snapshot: Response,\n): void {\n const output = getOutput(snapshot, event.output_index);\n const replacement = event.item;\n getOutputItemIdentityKeys(output, event.type);\n getOutputItemIdentityKeys(replacement, event.type);\n\n if (!hasOwn(replacement, 'type') || output.type !== replacement.type) {\n throw new OpenAIError(`expected output item type '${output.type}', got '${replacement.type}'`);\n }\n\n const outputID = hasOwn(output, 'id') ? output.id : undefined;\n const replacementID = hasOwn(replacement, 'id') ? replacement.id : undefined;\n if (outputID !== replacementID) {\n throw new OpenAIError(`expected output item id '${outputID}', got '${replacementID}'`);\n }\n\n if (\n hasRoutedOutputCallIdentity(output) &&\n hasRoutedOutputCallIdentity(replacement) &&\n output.call_id !== replacement.call_id\n ) {\n throw new OpenAIError(`expected output item call_id '${output.call_id}', got '${replacement.call_id}'`);\n }\n}\n\nfunction validateOutputItemIdentity(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n rejectInvalidShellTargets: boolean,\n): void {\n if (event.type === 'response.output_item.done') {\n validateCompletedOutputItemIdentity(event, snapshot);\n return;\n }\n\n if (\n rejectInvalidShellTargets &&\n (event.type === 'response.shell_call_command.added' ||\n event.type === 'response.shell_call_command.delta' ||\n event.type === 'response.shell_call_command.done')\n ) {\n const output = getOutput(snapshot, event.output_index);\n if (!hasOwn(output, 'type') || output.type !== 'shell_call') {\n throw new OpenAIError(`expected output item type 'shell_call', got '${output.type}'`);\n }\n return;\n }\n\n if (\n event.type !== 'response.content_part.added' &&\n event.type !== 'response.content_part.done' &&\n !hasOwn(expectedOutputItemTypes, event.type)\n ) {\n return;\n }\n\n const itemEvent = event as ResponseItemScopedEvent;\n if (!hasOwn(event, 'item_id') || typeof itemEvent.item_id !== 'string' || itemEvent.item_id.length === 0) {\n throw new OpenAIError(`expected a non-empty item_id for ${event.type}`);\n }\n\n const output = getOutput(snapshot, itemEvent.output_index);\n const outputID = hasOwn(output, 'id') ? output.id : undefined;\n if (outputID !== itemEvent.item_id) {\n throw new OpenAIError(`expected item_id '${outputID}', got '${itemEvent.item_id}'`);\n }\n\n const expectedType = getExpectedOutputItemType(itemEvent);\n if (output.type !== expectedType) {\n throw new OpenAIError(`expected output item type '${expectedType}', got '${output.type}'`);\n }\n}\n\nfunction getContent<T>(content: T[], contentIndex: number): T {\n validateArrayIndex(content, contentIndex, 'content');\n const part = content[contentIndex];\n if (!part) {\n throw new OpenAIError(`missing content at index ${contentIndex}`);\n }\n return part;\n}\n\nfunction getShellOutputContent(\n snapshot: Response,\n output: Extract<Response['output'][number], { type: 'shell_call_output' }>,\n commandIndex: number,\n): (typeof output.output)[number] {\n const shellCall = snapshot.output.find(\n (item): item is Extract<Response['output'][number], { type: 'shell_call' }> =>\n item.type === 'shell_call' && item.call_id === output.call_id,\n );\n\n if (shellCall) {\n validateArrayIndex(shellCall.action.commands, commandIndex, 'command');\n } else {\n validateArrayIndex(output.output, commandIndex, 'content', true);\n }\n\n while (output.output.length <= commandIndex) {\n output.output.push({\n stdout: '',\n stderr: '',\n outcome: { type: 'exit', exit_code: 0 },\n });\n }\n\n return getContent(output.output, commandIndex);\n}\n\nfunction createSupportedResponseEventTypes<EventTypes extends readonly ResponseAccumulatorEvent['type'][]>(\n eventTypes: EventTypes &\n (Exclude<ResponseAccumulatorEvent['type'], EventTypes[number]> extends never ? unknown : never),\n): ReadonlySet<ResponseAccumulatorEvent['type']> {\n return new Set(eventTypes);\n}\n\nconst supportedResponseEventTypes = createSupportedResponseEventTypes([\n 'response.output_item.added',\n 'response.output_item.done',\n 'response.content_part.added',\n 'response.content_part.done',\n 'response.output_text.delta',\n 'response.output_text.done',\n 'response.output_text.annotation.added',\n 'response.refusal.delta',\n 'response.refusal.done',\n 'response.function_call_arguments.delta',\n 'response.function_call_arguments.done',\n 'response.custom_tool_call_input.delta',\n 'response.custom_tool_call_input.done',\n 'response.mcp_call_arguments.delta',\n 'response.mcp_call_arguments.done',\n 'response.shell_call_command.added',\n 'response.shell_call_command.done',\n 'response.shell_call_command.delta',\n 'response.shell_call_output_content.delta',\n 'response.shell_call_output_content.done',\n 'response.reasoning_text.delta',\n 'response.reasoning_text.done',\n 'response.reasoning_summary_part.added',\n 'response.reasoning_summary_part.done',\n 'response.reasoning_summary_text.delta',\n 'response.reasoning_summary_text.done',\n 'response.code_interpreter_call_code.delta',\n 'response.code_interpreter_call_code.done',\n 'response.code_interpreter_call.in_progress',\n 'response.code_interpreter_call.interpreting',\n 'response.code_interpreter_call.completed',\n 'response.file_search_call.in_progress',\n 'response.file_search_call.searching',\n 'response.file_search_call.completed',\n 'response.web_search_call.in_progress',\n 'response.web_search_call.searching',\n 'response.web_search_call.completed',\n 'response.image_generation_call.in_progress',\n 'response.image_generation_call.generating',\n 'response.image_generation_call.completed',\n 'response.mcp_call.in_progress',\n 'response.mcp_call.completed',\n 'response.mcp_call.failed',\n 'response.created',\n 'response.queued',\n 'response.in_progress',\n 'response.completed',\n 'response.failed',\n 'response.incomplete',\n 'response.audio.delta',\n 'response.audio.done',\n 'response.audio.transcript.delta',\n 'response.audio.transcript.done',\n 'response.image_generation_call.partial_image',\n 'response.mcp_list_tools.in_progress',\n 'response.mcp_list_tools.completed',\n 'response.mcp_list_tools.failed',\n 'keepalive',\n 'error',\n] as const);\n\nfunction assertNever(_value: never): never {\n throw new OpenAIError('Unhandled response stream event: unknown');\n}\n\nconst responseEventRoutingFields = [\n 'item_id',\n 'output_index',\n 'content_index',\n 'annotation_index',\n 'command_index',\n 'summary_index',\n] as const;\n\nfunction sanitizeResponseEvent(event: ResponseAccumulatorEvent): ResponseAccumulatorEvent {\n let descriptor: PropertyDescriptor | undefined;\n try {\n descriptor = Object.getOwnPropertyDescriptor(event, 'type');\n } catch {\n return assertNever(event as never);\n }\n\n const type: unknown = descriptor?.value;\n if (\n typeof type !== 'string' ||\n !supportedResponseEventTypes.has(type as ResponseAccumulatorEvent['type'])\n ) {\n return assertNever(event as never);\n }\n\n const stableValues = new Map<PropertyKey, unknown>([['type', type]]);\n const itemScoped =\n type === 'response.output_item.added' ||\n type === 'response.output_item.done' ||\n type === 'response.content_part.added' ||\n type === 'response.content_part.done' ||\n type === 'response.shell_call_command.added' ||\n type === 'response.shell_call_command.delta' ||\n type === 'response.shell_call_command.done' ||\n hasOwn(expectedOutputItemTypes, type);\n\n if (itemScoped) {\n try {\n for (const field of responseEventRoutingFields) {\n const routingDescriptor = Object.getOwnPropertyDescriptor(event, field);\n stableValues.set(field, routingDescriptor ? Reflect.get(event, field, event) : undefined);\n }\n\n if (type === 'response.output_item.done') {\n stableValues.set('item', structuredClone(Reflect.get(event, 'item', event)));\n } else if (type === 'response.content_part.added' || type === 'response.content_part.done') {\n stableValues.set('part', structuredClone(Reflect.get(event, 'part', event)));\n }\n } catch {\n return assertNever(event as never);\n }\n }\n\n return new Proxy(event, {\n get(target, property) {\n return stableValues.has(property) ? stableValues.get(property) : Reflect.get(target, property, target);\n },\n });\n}\n\nfunction accumulateOutputItemEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n context: ResponseAccumulatorContext,\n): event is ResponseOutputItemEvent {\n switch (event.type) {\n case 'response.output_item.added': {\n validateArrayAppend(snapshot.output, event.output_index, 'output');\n const identityIndex = getResponseOutputIdentityIndex(context, snapshot);\n const output = structuredClone(event.item);\n const identities = getOutputItemIdentityKeys(output, event.type);\n assertOutputItemIdentitiesAvailable(identityIndex.identities, identities);\n if (output.type === 'message') {\n ensureCanonicalOutputText(context, snapshot);\n }\n snapshot.output.push(output);\n addOutputItemIdentities(identityIndex.identities, identities);\n identityIndex.length = snapshot.output.length;\n const text = getOutputText(context, output);\n if (context.canonicalSnapshot === snapshot) {\n context.outputTextIndex.append(text.length);\n }\n if (text) {\n snapshot.output_text += text;\n }\n return true;\n }\n case 'response.output_item.done': {\n const output = getOutput(snapshot, event.output_index);\n const previousText = getOutputText(context, output);\n const replacement = event.item;\n if (output.type === 'message' || replacement.type === 'message') {\n ensureCanonicalOutputText(context, snapshot);\n }\n snapshot.output[event.output_index] = replacement;\n const nextText = getOutputText(context, replacement);\n if (context.canonicalSnapshot === snapshot) {\n context.outputTextIndex.update(event.output_index, nextText.length);\n }\n updateOutputText(context, snapshot, event.output_index, previousText, nextText);\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateContentPartAddedEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n context: ResponseAccumulatorContext,\n): event is ResponseContentPartAddedEvent {\n switch (event.type) {\n case 'response.content_part.added': {\n const output = getOutput(snapshot, event.output_index);\n const { type } = output;\n const { part } = event;\n if (type === 'message' && part.type !== 'reasoning_text') {\n validateArrayAppend(output.content, event.content_index, 'content');\n const content = part;\n if (content.type === 'output_text') {\n ensureCanonicalOutputText(context, snapshot);\n }\n output.content.push(content);\n if (content.type === 'output_text') {\n updateCachedOutputTextLength(context, output, event.output_index, '', content.text);\n updateOutputText(context, snapshot, event.output_index, '', content.text, event.content_index);\n }\n } else if (type === 'reasoning' && part.type === 'reasoning_text') {\n const content = output.content ?? [];\n validateArrayAppend(content, event.content_index, 'content');\n if (!output.content) {\n output.content = content;\n }\n content.push(part);\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateContentPartDoneEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n context: ResponseAccumulatorContext,\n): event is ResponseContentPartDoneEvent {\n switch (event.type) {\n case 'response.content_part.done': {\n const output = getOutput(snapshot, event.output_index);\n const { part } = event;\n if (output.type === 'message' && part.type !== 'reasoning_text') {\n const content = getContent(output.content, event.content_index);\n const previousText = content.type === 'output_text' ? content.text : '';\n const replacement = part;\n if (content.type === 'output_text' || replacement.type === 'output_text') {\n ensureCanonicalOutputText(context, snapshot);\n }\n output.content[event.content_index] = replacement;\n const nextText = replacement.type === 'output_text' ? replacement.text : '';\n updateCachedOutputTextLength(context, output, event.output_index, previousText, nextText);\n updateOutputText(context, snapshot, event.output_index, previousText, nextText, event.content_index);\n } else if (output.type === 'reasoning' && part.type === 'reasoning_text') {\n const { content } = output;\n if (!content) {\n throw new OpenAIError(`missing content at index ${event.content_index}`);\n }\n getContent(content, event.content_index);\n content[event.content_index] = part;\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateOutputTextEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n context: ResponseAccumulatorContext,\n): event is ResponseOutputTextEvent {\n switch (event.type) {\n case 'response.output_text.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'message') {\n const content = getContent(output.content, event.content_index);\n if (content.type !== 'output_text') {\n throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);\n }\n const previousText = content.text;\n ensureCanonicalOutputText(context, snapshot);\n content.text = previousText + event.delta;\n updateCachedOutputTextLength(context, output, event.output_index, previousText, content.text);\n if (\n event.output_index === snapshot.output.length - 1 &&\n event.content_index === output.content.length - 1\n ) {\n snapshot.output_text += event.delta;\n } else {\n updateOutputText(\n context,\n snapshot,\n event.output_index,\n previousText,\n content.text,\n event.content_index,\n );\n }\n }\n return true;\n }\n case 'response.output_text.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'message') {\n const content = getContent(output.content, event.content_index);\n if (content.type !== 'output_text') {\n throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);\n }\n const previousText = content.text;\n ensureCanonicalOutputText(context, snapshot);\n content.text = event.text;\n updateCachedOutputTextLength(context, output, event.output_index, previousText, event.text);\n updateOutputText(\n context,\n snapshot,\n event.output_index,\n previousText,\n event.text,\n event.content_index,\n );\n }\n return true;\n }\n case 'response.output_text.annotation.added': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'message') {\n const content = getContent(output.content, event.content_index);\n if (content.type !== 'output_text') {\n throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);\n }\n validateArrayIndex(content.annotations, event.annotation_index, 'annotation', true);\n content.annotations[event.annotation_index] = structuredClone(\n event.annotation,\n ) as ResponseOutputText['annotations'][number];\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateRefusalAndArgumentsEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n): event is ResponseRefusalAndArgumentsEvent {\n switch (event.type) {\n case 'response.refusal.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'message') {\n const content = getContent(output.content, event.content_index);\n if (content.type !== 'refusal') {\n throw new OpenAIError(`expected content to be 'refusal', got ${content.type}`);\n }\n content.refusal += event.delta;\n }\n return true;\n }\n case 'response.refusal.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'message') {\n const content = getContent(output.content, event.content_index);\n if (content.type !== 'refusal') {\n throw new OpenAIError(`expected content to be 'refusal', got ${content.type}`);\n }\n content.refusal = event.refusal;\n }\n return true;\n }\n case 'response.function_call_arguments.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'function_call') {\n output.arguments += event.delta;\n }\n return true;\n }\n case 'response.function_call_arguments.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'function_call') {\n output.arguments = event.arguments;\n }\n return true;\n }\n case 'response.custom_tool_call_input.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'custom_tool_call') {\n output.input += event.delta;\n }\n return true;\n }\n case 'response.custom_tool_call_input.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'custom_tool_call') {\n output.input = event.input;\n }\n return true;\n }\n case 'response.mcp_call_arguments.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'mcp_call') {\n output.arguments += event.delta;\n }\n return true;\n }\n case 'response.mcp_call_arguments.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'mcp_call') {\n output.arguments = event.arguments;\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateShellEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n): event is ResponseShellEvent {\n switch (event.type) {\n case 'response.shell_call_command.added':\n case 'response.shell_call_command.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'shell_call') {\n const allowAppend = event.type === 'response.shell_call_command.added';\n validateArrayIndex(output.action.commands, event.command_index, 'command', allowAppend);\n output.action.commands[event.command_index] = event.command;\n }\n return true;\n }\n case 'response.shell_call_command.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'shell_call') {\n validateArrayIndex(output.action.commands, event.command_index, 'command');\n output.action.commands[event.command_index] += event.delta;\n }\n return true;\n }\n case 'response.shell_call_output_content.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'shell_call_output') {\n const content = getShellOutputContent(snapshot, output, event.command_index);\n content.stdout += event.delta.stdout ?? '';\n content.stderr += event.delta.stderr ?? '';\n }\n return true;\n }\n case 'response.shell_call_output_content.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'shell_call_output') {\n const content = getContent(event.output, 0);\n getShellOutputContent(snapshot, output, event.command_index);\n output.output[event.command_index] = structuredClone(content);\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateReasoningEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n): event is ResponseReasoningEvent {\n switch (event.type) {\n case 'response.reasoning_text.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'reasoning') {\n if (!output.content) {\n throw new OpenAIError(`missing content at index ${event.content_index}`);\n }\n const content = getContent(output.content, event.content_index);\n if (content.type !== 'reasoning_text') {\n throw new OpenAIError(`expected content to be 'reasoning_text', got ${content.type}`);\n }\n content.text += event.delta;\n }\n return true;\n }\n case 'response.reasoning_text.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'reasoning') {\n if (!output.content) {\n throw new OpenAIError(`missing content at index ${event.content_index}`);\n }\n const content = getContent(output.content, event.content_index);\n if (content.type !== 'reasoning_text') {\n throw new OpenAIError(`expected content to be 'reasoning_text', got ${content.type}`);\n }\n content.text = event.text;\n }\n return true;\n }\n case 'response.reasoning_summary_part.added': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'reasoning') {\n validateArrayAppend(output.summary, event.summary_index, 'content');\n output.summary.push(structuredClone(event.part));\n }\n return true;\n }\n case 'response.reasoning_summary_part.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'reasoning') {\n getContent(output.summary, event.summary_index);\n output.summary[event.summary_index] = structuredClone(event.part);\n }\n return true;\n }\n case 'response.reasoning_summary_text.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'reasoning') {\n const part = getContent(output.summary, event.summary_index);\n part.text += event.delta;\n }\n return true;\n }\n case 'response.reasoning_summary_text.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'reasoning') {\n const part = getContent(output.summary, event.summary_index);\n part.text = event.text;\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateCodeInterpreterEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n): event is ResponseCodeInterpreterEvent {\n switch (event.type) {\n case 'response.code_interpreter_call_code.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'code_interpreter_call') {\n output.code = (output.code ?? '') + event.delta;\n }\n return true;\n }\n case 'response.code_interpreter_call_code.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'code_interpreter_call') {\n output.code = event.code;\n }\n return true;\n }\n case 'response.code_interpreter_call.in_progress': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'code_interpreter_call') {\n output.status = 'in_progress';\n }\n return true;\n }\n case 'response.code_interpreter_call.interpreting': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'code_interpreter_call') {\n output.status = 'interpreting';\n }\n return true;\n }\n case 'response.code_interpreter_call.completed': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'code_interpreter_call') {\n output.status = 'completed';\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateSearchStatusEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n): event is ResponseSearchStatusEvent {\n switch (event.type) {\n case 'response.file_search_call.in_progress': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'file_search_call') {\n output.status = 'in_progress';\n }\n return true;\n }\n case 'response.file_search_call.searching': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'file_search_call') {\n output.status = 'searching';\n }\n return true;\n }\n case 'response.file_search_call.completed': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'file_search_call') {\n output.status = 'completed';\n }\n return true;\n }\n case 'response.web_search_call.in_progress': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'web_search_call') {\n output.status = 'in_progress';\n }\n return true;\n }\n case 'response.web_search_call.searching': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'web_search_call') {\n output.status = 'searching';\n }\n return true;\n }\n case 'response.web_search_call.completed': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'web_search_call') {\n output.status = 'completed';\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateImageAndMcpStatusEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n): event is ResponseImageAndMcpStatusEvent {\n switch (event.type) {\n case 'response.image_generation_call.in_progress': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'image_generation_call') {\n output.status = 'in_progress';\n }\n return true;\n }\n case 'response.image_generation_call.generating': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'image_generation_call') {\n output.status = 'generating';\n }\n return true;\n }\n case 'response.image_generation_call.completed': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'image_generation_call') {\n output.status = 'completed';\n }\n return true;\n }\n case 'response.mcp_call.in_progress': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'mcp_call') {\n output.status = 'in_progress';\n }\n return true;\n }\n case 'response.mcp_call.completed': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'mcp_call') {\n output.status = 'completed';\n }\n return true;\n }\n case 'response.mcp_call.failed': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'mcp_call') {\n output.status = 'failed';\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction isResponseLifecycleEvent(event: ResponseAccumulatorEvent): event is ResponseLifecycleEvent {\n switch (event.type) {\n case 'response.created':\n case 'response.queued':\n case 'response.in_progress':\n case 'response.completed':\n case 'response.failed':\n case 'response.incomplete': {\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction isIgnoredResponseEvent(event: ResponseAccumulatorEvent): event is ResponseIgnoredEvent {\n switch (event.type) {\n case 'response.audio.delta':\n case 'response.audio.done':\n case 'response.audio.transcript.delta':\n case 'response.audio.transcript.done':\n case 'response.image_generation_call.partial_image':\n case 'response.mcp_list_tools.in_progress':\n case 'response.mcp_list_tools.completed':\n case 'response.mcp_list_tools.failed':\n case 'keepalive':\n case 'error': {\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nexport function createResponseContext(): ResponseAccumulatorContext {\n return createCanonicalResponseContext();\n}\n\nexport function accumulateResponseWithContext(\n event: ResponseAccumulatorEvent,\n snapshot: Response | undefined,\n context: ResponseAccumulatorContext,\n rejectInvalidShellTargets = false,\n onSanitizedEvent?: (event: ResponseStreamEvent) => void,\n): Response {\n const dispatchEvent = sanitizeResponseEvent(event);\n if (onSanitizedEvent && dispatchEvent.type !== 'keepalive') {\n onSanitizedEvent(dispatchEvent);\n }\n\n if (!snapshot) {\n if (dispatchEvent.type !== 'response.created') {\n throw new OpenAIError(\n `When snapshot hasn't been set yet, expected 'response.created' event, got ${dispatchEvent.type}`,\n );\n }\n return cloneValidatedResponse(context, dispatchEvent.response);\n }\n\n validateOutputItemIdentity(dispatchEvent, snapshot, rejectInvalidShellTargets);\n\n if (accumulateOutputItemEvent(dispatchEvent, snapshot, context)) {\n return snapshot;\n }\n if (accumulateContentPartAddedEvent(dispatchEvent, snapshot, context)) {\n return snapshot;\n }\n if (accumulateContentPartDoneEvent(dispatchEvent, snapshot, context)) {\n return snapshot;\n }\n if (accumulateOutputTextEvent(dispatchEvent, snapshot, context)) {\n return snapshot;\n }\n if (accumulateRefusalAndArgumentsEvent(dispatchEvent, snapshot)) {\n return snapshot;\n }\n if (accumulateShellEvent(dispatchEvent, snapshot)) {\n return snapshot;\n }\n if (accumulateReasoningEvent(dispatchEvent, snapshot)) {\n return snapshot;\n }\n if (accumulateCodeInterpreterEvent(dispatchEvent, snapshot)) {\n return snapshot;\n }\n if (accumulateSearchStatusEvent(dispatchEvent, snapshot)) {\n return snapshot;\n }\n if (accumulateImageAndMcpStatusEvent(dispatchEvent, snapshot)) {\n return snapshot;\n }\n\n if (isResponseLifecycleEvent(dispatchEvent)) {\n return cloneValidatedResponse(context, dispatchEvent.response);\n }\n if (isIgnoredResponseEvent(dispatchEvent)) {\n return snapshot;\n }\n return assertNever(dispatchEvent);\n}\n","import { ContentFilterFinishReasonError, LengthFinishReasonError, OpenAIError } from '../error';\nimport type {\n ChatCompletion,\n ChatCompletionCreateParams,\n ChatCompletionCreateParamsBase,\n ChatCompletionFunctionTool,\n ChatCompletionMessage,\n ChatCompletionMessageFunctionToolCall,\n ChatCompletionMessageToolCall,\n ChatCompletionStreamingToolRunnerParams,\n ChatCompletionStreamingToolRunnerParamsWithContext,\n ChatCompletionStreamParams,\n ChatCompletionToolRunnerParams,\n ChatCompletionToolRunnerParamsWithContext,\n ParsedChatCompletion,\n ParsedChatCompletionMessageToolCall,\n ParsedChoice,\n} from '../resources/chat/completions';\nimport type { ResponseFormatTextJSONSchemaConfig } from '../resources/responses/responses';\nimport type { ResponseFormatJSONSchema } from '../resources/shared';\n\n/** Chat completion creation, parsing, streaming, or tool-runner request parameters. */\ntype AnyChatCompletionCreateParams =\n | ChatCompletionCreateParams\n | ChatCompletionToolRunnerParams<any>\n | ChatCompletionToolRunnerParamsWithContext<any, any>\n | ChatCompletionStreamingToolRunnerParams<any>\n | ChatCompletionStreamingToolRunnerParamsWithContext<any, any>\n | ChatCompletionStreamParams;\n\n/** Extracts the element type from an array while preserving non-array values. */\ntype Unpacked<T> = T extends (infer U)[] ? U : T;\n\n/** One optional tool definition accepted by a chat completion request. */\ntype ToolCall = Unpacked<ChatCompletionCreateParamsBase['tools']>;\n\n/** Returns whether an optional chat completion tool contains a function-tool definition. */\nexport function isChatCompletionFunctionTool(tool: ToolCall): tool is ChatCompletionFunctionTool {\n return tool !== undefined && 'function' in tool && tool.function !== undefined;\n}\n\n/** Infers parsed output for each member of a possibly optional response-format union. */\ntype ParsedResponseFormat<Format> = [Format] extends [never]\n ? null\n : Format extends AutoParseableResponseFormat<infer ParsedT>\n ? ParsedT\n : Format extends ResponseFormatJSONSchema\n ? unknown\n : null;\n\n/**\n * Resolves the type of `message.parsed` / `content[].parsed` for the given params.\n *\n * This must stay in sync with {@link isParseableResponseFormat} and\n * {@link parseResponseFormatContent}: formats built by an SDK helper carry their\n * parsed type in the brand, while a raw `{ type: 'json_schema' }` format is parsed\n * with `JSON.parse()` and so can only be described as `unknown`.\n */\nexport type ExtractParsedContentFromParams<Params extends AnyChatCompletionCreateParams> =\n ParsedResponseFormat<Params['response_format']>;\n\n/** A Chat Completions JSON Schema response format with an attached structured-output parser. */\nexport type AutoParseableResponseFormat<ParsedT> = ResponseFormatJSONSchema & {\n /** Type-only marker used to infer the parser's output; this property does not exist at runtime. */\n __output: ParsedT; // type-level only\n\n /** Non-enumerable SDK marker identifying a response format with an attached parser. */\n $brand: 'auto-parseable-response-format';\n /** Parses the completed raw assistant text into the response format's output type. */\n $parseRaw(content: string): ParsedT;\n};\n\n/** Copies a JSON Schema response format and attaches a non-enumerable structured-output parser. */\nexport function makeParseableResponseFormat<ParsedT>(\n response_format: ResponseFormatJSONSchema,\n parser: (content: string) => ParsedT,\n): AutoParseableResponseFormat<ParsedT> {\n const obj = { ...response_format, type: 'json_schema' as const };\n obj.json_schema = { ...obj.json_schema };\n delete (obj as { toJSON?: unknown }).toJSON;\n delete (obj.json_schema as { toJSON?: unknown }).toJSON;\n\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-response-format',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n });\n\n return obj as AutoParseableResponseFormat<ParsedT>;\n}\n\n/** A Responses API JSON Schema text format with an attached structured-output parser. */\nexport type AutoParseableTextFormat<ParsedT> = ResponseFormatTextJSONSchemaConfig & {\n /** Type-only marker used to infer the parser's output; this property does not exist at runtime. */\n __output: ParsedT; // type-level only\n\n /** Non-enumerable SDK marker identifying a text format with an attached parser. */\n $brand: 'auto-parseable-response-format';\n /** Parses completed output text into the text format's structured output type. */\n $parseRaw(content: string): ParsedT;\n};\n\n/** Copies a Responses API text format and attaches a non-enumerable structured-output parser. */\nexport function makeParseableTextFormat<ParsedT>(\n response_format: ResponseFormatTextJSONSchemaConfig,\n parser: (content: string) => ParsedT,\n): AutoParseableTextFormat<ParsedT> {\n const obj = { ...response_format, type: 'json_schema' as const };\n delete (obj as { toJSON?: unknown }).toJSON;\n\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-response-format',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n });\n\n return obj as AutoParseableTextFormat<ParsedT>;\n}\n\n/**\n * Whether the given format was built by an SDK helper (e.g. `zodResponseFormat()`)\n * and therefore carries its own `$parseRaw` callback.\n *\n * Prefer {@link isParseableResponseFormat} when deciding whether output should be\n * parsed at all; raw `{ type: 'json_schema' }` formats are parsed too, but are not\n * branded.\n */\nexport function isAutoParsableResponseFormat<ParsedT>(\n response_format: any,\n): response_format is AutoParseableResponseFormat<ParsedT> {\n return response_format?.['$brand'] === 'auto-parseable-response-format';\n}\n\n/**\n * The canonical definition of an auto-parseable response format, covering both the\n * Chat Completions `response_format` and the Responses `text.format` shapes.\n *\n * Every gate that decides whether output should be parsed must go through this\n * predicate so the runtime, the streaming events and\n * {@link ExtractParsedContentFromParams} cannot drift apart.\n */\nexport function isParseableResponseFormat(format: unknown): boolean {\n return isAutoParsableResponseFormat(format) || (format as { type?: string } | null)?.type === 'json_schema';\n}\n\n/**\n * The canonical parser for auto-parseable response formats. This is the only place\n * that chooses between an existing `$parseRaw` callback and generic `JSON.parse()`.\n *\n * Returns `null` for formats that are not auto-parseable.\n */\nexport function parseResponseFormatContent<ParsedT>(format: unknown, content: string): ParsedT | null {\n if (!isParseableResponseFormat(format)) {\n return null;\n }\n\n if (\n typeof format === 'object' &&\n format !== null &&\n '$parseRaw' in format &&\n typeof format.$parseRaw === 'function'\n ) {\n return format.$parseRaw(content) as ParsedT;\n }\n\n try {\n return JSON.parse(content) as ParsedT;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new SyntaxError('Error reading response: invalid structured output JSON.');\n }\n\n throw error;\n }\n}\n\n/** Type-level details used to infer a chat function tool's parser and execution callback. */\ntype ToolOptions = {\n /** Model-visible function name used to match generated tool calls. */\n name: string;\n /** Parsed argument value accepted by the optional execution callback. */\n arguments: any;\n /** Optional callback invoked by chat completion tool-running helpers. */\n function?: ((args: any) => any) | undefined;\n};\n\n/** A Chat Completions function tool with an argument parser and optional executable callback. */\nexport type AutoParseableTool<\n OptionsT extends ToolOptions,\n HasFunction = OptionsT['function'] extends (...args: never[]) => unknown ? true : false,\n> = ChatCompletionFunctionTool & {\n /** Type-only marker for parsed tool arguments; this property does not exist at runtime. */\n __arguments: OptionsT['arguments']; // type-level only\n /** Type-only marker for the tool name; this property does not exist at runtime. */\n __name: OptionsT['name']; // type-level only\n /** Type-only marker indicating whether a runnable callback was supplied. */\n __hasFunction: HasFunction; // type-level only\n\n /** Non-enumerable SDK marker identifying a tool with an attached argument parser. */\n $brand: 'auto-parseable-tool';\n /** Optional runnable callback used by `.runTools()` after arguments are parsed. */\n $callback: ((args: OptionsT['arguments']) => any) | undefined;\n /** Parses the raw JSON argument string into the callback's typed argument value. */\n $parseRaw(args: string): OptionsT['arguments'];\n};\n\n/** Parser and optional callback supplied when creating a custom chat function tool. */\ntype ToolParserOptions<OptionsT extends ToolOptions> = {\n /** Converts the raw JSON argument string into the tool's typed argument value. */\n parser: (content: string) => OptionsT['arguments'];\n /** Optional callback invoked by a chat completion tool runner. */\n callback: ((args: OptionsT['arguments']) => any) | undefined;\n};\n\n/** Creates a runnable function tool with a guaranteed execution callback. */\nexport function makeParseableTool<OptionsT extends ToolOptions>(\n tool: ChatCompletionFunctionTool,\n options: ToolParserOptions<OptionsT> & {\n /** Callback invoked with the parsed tool arguments. */\n callback: (args: OptionsT['arguments']) => any;\n },\n): AutoParseableTool<OptionsT, true>;\n\n/** Creates a parse-only function tool without an execution callback. */\nexport function makeParseableTool<OptionsT extends ToolOptions>(\n tool: ChatCompletionFunctionTool,\n options: ToolParserOptions<OptionsT> & {\n /** No execution callback is attached to this tool. */\n callback: undefined;\n },\n): AutoParseableTool<OptionsT, false>;\n\n/** Creates a function tool whose execution callback may be unavailable. */\nexport function makeParseableTool<OptionsT extends ToolOptions>(\n tool: ChatCompletionFunctionTool,\n options: ToolParserOptions<OptionsT>,\n): AutoParseableTool<OptionsT, boolean>;\n\n/** Copies a function tool and attaches non-enumerable parsing and callback metadata. */\nexport function makeParseableTool<OptionsT extends ToolOptions>(\n tool: ChatCompletionFunctionTool,\n { parser, callback }: ToolParserOptions<OptionsT>,\n): AutoParseableTool<OptionsT, boolean> {\n const obj = { ...tool };\n\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-tool',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n $callback: {\n value: callback,\n enumerable: false,\n },\n });\n\n return obj as AutoParseableTool<OptionsT, boolean>;\n}\n\n/** Returns whether a Chat Completions tool carries the SDK's argument-parser marker. */\nexport function isAutoParsableTool(tool: any): tool is AutoParseableTool<any> {\n return tool?.['$brand'] === 'auto-parseable-tool';\n}\n\n/**\n * Adds parsed-content fields to a chat completion, invoking parsers only when the\n * request includes an auto-parseable response format or a strict function tool.\n */\nexport function maybeParseChatCompletion<\n Params extends ChatCompletionCreateParams | null,\n ParsedT = Params extends null ? null : ExtractParsedContentFromParams<NonNullable<Params>>,\n>(completion: ChatCompletion, params: Params): ParsedChatCompletion<ParsedT> {\n if (!params || !hasAutoParseableInput(params)) {\n return {\n ...completion,\n choices: completion.choices.map((choice) => ({\n ...choice,\n message: {\n ...choice.message,\n parsed: null,\n ...(choice.message.tool_calls\n ? {\n tool_calls: choice.message.tool_calls,\n }\n : undefined),\n },\n })),\n };\n }\n\n return parseChatCompletion(completion, params);\n}\n\n/**\n * Parses structured assistant content and strict function-tool arguments.\n *\n * @throws {LengthFinishReasonError} If generation stopped at its token limit.\n * @throws {ContentFilterFinishReasonError} If generation stopped because of content filtering.\n * @throws {OpenAIError} If the completion contains an unsupported tool-call type.\n */\nexport function parseChatCompletion<\n Params extends ChatCompletionCreateParams,\n ParsedT = ExtractParsedContentFromParams<Params>,\n>(completion: ChatCompletion, params: Params): ParsedChatCompletion<ParsedT> {\n const choices: ParsedChoice<ParsedT>[] = completion.choices.map((choice): ParsedChoice<ParsedT> => {\n if (choice.finish_reason === 'length') {\n throw new LengthFinishReasonError();\n }\n\n if (choice.finish_reason === 'content_filter') {\n throw new ContentFilterFinishReasonError();\n }\n\n return {\n ...choice,\n message: {\n ...choice.message,\n ...(choice.message.tool_calls\n ? {\n tool_calls:\n choice.message.tool_calls?.map((toolCall) => parseToolCall(params, toolCall)) ?? undefined,\n }\n : undefined),\n parsed:\n choice.message.content !== null &&\n choice.message.content !== undefined &&\n !choice.message.refusal &&\n (choice.message.content !== '' ||\n (!choice.message.tool_calls?.length && !choice.message.function_call))\n ? parseResponseFormat(params, choice.message.content)\n : null,\n },\n };\n });\n\n return { ...completion, choices };\n}\n\nfunction parseResponseFormat<\n Params extends ChatCompletionCreateParams,\n ParsedT = ExtractParsedContentFromParams<Params>,\n>(params: Params, content: string): ParsedT | null {\n return parseResponseFormatContent<ParsedT>(params.response_format, content);\n}\n\nfunction parseToolCall<Params extends ChatCompletionCreateParams>(\n params: Params,\n toolCall: ChatCompletionMessageToolCall,\n): ParsedChatCompletionMessageToolCall {\n if (toolCall.type === 'custom') {\n return toolCall;\n }\n\n if (toolCall.type !== 'function') {\n const unsupportedType = (toolCall as { type: string }).type;\n throw new OpenAIError(\n `Currently only \\`function\\` and \\`custom\\` tool calls are supported; Received \\`${unsupportedType}\\``,\n );\n }\n\n const inputTool = params.tools?.find(\n (inputTool) =>\n isChatCompletionFunctionTool(inputTool) && inputTool.function?.name === toolCall.function.name,\n ) as ChatCompletionFunctionTool | undefined; // TS doesn't narrow based on isChatCompletionTool\n let parsedArguments: unknown = null;\n if (isAutoParsableTool(inputTool)) {\n parsedArguments = inputTool.$parseRaw(toolCall.function.arguments);\n } else if (inputTool?.function.strict) {\n parsedArguments = parseResponseFormatContent(\n { type: 'json_schema', $parseRaw: undefined },\n toolCall.function.arguments,\n );\n }\n\n return {\n ...toolCall,\n function: {\n ...toolCall.function,\n parsed_arguments: parsedArguments,\n },\n };\n}\n\n/** Returns whether a tool call matches a strict or auto-parseable function in the request. */\nexport function shouldParseToolCall(\n params: ChatCompletionCreateParams | null | undefined,\n // accepts partially accumulated tool calls so streaming snapshots can be checked as they build up\n toolCall: {\n type?: ChatCompletionMessageToolCall['type'];\n function?: { name?: string };\n },\n): boolean {\n if (!params || !('tools' in params) || !params.tools || toolCall.type !== 'function') {\n return false;\n }\n\n const inputTool = params.tools?.find(\n (inputTool) =>\n isChatCompletionFunctionTool(inputTool) && inputTool.function?.name === toolCall.function?.name,\n );\n return (\n isChatCompletionFunctionTool(inputTool) &&\n (isAutoParsableTool(inputTool) || inputTool?.function.strict || false)\n );\n}\n\n/** Returns whether the request contains an auto-parseable response format or strict function tool. */\nexport function hasAutoParseableInput(params: AnyChatCompletionCreateParams): boolean {\n if (isParseableResponseFormat(params.response_format)) {\n return true;\n }\n\n return (\n params.tools?.some(\n (t) => isAutoParsableTool(t) || (t.type === 'function' && t.function.strict === true),\n ) ?? false\n );\n}\n\n/**\n * Narrows completion tool calls to function calls supported by parsing helpers.\n *\n * @throws {OpenAIError} If any tool call has a non-function type.\n */\nexport function assertToolCallsAreChatCompletionFunctionToolCalls(\n toolCalls: ChatCompletionMessage['tool_calls'],\n): asserts toolCalls is ChatCompletionMessageFunctionToolCall[] {\n for (const toolCall of toolCalls || []) {\n if (toolCall.type !== 'function') {\n throw new OpenAIError(\n `Currently only \\`function\\` tool calls are supported; Received \\`${toolCall.type}\\``,\n );\n }\n }\n}\n\n/**\n * Validates strict function tools while preserving supported custom tools.\n *\n * @throws {OpenAIError} If a tool is unsupported or a function is missing `strict: true`.\n */\nexport function validateInputTools(tools: ChatCompletionCreateParamsBase['tools']) {\n for (const tool of tools ?? []) {\n if (tool.type === 'custom') {\n continue;\n }\n\n if (tool.type !== 'function') {\n const unsupportedType = (tool as { type: string }).type;\n throw new OpenAIError(\n `Currently only \\`function\\` and \\`custom\\` tool types are supported; Received \\`${unsupportedType}\\``,\n );\n }\n\n if (tool.function.strict !== true) {\n throw new OpenAIError(\n `The \\`${tool.function.name}\\` tool is not marked with \\`strict: true\\`. Only strict function tools can be auto-parsed`,\n );\n }\n }\n}\n","import { OpenAIError } from '../error';\nimport type { ChatCompletionTool } from '../resources/chat/completions';\nimport type {\n FunctionTool,\n NamespaceTool,\n ParsedContent,\n ParsedResponse,\n ParsedResponseFunctionToolCall,\n ParsedResponseOutputItem,\n Response,\n ResponseCreateParamsBase,\n ResponseCreateParamsNonStreaming,\n ResponseFormatTextJSONSchemaConfig,\n ResponseFunctionToolCall,\n ResponseTextConfig,\n Tool,\n} from '../resources/responses/responses';\nimport { isParseableResponseFormat, parseResponseFormatContent } from '../lib/parser';\nimport type { AutoParseableTextFormat } from '../lib/parser';\n\n/** Response tools, a compatible chat completion tool, or no tools. */\nexport type ParseableToolsParams = Tool[] | ChatCompletionTool | null;\n\n/** Response-creation parameters that may include tools recognized by parsing helpers. */\nexport type ResponseCreateParamsWithTools = ResponseCreateParamsBase & {\n /** Tools available to the model while producing the response. */\n tools?: ParseableToolsParams;\n};\n\n/** Request fields that can select a plain-text or structured Responses API output format. */\ntype TextConfigParams = {\n /** Optional text output configuration, including its structured JSON format. */\n text?: ResponseTextConfig;\n};\n\n/** Infers parsed output for each member of a possibly optional text-format union. */\ntype ParsedTextFormat<Format> = [Format] extends [never]\n ? null\n : Format extends AutoParseableTextFormat<infer ParsedT>\n ? ParsedT\n : Format extends ResponseFormatTextJSONSchemaConfig\n ? unknown\n : null;\n\n/**\n * Resolves the type of `output_parsed` / `content[].parsed` for the given params.\n *\n * This must stay in sync with `isParseableResponseFormat()` and\n * `parseResponseFormatContent()`: formats built by an SDK helper carry their parsed\n * type in the brand, while a raw `{ type: 'json_schema' }` format is parsed with\n * `JSON.parse()` and so can only be described as `unknown`.\n */\nexport type ExtractParsedContentFromParams<Params extends TextConfigParams> = ParsedTextFormat<\n NonNullable<Params['text']>['format']\n>;\n\n/**\n * Adds parsed-output fields to a response, invoking parsers only when its request\n * includes an auto-parseable text format or strict function tool.\n */\nexport function maybeParseResponse<\n Params extends ResponseCreateParamsBase | null,\n ParsedT = Params extends null ? null : ExtractParsedContentFromParams<NonNullable<Params>>,\n>(response: Response, params: Params): ParsedResponse<ParsedT> {\n if (!params || !hasAutoParseableInput(params)) {\n const parsed = {\n ...response,\n output_parsed: null,\n output: response.output.map((item) => {\n if (item.type === 'function_call') {\n return {\n ...item,\n parsed_arguments: null,\n };\n }\n\n if (item.type === 'message') {\n return {\n ...item,\n content: item.content.map((content) => ({\n ...content,\n parsed: null,\n })),\n };\n }\n return item;\n }),\n };\n\n if (needsOutputText(response, parsed)) {\n addOutputText(parsed as Response);\n }\n\n return parsed;\n }\n\n return parseResponse(response, params);\n}\n\n/**\n * Parses completed response text and strict function-tool arguments, matching\n * namespaced functions by both namespace and name.\n *\n * Incomplete or nonterminal responses keep their parsed values as `null`, and\n * `output_parsed` returns the first successfully parsed output-text item.\n */\nexport function parseResponse<\n Params extends ResponseCreateParamsBase,\n ParsedT = ExtractParsedContentFromParams<Params>,\n>(response: Response, params: Params): ParsedResponse<ParsedT> {\n const shouldParse = !response.status || response.status === 'completed';\n const output: ParsedResponseOutputItem<ParsedT>[] = response.output.map(\n (item): ParsedResponseOutputItem<ParsedT> => {\n if (item.type === 'function_call') {\n return shouldParse ? parseToolCall(params, item) : { ...item, parsed_arguments: null };\n }\n if (item.type === 'message') {\n const content: ParsedContent<ParsedT>[] = item.content.map((content) => {\n if (content.type === 'output_text') {\n return {\n ...content,\n parsed: shouldParse ? parseTextFormat(params, content.text) : null,\n };\n }\n\n return content;\n });\n\n return {\n ...item,\n content,\n };\n }\n\n return item;\n },\n );\n\n const parsed: Omit<ParsedResponse<ParsedT>, 'output_parsed'> = { ...response, output };\n if (needsOutputText(response, parsed)) {\n addOutputText(parsed);\n }\n\n Object.defineProperty(parsed, 'output_parsed', {\n enumerable: true,\n get() {\n for (const output of parsed.output) {\n if (output.type !== 'message') {\n continue;\n }\n\n for (const content of output.content) {\n if (content.type === 'output_text' && content.parsed !== null) {\n return content.parsed;\n }\n }\n }\n\n return null;\n },\n });\n\n return parsed as ParsedResponse<ParsedT>;\n}\n\nfunction parseTextFormat<\n Params extends ResponseCreateParamsBase,\n ParsedT = ExtractParsedContentFromParams<Params>,\n>(params: Params, content: string): ParsedT | null {\n return parseResponseFormatContent<ParsedT>(params.text?.format, content);\n}\n\n/** Returns whether the request includes an auto-parseable text format or strict function tool. */\nexport function hasAutoParseableInput(params: ResponseCreateParamsWithTools): boolean {\n if (isParseableResponseFormat(params.text?.format)) {\n return true;\n }\n\n return (\n Array.isArray(params.tools) &&\n params.tools.some(\n (tool) =>\n isAutoParsableTool(tool) ||\n (tool.type === 'function' && tool.strict === true) ||\n (tool.type === 'namespace' &&\n tool.tools.some(\n (nested) => nested.type === 'function' && (isAutoParsableTool(nested) || nested.strict === true),\n )),\n )\n );\n}\n\n/** Type-level details used to infer a Responses API function tool's parser and callback. */\ntype ToolOptions = {\n /** Model-visible function name used to match generated tool calls. */\n name: string;\n /** Parsed argument value accepted by the optional execution callback. */\n arguments: any;\n /** Optional callback metadata associated with the parsed function tool. */\n function?: ((args: any) => any) | undefined;\n};\n\n/** A Responses API function tool with an argument parser and optional executable callback. */\nexport type AutoParseableResponseTool<\n OptionsT extends ToolOptions,\n HasFunction = OptionsT['function'] extends (...args: never[]) => unknown ? true : false,\n> = FunctionTool & {\n /** Type-only marker for parsed tool arguments; this property does not exist at runtime. */\n __arguments: OptionsT['arguments']; // type-level only\n /** Type-only marker for the function name; this property does not exist at runtime. */\n __name: OptionsT['name']; // type-level only\n\n /** Non-enumerable SDK marker identifying a tool with an attached argument parser. */\n $brand: 'auto-parseable-tool';\n /** Optional callback available to helpers that execute parsed function tools. */\n $callback: ((args: OptionsT['arguments']) => any) | undefined;\n /** Parses the raw JSON argument string into the function's typed argument value. */\n $parseRaw(args: string): OptionsT['arguments'];\n};\n\n/** Copies a Responses API function tool and attaches non-enumerable parser and callback metadata. */\nexport function makeParseableResponseTool<OptionsT extends ToolOptions>(\n tool: FunctionTool,\n {\n parser,\n callback,\n }: {\n /** Converts the raw JSON argument string into the function's typed argument value. */\n parser: (content: string) => OptionsT['arguments'];\n /** Optional callback available to helpers that execute the parsed function. */\n callback: ((args: OptionsT['arguments']) => any) | undefined;\n },\n): AutoParseableResponseTool<OptionsT> {\n const obj = { ...tool };\n\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-tool',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n $callback: {\n value: callback,\n enumerable: false,\n },\n });\n\n return obj as AutoParseableResponseTool<OptionsT>;\n}\n\n/** Returns whether a Responses API tool carries the SDK's argument-parser marker. */\nexport function isAutoParsableTool(tool: any): tool is AutoParseableResponseTool<any> {\n return tool?.['$brand'] === 'auto-parseable-tool';\n}\n\nfunction getInputToolByName(\n input_tools: Tool[],\n name: string,\n namespace?: string,\n): FunctionTool | NamespaceTool.Function | undefined {\n for (const tool of input_tools) {\n if (namespace == null) {\n if (tool.type === 'function' && tool.name === name) {\n return tool;\n }\n } else if (tool.type === 'namespace' && tool.name === namespace) {\n return tool.tools.find(\n (nested): nested is NamespaceTool.Function => nested.type === 'function' && nested.name === name,\n );\n }\n }\n return undefined;\n}\n\nfunction parseToolCall<Params extends ResponseCreateParamsBase>(\n params: Params,\n toolCall: ResponseFunctionToolCall,\n): ParsedResponseFunctionToolCall {\n const inputTool = getInputToolByName(params.tools ?? [], toolCall.name, toolCall.namespace);\n\n let parsedArguments: unknown = null;\n if (isAutoParsableTool(inputTool)) {\n parsedArguments = inputTool.$parseRaw(toolCall.arguments);\n } else if (inputTool?.strict) {\n parsedArguments = parseResponseFormatContent(\n { type: 'json_schema', $parseRaw: undefined },\n toolCall.arguments,\n );\n }\n\n return {\n ...toolCall,\n parsed_arguments: parsedArguments,\n };\n}\n\n/** Matches a response function call to a strict or auto-parseable tool by namespace and name. */\nexport function shouldParseToolCall(\n params: ResponseCreateParamsNonStreaming | null | undefined,\n toolCall: ResponseFunctionToolCall,\n): boolean {\n if (!params) {\n return false;\n }\n\n const inputTool = getInputToolByName(params.tools ?? [], toolCall.name, toolCall.namespace);\n return isAutoParsableTool(inputTool) || inputTool?.strict || false;\n}\n\n/**\n * Validates that compatible chat completion tools can be automatically parsed.\n *\n * @throws {OpenAIError} If a tool is not a function or is missing `strict: true`.\n */\nexport function validateInputTools(tools: ChatCompletionTool[] | undefined) {\n for (const tool of tools ?? []) {\n if (tool.type !== 'function') {\n throw new OpenAIError(\n `Currently only \\`function\\` tool types support auto-parsing; Received \\`${tool.type}\\``,\n );\n }\n\n if (tool.function.strict !== true) {\n throw new OpenAIError(\n `The \\`${tool.function.name}\\` tool is not marked with \\`strict: true\\`. Only strict function tools can be auto-parsed`,\n );\n }\n }\n}\n\nfunction needsOutputText(\n response: Response,\n target: { output_text?: Response['output_text'] | null },\n): boolean {\n return !Object.getOwnPropertyDescriptor(response, 'output_text') || target.output_text == null;\n}\n\n/** Replaces `output_text` with the concatenated text from every response output message. */\nexport function addOutputText(rsp: Response): void {\n const texts: string[] = [];\n for (const output of rsp.output) {\n if (output.type !== 'message') {\n continue;\n }\n\n for (const content of output.content) {\n if (content.type === 'output_text') {\n texts.push(content.text);\n }\n }\n }\n\n rsp.output_text = texts.join('');\n}\n","/**\n * This module provides internal shims and utility functions for environments where certain Node.js or global types may not be available.\n *\n * These are used to ensure we can provide a consistent behaviour between different JavaScript environments and good error\n * messages in cases where an environment isn't fully supported.\n */\n\nimport type { Fetch } from './builtin-types';\nimport type { ReadableStream } from './shim-types';\n\nexport function getDefaultFetch(): Fetch {\n if (typeof fetch !== 'undefined') {\n return fetch as any;\n }\n\n throw new Error(\n '`fetch` is not defined as a global; Either pass `fetch` to the client, `new OpenAI({ fetch })` or polyfill the global, `globalThis.fetch = fetch`',\n );\n}\n\ntype ReadableStreamArgs = ConstructorParameters<typeof ReadableStream>;\n\nexport function makeReadableStream(...args: ReadableStreamArgs): ReadableStream {\n const ReadableStream = (globalThis as any).ReadableStream;\n if (typeof ReadableStream === 'undefined') {\n // Note: All of the platforms / runtimes we officially support already define\n // `ReadableStream` as a global, so this should only ever be hit on unsupported runtimes.\n throw new Error(\n '`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`',\n );\n }\n\n return new ReadableStream(...args);\n}\n\nexport function ReadableStreamFrom<T>(iterable: Iterable<T> | AsyncIterable<T>): ReadableStream<T> {\n let iter: AsyncIterator<T> | Iterator<T> =\n Symbol.asyncIterator in iterable ? iterable[Symbol.asyncIterator]() : iterable[Symbol.iterator]();\n\n return makeReadableStream({\n start() {},\n async pull(controller: any) {\n const { done, value } = await iter.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n async cancel() {\n await iter.return?.();\n },\n });\n}\n\n/**\n * Most browsers don't yet have async iterable support for ReadableStream,\n * and Node has a very different way of reading bytes from its \"ReadableStream\".\n *\n * This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490\n */\nexport function ReadableStreamToAsyncIterable<T>(stream: any): AsyncIterableIterator<T> {\n if (stream[Symbol.asyncIterator]) return stream;\n\n const reader = stream.getReader();\n return {\n async next() {\n try {\n const result = await reader.read();\n if (result?.done) reader.releaseLock(); // release lock when stream becomes closed\n return result;\n } catch (e) {\n reader.releaseLock(); // release lock when stream becomes errored\n throw e;\n }\n },\n async return() {\n const cancelPromise = reader.cancel();\n reader.releaseLock();\n await cancelPromise;\n return { done: true, value: undefined };\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n}\n\n/**\n * Cancels a ReadableStream we don't need to consume.\n * See https://undici.nodejs.org/#/?id=garbage-collection\n */\nexport async function CancelReadableStream(stream: any): Promise<void> {\n if (stream === null || typeof stream !== 'object') return;\n\n if (stream[Symbol.asyncIterator]) {\n await stream[Symbol.asyncIterator]().return?.();\n return;\n }\n\n const reader = stream.getReader();\n const cancelPromise = reader.cancel();\n reader.releaseLock();\n await cancelPromise;\n}\n","import { decodeUTF8, encodeUTF8 } from '../utils/bytes';\n\n/** Text or UTF-8 bytes accepted by the incremental line decoder. */\nexport type Bytes = string | ArrayBuffer | Uint8Array | null | undefined;\n\n/** Maximum backing-buffer capacity retained when completed lines leave little active data. */\nconst MAX_RETAINED_BUFFER_BYTES = 64 * 1024;\n\n/**\n * Incrementally decodes UTF-8 text into lines without losing partial characters\n * or newline sequences that span multiple chunks.\n *\n * Supports `\\n`, `\\r`, and `\\r\\n` line endings. Call {@link flush} after the\n * final chunk to emit a trailing line that does not end with a newline.\n *\n * Based on the line decoder used by the Python `httpx` project:\n * https://github.com/encode/httpx/blob/920333ea98118e9cf617f246905d7b202510941c/httpx/_decoders.py#L258\n */\nexport class LineDecoder {\n // prettier-ignore\n /** Individual characters recognized as possible line terminators. */\n static NEWLINE_CHARS = new Set(['\\n', '\\r']);\n\n /** Matches complete CRLF terminators as well as standalone CR and LF characters. */\n static NEWLINE_REGEXP = /\\r\\n|[\\n\\r]/g;\n\n #buffer: Uint8Array;\n #start: number;\n #end: number;\n #searchIndex: number;\n #skipLeadingLF: boolean;\n\n /** Creates a decoder with no buffered bytes or pending newline continuation. */\n constructor() {\n this.#buffer = new Uint8Array();\n this.#start = 0;\n this.#end = 0;\n this.#searchIndex = 0;\n this.#skipLeadingLF = false;\n }\n\n /**\n * Appends a text or UTF-8 byte chunk and returns every newly completed line.\n *\n * Incomplete lines remain buffered for the next call. A trailing `\\r`\n * completes its line immediately, and a following `\\n` is consumed as its\n * continuation. `null` and `undefined` are ignored and do not flush buffered\n * content.\n */\n decode(chunk: Bytes): string[] {\n if (chunk == null) {\n return [];\n }\n\n let binaryChunk: Uint8Array;\n if (chunk instanceof ArrayBuffer) {\n binaryChunk = new Uint8Array(chunk);\n } else if (typeof chunk === 'string') {\n binaryChunk = encodeUTF8(chunk);\n } else {\n binaryChunk = chunk;\n }\n\n if (binaryChunk.length === 0) {\n return [];\n }\n\n if (this.#skipLeadingLF) {\n this.#skipLeadingLF = false;\n if (binaryChunk[0] === 0x0a) {\n binaryChunk = binaryChunk.subarray(1);\n }\n if (binaryChunk.length === 0) {\n return [];\n }\n }\n\n this.#append(binaryChunk);\n\n const lines: string[] = [];\n let patternIndex;\n while ((patternIndex = findNewlineIndex(this.#buffer, this.#searchIndex, this.#end)) != null) {\n const line = decodeUTF8(this.#buffer.subarray(this.#start, patternIndex.preceding));\n lines.push(line);\n\n this.#start = patternIndex.index;\n if (patternIndex.carriage) {\n if (this.#start < this.#end && this.#buffer[this.#start] === 0x0a) {\n this.#start += 1;\n } else if (this.#start === this.#end) {\n this.#skipLeadingLF = true;\n }\n }\n this.#searchIndex = this.#start;\n }\n\n this.#searchIndex = this.#end;\n if (this.#start === this.#end) {\n this.#start = 0;\n this.#end = 0;\n this.#searchIndex = 0;\n if (this.#buffer.length > MAX_RETAINED_BUFFER_BYTES) {\n this.#buffer = new Uint8Array();\n }\n } else if (lines.length > 0 && this.#buffer.length > MAX_RETAINED_BUFFER_BYTES) {\n const length = this.#end - this.#start;\n if (length <= MAX_RETAINED_BUFFER_BYTES || this.#buffer.length > length * 4) {\n const capacity =\n length <= MAX_RETAINED_BUFFER_BYTES\n ? Math.min(Math.max(length * 2, 256), MAX_RETAINED_BUFFER_BYTES)\n : length * 2;\n const buffer = new Uint8Array(capacity);\n buffer.set(this.#buffer.subarray(this.#start, this.#end));\n this.#buffer = buffer;\n this.#start = 0;\n this.#end = length;\n this.#searchIndex = length;\n }\n }\n\n return lines;\n }\n\n #append(chunk: Uint8Array): void {\n if (this.#end + chunk.length > this.#buffer.length) {\n const length = this.#end - this.#start;\n if (this.#start >= this.#buffer.length / 2 && length + chunk.length <= this.#buffer.length) {\n this.#buffer.copyWithin(0, this.#start, this.#end);\n } else {\n const capacity = Math.max(this.#buffer.length * 2, length + chunk.length, 256);\n const buffer = new Uint8Array(capacity);\n buffer.set(this.#buffer.subarray(this.#start, this.#end));\n this.#buffer = buffer;\n }\n\n this.#searchIndex -= this.#start;\n this.#end = length;\n this.#start = 0;\n }\n\n this.#buffer.set(chunk, this.#end);\n this.#end += chunk.length;\n }\n\n /** Emits the remaining unterminated line, or returns an empty array when idle. */\n flush(): string[] {\n this.#skipLeadingLF = false;\n if (this.#start === this.#end) {\n return [];\n }\n return this.decode('\\n');\n }\n}\n\n/**\n * Searches the active buffer range for the next CR or LF byte and returns its\n * zero-based position, the position immediately after it, and whether the byte\n * was a carriage return. Returns `null` when the range contains no newline byte.\n *\n * ```ts\n * findNewlineIndex(new TextEncoder().encode('abc\\ndef'), 0, 7)\n * // => { preceding: 3, index: 4, carriage: false }\n * ```\n */\nfunction findNewlineIndex(\n buffer: Uint8Array,\n start: number,\n end: number,\n): { preceding: number; index: number; carriage: boolean } | null {\n const newline = 0x0a; // \\n\n const carriage = 0x0d; // \\r\n\n for (let i = start; i < end; i++) {\n if (buffer[i] === newline) {\n return { preceding: i, index: i + 1, carriage: false };\n }\n\n if (buffer[i] === carriage) {\n return { preceding: i, index: i + 1, carriage: true };\n }\n }\n\n return null;\n}\n\n/**\n * Finds the first blank-line separator used to delimit streamed event records.\n *\n * @returns The byte offset immediately after the first pair of consecutive\n * line endings, or `-1` when the buffer contains no complete separator.\n */\nexport function findDoubleNewlineIndex(buffer: Uint8Array): number {\n for (let i = 0; i < buffer.length - 1; i++) {\n const firstEndingLength = lineEndingLength(buffer, i);\n if (firstEndingLength > 0) {\n const secondEndingIndex = i + firstEndingLength;\n const secondEndingLength = lineEndingLength(buffer, secondEndingIndex);\n if (secondEndingLength > 0) {\n return secondEndingIndex + secondEndingLength;\n }\n }\n }\n\n return -1;\n}\n\nfunction lineEndingLength(buffer: Uint8Array, index: number): number {\n const newline = 0x0a; // \\n\n const carriage = 0x0d; // \\r\n\n if (buffer[index] === newline) {\n return 1;\n }\n if (buffer[index] === carriage) {\n return buffer[index + 1] === newline ? 2 : 1;\n }\n return 0;\n}\n","import { OpenAIError, APIError } from './error';\nimport type { ReadableStream } from '../internal/shim-types';\nimport { makeReadableStream, ReadableStreamToAsyncIterable } from '../internal/shims';\nimport { findDoubleNewlineIndex, LineDecoder } from '../internal/decoders/line';\nimport { isAbortError } from '../internal/errors';\nimport { encodeUTF8 } from '../internal/utils/bytes';\nimport { loggerFor } from '../internal/utils/log';\nimport type { OpenAI } from '../client';\n\ntype Bytes = string | ArrayBuffer | Uint8Array | null | undefined;\n\nfunction isTransportAbortError(error: unknown): boolean {\n return !(error instanceof APIError) && isAbortError(error);\n}\n\ntype StreamTeeQueue<Item> = {\n readonly length: number;\n readonly canceled: boolean;\n enqueue: (value: Promise<IteratorResult<Item>>) => void;\n dequeue: () => Promise<IteratorResult<Item>> | undefined;\n cancel: () => void;\n};\n\nfunction createStreamTeeQueue<Item>(): StreamTeeQueue<Item> {\n let entries: (Promise<IteratorResult<Item>> | undefined)[] = [];\n let head = 0;\n let canceled = false;\n\n return {\n get length() {\n return entries.length - head;\n },\n get canceled() {\n return canceled;\n },\n enqueue(value) {\n if (!canceled) {\n entries.push(value);\n }\n },\n dequeue() {\n if (head === entries.length) {\n return undefined;\n }\n\n const value = entries[head];\n entries[head] = undefined;\n head += 1;\n\n if (head === entries.length) {\n entries = [];\n head = 0;\n } else if (head >= 1024 && head * 2 >= entries.length) {\n entries = entries.slice(head);\n head = 0;\n }\n\n return value;\n },\n cancel() {\n canceled = true;\n entries.length = 0;\n head = 0;\n },\n };\n}\n\n/** A decoded server-sent event before its JSON payload has been parsed. */\nexport type ServerSentEvent = {\n /** Explicit SSE event name, or `null` when the event has no `event:` field. */\n event: string | null;\n /** Joined contents of the event's `data:` fields. */\n data: string;\n /** Original event lines retained for diagnostics when parsing fails. */\n raw: string[];\n};\n\n/**\n * A single-consumption asynchronous API response stream.\n *\n * Use {@link Stream.tee} when two consumers need the same events. Breaking out of\n * a response-backed stream early aborts its request; branches created by `tee()`\n * instead share {@link Stream.controller} for explicit cancellation.\n */\nexport class Stream<Item> implements AsyncIterable<Item> {\n /** Abort controller for the underlying request and all branches created with `tee()`. */\n controller: AbortController;\n #client: OpenAI | undefined;\n #isTeeBranch = false;\n private iterator: () => AsyncIterator<Item>;\n\n /** Wraps an asynchronous event iterator and the controller that owns its request. */\n constructor(iterator: () => AsyncIterator<Item>, controller: AbortController, client?: OpenAI) {\n this.iterator = iterator;\n this.controller = controller;\n this.#client = client;\n }\n\n /**\n * Decodes an SSE response into parsed JSON events.\n *\n * The resulting stream can be consumed only once, ignores events after `[DONE]`, and\n * surfaces API error payloads as `APIError` instances. When\n * `synthesizeEventData` is enabled, each item also includes its SSE event name.\n */\n static fromSSEResponse<Item>(\n response: Response,\n controller: AbortController,\n client?: OpenAI,\n synthesizeEventData?: boolean,\n ): Stream<Item> {\n let consumed = false;\n const logger = client ? loggerFor(client) : console;\n\n async function* iterator(): AsyncIterator<Item, any, undefined> {\n if (consumed) {\n throw new OpenAIError('Cannot iterate over a consumed stream, use `.tee()` to split the stream.');\n }\n consumed = true;\n let done = false;\n let receivedCompletionSentinel = false;\n const messages = _iterSSEMessages(response, controller);\n const closeMessages = messages.return.bind(messages);\n messages.return = (value) => {\n // Abort before nested iterator cleanup can wait on the response body's cancellation.\n if (!receivedCompletionSentinel) {\n controller.abort();\n }\n return closeMessages(value);\n };\n try {\n for await (const sse of messages) {\n if (sse.data === '[DONE]') {\n receivedCompletionSentinel = true;\n break;\n }\n\n if (sse.event === null || !sse.event.startsWith('thread.')) {\n let data;\n\n try {\n data = JSON.parse(sse.data) as any;\n } catch {\n logger.error(`Could not parse message into JSON:`);\n logger.error(`From chunk:`);\n throw new SyntaxError('Error reading response: malformed server-sent event JSON.');\n }\n\n if (sse.event === 'error') {\n throw new APIError(undefined, data?.error ?? data, undefined, response.headers);\n }\n\n if (data && data.error) {\n throw new APIError(undefined, data.error, undefined, response.headers);\n }\n\n yield synthesizeEventData ? { event: sse.event, data } : data;\n } else {\n let data;\n try {\n data = JSON.parse(sse.data);\n } catch {\n logger.error(`Could not parse message into JSON:`);\n logger.error(`From chunk:`);\n throw new SyntaxError('Error reading response: malformed server-sent event JSON.');\n }\n yield { event: sse.event, data } as any;\n }\n }\n done = true;\n } catch (e) {\n // Abort errors and cleanup failures after the completion sentinel are non-fatal.\n if (\n receivedCompletionSentinel ||\n isTransportAbortError(e) ||\n (controller.signal.aborted && e === controller.signal.reason)\n ) {\n return;\n }\n throw e;\n } finally {\n // If the user `break`s, abort the ongoing request.\n if (!done) {\n controller.abort();\n }\n }\n }\n\n return new Stream(iterator, controller, client);\n }\n\n /**\n * Generates a Stream from a newline-separated ReadableStream\n * where each item is a JSON value.\n */\n static fromReadableStream<Item>(\n readableStream: ReadableStream,\n controller: AbortController,\n client?: OpenAI,\n ): Stream<Item> {\n let consumed = false;\n\n async function* iterLines(): AsyncGenerator<string, void, unknown> {\n const lineDecoder = new LineDecoder();\n const reader = readableStream.getReader();\n let closed = false;\n let cancelPromise: Promise<void> | undefined;\n const cancel = () => {\n cancelPromise ??= reader.cancel();\n cancelPromise.catch(() => undefined);\n };\n\n controller.signal.addEventListener('abort', cancel, { once: true });\n try {\n if (controller.signal.aborted) {\n cancel();\n return;\n }\n\n while (true) {\n const { value: chunk, done } = await reader.read();\n if (done) {\n closed = true;\n break;\n }\n if (controller.signal.aborted) {\n return;\n }\n\n for (const line of lineDecoder.decode(chunk)) {\n if (controller.signal.aborted) {\n return;\n }\n yield line;\n }\n }\n\n if (controller.signal.aborted) {\n return;\n }\n for (const line of lineDecoder.flush()) {\n if (controller.signal.aborted) {\n return;\n }\n yield line;\n }\n } finally {\n controller.signal.removeEventListener('abort', cancel);\n if (!closed) {\n cancel();\n }\n reader.releaseLock();\n }\n }\n\n async function* iterator(): AsyncIterator<Item, any, undefined> {\n if (consumed) {\n throw new OpenAIError('Cannot iterate over a consumed stream, use `.tee()` to split the stream.');\n }\n consumed = true;\n let done = false;\n try {\n for await (const line of iterLines()) {\n if (line) {\n let data: Item;\n try {\n data = JSON.parse(line) as Item;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new SyntaxError('Error reading response: malformed newline-delimited JSON.');\n }\n\n throw error;\n }\n\n yield data;\n }\n }\n done = true;\n } catch (e) {\n // If the user calls `stream.controller.abort()`, we should exit without throwing.\n if (controller.signal.aborted || isAbortError(e)) {\n return;\n }\n throw e;\n } finally {\n // If the user `break`s, abort the ongoing request.\n if (!done) {\n controller.abort();\n }\n }\n }\n\n return new Stream(iterator, controller, client);\n }\n\n /** Starts consuming this stream; attempting to consume it again throws. */\n [Symbol.asyncIterator](): AsyncIterator<Item> {\n return this.iterator();\n }\n\n /**\n * Splits the stream into two streams which can be\n * independently read from at different speeds.\n * Closing a branch discards its buffered events without stopping its sibling.\n * Future reads on that branch finish immediately; previously issued `next()`\n * promises remain shared with its sibling and may still resolve with events.\n * Closing both branches invokes the source iterator's `return()` when available.\n * For {@link Stream.fromReadableStream}, closing both branches before iteration\n * starts does not cancel the supplied readable; cancel that readable directly.\n */\n tee(): [Stream<Item>, Stream<Item>] {\n const { controller } = this;\n const left = createStreamTeeQueue<Item>();\n const right = createStreamTeeQueue<Item>();\n const iterator = this.iterator();\n\n const teeIterator = (queue: StreamTeeQueue<Item>): AsyncIterator<Item> => ({\n next: () => {\n if (queue.canceled) {\n return Promise.resolve({ value: undefined, done: true });\n }\n if (queue.length === 0) {\n const result = iterator.next();\n left.enqueue(result);\n right.enqueue(result);\n }\n return queue.dequeue()!;\n },\n return: async () => {\n if (!queue.canceled) {\n queue.cancel();\n if (left.canceled && right.canceled) {\n await this.#cancelIterator(iterator, controller);\n }\n }\n return { value: undefined, done: true };\n },\n });\n\n const branch = (queue: StreamTeeQueue<Item>) => {\n const stream = new Stream(() => teeIterator(queue), controller, this.#client);\n stream.#isTeeBranch = true;\n return stream;\n };\n return [branch(left), branch(right)];\n }\n\n /**\n * Converts this stream to a newline-separated ReadableStream of\n * JSON stringified values in the stream\n * which can be turned back into a Stream with `Stream.fromReadableStream()`.\n * Canceling a response-backed readable aborts its request. Canceling a tee\n * branch discards its buffered events and leaves sibling consumers running.\n */\n toReadableStream(): ReadableStream {\n const { controller } = this;\n let iter: AsyncIterator<Item>;\n\n return makeReadableStream({\n start: async () => {\n iter = this[Symbol.asyncIterator]();\n },\n async pull(ctrl: any) {\n try {\n const { value, done } = await iter.next();\n if (done) {\n return ctrl.close();\n }\n\n const bytes = encodeUTF8(JSON.stringify(value) + '\\n');\n\n ctrl.enqueue(bytes);\n } catch (err) {\n ctrl.error(err);\n }\n },\n cancel: () => this.#cancelIterator(iter, controller),\n });\n }\n\n async #cancelIterator(iterator: AsyncIterator<Item>, controller: AbortController): Promise<void> {\n const returnMethod = iterator.return;\n if (returnMethod) {\n if (!this.#isTeeBranch) {\n controller.abort();\n }\n await Reflect.apply(returnMethod, iterator, []);\n }\n }\n}\n\nfunction createAbortableSSESource(body: NonNullable<Response['body']>, signal: AbortSignal) {\n const reader = typeof body.getReader === 'function' ? body.getReader() : undefined;\n const source = reader\n ? {\n next: () => reader.read(),\n return: () => reader.cancel(),\n }\n : ReadableStreamToAsyncIterable<Bytes>(body)[Symbol.asyncIterator]();\n const ended: IteratorResult<Bytes> = { value: undefined, done: true };\n let closed = false;\n let canceled = false;\n let cancellation: Promise<unknown> | undefined;\n let interrupt: (() => void) | undefined;\n\n const waitForAbort = () =>\n // oxlint-disable-next-line promise/avoid-new -- AbortSignal callbacks need a portable Promise bridge.\n new Promise<void>((resolve) => {\n interrupt = resolve;\n });\n\n const cancel = () => {\n if (canceled || closed) {\n return cancellation;\n }\n canceled = true;\n try {\n cancellation = Promise.resolve(source.return?.());\n } catch (error) {\n cancellation = Promise.reject(error);\n }\n cancellation.catch(() => undefined);\n return cancellation;\n };\n const abort = () => {\n queueMicrotask(() => {\n interrupt?.();\n cancel();\n });\n };\n const iterator: AsyncIterableIterator<Bytes> = {\n async next() {\n if (signal.aborted) {\n return ended;\n }\n const aborted = waitForAbort().then(() => ended);\n try {\n const result = await Promise.race([source.next(), aborted]);\n if (signal.aborted) {\n return ended;\n }\n if (result.done) {\n closed = true;\n return ended;\n }\n return { value: result.value, done: false };\n } catch (error) {\n if (signal.aborted && (isAbortError(error) || error === signal.reason)) {\n return ended;\n }\n throw error;\n } finally {\n interrupt = undefined;\n }\n },\n async return() {\n const pending = cancel();\n if (pending && !signal.aborted) {\n const aborted = waitForAbort();\n try {\n if (!signal.aborted) {\n await Promise.race([pending, aborted]);\n }\n } finally {\n interrupt = undefined;\n }\n }\n return ended;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n\n return {\n iterator,\n start() {\n signal.addEventListener('abort', abort, { once: true });\n if (signal.aborted) {\n abort();\n }\n },\n async cleanup(failed: boolean) {\n let cleanupError: unknown;\n try {\n signal.removeEventListener('abort', abort);\n } catch (error) {\n cleanupError = error;\n }\n if (!closed) {\n const pending = cancel();\n if (pending && !failed && !signal.aborted) {\n try {\n await pending;\n } catch (error) {\n cleanupError ??= error;\n }\n }\n }\n if (reader) {\n try {\n reader.releaseLock();\n } catch (error) {\n cleanupError ??= error;\n }\n }\n if (cleanupError !== undefined && !failed && !signal.aborted) {\n throw cleanupError;\n }\n },\n };\n}\n\n/**\n * Decodes complete SSE records from a response and aborts when its body is absent.\n * Complete events are decoded on demand without imposing a line or event size limit.\n *\n * @yields {ServerSentEvent} Each decoded server-sent event in wire order.\n */\nexport async function* _iterSSEMessages(\n response: Response,\n controller: AbortController,\n): AsyncGenerator<ServerSentEvent, void, unknown> {\n if (!response.body) {\n controller.abort();\n if (\n (globalThis as any).navigator !== undefined &&\n (globalThis as any).navigator.product === 'ReactNative'\n ) {\n throw new OpenAIError(\n `The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api`,\n );\n }\n throw new OpenAIError(`Attempted to iterate over a response with no body`);\n }\n\n const sseDecoder = new SSEDecoder();\n const lineDecoder = new LineDecoder();\n const { signal } = controller;\n const source = createAbortableSSESource(response.body, signal);\n let failed = false;\n\n try {\n source.start();\n for await (const sseChunk of iterSSEChunks(source.iterator)) {\n if (signal.aborted) {\n return;\n }\n for (const line of lineDecoder.decode(sseChunk)) {\n if (signal.aborted) {\n return;\n }\n const sse = sseDecoder.decode(line);\n if (sse) {\n yield sse;\n }\n }\n }\n if (signal.aborted) {\n return;\n }\n for (const line of lineDecoder.flush()) {\n if (signal.aborted) {\n return;\n }\n const sse = sseDecoder.decode(line);\n if (sse) {\n yield sse;\n }\n }\n } catch (error) {\n failed = true;\n if (!signal.aborted || (!isAbortError(error) && error !== signal.reason)) {\n throw error;\n }\n } finally {\n await source.cleanup(failed);\n }\n}\n\n// A `\\r\\n\\r\\n` separator may retain up to three bytes from the previous chunk.\nconst DOUBLE_NEWLINE_DELIMITER_MAX_OVERLAP_BYTES = 3;\n\n/**\n * Given an async iterable iterator, iterates over it and yields full\n * SSE chunks, i.e. yields when a double new-line is encountered.\n *\n * @yields {Uint8Array} A complete SSE chunk.\n */\nasync function* iterSSEChunks(iterator: AsyncIterableIterator<Bytes>): AsyncGenerator<Uint8Array> {\n let data = new Uint8Array();\n let dataStart = 0;\n let dataEnd = 0;\n let searchStartIndex = 0;\n\n for await (const chunk of iterator) {\n if (chunk == null) {\n continue;\n }\n\n let binaryChunk: Uint8Array;\n if (chunk instanceof ArrayBuffer) {\n binaryChunk = new Uint8Array(chunk);\n } else if (typeof chunk === 'string') {\n binaryChunk = encodeUTF8(chunk);\n } else {\n binaryChunk = chunk;\n }\n\n if (dataEnd + binaryChunk.length > data.length) {\n const bufferedLength = dataEnd - dataStart;\n\n // Compact only when it reclaims substantial space without moving a large live tail repeatedly.\n if (dataStart >= data.length / 2 && bufferedLength + binaryChunk.length <= data.length) {\n data.copyWithin(0, dataStart, dataEnd);\n } else {\n const newData = new Uint8Array(Math.max(data.length * 2, bufferedLength + binaryChunk.length));\n newData.set(data.subarray(dataStart, dataEnd));\n data = newData;\n }\n\n searchStartIndex -= dataStart;\n dataStart = 0;\n dataEnd = bufferedLength;\n }\n\n data.set(binaryChunk, dataEnd);\n dataEnd += binaryChunk.length;\n\n let patternIndex;\n while ((patternIndex = findDoubleNewlineIndex(data.subarray(searchStartIndex, dataEnd))) !== -1) {\n patternIndex += searchStartIndex;\n yield data.slice(dataStart, patternIndex);\n dataStart = patternIndex;\n searchStartIndex = dataStart;\n }\n\n searchStartIndex = Math.max(dataStart, dataEnd - DOUBLE_NEWLINE_DELIMITER_MAX_OVERLAP_BYTES);\n }\n\n if (dataEnd > dataStart) {\n yield data.slice(dataStart, dataEnd);\n }\n}\n\nclass SSEDecoder {\n private data: string[];\n private event: string | null = null;\n private chunks: string[];\n\n constructor() {\n this.data = [];\n this.chunks = [];\n }\n\n decode(line: string) {\n if (line.endsWith('\\r')) {\n line = line.slice(0, -1);\n }\n\n if (!line) {\n // empty line and we didn't previously encounter any messages\n if (!this.event && !this.data.length) {\n return null;\n }\n\n const sse: ServerSentEvent = {\n event: this.event,\n data: this.data.join('\\n'),\n raw: this.chunks,\n };\n\n this.event = null;\n this.data = [];\n this.chunks = [];\n\n return sse;\n }\n\n this.chunks.push(line);\n\n if (line.startsWith(':')) {\n return null;\n }\n\n const [fieldname, , initialValue] = partition(line, ':');\n let value = initialValue;\n\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n\n if (fieldname === 'event') {\n this.event = value;\n } else if (fieldname === 'data') {\n this.data.push(value);\n }\n\n return null;\n }\n}\n\nfunction partition(str: string, delimiter: string): [string, string, string] {\n const index = str.indexOf(delimiter);\n if (index !== -1) {\n return [str.slice(0, index), delimiter, str.slice(index + delimiter.length)];\n }\n\n return [str, '', ''];\n}\n","import type {\n ParsedResponse,\n Response,\n ResponseCreateParamsBase,\n ResponseCreateParamsStreaming,\n ResponseStreamEvent,\n ResponseTextConfig,\n} from '../../resources/responses/responses';\nimport type { RequestOptions } from '../../internal/request-options';\nimport type { ReadableStream } from '../../internal/shim-types';\nimport { APIError, APIUserAbortError, OpenAIError } from '../../error';\nimport type OpenAI from '../../index';\nimport { EventStream } from '../EventStream';\nimport type { BaseEvents } from '../EventStream';\nimport type { ResponseFunctionCallArgumentsDeltaEvent, ResponseTextDeltaEvent } from './EventTypes';\nimport {\n accumulateResponseWithContext,\n createResponseContext,\n} from '../../internal/responses/response-accumulator';\nimport type { ParseableToolsParams } from '../ResponsesParser';\nimport { maybeParseResponse } from '../ResponsesParser';\nimport { Stream } from '../../streaming';\n\n/** Parameters for starting a new response stream or replaying an existing response. */\nexport type ResponseStreamParams = ResponseCreateAndStreamParams | ResponseStreamByIdParams;\n\n/** Response-creation parameters accepted by the streaming convenience helper. */\nexport type ResponseCreateAndStreamParams = Omit<ResponseCreateParamsBase, 'stream'> & {\n /** Streaming is always enabled by the helper and may be specified explicitly. */\n stream?: true;\n};\n\n/** Parameters for replaying an existing response and optionally filtering emitted events. */\nexport type ResponseStreamByIdParams = {\n /**\n * The ID of the response to stream.\n */\n response_id: string;\n /**\n * If provided, events with a sequence number less than or equal to this value\n * will not be emitted. The helper still replays them internally to build a\n * complete snapshot for later events and `finalResponse()`.\n */\n starting_after?: number;\n /**\n * Configuration options for a text response from the model. Can be plain text or\n * structured JSON data. Learn more:\n *\n * - [Text inputs and outputs](https://platform.openai.com/docs/guides/text)\n * - [Structured Outputs](https://platform.openai.com/docs/guides/structured-outputs)\n */\n text?: ResponseTextConfig;\n\n /**\n * An array of tools the model may call while generating a response. When continuing a stream, provide\n * the same tools as the original request.\n */\n tools?: ParseableToolsParams;\n};\n\n/** Raw Responses API events, lifecycle notifications, and snapshot-enhanced delta listeners. */\ntype ResponseEvents = BaseEvents &\n Omit<\n {\n [K in ResponseStreamEvent['type']]: (\n event: Extract<\n ResponseStreamEvent,\n {\n /** Event discriminator that selects the listener's precise server-event payload. */\n type: K;\n }\n >,\n ) => void;\n },\n 'response.output_text.delta' | 'response.function_call_arguments.delta' | 'error'\n > & {\n /** Called for every raw response event that passes the replay sequence filter. */\n event: (event: ResponseStreamEvent) => void;\n /** Called with each text fragment and the complete text accumulated for its content part. */\n 'response.output_text.delta': (event: ResponseTextDeltaEvent) => void;\n /** Called with each argument fragment and the complete JSON accumulated for its function call. */\n 'response.function_call_arguments.delta': (event: ResponseFunctionCallArgumentsDeltaEvent) => void;\n };\n\n/** Response request parameters retained to parse structured output and tool arguments. */\nexport type ResponseStreamingParams = Omit<ResponseCreateParamsBase, 'stream'> & {\n /** Streaming is always enabled by the helper and may be specified explicitly. */\n stream?: true;\n};\n\n/** Streams Responses API events while accumulating the latest response and parsed output. */\nexport class ResponseStream<ParsedT = null>\n extends EventStream<ResponseEvents>\n implements AsyncIterable<ResponseStreamEvent>\n{\n #params: ResponseStreamingParams | null;\n #currentResponseSnapshot: Response | undefined;\n #finalResponse: ParsedResponse<ParsedT> | undefined;\n #accumulatorContext = createResponseContext();\n\n /** Creates an unstarted stream, retaining request parameters for structured-output parsing. */\n constructor(params: ResponseStreamingParams | null) {\n super();\n this.#params = params;\n }\n\n /** Starts a new response stream or replays an existing response by its identifier. */\n static createResponse<ParsedT>(\n client: OpenAI,\n params: ResponseStreamParams,\n options?: RequestOptions,\n ): ResponseStream<ParsedT> {\n const runner = new ResponseStream<ParsedT>(params as ResponseCreateParamsStreaming);\n runner._run(() =>\n runner._createOrRetrieveResponse(client, params, {\n ...options,\n __metadata: { ...options?.__metadata, helperMethod: 'stream' },\n }),\n );\n return runner;\n }\n\n /** Consumes serialized response events from a readable stream in another runtime. */\n static fromReadableStream(stream: ReadableStream): ResponseStream<null> {\n const runner = new ResponseStream(null);\n runner._run(() => runner._fromReadableStream(stream));\n return runner;\n }\n\n #beginRequest() {\n if (this.ended) {\n return;\n }\n this.#currentResponseSnapshot = undefined;\n this.#accumulatorContext = createResponseContext();\n }\n\n #addEvent(this: ResponseStream<ParsedT>, event: ResponseStreamEvent, starting_after: number | null) {\n if (this.ended) {\n return;\n }\n\n const maybeEmit = (name: string, event: ResponseStreamEvent & { snapshot?: string }) => {\n if (starting_after == null || event.sequence_number > starting_after) {\n this._emit(name as any, event);\n }\n };\n\n if (event.type === 'error') {\n // First-party providers nest their error payload; retain flat compatibility for\n // serialized events matching the currently published event schema.\n const error =\n 'error' in event && typeof event.error === 'object' && event.error !== null ? event.error : event;\n throw new APIError(undefined, error, event.message, undefined);\n }\n\n let dispatchEvent: ResponseStreamEvent = event;\n const response = accumulateResponseWithContext(\n event,\n this.#currentResponseSnapshot,\n this.#accumulatorContext,\n true,\n (sanitizedEvent) => {\n dispatchEvent = sanitizedEvent;\n },\n );\n this.#currentResponseSnapshot = response;\n maybeEmit('event', event);\n\n switch (dispatchEvent.type) {\n case 'response.output_text.delta': {\n const output = response.output[dispatchEvent.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${dispatchEvent.output_index}`);\n }\n if (output.type === 'message') {\n const content = output.content[dispatchEvent.content_index];\n if (!content) {\n throw new OpenAIError(`missing content at index ${dispatchEvent.content_index}`);\n }\n if (content.type !== 'output_text') {\n throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);\n }\n\n maybeEmit('response.output_text.delta', {\n ...dispatchEvent,\n type: dispatchEvent.type,\n item_id: dispatchEvent.item_id,\n output_index: dispatchEvent.output_index,\n content_index: dispatchEvent.content_index,\n snapshot: content.text,\n });\n }\n break;\n }\n case 'response.function_call_arguments.delta': {\n const output = response.output[dispatchEvent.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${dispatchEvent.output_index}`);\n }\n if (output.type === 'function_call') {\n maybeEmit('response.function_call_arguments.delta', {\n ...dispatchEvent,\n type: dispatchEvent.type,\n item_id: dispatchEvent.item_id,\n output_index: dispatchEvent.output_index,\n snapshot: output.arguments,\n });\n }\n break;\n }\n default: {\n maybeEmit(dispatchEvent.type, event);\n break;\n }\n }\n }\n\n #endRequest(): ParsedResponse<ParsedT> {\n if (this.ended) {\n throw new OpenAIError(`stream has ended, this shouldn't happen`);\n }\n const snapshot = this.#currentResponseSnapshot;\n if (!snapshot) {\n throw new OpenAIError(`request ended without sending any events`);\n }\n this.#currentResponseSnapshot = undefined;\n this.#accumulatorContext = createResponseContext();\n const parsedResponse = finalizeResponse<ParsedT>(snapshot, this.#params);\n this.#finalResponse = parsedResponse;\n\n return parsedResponse;\n }\n\n protected async _createOrRetrieveResponse(\n client: OpenAI,\n params: ResponseStreamParams,\n options?: RequestOptions,\n ): Promise<ParsedResponse<ParsedT>> {\n this._listenForAbort(options?.signal);\n this.#beginRequest();\n\n let stream: Stream<ResponseStreamEvent> | undefined;\n let starting_after: number | null = null;\n if ('response_id' in params) {\n // Keep the full replay so that `accumulateResponse()` sees `response.created` and can build\n // complete snapshots before locally filtering events at `starting_after`.\n stream = await client.responses.retrieve(\n params.response_id,\n { stream: true },\n { ...options, signal: this.controller.signal, stream: true },\n );\n starting_after = params.starting_after ?? null;\n } else {\n stream = await client.responses.create(\n { ...params, stream: true },\n { ...options, signal: this.controller.signal },\n );\n }\n\n this._connected();\n for await (const event of stream) {\n this.#addEvent(event, starting_after);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this.#endRequest();\n }\n\n protected async _fromReadableStream(\n readableStream: ReadableStream,\n options?: RequestOptions,\n ): Promise<ParsedResponse<ParsedT>> {\n this._listenForAbort(options?.signal);\n this.#beginRequest();\n this._connected();\n const stream = Stream.fromReadableStream<ResponseStreamEvent>(readableStream, this.controller);\n for await (const event of stream) {\n this.#addEvent(event, null);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this.#endRequest();\n }\n\n /** Iterates over response events; stopping iteration early aborts the underlying request. */\n [Symbol.asyncIterator](this: ResponseStream<ParsedT>): AsyncIterator<ResponseStreamEvent> {\n return this._createIterator<ResponseStreamEvent>(\n (push) => {\n const onEvent = (event: ResponseStreamEvent) => push(event);\n this.on('event', onEvent);\n return () => this.off('event', onEvent);\n },\n { onReturn: () => this.abort() },\n );\n }\n\n /**\n * Waits for the stream to end and returns its latest accumulated response.\n *\n * A clean end after at least one response event resolves even when the response is\n * incomplete. Network errors, cancellation, and streams without a response reject.\n */\n async finalResponse(): Promise<ParsedResponse<ParsedT>> {\n await this.done();\n const response = this.#finalResponse;\n if (!response) {\n throw new OpenAIError('stream ended without producing a Response');\n }\n return response;\n }\n}\n\nfunction finalizeResponse<ParsedT>(\n snapshot: Response,\n params: ResponseStreamingParams | null,\n): ParsedResponse<ParsedT> {\n return maybeParseResponse(snapshot, params);\n}\n","/** 本文件负责使用官方 SDK 将 SSE 事件还原为完整响应对象。 */\r\n\r\nimport { MessageStream } from \"@anthropic-ai/sdk/lib/MessageStream\";\r\nimport type { Protocol, SseRow } from \"@tracelet/shared\";\r\nimport { ResponseStream } from \"openai/lib/responses/ResponseStream\";\r\n\r\nconst encoder = new TextEncoder();\r\n\r\n/** 提取官方 SDK 可消费的逐行 JSON 事件。 */\r\nfunction jsonLines(events: SseRow[]): string[] {\r\n return events\r\n .map((event) => event.data.trim())\r\n .filter((data) => data.startsWith(\"{\") && data.endsWith(\"}\"));\r\n}\r\n\r\n/** 返回最后一个 response.completed 事件的位置。 */\r\nfunction completedIndex(values: Record<string, unknown>[]): number {\r\n for (let index = values.length - 1; index >= 0; index -= 1) {\r\n if (values[index]?.type === \"response.completed\") {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\n/** 兼容 Codex lite 终态中 output 为空的流式响应。 */\r\nfunction fixLite(lines: string[]): string[] {\r\n const values = lines.map((line) => JSON.parse(line) as Record<string, unknown>);\r\n const created = values.findIndex((value) => value.type === \"response.created\");\r\n const firstItem = values.findIndex((value) => value.type === \"response.output_item.added\");\r\n const completed = completedIndex(values);\r\n const terminal = values[completed]?.response as { output?: unknown[] } | undefined;\r\n\r\n if (created < 0 || firstItem <= created || completed <= firstItem || terminal?.output?.length !== 0) {\r\n return lines;\r\n }\r\n\r\n // 保留前置生命周期事件,再由 SDK 在 lite 终态上继续累加完整 output。\r\n return [\r\n ...lines.slice(0, firstItem),\r\n lines[completed]!,\r\n ...lines.slice(firstItem, completed),\r\n ...lines.slice(completed + 1),\r\n ];\r\n}\r\n\r\n/** 把逐行 JSON 转为官方 SDK 可消费的 ReadableStream。 */\r\nfunction toStream(lines: string[]): ReadableStream<Uint8Array> {\r\n let index = 0;\r\n\r\n return new ReadableStream<Uint8Array>({\r\n /** 每次拉取时向 SDK 提供一个完整的 JSON 事件。 */\r\n pull(controller) {\r\n const line = lines[index];\r\n if (line === undefined) {\r\n controller.close();\r\n return;\r\n }\r\n\r\n controller.enqueue(encoder.encode(`${line}\\n`));\r\n index += 1;\r\n },\r\n });\r\n}\r\n\r\n/** 使用 Anthropic SDK 的 finalMessage 生成完整 Message。 */\r\nasync function buildAnthropic(events: SseRow[]): Promise<unknown> {\r\n const stream = MessageStream.fromReadableStream(toStream(jsonLines(events)));\r\n return stream.finalMessage();\r\n}\r\n\r\n/** 使用 OpenAI SDK 的 finalResponse 生成完整 Response。 */\r\nasync function buildOpenAI(events: SseRow[]): Promise<unknown> {\r\n const stream = ResponseStream.fromReadableStream(toStream(fixLite(jsonLines(events))));\r\n return stream.finalResponse();\r\n}\r\n\r\n/** 根据协议调用对应官方 SDK 的流式累加方法。 */\r\nexport async function buildResponse(protocol: Protocol, events: SseRow[]): Promise<unknown> {\r\n return protocol === \"anthropic\" ? buildAnthropic(events) : buildOpenAI(events);\r\n}\r\n","/** 本文件负责从请求和响应链中识别持续会话。 */\r\n\r\nimport type { HeaderMap, Protocol, SessionMatch } from \"@tracelet/shared\";\r\n\r\nexport class SessionResolver {\r\n private readonly responses = new Map<string, string>();\r\n\r\n /** 根据协议显式标识和已有响应链确定会话。 */\r\n resolve(protocol: Protocol, headers: HeaderMap, body: unknown, runId: string): SessionMatch {\r\n const data = body && typeof body === \"object\" ? (body as Record<string, unknown>) : {};\r\n\r\n if (protocol === \"anthropic\") {\r\n const session = headers?.[\"x-claude-code-session-id\"];\r\n const agent = headers?.[\"x-claude-code-agent-id\"];\r\n const parent = headers?.[\"x-claude-code-parent-agent-id\"];\r\n\r\n if (typeof session === \"string\" && session) {\r\n return {\r\n id: `claude:${session}`,\r\n source: \"header\",\r\n ...(typeof agent === \"string\" ? { agentId: agent } : {}),\r\n ...(typeof parent === \"string\" ? { parentAgentId: parent } : {}),\r\n };\r\n }\r\n }\r\n\r\n if (protocol === \"openai\") {\r\n const session = headers?.[\"session-id\"] ?? headers?.[\"thread-id\"];\r\n if (typeof session === \"string\" && session) {\r\n return { id: `codex:${session}`, source: \"header\" };\r\n }\r\n }\r\n\r\n const conversation = data?.conversation;\r\n const conversationId =\r\n typeof conversation === \"string\"\r\n ? conversation\r\n : conversation && typeof conversation === \"object\"\r\n ? (conversation as Record<string, unknown>)?.id\r\n : undefined;\r\n\r\n if (typeof conversationId === \"string\" && conversationId) {\r\n return { id: `openai:${conversationId}`, source: \"conversation\" };\r\n }\r\n\r\n const previous = data?.previous_response_id;\r\n if (typeof previous === \"string\" && previous) {\r\n return {\r\n id: this.responses.get(previous) ?? `run:${runId}`,\r\n source: this.responses.has(previous) ? \"response-chain\" : \"run\",\r\n previousResponseId: previous,\r\n };\r\n }\r\n\r\n return { id: `run:${runId}`, source: \"run\" };\r\n }\r\n\r\n /** 将响应 ID 绑定到已识别的内部会话。 */\r\n bind(responseId: string, sessionId: string): void {\r\n this.responses.set(responseId, sessionId);\r\n }\r\n}\r\n","/** 本文件负责将任意网络 chunk 增量切分为完整 SSE 事件。 */\r\n\r\nimport type { SseRow } from \"@tracelet/shared\";\r\n\r\ntype EventHandler = (event: SseRow) => void;\r\n\r\nexport class SseParser {\r\n private readonly decoder = new TextDecoder();\r\n private readonly onEvent: EventHandler;\r\n private buffer = \"\";\r\n private eventSeq = 0;\r\n private firstChunk = 0;\r\n private lastChunk = 0;\r\n private lastTimeUs = 0;\r\n\r\n /** 创建一个将完整事件交给回调的 SSE 解析器。 */\r\n constructor(onEvent: EventHandler) {\r\n this.onEvent = onEvent;\r\n }\r\n\r\n /** 输入一个原始响应 chunk,并尽可能产出完整事件。 */\r\n push(chunk: Uint8Array, chunkSeq: number, tUs: number): void {\r\n if (!this.buffer) {\r\n this.firstChunk = chunkSeq;\r\n }\r\n\r\n this.lastChunk = chunkSeq;\r\n this.lastTimeUs = tUs;\r\n this.buffer += this.decoder.decode(chunk, { stream: true });\r\n this.flush(false);\r\n }\r\n\r\n /** 结束字符解码,并提交最后一个没有空行结尾的事件。 */\r\n end(): void {\r\n this.buffer += this.decoder.decode();\r\n this.flush(true);\r\n }\r\n\r\n /** 从当前缓冲区依次提取 SSE 事件。 */\r\n private flush(final: boolean): void {\r\n let match = this.buffer.match(/\\r?\\n\\r?\\n/);\r\n\r\n while (match?.index !== undefined) {\r\n const raw = this.buffer.slice(0, match.index);\r\n this.buffer = this.buffer.slice(match.index + match[0].length);\r\n this.emit(raw);\r\n this.firstChunk = this.lastChunk;\r\n match = this.buffer.match(/\\r?\\n\\r?\\n/);\r\n }\r\n\r\n if (final && this.buffer.trim()) {\r\n this.emit(this.buffer);\r\n this.buffer = \"\";\r\n }\r\n }\r\n\r\n /** 解析一个完整 SSE block 的 event 和 data 字段。 */\r\n private emit(raw: string): void {\r\n if (!raw.trim()) {\r\n return;\r\n }\r\n\r\n let event = \"message\";\r\n const data: string[] = [];\r\n\r\n for (const line of raw.split(/\\r?\\n/)) {\r\n if (line.startsWith(\"event:\")) {\r\n event = line.slice(6).trim();\r\n } else if (line.startsWith(\"data:\")) {\r\n data.push(line.slice(5).trimStart());\r\n } else if (line.startsWith(\":\")) {\r\n event = \"comment\";\r\n data.push(line.slice(1).trimStart());\r\n }\r\n }\r\n\r\n this.onEvent({\r\n seq: this.eventSeq++,\r\n event,\r\n data: data.join(\"\\n\"),\r\n raw,\r\n firstChunk: this.firstChunk,\r\n lastChunk: this.lastChunk,\r\n tUs: this.lastTimeUs,\r\n });\r\n }\r\n}\r\n","/** 本文件负责协调原始流记录、SSE 分帧、会话识别和 SDK 响应还原。 */\r\n\r\nimport type { IncomingHttpHeaders } from \"node:http\";\r\nimport { buildResponse, decodeBody, parseRequest } from \"@tracelet/protocols\";\r\nimport {\r\n elapsedUs,\r\n makeId,\r\n nowIso,\r\n redactHeaders,\r\n type ExchangeMeta,\r\n type Protocol,\r\n type SseRow,\r\n} from \"@tracelet/shared\";\r\nimport { type ExchangeWriter, FileStore } from \"@tracelet/storage\";\r\nimport { SessionResolver } from \"./session.js\";\r\nimport { SseParser } from \"./sse.js\";\r\n\r\nexport interface CaptureStart {\r\n runId: string;\r\n protocol: Protocol;\r\n method: string;\r\n path: string;\r\n headers: IncomingHttpHeaders;\r\n}\r\n\r\ntype ChangeHandler = (meta: ExchangeMeta) => void;\r\n\r\nexport class Capture {\r\n private readonly writer: ExchangeWriter;\r\n private readonly resolver: SessionResolver;\r\n private readonly onChange: ChangeHandler;\r\n private readonly clock = process.hrtime.bigint();\r\n private readonly reqParts: Buffer[] = [];\r\n private readonly resParts: Buffer[] = [];\r\n private readonly events: SseRow[] = [];\r\n private readonly parser: SseParser;\r\n private meta: ExchangeMeta;\r\n private done = false;\r\n\r\n /** 创建一次请求的完整捕获上下文。 */\r\n constructor(\r\n writer: ExchangeWriter,\r\n resolver: SessionResolver,\r\n meta: ExchangeMeta,\r\n onChange: ChangeHandler,\r\n ) {\r\n this.writer = writer;\r\n this.resolver = resolver;\r\n this.meta = meta;\r\n this.onChange = onChange;\r\n this.parser = new SseParser((event) => this.addEvent(event));\r\n }\r\n\r\n /** 记录一个请求 body chunk。 */\r\n reqChunk(chunk: Uint8Array): void {\r\n const data = Buffer.from(chunk);\r\n this.reqParts.push(data);\r\n this.meta.requestBytes += data.byteLength;\r\n this.writer.addReq(data, elapsedUs(this.clock));\r\n }\r\n\r\n /** 在请求 body 完成后解析模型参数并识别会话。 */\r\n reqEnd(): void {\r\n try {\r\n const raw = Buffer.concat(this.reqParts);\r\n const body = decodeBody(raw, this.meta.requestHeaders[\"content-encoding\"]);\r\n const text = Buffer.from(body).toString(\"utf8\");\r\n const parsed = parseRequest(text);\r\n const session = this.resolver.resolve(\r\n this.meta.protocol,\r\n this.meta.requestHeaders,\r\n parsed.body,\r\n this.meta.runId,\r\n );\r\n\r\n this.meta = {\r\n ...this.meta,\r\n sessionId: session.id,\r\n sessionSource: session.source,\r\n stream: parsed.stream,\r\n ...(parsed.model ? { model: parsed.model } : {}),\r\n ...(session.agentId ? { agentId: session.agentId } : {}),\r\n ...(session.parentAgentId ? { parentAgentId: session.parentAgentId } : {}),\r\n };\r\n this.writer.patch(this.meta);\r\n } catch {\r\n // 无法解析的请求仍然保留原始字节并归入当前 run。\r\n }\r\n }\r\n\r\n /** 记录上游响应状态和脱敏 Header。 */\r\n resStart(status: number, headers: IncomingHttpHeaders): void {\r\n this.meta = {\r\n ...this.meta,\r\n responseStatus: status,\r\n responseHeaders: redactHeaders(headers),\r\n };\r\n this.writer.patch(this.meta);\r\n }\r\n\r\n /** 记录并解析一个上游响应 chunk。 */\r\n resChunk(chunk: Uint8Array): void {\r\n const data = Buffer.from(chunk);\r\n const tUs = elapsedUs(this.clock);\r\n const seq = this.writer.addRes(data, tUs);\r\n\r\n if (!this.meta.firstByteAt) {\r\n this.meta.firstByteAt = nowIso();\r\n }\r\n\r\n this.resParts.push(data);\r\n this.meta.responseBytes += data.byteLength;\r\n this.parser.push(data, seq, tUs);\r\n }\r\n\r\n /** 完成记录,并通过对应官方 SDK 生成完整响应对象。 */\r\n async end(): Promise<void> {\r\n if (this.done) {\r\n return;\r\n }\r\n this.done = true;\r\n this.parser.end();\r\n\r\n try {\r\n const response = this.meta.stream\r\n ? await buildResponse(this.meta.protocol, this.events)\r\n : (JSON.parse(Buffer.concat(this.resParts).toString(\"utf8\")) as unknown);\r\n\r\n this.writer.saveResponse(response);\r\n this.bindResponse(response);\r\n } catch (error) {\r\n this.meta.reconstructError = error instanceof Error ? error.message : String(error);\r\n }\r\n\r\n this.meta.completedAt = nowIso();\r\n this.meta.captureComplete = true;\r\n this.writer.patch(this.meta);\r\n const writeError = await this.writer.close();\r\n\r\n if (writeError) {\r\n this.meta.captureComplete = false;\r\n this.meta.error = writeError.message;\r\n }\r\n\r\n this.onChange(this.meta);\r\n }\r\n\r\n /** 标记上游请求失败并结束当前记录。 */\r\n async fail(error: Error): Promise<void> {\r\n if (this.done) {\r\n return;\r\n }\r\n this.done = true;\r\n this.meta = {\r\n ...this.meta,\r\n error: error.message,\r\n completedAt: nowIso(),\r\n captureComplete: false,\r\n };\r\n this.writer.patch(this.meta);\r\n await this.writer.close();\r\n this.onChange(this.meta);\r\n }\r\n\r\n /** 持久化一个完整 SSE 事件。 */\r\n private addEvent(event: SseRow): void {\r\n this.events.push(event);\r\n this.writer.addEvent(event);\r\n }\r\n\r\n /** 从官方 SDK 响应对象中提取 ID 并延续 OpenAI 响应链。 */\r\n private bindResponse(response: unknown): void {\r\n if (this.meta.protocol !== \"openai\" || !response || typeof response !== \"object\") {\r\n return;\r\n }\r\n\r\n const id = (response as Record<string, unknown>)?.id;\r\n if (typeof id === \"string\" && id) {\r\n this.resolver.bind(id, this.meta.sessionId);\r\n }\r\n }\r\n}\r\n\r\nexport class Recorder {\r\n private readonly store: FileStore;\r\n private readonly resolver = new SessionResolver();\r\n private readonly onChange: ChangeHandler;\r\n private readonly active = new Set<Promise<void>>();\r\n\r\n /** 创建共享文件存储和会话状态的记录器。 */\r\n constructor(store: FileStore, onChange: ChangeHandler = () => undefined) {\r\n this.store = store;\r\n this.onChange = onChange;\r\n }\r\n\r\n /** 开始捕获一次模型 HTTP 请求。 */\r\n async start(input: CaptureStart): Promise<Capture> {\r\n const meta: ExchangeMeta = {\r\n id: makeId(\"ex\"),\r\n runId: input.runId,\r\n sessionId: `run:${input.runId}`,\r\n sessionSource: \"run\",\r\n protocol: input.protocol,\r\n method: input.method,\r\n path: input.path,\r\n stream: false,\r\n requestHeaders: redactHeaders(input.headers),\r\n startedAt: nowIso(),\r\n requestBytes: 0,\r\n responseBytes: 0,\r\n captureComplete: false,\r\n };\r\n const writer = await this.store.startExchange(meta);\r\n this.onChange(meta);\r\n return new Capture(writer, this.resolver, meta, this.onChange);\r\n }\r\n\r\n /** 跟踪后台收尾任务,确保服务退出前文件已写完。 */\r\n track(task: Promise<void>): void {\r\n this.active.add(task);\r\n task.finally(() => this.active.delete(task)).catch(() => undefined);\r\n }\r\n\r\n /** 等待所有正在写入的 exchange 完成。 */\r\n async drain(): Promise<void> {\r\n await Promise.allSettled([...this.active]);\r\n }\r\n}\r\n","/** 本文件负责扫描本地记录并为 Dashboard 组装查询结果。 */\r\n\r\nimport { readFile, readdir } from \"node:fs/promises\";\r\nimport { join } from \"node:path\";\r\nimport { buildResponse, decodeBody, parseRequest } from \"@tracelet/protocols\";\r\nimport type {\r\n ChunkRow,\r\n ChunkView,\r\n ExchangeDetail,\r\n ExchangeMeta,\r\n ExchangeSummary,\r\n ConversationDetail,\r\n SessionSummary,\r\n SseRow,\r\n} from \"@tracelet/shared\";\r\nimport { readJson, readJsonl } from \"./files.js\";\r\nimport { buildConversation } from \"./conversation.js\";\r\n\r\ninterface StoredMeta {\r\n dir: string;\r\n meta: ExchangeMeta;\r\n}\r\n\r\n/** 判断一次记录是否属于 Dashboard 需要展示的模型交互。 */\r\nfunction isVisible(meta: ExchangeMeta): boolean {\r\n const path = meta.path.split(\"?\", 1)[0];\r\n if (meta.method !== \"POST\") {\r\n return false;\r\n }\r\n // 只让实际推理接口进入会话,模型列表和健康检查仍保留在磁盘。\r\n return meta.protocol === \"anthropic\"\r\n ? Boolean(path?.endsWith(\"/messages\"))\r\n : Boolean(path?.endsWith(\"/responses\") || path?.endsWith(\"/chat/completions\"));\r\n}\r\n\r\n/** 判断 Codex Exchange 是否由系统后台任务发起。 */\r\nfunction isInternal(meta: ExchangeMeta): boolean {\r\n const value = meta.requestHeaders?.[\"x-codex-turn-metadata\"];\r\n const text = Array.isArray(value) ? value[0] : value;\r\n if (!text) {\r\n return false;\r\n }\r\n try {\r\n return (JSON.parse(text) as { thread_source?: string })?.thread_source === \"system\";\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/** 使用 Codex 请求 Header 修正旧记录中的会话归属。 */\r\nfunction normalizeMeta(meta: ExchangeMeta): ExchangeMeta {\r\n if (meta.protocol !== \"openai\" || meta.sessionSource !== \"run\") {\r\n return meta;\r\n }\r\n\r\n const session = meta.requestHeaders[\"session-id\"] ?? meta.requestHeaders[\"thread-id\"];\r\n return typeof session === \"string\" && session\r\n ? { ...meta, sessionId: `codex:${session}`, sessionSource: \"header\" }\r\n : meta;\r\n}\r\n\r\n/** 按记录的 Content-Encoding 返回可展示的请求文本。 */\r\nfunction decodeText(body: Buffer, meta: ExchangeMeta): string {\r\n const decoded = decodeBody(body, meta.requestHeaders[\"content-encoding\"]);\r\n return Buffer.from(decoded).toString(\"utf8\");\r\n}\r\n\r\n/** 读取目录;目录不存在时返回空列表。 */\r\nasync function readDirs(path: string): Promise<string[]> {\r\n try {\r\n const entries = await readdir(path, { withFileTypes: true });\r\n return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\n/** 扫描全部 exchange 元数据。 */\r\nasync function scan(root: string): Promise<StoredMeta[]> {\r\n const result: StoredMeta[] = [];\r\n const runsRoot = join(root, \"runs\");\r\n\r\n for (const date of await readDirs(runsRoot)) {\r\n const dateDir = join(runsRoot, date);\r\n for (const run of await readDirs(dateDir)) {\r\n const exchangesDir = join(dateDir, run, \"exchanges\");\r\n for (const exchange of await readDirs(exchangesDir)) {\r\n const dir = join(exchangesDir, exchange);\r\n try {\r\n const meta = await readJson<ExchangeMeta>(join(dir, \"meta.json\"));\r\n result.push({ dir, meta: normalizeMeta(meta) });\r\n } catch {\r\n // 未完成的损坏记录不进入 Dashboard 列表。\r\n }\r\n }\r\n }\r\n }\r\n\r\n return result.sort((left, right) => left.meta.startedAt.localeCompare(right.meta.startedAt));\r\n}\r\n\r\n/** 将 exchange 元数据缩减为列表摘要。 */\r\nfunction toSummary(meta: ExchangeMeta): ExchangeSummary {\r\n return {\r\n id: meta.id,\r\n runId: meta.runId,\r\n sessionId: meta.sessionId,\r\n protocol: meta.protocol,\r\n method: meta.method,\r\n path: meta.path,\r\n ...(meta.model ? { model: meta.model } : {}),\r\n ...(meta.responseStatus ? { status: meta.responseStatus } : {}),\r\n startedAt: meta.startedAt,\r\n ...(meta.completedAt ? { completedAt: meta.completedAt } : {}),\r\n responseBytes: meta.responseBytes,\r\n captureComplete: meta.captureComplete,\r\n };\r\n}\r\n\r\n/** 按会话聚合所有请求,供 Dashboard 左侧导航使用。 */\r\nexport async function listSessions(root: string): Promise<SessionSummary[]> {\r\n const groups = new Map<string, SessionSummary>();\r\n\r\n for (const item of await scan(root)) {\r\n if (!isVisible(item.meta)) {\r\n continue;\r\n }\r\n\r\n const current = groups.get(item.meta.sessionId);\r\n if (current) {\r\n current.exchanges.push(toSummary(item.meta));\r\n current.internal = current.internal === true && isInternal(item.meta);\r\n if (item.meta.completedAt) {\r\n current.endedAt = item.meta.completedAt;\r\n }\r\n continue;\r\n }\r\n\r\n groups.set(item.meta.sessionId, {\r\n id: item.meta.sessionId,\r\n protocol: item.meta.protocol,\r\n startedAt: item.meta.startedAt,\r\n ...(item.meta.completedAt ? { endedAt: item.meta.completedAt } : {}),\r\n ...(isInternal(item.meta) ? { internal: true } : {}),\r\n exchanges: [toSummary(item.meta)],\r\n });\r\n }\r\n\r\n return [...groups.values()].sort((left, right) => right.startedAt.localeCompare(left.startedAt));\r\n}\r\n\r\n/** 读取一次 exchange 的完整请求、响应、chunk 和事件。 */\r\nasync function readExchange(stored: StoredMeta): Promise<ExchangeDetail> {\r\n const [requestBody, responseBody, chunkRows, events] = await Promise.all([\r\n readFile(join(stored.dir, \"request.bin\")),\r\n readFile(join(stored.dir, \"response.bin\")),\r\n readJsonl<ChunkRow>(join(stored.dir, \"response-chunks.jsonl\")),\r\n readJsonl<SseRow>(join(stored.dir, \"sse-events.jsonl\")),\r\n ]);\r\n let requestText = requestBody.toString(\"utf8\");\r\n try {\r\n requestText = decodeText(requestBody, stored.meta);\r\n } catch {\r\n // 不支持的编码仍回退到原始文本,保证旧记录可以打开。\r\n }\r\n const responseText = responseBody.toString(\"utf8\");\r\n const chunks: ChunkView[] = chunkRows.map((row) => {\r\n const data = responseBody.subarray(row.offset, row.offset + row.length);\r\n return { ...row, text: data.toString(\"utf8\"), base64: data.toString(\"base64\") };\r\n });\r\n\r\n let meta = stored.meta;\r\n let request: unknown = requestText;\r\n let response: unknown = responseText;\r\n\r\n try {\r\n const parsed = parseRequest(requestText);\r\n request = parsed.body;\r\n meta = {\r\n ...meta,\r\n stream: parsed.stream,\r\n ...(parsed.model ? { model: parsed.model } : {}),\r\n };\r\n } catch {\r\n // 非 JSON 请求仍通过原始文本展示。\r\n }\r\n\r\n try {\r\n response = await readJson<unknown>(join(stored.dir, \"reconstructed.json\"));\r\n } catch {\r\n try {\r\n if (events.length > 0) {\r\n response = await buildResponse(meta.protocol, events);\r\n const { reconstructError: _error, ...validMeta } = meta;\r\n meta = validMeta;\r\n }\r\n } catch {\r\n // 无法还原的流仍通过原始 SSE 文本展示。\r\n }\r\n }\r\n\r\n return { meta, requestText, responseText, request, response, chunks, events };\r\n}\r\n\r\n/** 读取一次 exchange 的完整请求、响应、chunk 和事件。 */\r\nexport async function getExchange(root: string, id: string): Promise<ExchangeDetail | undefined> {\r\n const stored = (await scan(root)).find((item) => item.meta.id === id);\r\n return stored ? readExchange(stored) : undefined;\r\n}\r\n\r\n/** 从现有 Exchange 动态还原指定会话。 */\r\nexport async function getConversation(root: string, sessionId: string): Promise<ConversationDetail | undefined> {\r\n const stored = (await scan(root)).filter(\r\n (item) => item.meta.sessionId === sessionId && isVisible(item.meta),\r\n );\r\n if (stored.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const exchanges = await Promise.all(stored.map((item) => readExchange(item)));\r\n const first = stored[0]!.meta;\r\n const last = stored.at(-1)!.meta;\r\n const session: SessionSummary = {\r\n id: sessionId,\r\n protocol: first.protocol,\r\n startedAt: first.startedAt,\r\n ...(last.completedAt ? { endedAt: last.completedAt } : {}),\r\n exchanges: stored.map((item) => toSummary(item.meta)),\r\n };\r\n return buildConversation(session, exchanges);\r\n}\r\n","/** 本文件负责 Tracelet 记录文件的安全读写和路径组织。 */\r\n\r\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\r\nimport { dirname, join } from \"node:path\";\r\n\r\n/** 根据运行时间生成稳定的日期目录。 */\r\nexport function dateKey(iso: string): string {\r\n return iso.slice(0, 10);\r\n}\r\n\r\n/** 计算一次运行的本地目录。 */\r\nexport function getRunDir(root: string, iso: string, runId: string): string {\r\n return join(root, \"runs\", dateKey(iso), runId);\r\n}\r\n\r\n/** 通过临时文件和 rename 原子写入 JSON。 */\r\nexport async function writeJson(path: string, value: unknown): Promise<void> {\r\n const temp = `${path}.tmp`;\r\n await mkdir(dirname(path), { recursive: true });\r\n await writeFile(temp, `${JSON.stringify(value, null, 2)}\\n`, \"utf8\");\r\n await rename(temp, path);\r\n}\r\n\r\n/** 读取并解析一个 JSON 文件。 */\r\nexport async function readJson<T>(path: string): Promise<T> {\r\n return JSON.parse(await readFile(path, \"utf8\")) as T;\r\n}\r\n\r\n/** 读取 JSONL,并忽略崩溃时可能残留的不完整尾行。 */\r\nexport async function readJsonl<T>(path: string): Promise<T[]> {\r\n let text = \"\";\r\n\r\n try {\r\n text = await readFile(path, \"utf8\");\r\n } catch {\r\n return [];\r\n }\r\n\r\n const rows: T[] = [];\r\n for (const line of text.split(\"\\n\")) {\r\n if (!line.trim()) {\r\n continue;\r\n }\r\n\r\n try {\r\n rows.push(JSON.parse(line) as T);\r\n } catch {\r\n break;\r\n }\r\n }\r\n\r\n return rows;\r\n}\r\n","/** 本文件负责从现有请求与响应记录中还原会话、消息和工具调用。 */\r\n\r\nimport type {\r\n ConversationDetail,\r\n ConversationItem,\r\n ConversationKind,\r\n ConversationRole,\r\n ConversationTurn,\r\n ExchangeDetail,\r\n HeaderValue,\r\n SessionSummary,\r\n} from \"@tracelet/shared\";\r\n\r\ntype DraftKind = ConversationKind | \"tool-result\";\r\n\r\ninterface DraftItem {\r\n sourceId?: string;\r\n kind: DraftKind;\r\n role?: ConversationRole;\r\n text?: string;\r\n name?: string;\r\n callId?: string;\r\n input?: unknown;\r\n output?: unknown;\r\n status?: \"pending\" | \"complete\" | \"error\";\r\n}\r\n\r\ninterface TurnMeta {\r\n id?: string;\r\n internal: boolean;\r\n}\r\n\r\n/** 将未知值收窄为普通对象。 */\r\nfunction record(value: unknown): Record<string, unknown> | undefined {\r\n return value && typeof value === \"object\" && !Array.isArray(value)\r\n ? value as Record<string, unknown>\r\n : undefined;\r\n}\r\n\r\n/** 将未知值收窄为数组。 */\r\nfunction array(value: unknown): unknown[] {\r\n return Array.isArray(value) ? value : [];\r\n}\r\n\r\n/** 返回非空字符串值。 */\r\nfunction string(value: unknown): string | undefined {\r\n return typeof value === \"string\" && value.trim() ? value : undefined;\r\n}\r\n\r\n/** 返回单值 Header 文本。 */\r\nfunction header(value: HeaderValue | undefined): string | undefined {\r\n return string(Array.isArray(value) ? value[0] : value);\r\n}\r\n\r\n/** 安全解析 JSON 字符串。 */\r\nfunction json(value: unknown): unknown {\r\n if (typeof value !== \"string\") {\r\n return value;\r\n }\r\n try {\r\n return JSON.parse(value) as unknown;\r\n } catch {\r\n return value;\r\n }\r\n}\r\n\r\n/** 生成可用于消息去重的稳定文本。 */\r\nfunction stable(value: unknown): string {\r\n try {\r\n return JSON.stringify(value) ?? String(value);\r\n } catch {\r\n return String(value);\r\n }\r\n}\r\n\r\n/** 判断文本是否属于 Agent 注入的运行环境上下文。 */\r\nfunction isContext(text: string): boolean {\r\n const value = text.trim();\r\n return value.startsWith(\"<system-reminder>\")\r\n || value.startsWith(\"<environment_context>\")\r\n || value.startsWith(\"<in-app-browser-context\")\r\n || value.startsWith(\"<recommended_plugins>\")\r\n || value.startsWith(\"<skills_instructions>\")\r\n || value.startsWith(\"# AGENTS.md instructions\");\r\n}\r\n\r\n/** 判断请求是否为标题、摘要等 Agent 内部任务。 */\r\nfunction isInternalText(text: string): boolean {\r\n return text.includes(\"Write the title in the predominant language\")\r\n || text.includes(\"Generate a concise, single-line task title\")\r\n || text.includes(\"The user stepped away and is coming back. Recap\");\r\n}\r\n\r\n/** 从多形态内容中提取可展示文本,并排除运行环境注入内容。 */\r\nfunction contentText(value: unknown): string | undefined {\r\n if (typeof value === \"string\") {\r\n return isContext(value) ? undefined : string(value);\r\n }\r\n\r\n const parts = array(value)\r\n .map((item) => record(item))\r\n .filter((item) => item?.type === \"text\" || item?.type === \"input_text\" || item?.type === \"output_text\")\r\n .map((item) => string(item?.text))\r\n .filter((text): text is string => typeof text === \"string\" && !isContext(text));\r\n return string(parts.join(\"\\n\\n\"));\r\n}\r\n\r\n/** 从 Reasoning 或 Thinking 内容中提取文本。 */\r\nfunction reasoningText(value: Record<string, unknown>): string | undefined {\r\n const summary = array(value?.summary)\r\n .map((item) => string(record(item)?.text))\r\n .filter((text): text is string => Boolean(text));\r\n return string(summary.join(\"\\n\\n\"))\r\n ?? string(value?.thinking)\r\n ?? contentText(value?.content);\r\n}\r\n\r\n/** 将 Claude 单条 message 展开为消息、思考和工具草稿。 */\r\nfunction claudeMessage(value: unknown, responseId?: string): DraftItem[] {\r\n const message = record(value);\r\n const role = message?.role === \"user\" || message?.role === \"assistant\" ? message.role : undefined;\r\n if (!role) {\r\n return [];\r\n }\r\n\r\n const content = message?.content;\r\n const result: DraftItem[] = [];\r\n const text = contentText(content);\r\n if (text) {\r\n result.push({\r\n ...(responseId ? { sourceId: responseId } : {}),\r\n kind: \"message\",\r\n role,\r\n text,\r\n });\r\n }\r\n\r\n for (const raw of array(content)) {\r\n const item = record(raw);\r\n const type = string(item?.type);\r\n if (type === \"thinking\") {\r\n const thinking = reasoningText(item ?? {});\r\n if (thinking) {\r\n result.push({\r\n ...(responseId ? { sourceId: `${responseId}:reasoning` } : {}),\r\n kind: \"reasoning\",\r\n role: \"assistant\",\r\n text: thinking,\r\n });\r\n }\r\n }\r\n if (type === \"tool_use\") {\r\n const callId = string(item?.id);\r\n result.push({\r\n ...(callId ? { sourceId: callId, callId } : {}),\r\n kind: \"tool\",\r\n role: \"assistant\",\r\n name: string(item?.name) ?? \"tool\",\r\n input: item?.input,\r\n status: \"pending\",\r\n });\r\n }\r\n if (type === \"tool_result\") {\r\n const callId = string(item?.tool_use_id);\r\n result.push({\r\n kind: \"tool-result\",\r\n ...(callId ? { callId } : {}),\r\n output: item?.content,\r\n status: item?.is_error === true ? \"error\" : \"complete\",\r\n });\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** 将 Codex Responses item 转为统一会话草稿。 */\r\nfunction codexItem(value: unknown): DraftItem[] {\r\n const item = record(value);\r\n const type = string(item?.type);\r\n if (!type) {\r\n return [];\r\n }\r\n\r\n if (type === \"message\") {\r\n const role = item?.role === \"user\" || item?.role === \"assistant\" ? item.role : undefined;\r\n const text = role ? contentText(item?.content) : undefined;\r\n const sourceId = string(item?.id);\r\n return role && text ? [{\r\n ...(sourceId ? { sourceId } : {}),\r\n kind: \"message\",\r\n role,\r\n text,\r\n }] : [];\r\n }\r\n\r\n if (type === \"reasoning\") {\r\n const text = reasoningText(item ?? {});\r\n const sourceId = string(item?.id);\r\n return text ? [{\r\n ...(sourceId ? { sourceId } : {}),\r\n kind: \"reasoning\",\r\n role: \"assistant\",\r\n text,\r\n }] : [];\r\n }\r\n\r\n if (type.endsWith(\"_call_output\")) {\r\n const callId = string(item?.call_id);\r\n return [{\r\n kind: \"tool-result\",\r\n ...(callId ? { callId } : {}),\r\n output: item?.output,\r\n status: \"complete\",\r\n }];\r\n }\r\n\r\n if (type.endsWith(\"_call\")) {\r\n const callId = string(item?.call_id) ?? string(item?.id);\r\n const input = item?.arguments ?? item?.input ?? item?.action;\r\n return [{\r\n ...(callId ? { sourceId: callId, callId } : {}),\r\n kind: \"tool\",\r\n role: \"assistant\",\r\n name: string(item?.name) ?? type.replace(/_call$/, \"\"),\r\n input: json(input),\r\n status: \"pending\",\r\n }];\r\n }\r\n\r\n return [];\r\n}\r\n\r\n/** 提取一次请求携带的全部会话草稿。 */\r\nfunction requestItems(exchange: ExchangeDetail): DraftItem[] {\r\n const body = record(exchange?.request);\r\n if (exchange?.meta?.protocol === \"anthropic\") {\r\n return array(body?.messages).flatMap((message) => claudeMessage(message));\r\n }\r\n return array(body?.input).flatMap((item) => codexItem(item));\r\n}\r\n\r\n/** 提取一次已还原响应产生的全部会话草稿。 */\r\nfunction responseItems(exchange: ExchangeDetail): DraftItem[] {\r\n const body = record(exchange?.response);\r\n if (exchange?.meta?.protocol === \"anthropic\") {\r\n return claudeMessage(body, string(body?.id));\r\n }\r\n return array(body?.output).flatMap((item) => codexItem(item));\r\n}\r\n\r\n/** 读取 Codex Turn 元数据,并识别内部任务。 */\r\nfunction turnMeta(exchange: ExchangeDetail): TurnMeta {\r\n const body = record(exchange?.request);\r\n const client = record(body?.client_metadata);\r\n const encoded = header(exchange?.meta?.requestHeaders?.[\"x-codex-turn-metadata\"]);\r\n const metadata = record(json(encoded));\r\n const source = string(client?.thread_source) ?? string(metadata?.thread_source);\r\n const id = string(client?.turn_id) ?? string(metadata?.turn_id);\r\n const texts = requestItems(exchange)\r\n .filter((item) => item?.kind === \"message\")\r\n .map((item) => item?.text ?? \"\")\r\n .join(\"\\n\");\r\n\r\n return {\r\n ...(id ? { id } : {}),\r\n internal: source === \"system\" || isInternalText(texts),\r\n };\r\n}\r\n\r\n/** 生成会话草稿的内容指纹。 */\r\nfunction fingerprint(item: DraftItem): string {\r\n return stable({\r\n kind: item?.kind,\r\n role: item?.role,\r\n text: item?.text,\r\n name: item?.name,\r\n callId: item?.callId,\r\n input: item?.input,\r\n output: item?.output,\r\n });\r\n}\r\n\r\n/** 返回数组中最后一个用户消息的位置。 */\r\nfunction lastUser(items: DraftItem[]): number {\r\n for (let index = items.length - 1; index >= 0; index -= 1) {\r\n const item = items[index];\r\n if (item?.kind === \"message\" && item?.role === \"user\") {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\n/** 返回会话最后一次请求使用的模型。 */\r\nfunction lastModel(session: SessionSummary): string | undefined {\r\n for (let index = session.exchanges.length - 1; index >= 0; index -= 1) {\r\n const model = session.exchanges[index]?.model;\r\n if (model) {\r\n return model;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nclass Builder {\r\n private readonly session: SessionSummary;\r\n private readonly turns: ConversationTurn[] = [];\r\n private readonly turnMap = new Map<string, ConversationTurn>();\r\n private readonly tools = new Map<string, ConversationItem>();\r\n private readonly ids = new Set<string>();\r\n private readonly seen = new Set<string>();\r\n private readonly max = new Map<string, number>();\r\n private current?: ConversationTurn;\r\n private turnSeq = 0;\r\n private itemSeq = 0;\r\n\r\n /** 创建指定会话的增量还原状态。 */\r\n constructor(session: SessionSummary) {\r\n this.session = session;\r\n }\r\n\r\n /** 将一次 Exchange 合并到当前会话。 */\r\n add(exchange: ExchangeDetail): void {\r\n const meta = turnMeta(exchange);\r\n const input = this.snapshot(requestItems(exchange));\r\n const userIndex = lastUser(input);\r\n\r\n input.forEach((item, index) => {\r\n const newTurn = item?.kind === \"message\" && item?.role === \"user\";\r\n const explicit = newTurn && index === userIndex ? meta.id : undefined;\r\n const turn = newTurn\r\n ? this.turn(explicit, meta.internal, exchange, true)\r\n : this.turn(meta.id, meta.internal, exchange, false);\r\n this.item(turn, item, exchange);\r\n });\r\n\r\n for (const item of this.fresh(responseItems(exchange))) {\r\n const turn = this.turn(meta.id, meta.internal, exchange, false);\r\n this.item(turn, item, exchange);\r\n }\r\n\r\n if (this.current && exchange?.meta?.completedAt) {\r\n this.current.completedAt = exchange.meta.completedAt;\r\n }\r\n }\r\n\r\n /** 返回完成去重和工具关联的会话对象。 */\r\n build(): ConversationDetail {\r\n const model = lastModel(this.session);\r\n return {\r\n sessionId: this.session.id,\r\n protocol: this.session.protocol,\r\n ...(model ? { model } : {}),\r\n startedAt: this.session.startedAt,\r\n ...(this.session.endedAt ? { endedAt: this.session.endedAt } : {}),\r\n exchangeIds: this.session.exchanges.map((item) => item.id),\r\n turns: this.turns.filter((turn) => turn?.items?.length > 0),\r\n };\r\n }\r\n\r\n /** 从请求快照中筛选尚未出现的内容。 */\r\n private snapshot(items: DraftItem[]): DraftItem[] {\r\n const counts = new Map<string, number>();\r\n return items.filter((item) => {\r\n const base = fingerprint(item);\r\n const occurrence = (counts.get(base) ?? 0) + 1;\r\n counts.set(base, occurrence);\r\n const token = `${base}:${occurrence}`;\r\n const sourceId = item?.sourceId;\r\n const duplicate = this.seen.has(token) || Boolean(sourceId && this.ids.has(sourceId));\r\n this.seen.add(token);\r\n this.max.set(base, Math.max(this.max.get(base) ?? 0, occurrence));\r\n if (sourceId) {\r\n this.ids.add(sourceId);\r\n }\r\n return !duplicate;\r\n });\r\n }\r\n\r\n /** 将响应中的新内容加入全局去重集合。 */\r\n private fresh(items: DraftItem[]): DraftItem[] {\r\n return items.filter((item) => {\r\n const sourceId = item?.sourceId;\r\n if (sourceId && this.ids.has(sourceId)) {\r\n return false;\r\n }\r\n const base = fingerprint(item);\r\n const occurrence = (this.max.get(base) ?? 0) + 1;\r\n this.max.set(base, occurrence);\r\n this.seen.add(`${base}:${occurrence}`);\r\n if (sourceId) {\r\n this.ids.add(sourceId);\r\n }\r\n return true;\r\n });\r\n }\r\n\r\n /** 获取已有 Turn,或在需要时创建新 Turn。 */\r\n private turn(\r\n explicit: string | undefined,\r\n internal: boolean,\r\n exchange: ExchangeDetail,\r\n force: boolean,\r\n ): ConversationTurn {\r\n const known = explicit ? this.turnMap.get(explicit) : undefined;\r\n if (known && !force) {\r\n this.link(known.exchangeIds, exchange.meta.id);\r\n this.current = known;\r\n return known;\r\n }\r\n if (!force && this.current) {\r\n this.link(this.current.exchangeIds, exchange.meta.id);\r\n this.current.internal = this.current.internal && internal;\r\n return this.current;\r\n }\r\n\r\n const id = explicit ?? `${this.session.id}:turn:${++this.turnSeq}`;\r\n const turn: ConversationTurn = {\r\n id,\r\n internal,\r\n startedAt: exchange.meta.startedAt,\r\n ...(exchange.meta.completedAt ? { completedAt: exchange.meta.completedAt } : {}),\r\n exchangeIds: [exchange.meta.id],\r\n items: [],\r\n };\r\n this.turns.push(turn);\r\n this.turnMap.set(id, turn);\r\n this.current = turn;\r\n return turn;\r\n }\r\n\r\n /** 将草稿追加为消息、思考或工具节点。 */\r\n private item(turn: ConversationTurn, draft: DraftItem, exchange: ExchangeDetail): void {\r\n if (draft?.kind === \"tool-result\") {\r\n this.toolResult(turn, draft, exchange);\r\n return;\r\n }\r\n\r\n if (draft?.kind === \"tool\") {\r\n const callId = draft?.callId;\r\n const known = callId ? this.tools.get(callId) : undefined;\r\n if (known) {\r\n known.input ??= draft.input;\r\n this.link(known.exchangeIds, exchange.meta.id);\r\n return;\r\n }\r\n }\r\n\r\n const item: ConversationItem = {\r\n id: draft?.sourceId ?? `${exchange.meta.id}:item:${++this.itemSeq}`,\r\n kind: draft.kind as ConversationKind,\r\n ...(draft.role ? { role: draft.role } : {}),\r\n ...(draft.text ? { text: draft.text } : {}),\r\n ...(draft.name ? { name: draft.name } : {}),\r\n ...(draft.callId ? { callId: draft.callId } : {}),\r\n ...(draft.input !== undefined ? { input: draft.input } : {}),\r\n ...(draft.output !== undefined ? { output: draft.output } : {}),\r\n ...(draft.status ? { status: draft.status } : {}),\r\n startedAt: exchange.meta.startedAt,\r\n exchangeIds: [exchange.meta.id],\r\n };\r\n turn.items.push(item);\r\n if (item.kind === \"tool\" && item.callId) {\r\n this.tools.set(item.callId, item);\r\n }\r\n }\r\n\r\n /** 将工具结果绑定到同一调用卡片。 */\r\n private toolResult(turn: ConversationTurn, draft: DraftItem, exchange: ExchangeDetail): void {\r\n const known = draft?.callId ? this.tools.get(draft.callId) : undefined;\r\n if (known) {\r\n known.output = draft.output;\r\n known.status = draft.status ?? \"complete\";\r\n this.link(known.exchangeIds, exchange.meta.id);\r\n this.link(turn.exchangeIds, exchange.meta.id);\r\n return;\r\n }\r\n\r\n this.item(turn, {\r\n kind: \"tool\",\r\n role: \"assistant\",\r\n name: \"tool\",\r\n ...(draft?.callId ? { callId: draft.callId } : {}),\r\n output: draft.output,\r\n status: draft.status ?? \"complete\",\r\n }, exchange);\r\n }\r\n\r\n /** 向 ID 列表追加不重复的 Exchange。 */\r\n private link(ids: string[], id: string): void {\r\n if (!ids.includes(id)) {\r\n ids.push(id);\r\n }\r\n }\r\n}\r\n\r\n/** 从按时间排序的 Exchange 中还原完整会话。 */\r\nexport function buildConversation(\r\n session: SessionSummary,\r\n exchanges: ExchangeDetail[],\r\n): ConversationDetail {\r\n const builder = new Builder(session);\r\n const ordered = [...exchanges].sort((left, right) => left.meta.startedAt.localeCompare(right.meta.startedAt));\r\n ordered.forEach((exchange) => builder.add(exchange));\r\n return builder.build();\r\n}\r\n","/** 本文件负责管理 run 与 exchange 的目录生命周期。 */\r\n\r\nimport { mkdir } from \"node:fs/promises\";\r\nimport { join } from \"node:path\";\r\nimport type { ExchangeMeta, RunMeta } from \"@tracelet/shared\";\r\nimport { getRunDir, writeJson } from \"./files.js\";\r\nimport { ExchangeWriter } from \"./writer.js\";\r\n\r\nexport class FileStore {\r\n readonly root: string;\r\n private readonly runs = new Map<string, string>();\r\n\r\n /** 创建指定数据目录的文件存储。 */\r\n constructor(root: string) {\r\n this.root = root;\r\n }\r\n\r\n /** 初始化存储根目录。 */\r\n async init(): Promise<void> {\r\n await mkdir(join(this.root, \"runs\"), { recursive: true });\r\n }\r\n\r\n /** 创建一次运行记录并返回其目录。 */\r\n async startRun(run: RunMeta): Promise<string> {\r\n const dir = getRunDir(this.root, run.startedAt, run.id);\r\n this.runs.set(run.id, dir);\r\n await writeJson(join(dir, \"run.json\"), run);\r\n return dir;\r\n }\r\n\r\n /** 更新一次运行的结束状态。 */\r\n async finishRun(run: RunMeta): Promise<void> {\r\n const dir = this.runs.get(run.id) ?? getRunDir(this.root, run.startedAt, run.id);\r\n await writeJson(join(dir, \"run.json\"), run);\r\n }\r\n\r\n /** 为一次模型请求创建独立的追加写入器。 */\r\n async startExchange(meta: ExchangeMeta): Promise<ExchangeWriter> {\r\n const runDir = this.runs.get(meta.runId);\r\n if (!runDir) {\r\n throw new Error(`运行不存在:${meta.runId}`);\r\n }\r\n\r\n const writer = new ExchangeWriter(join(runDir, \"exchanges\", meta.id), meta);\r\n await writer.init();\r\n return writer;\r\n }\r\n}\r\n","/** 本文件负责把请求、响应、chunk 和 SSE 事件追加到本地文件。 */\r\n\r\nimport { mkdir, open, type FileHandle } from \"node:fs/promises\";\r\nimport { join } from \"node:path\";\r\nimport type { ChunkRow, ExchangeMeta, SseRow } from \"@tracelet/shared\";\r\nimport { writeJson } from \"./files.js\";\r\n\r\ntype Side = \"request\" | \"response\";\r\n\r\nexport class ExchangeWriter {\r\n readonly dir: string;\r\n private meta: ExchangeMeta;\r\n private req?: FileHandle;\r\n private reqIndex?: FileHandle;\r\n private res?: FileHandle;\r\n private resIndex?: FileHandle;\r\n private eventFile?: FileHandle;\r\n private reqSeq = 0;\r\n private resSeq = 0;\r\n private reqOffset = 0;\r\n private resOffset = 0;\r\n private pending = Promise.resolve();\r\n private writeError?: Error;\r\n\r\n /** 创建一个 exchange 文件写入器。 */\r\n constructor(dir: string, meta: ExchangeMeta) {\r\n this.dir = dir;\r\n this.meta = meta;\r\n }\r\n\r\n /** 创建目录并打开全部追加文件。 */\r\n async init(): Promise<void> {\r\n await mkdir(this.dir, { recursive: true });\r\n [this.req, this.reqIndex, this.res, this.resIndex, this.eventFile] = await Promise.all([\r\n open(join(this.dir, \"request.bin\"), \"a\"),\r\n open(join(this.dir, \"request-chunks.jsonl\"), \"a\"),\r\n open(join(this.dir, \"response.bin\"), \"a\"),\r\n open(join(this.dir, \"response-chunks.jsonl\"), \"a\"),\r\n open(join(this.dir, \"sse-events.jsonl\"), \"a\"),\r\n ]);\r\n await writeJson(join(this.dir, \"meta.json\"), this.meta);\r\n }\r\n\r\n /** 追加一个请求 body chunk,并返回其索引。 */\r\n addReq(chunk: Uint8Array, tUs: number): number {\r\n return this.addChunk(\"request\", chunk, tUs);\r\n }\r\n\r\n /** 追加一个响应 body chunk,并返回其索引。 */\r\n addRes(chunk: Uint8Array, tUs: number): number {\r\n return this.addChunk(\"response\", chunk, tUs);\r\n }\r\n\r\n /** 将解析完成的 SSE 事件追加到事件日志。 */\r\n addEvent(event: SseRow): void {\r\n this.enqueue(async () => {\r\n await this.eventFile?.write(`${JSON.stringify(event)}\\n`);\r\n });\r\n }\r\n\r\n /** 合并并持久化 exchange 元数据。 */\r\n patch(next: Partial<ExchangeMeta>): void {\r\n this.meta = { ...this.meta, ...next };\r\n const snapshot = { ...this.meta };\r\n\r\n this.enqueue(async () => {\r\n await writeJson(join(this.dir, \"meta.json\"), snapshot);\r\n });\r\n }\r\n\r\n /** 保存由官方 SDK 生成的完整响应对象。 */\r\n saveResponse(response: unknown): void {\r\n this.enqueue(async () => {\r\n await writeJson(join(this.dir, \"reconstructed.json\"), response);\r\n });\r\n }\r\n\r\n /** 等待全部写入完成并关闭文件。 */\r\n async close(): Promise<Error | undefined> {\r\n await this.pending;\r\n if (this.writeError) {\r\n this.meta = { ...this.meta, captureComplete: false, error: this.writeError.message };\r\n await writeJson(join(this.dir, \"meta.json\"), this.meta);\r\n }\r\n await Promise.all([\r\n this.req?.close(),\r\n this.reqIndex?.close(),\r\n this.res?.close(),\r\n this.resIndex?.close(),\r\n this.eventFile?.close(),\r\n ]);\r\n return this.writeError;\r\n }\r\n\r\n /** 追加原始字节和对应 chunk 索引。 */\r\n private addChunk(side: Side, chunk: Uint8Array, tUs: number): number {\r\n const data = Buffer.from(chunk);\r\n const seq = side === \"request\" ? this.reqSeq++ : this.resSeq++;\r\n const offset = side === \"request\" ? this.reqOffset : this.resOffset;\r\n const row: ChunkRow = { seq, tUs, offset, length: data.byteLength };\r\n\r\n if (side === \"request\") {\r\n this.reqOffset += data.byteLength;\r\n } else {\r\n this.resOffset += data.byteLength;\r\n }\r\n\r\n this.enqueue(async () => {\r\n const body = side === \"request\" ? this.req : this.res;\r\n const index = side === \"request\" ? this.reqIndex : this.resIndex;\r\n await body?.write(data);\r\n await index?.write(`${JSON.stringify(row)}\\n`);\r\n });\r\n\r\n return seq;\r\n }\r\n\r\n /** 串行执行文件操作,避免同一 exchange 内的写入乱序。 */\r\n private enqueue(task: () => Promise<void>): void {\r\n this.pending = this.pending.then(task).catch((error: unknown) => {\r\n this.writeError = error instanceof Error ? error : new Error(String(error));\r\n });\r\n }\r\n}\r\n","/** 本文件负责处理 Dashboard 使用的本地只读 API。 */\r\n\r\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\r\nimport { getConversation, getExchange, listSessions } from \"@tracelet/storage\";\r\nimport { LiveBus } from \"./live.js\";\r\n\r\n/** 返回 JSON 响应。 */\r\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\r\n res.writeHead(status, {\r\n \"content-type\": \"application/json; charset=utf-8\",\r\n \"cache-control\": \"no-store\",\r\n });\r\n res.end(JSON.stringify(body));\r\n}\r\n\r\n/** 处理一个 Dashboard API 请求,并返回是否已匹配。 */\r\nexport async function serveApi(\r\n req: IncomingMessage,\r\n res: ServerResponse,\r\n pathname: string,\r\n dataDir: string,\r\n live: LiveBus,\r\n): Promise<boolean> {\r\n if (req.method === \"GET\" && pathname === \"/api/live\") {\r\n live.connect(res);\r\n return true;\r\n }\r\n\r\n if (req.method === \"GET\" && pathname === \"/api/sessions\") {\r\n sendJson(res, 200, { sessions: await listSessions(dataDir) });\r\n return true;\r\n }\r\n\r\n const conversationMatch = pathname.match(/^\\/api\\/conversations\\/([^/]+)$/);\r\n if (req.method === \"GET\" && conversationMatch?.[1]) {\r\n const conversation = await getConversation(dataDir, decodeURIComponent(conversationMatch[1]));\r\n sendJson(res, conversation ? 200 : 404, conversation ?? { error: \"conversation_not_found\" });\r\n return true;\r\n }\r\n\r\n const exchangeMatch = pathname.match(/^\\/api\\/exchanges\\/([^/]+)$/);\r\n if (req.method === \"GET\" && exchangeMatch?.[1]) {\r\n const exchange = await getExchange(dataDir, decodeURIComponent(exchangeMatch[1]));\r\n sendJson(res, exchange ? 200 : 404, exchange ?? { error: \"exchange_not_found\" });\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/** 本文件负责向 Dashboard 推送本地记录变化事件。 */\r\n\r\nimport type { ServerResponse } from \"node:http\";\r\n\r\nexport class LiveBus {\r\n private readonly clients = new Set<ServerResponse>();\r\n\r\n /** 注册一个 Dashboard SSE 连接。 */\r\n connect(res: ServerResponse): void {\r\n res.writeHead(200, {\r\n \"content-type\": \"text/event-stream; charset=utf-8\",\r\n \"cache-control\": \"no-cache\",\r\n connection: \"keep-alive\",\r\n });\r\n res.write(\"event: ready\\ndata: {}\\n\\n\");\r\n this.clients.add(res);\r\n const clients = this.clients;\r\n\r\n /** 连接结束时从广播集合移除客户端。 */\r\n function remove(): void {\r\n clients.delete(res);\r\n }\r\n\r\n res.once(\"close\", remove);\r\n }\r\n\r\n /** 向全部 Dashboard 连接发送数据变化通知。 */\r\n publish(type: string, data: unknown): void {\r\n const message = `event: ${type}\\ndata: ${JSON.stringify(data)}\\n\\n`;\r\n for (const client of this.clients) {\r\n client.write(message);\r\n }\r\n }\r\n\r\n /** 关闭全部 Dashboard SSE 连接。 */\r\n close(): void {\r\n for (const client of this.clients) {\r\n client.end();\r\n }\r\n this.clients.clear();\r\n }\r\n}\r\n","/** 本文件负责安全地返回 Dashboard 静态资源。 */\r\n\r\nimport type { ServerResponse } from \"node:http\";\r\nimport { readFile, stat } from \"node:fs/promises\";\r\nimport { extname, resolve, sep } from \"node:path\";\r\n\r\nconst contentTypes: Record<string, string> = {\r\n \".css\": \"text/css; charset=utf-8\",\r\n \".html\": \"text/html; charset=utf-8\",\r\n \".js\": \"text/javascript; charset=utf-8\",\r\n \".json\": \"application/json; charset=utf-8\",\r\n \".svg\": \"image/svg+xml\",\r\n};\r\n\r\n/** 判断文件路径是否位于 Dashboard 构建目录内。 */\r\nfunction isInside(root: string, file: string): boolean {\r\n return file === root || file.startsWith(`${root}${sep}`);\r\n}\r\n\r\n/** 返回静态资源;未知前端路由回退到 index.html。 */\r\nexport async function serveStatic(root: string, pathname: string, res: ServerResponse): Promise<void> {\r\n const base = resolve(root);\r\n const requested = resolve(base, `.${pathname}`);\r\n let target = requested;\r\n\r\n if (!isInside(base, requested)) {\r\n res.writeHead(403);\r\n res.end();\r\n return;\r\n }\r\n\r\n try {\r\n if ((await stat(target)).isDirectory()) {\r\n target = resolve(target, \"index.html\");\r\n }\r\n } catch {\r\n target = resolve(base, \"index.html\");\r\n }\r\n\r\n try {\r\n const body = await readFile(target);\r\n res.writeHead(200, {\r\n \"content-type\": contentTypes?.[extname(target)] ?? \"application/octet-stream\",\r\n \"cache-control\": target.endsWith(\"index.html\") ? \"no-cache\" : \"public, max-age=31536000, immutable\",\r\n });\r\n res.end(body);\r\n } catch {\r\n res.writeHead(503, { \"content-type\": \"text/plain; charset=utf-8\" });\r\n res.end(\"Dashboard 尚未构建,请先运行 pnpm build。\\n\");\r\n }\r\n}\r\n","/** 本文件负责读取和保存用户目录中的 Tracelet 配置。 */\r\n\r\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\r\nimport { dirname } from \"node:path\";\r\nimport { settingsFile } from \"./paths.js\";\r\n\r\nexport type ProxyMode = \"direct\" | \"system\";\r\n\r\nexport interface Settings {\r\n proxy: {\r\n mode: ProxyMode;\r\n };\r\n}\r\n\r\n/** 判断配置值是否为普通对象。 */\r\nfunction isObject(value: unknown): value is Record<string, unknown> {\r\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\r\n}\r\n\r\n/** 读取原始配置对象,文件不存在时返回空配置。 */\r\nasync function readRaw(path: string): Promise<Record<string, unknown>> {\r\n try {\r\n const value = JSON.parse(await readFile(path, \"utf8\")) as unknown;\r\n if (!isObject(value)) {\r\n throw new Error(\"Settings root must be an object\");\r\n }\r\n return value;\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\r\n return {};\r\n }\r\n throw new Error(`Failed to read Tracelet settings: ${path}`, { cause: error });\r\n }\r\n}\r\n\r\n/** 读取并校验 Tracelet 配置,缺省时使用直连。 */\r\nexport async function loadSettings(path = settingsFile()): Promise<Settings> {\r\n const value = await readRaw(path);\r\n const proxy = value.proxy;\r\n if (proxy !== undefined && !isObject(proxy)) {\r\n throw new Error(`Invalid proxy settings: ${path}`);\r\n }\r\n\r\n const mode = isObject(proxy) ? proxy.mode : undefined;\r\n if (mode !== undefined && mode !== \"direct\" && mode !== \"system\") {\r\n throw new Error(`Invalid proxy mode: ${String(mode)}`);\r\n }\r\n\r\n return { proxy: { mode: mode ?? \"direct\" } };\r\n}\r\n\r\n/** 保存代理模式,同时保留配置文件中的其他字段。 */\r\nexport async function saveProxy(mode: ProxyMode, path = settingsFile()): Promise<void> {\r\n const value = await readRaw(path);\r\n const proxy = isObject(value.proxy) ? value.proxy : {};\r\n const next = { ...value, proxy: { ...proxy, mode } };\r\n\r\n // settings.json 独立于记录目录,始终保存在当前用户的 Tracelet 目录下。\r\n await mkdir(dirname(path), { recursive: true });\r\n await writeFile(path, `${JSON.stringify(next, null, 2)}\\n`, { encoding: \"utf8\", mode: 0o600 });\r\n}\r\n","/** 本文件负责启动 agent 子进程并保持终端及退出信号一致。 */\r\n\r\nimport { spawn } from \"node:child_process\";\r\nimport type { LaunchInfo } from \"./agents.js\";\r\n\r\n/** 启动 agent,并返回其最终退出码。 */\r\nexport async function spawnAgent(input: LaunchInfo): Promise<number> {\r\n return new Promise<number>((resolve, reject) => {\r\n const child = spawn(input.command, input.args, {\r\n env: input.env,\r\n stdio: \"inherit\",\r\n });\r\n\r\n /** 把 Ctrl+C 转发给正在运行的 agent。 */\r\n function onSigint(): void {\r\n child.kill(\"SIGINT\");\r\n }\r\n\r\n /** 把终止信号转发给正在运行的 agent。 */\r\n function onSigterm(): void {\r\n child.kill(\"SIGTERM\");\r\n }\r\n\r\n /** 清理信号监听器,避免连续运行时重复触发。 */\r\n function cleanup(): void {\r\n process.off(\"SIGINT\", onSigint);\r\n process.off(\"SIGTERM\", onSigterm);\r\n }\r\n\r\n process.on(\"SIGINT\", onSigint);\r\n process.on(\"SIGTERM\", onSigterm);\r\n\r\n child.once(\"error\", (error) => {\r\n cleanup();\r\n reject(error);\r\n });\r\n child.once(\"close\", (code) => {\r\n cleanup();\r\n resolve(code ?? 1);\r\n });\r\n });\r\n}\r\n","/** 本文件负责读取 macOS 和 Windows 当前用户的固定系统代理。 */\r\n\r\nimport { execFile } from \"node:child_process\";\r\nimport { promisify } from \"node:util\";\r\n\r\nconst exec = promisify(execFile);\r\nconst winKey = \"HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Internet Settings\";\r\n\r\n/** 从命令输出中读取一个键的值。 */\r\nfunction lineValue(output: string, key: string): string | undefined {\r\n return output.match(new RegExp(`^\\\\s*${key}\\\\s*:\\\\s*(.+?)\\\\s*$`, \"m\"))?.[1];\r\n}\r\n\r\n/** 将主机和端口转换为 HTTP 代理 URL。 */\r\nfunction proxyUrl(value: string | undefined): string | undefined {\r\n const input = value?.trim();\r\n if (!input) {\r\n return undefined;\r\n }\r\n\r\n try {\r\n const url = new URL(/^[a-z]+:\\/\\//i.test(input) ? input : `http://${input}`);\r\n return url.protocol === \"http:\" || url.protocol === \"https:\"\r\n ? url.toString().replace(/\\/$/, \"\")\r\n : undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n/** 解析 scutil 输出中的固定 HTTPS 或 HTTP 系统代理。 */\r\nexport function parseMacProxy(output: string): string | undefined {\r\n /** 读取一个已启用协议的代理地址。 */\r\n function read(kind: \"HTTP\" | \"HTTPS\"): string | undefined {\r\n if (lineValue(output, `${kind}Enable`) !== \"1\") {\r\n return undefined;\r\n }\r\n const host = lineValue(output, `${kind}Proxy`);\r\n const port = lineValue(output, `${kind}Port`);\r\n return host && /^\\d+$/.test(port ?? \"\") ? proxyUrl(`${host}:${port}`) : undefined;\r\n }\r\n\r\n return read(\"HTTPS\") ?? read(\"HTTP\");\r\n}\r\n\r\n/** 从 reg query 输出中读取指定注册表值。 */\r\nfunction regValue(output: string, key: string): string | undefined {\r\n return output.match(new RegExp(`^\\\\s*${key}\\\\s+REG_[A-Z_]+\\\\s+(.+?)\\\\s*$`, \"mi\"))?.[1];\r\n}\r\n\r\n/** 解析 Windows 当前用户的固定系统代理。 */\r\nexport function parseWindowsProxy(output: string): string | undefined {\r\n const enabled = Number.parseInt(regValue(output, \"ProxyEnable\") ?? \"0\", 0) === 1;\r\n const server = regValue(output, \"ProxyServer\")?.trim();\r\n if (!enabled || !server) {\r\n return undefined;\r\n }\r\n\r\n if (!server.includes(\"=\")) {\r\n return proxyUrl(server);\r\n }\r\n\r\n const endpoints = new Map<string, string>();\r\n for (const item of server.split(\";\")) {\r\n const [name, value] = item.split(\"=\", 2);\r\n if (name && value) {\r\n endpoints.set(name.trim().toLowerCase(), value.trim());\r\n }\r\n }\r\n return proxyUrl(endpoints.get(\"https\")) ?? proxyUrl(endpoints.get(\"http\"));\r\n}\r\n\r\n/** 按当前操作系统读取固定系统代理,读取失败时返回直连。 */\r\nexport async function systemProxy(platform = process.platform): Promise<string | undefined> {\r\n try {\r\n if (platform === \"darwin\") {\r\n const result = await exec(\"/usr/sbin/scutil\", [\"--proxy\"]);\r\n return parseMacProxy(result.stdout);\r\n }\r\n if (platform === \"win32\") {\r\n const result = await exec(\"reg.exe\", [\"query\", winKey]);\r\n return parseWindowsProxy(result.stdout);\r\n }\r\n return undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n","/** 本文件负责组合本地服务、运行记录与 agent 子进程生命周期。 */\r\n\r\nimport type { AgentType, RunMeta } from \"@tracelet/shared\";\r\nimport { makeId, nowIso } from \"@tracelet/shared\";\r\nimport { TraceletServer } from \"@tracelet/server\";\r\nimport { agents } from \"./agents.js\";\r\nimport { dashboardDir, dataDir } from \"./paths.js\";\r\nimport { loadSettings } from \"./settings.js\";\r\nimport { spawnAgent } from \"./spawn.js\";\r\nimport { systemProxy } from \"./system-proxy.js\";\r\n\r\nexport interface RunOptions {\r\n port: number;\r\n dataDir?: string;\r\n}\r\n\r\n/** 启动 Tracelet 服务和指定 agent,并在退出前完成记录落盘。 */\r\nexport async function runAgent(agentId: AgentType, args: string[], options: RunOptions): Promise<number> {\r\n const adapter = agents[agentId];\r\n if (!(await adapter.detect())) {\r\n throw new Error(`${adapter.label} command not found: ${adapter.command}`);\r\n }\r\n\r\n const settings = await loadSettings();\r\n // 仅在启用且成功发现系统代理时传递代理地址,否则保持原有直连行为。\r\n const proxy = settings.proxy.mode === \"system\" ? await systemProxy() : undefined;\r\n if (settings.proxy.mode === \"system\" && !proxy) {\r\n console.warn(\"System proxy not found. Using a direct connection.\");\r\n }\r\n\r\n const server = new TraceletServer({\r\n dataDir: dataDir(options.dataDir),\r\n dashboardDir: dashboardDir(),\r\n });\r\n await server.listen(options.port);\r\n\r\n const run: RunMeta = {\r\n id: makeId(\"run\"),\r\n agent: adapter.id,\r\n cwd: process.cwd(),\r\n command: adapter.command,\r\n startedAt: nowIso(),\r\n };\r\n const proxyUrl = await server.addRun(run, adapter.protocol, await adapter.upstream(), proxy);\r\n\r\n console.log(`Tracelet Dashboard: ${server.url()}`);\r\n console.log(`Starting ${adapter.label}...`);\r\n\r\n let exitCode = 1;\r\n try {\r\n exitCode = await spawnAgent(adapter.launch(proxyUrl, args));\r\n return exitCode;\r\n } finally {\r\n await server.finishRun({ ...run, endedAt: nowIso(), exitCode });\r\n await server.close();\r\n }\r\n}\r\n\r\n/** 启动只读 Dashboard 服务,直到用户发送终止信号。 */\r\nexport async function runDashboard(options: RunOptions): Promise<void> {\r\n const server = new TraceletServer({\r\n dataDir: dataDir(options.dataDir),\r\n dashboardDir: dashboardDir(),\r\n });\r\n await server.listen(options.port);\r\n console.log(`Tracelet Dashboard: ${server.url()}`);\r\n\r\n await new Promise<void>((resolve) => {\r\n /** 收到退出信号后结束等待。 */\r\n function stop(): void {\r\n resolve();\r\n }\r\n\r\n process.once(\"SIGINT\", stop);\r\n process.once(\"SIGTERM\", stop);\r\n });\r\n\r\n await server.close();\r\n}\r\n","/** 本文件是 Tracelet CLI 的程序入口。 */\r\n\r\nimport { createProgram } from \"./program.js\";\r\n\r\n/** 解析命令行并统一输出可读错误。 */\r\nasync function main(): Promise<void> {\r\n try {\r\n await createProgram().parseAsync(process.argv);\r\n } catch (error) {\r\n console.error(error instanceof Error ? error.message : String(error));\r\n process.exitCode = 1;\r\n }\r\n}\r\n\r\nawait main();\r\n"],"mappings":"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","names":["proxyUrl","homedir","join","homedir","resolve","http","err","err","ReadableStream","encoder","err","delimiter","resolve","_MessageStream_getFinalMessage","_MessageStream_getFinalText","_MessageStream_beginRequest","_MessageStream_addStreamEvent","_MessageStream_endRequest","_MessageStream_accumulateMessage","err","chunk","__classPrivateFieldSet","__classPrivateFieldGet","isAbortError","err","castToError","APIError","APIConnectionError","castToError","BadRequestError","AuthenticationError","PermissionDeniedError","NotFoundError","ConflictError","UnprocessableEntityError","RateLimitError","InternalServerError","APIUserAbortError","APIConnectionError","APIError","APIUserAbortError","AuthenticationError","BadRequestError","ConflictError","InternalServerError","NotFoundError","PermissionDeniedError","RateLimitError","UnprocessableEntityError","kind","length","record","__classPrivateFieldSet","resolve","__classPrivateFieldGet","_EventStream_onceForEmitted","_EventStream_removeEmittedListener","_EventStream_cleanupEmittedListeners","_EventStream_handleError","_EventStream_settleTerminalEvent","hasOwn","encodeUTF8_","encodeUTF8","encoder","decodeUTF8_","decodeUTF8","levelNumbers","noop","makeLogFn","levelNumbers","noopLogger","cachedLoggers","loggerFor","hasOwn","output","content","output","makeReadableStream","ReadableStream","ReadableStreamToAsyncIterable","LineDecoder","_LineDecoder_buffer","__classPrivateFieldSet","encodeUTF8","__classPrivateFieldGet","findNewlineIndex","decodeUTF8","findDoubleNewlineIndex","APIError","isAbortError","Stream","_Stream_client","__classPrivateFieldSet","loggerFor","_iterSSEMessages","LineDecoder","__classPrivateFieldGet","makeReadableStream","encodeUTF8","err","_Stream_cancelIterator","ReadableStreamToAsyncIterable","resolve","SSEDecoder","iterSSEChunks","findDoubleNewlineIndex","partition","delimiter","__classPrivateFieldSet","__classPrivateFieldGet","APIUserAbortError","Stream","_ResponseStream_beginRequest","_ResponseStream_addEvent","event","APIError","_ResponseStream_endRequest","readFile","join","mkdir","readFile","join","join","readFile","mkdir","join","mkdir","join","mkdir","join","mkdir","join","dataDir","readFile","resolve","http","resolve","mkdir","readFile","writeFile","dirname","readFile","mkdir","dirname","writeFile","resolve","execFile","promisify","exec","proxyUrl","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/program.ts","../src/agents.ts","../src/clear.ts","../src/custom-menu.ts","../src/settings.ts","../src/paths.ts","../../../packages/shared/src/headers.ts","../../../packages/shared/src/ids.ts","../../../packages/shared/src/time.ts","../../../packages/server/src/server.ts","../../../packages/proxy/src/proxy.ts","../../../packages/proxy/src/headers.ts","../../../packages/proxy/src/target.ts","../../../node_modules/.pnpm/fzstd@0.1.1/node_modules/fzstd/esm/index.mjs","../../../packages/protocols/src/body.ts","../../../packages/protocols/src/request.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/internal/tslib.mjs","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/stainless-helper-header.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/errors.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/core/error.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/utils/values.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/shims.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/utils/bytes.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/decoders/line.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/utils/log.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/request-signal.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/core/streaming.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/lib/parser.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/_vendor/partial-json-parser/parser.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/internal/message-stream-utils.ts","../../../node_modules/.pnpm/@anthropic-ai+sdk@0.125.0/node_modules/@anthropic-ai/sdk/src/lib/MessageStream.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/internal/tslib.mjs","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/errors.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/core/error.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/lib/EventStream.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/utils/values.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/utils/bytes.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/utils/log.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/responses/output-text-index.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/responses/canonical-output-text.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/responses/response-accumulator.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/lib/parser.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/lib/ResponsesParser.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/shims.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/internal/decoders/line.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/core/streaming.ts","../../../node_modules/.pnpm/openai@7.15.0_ws@8.21.3/node_modules/openai/src/lib/responses/ResponseStream.ts","../../../packages/protocols/src/sdk-stream.ts","../../../packages/recorder/src/session.ts","../../../packages/recorder/src/sse.ts","../../../packages/recorder/src/recorder.ts","../../../packages/storage/src/reader.ts","../../../packages/storage/src/files.ts","../../../packages/storage/src/conversation.ts","../../../packages/storage/src/store.ts","../../../packages/storage/src/writer.ts","../../../packages/server/src/api.ts","../../../packages/server/src/live.ts","../../../packages/server/src/static.ts","../src/spawn.ts","../src/system-proxy.ts","../src/run.ts","../src/bin.ts"],"sourcesContent":["/** 本文件负责定义 Commander 命令和无参数时的交互菜单。 */\r\n\r\nimport { confirm, select } from \"@inquirer/prompts\";\r\nimport { readFileSync } from \"node:fs\";\r\nimport { Command, Option } from \"commander\";\r\nimport { agents, customAdapter } from \"./agents.js\";\r\nimport { clearData } from \"./clear.js\";\r\nimport { manageAgents } from \"./custom-menu.js\";\r\nimport { dataDir } from \"./paths.js\";\r\nimport { runAgent, runDashboard, type RunOptions } from \"./run.js\";\r\nimport {\r\n loadSettings,\r\n proxyMode,\r\n saveProxy,\r\n type ProxyMode,\r\n type ProxyTarget,\r\n} from \"./settings.js\";\r\n\r\n// 源码和构建产物都位于 package.json 的下一级目录,始终读取 CLI 包自身的版本。\r\nconst { version } = JSON.parse(\r\n readFileSync(new URL(\"../package.json\", import.meta.url), \"utf8\"),\r\n) as { version: string };\r\n\r\n/** 将端口字符串转换为合法整数。 */\r\nfunction parsePort(value: string): number {\r\n const port = Number.parseInt(value, 10);\r\n if (!Number.isInteger(port) || port < 0 || port > 65_535) {\r\n throw new Error(`Invalid port: ${value}`);\r\n }\r\n return port;\r\n}\r\n\r\n/** 从 Commander 根命令读取共享运行参数。 */\r\nfunction getOptions(program: Command): RunOptions {\r\n const options = program.opts<{ port: number; dataDir?: string }>();\r\n return {\r\n port: options.port,\r\n ...(options.dataDir ? { dataDir: options.dataDir } : {}),\r\n };\r\n}\r\n\r\n/** 展示可用 agent 菜单并运行用户选择项。 */\r\nasync function interactive(program: Command): Promise<void> {\r\n if (!process.stdin.isTTY) {\r\n throw new Error(\"Use tracelet claude, tracelet codex, or tracelet run <id> in a non-interactive environment.\");\r\n }\r\n\r\n for (;;) {\r\n const settings = await loadSettings();\r\n const [claudeReady, codexReady] = await Promise.all([\r\n agents.claude.detect(),\r\n agents.codex.detect(),\r\n ]);\r\n const custom = await Promise.all(Object.entries(settings.customAgents).map(async ([id, config]) => ({\r\n name: config.label,\r\n value: id,\r\n ...(!(await customAdapter(id, config).detect())\r\n ? { disabled: `${config.command} command not found` } : {}),\r\n })));\r\n const agent = await select<string>({\r\n message: \"Select an agent to trace\",\r\n choices: [\r\n {\r\n name: \"Claude Code\",\r\n value: \"claude\",\r\n ...(!claudeReady ? { disabled: \"claude command not found\" } : {}),\r\n },\r\n {\r\n name: \"Codex\",\r\n value: \"codex\",\r\n ...(!codexReady ? { disabled: \"codex command not found\" } : {}),\r\n },\r\n ...custom,\r\n { name: \"Manage custom agents...\", value: \"manage\" },\r\n ],\r\n });\r\n if (agent === \"manage\") {\r\n const launch = await manageAgents();\r\n if (launch) {\r\n process.exitCode = await runAgent(launch, [], getOptions(program));\r\n return;\r\n }\r\n continue;\r\n }\r\n process.exitCode = await runAgent(agent, [], getOptions(program));\r\n return;\r\n }\r\n}\r\n\r\n/** 确认后清除当前数据目录中的全部历史记录。 */\r\nasync function clearRecords(program: Command, yes: boolean): Promise<void> {\r\n const root = dataDir(getOptions(program).dataDir);\r\n\r\n if (!yes) {\r\n if (!process.stdin.isTTY) {\r\n throw new Error(\"Use tracelet clear --yes in a non-interactive environment.\");\r\n }\r\n\r\n const accepted = await confirm({\r\n message: `This will permanently delete all Tracelet records in ${root}. Continue?`,\r\n default: false,\r\n });\r\n if (!accepted) {\r\n console.log(\"Clear cancelled.\");\r\n return;\r\n }\r\n }\r\n\r\n await clearData(root);\r\n console.log(`All Tracelet records cleared: ${root}`);\r\n}\r\n\r\n/** 通过 Agent 和 On/Off 菜单配置系统代理。 */\r\nasync function configureProxy(): Promise<void> {\r\n if (!process.stdin.isTTY) {\r\n throw new Error(\"The proxy command requires an interactive terminal.\");\r\n }\r\n\r\n const settings = await loadSettings();\r\n const target = await select<ProxyTarget>({\r\n message: \"Select an agent to configure\",\r\n choices: [\r\n {\r\n name: `Claude Code (${proxyMode(settings, \"claude\") === \"system\" ? \"On\" : \"Off\"})`,\r\n value: \"claude\",\r\n },\r\n {\r\n name: `Codex (${proxyMode(settings, \"codex\") === \"system\" ? \"On\" : \"Off\"})`,\r\n value: \"codex\",\r\n },\r\n { name: \"All agents\", value: \"all\" },\r\n ...Object.entries(settings.customAgents).map(([id, agent]) => ({\r\n name: `${agent.label} (${proxyMode(settings, id) === \"system\" ? \"On\" : \"Off\"})`,\r\n value: id,\r\n })),\r\n ],\r\n });\r\n const current = target === \"all\" ? settings.proxy.default.mode : proxyMode(settings, target);\r\n const mode = await select<ProxyMode>({\r\n message: \"Use the system proxy for upstream requests?\",\r\n choices: [\r\n { name: \"On\", value: \"system\" },\r\n { name: \"Off\", value: \"direct\" },\r\n ],\r\n default: current,\r\n });\r\n await saveProxy(target, mode);\r\n const label = target === \"all\" ? \"all agents\"\r\n : target === \"claude\" || target === \"codex\" ? agents[target].label\r\n : settings.customAgents[target]?.label ?? target;\r\n console.log(`System proxy ${mode === \"system\" ? \"enabled\" : \"disabled\"} for ${label}.`);\r\n}\r\n\r\n/** 创建并配置 Tracelet Commander 程序。 */\r\nexport function createProgram(): Command {\r\n const program = new Command();\r\n program\r\n .name(\"tracelet\")\r\n .description(\"Record LLM requests and streaming responses from built-in and custom agents\")\r\n .version(version)\r\n .enablePositionalOptions()\r\n .addOption(new Option(\"-p, --port <port>\", \"Local server port\").default(4318).argParser(parsePort))\r\n .option(\"--data-dir <path>\", \"Local trace directory\")\r\n .action(() => interactive(program));\r\n\r\n for (const agentId of [\"claude\", \"codex\"] as const) {\r\n program\r\n .command(`${agentId} [args...]`)\r\n .description(`Start and trace ${agents[agentId].label}`)\r\n .allowUnknownOption()\r\n .passThroughOptions()\r\n .action(async (args: string[]) => {\r\n process.exitCode = await runAgent(agentId, args, getOptions(program));\r\n });\r\n }\r\n\r\n program\r\n .command(\"agent\")\r\n .description(\"Add, edit, or delete custom agents\")\r\n .action(async () => {\r\n const launch = await manageAgents();\r\n if (launch) process.exitCode = await runAgent(launch, [], getOptions(program));\r\n });\r\n\r\n program\r\n .command(\"run <id> [args...]\")\r\n .description(\"Start and trace a custom agent by ID\")\r\n .allowUnknownOption()\r\n .passThroughOptions()\r\n .action(async (id: string, args: string[]) => {\r\n process.exitCode = await runAgent(id, args, getOptions(program));\r\n });\r\n\r\n program\r\n .command(\"dashboard\")\r\n .description(\"View local Tracelet history\")\r\n .action(() => runDashboard(getOptions(program)));\r\n\r\n program\r\n .command(\"proxy\")\r\n .description(\"Configure system proxy usage\")\r\n .action(configureProxy);\r\n\r\n const clear = program\r\n .command(\"clear\")\r\n .description(\"Clear all local Tracelet history\")\r\n .option(\"-y, --yes\", \"Skip confirmation\");\r\n\r\n /** 读取 clear 子命令参数并执行清理。 */\r\n clear.action(async () => {\r\n const options = clear.opts<{ yes?: boolean }>();\r\n await clearRecords(program, options.yes === true);\r\n });\r\n\r\n return program;\r\n}\r\n","/** 本文件负责检测 Claude Code 与 Codex,并生成无全局副作用的启动参数。 */\r\n\r\nimport { access, readFile } from \"node:fs/promises\";\r\nimport { constants } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { delimiter, join } from \"node:path\";\r\nimport { execFile } from \"node:child_process\";\r\nimport { promisify } from \"node:util\";\r\nimport type { AgentType, Protocol } from \"@tracelet/shared\";\r\nimport type { CustomAgent } from \"./settings.js\";\r\n\r\nconst exec = promisify(execFile);\r\nconst codexProvider = \"tracelet\";\r\n\r\nexport interface LaunchInfo {\r\n command: string;\r\n args: string[];\r\n env: NodeJS.ProcessEnv;\r\n}\r\n\r\nexport interface AgentAdapter {\r\n id: string;\r\n label: string;\r\n command: string;\r\n protocol: Protocol;\r\n /** 检测本机是否安装当前 agent。 */\r\n detect(): Promise<boolean>;\r\n /** 获取当前 agent 原本使用的上游地址。 */\r\n upstream(): Promise<string>;\r\n /** 生成只对本次子进程生效的代理启动参数。 */\r\n launch(proxyUrl: string, args: string[]): LaunchInfo;\r\n}\r\n\r\ninterface ClaudeSettings {\r\n env?: Record<string, unknown>;\r\n}\r\n\r\n/** 将 Tracelet 本地地址加入子进程的代理绕过列表。 */\r\nfunction launchEnv(env: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {\r\n const values = [env.NO_PROXY, env.no_proxy, \"127.0.0.1\", \"localhost\", \"::1\"]\r\n .flatMap((value) => value?.split(\",\") ?? [])\r\n .map((value) => value.trim())\r\n .filter(Boolean);\r\n const noProxy = [...new Set(values)].join(\",\");\r\n return { ...env, NO_PROXY: noProxy, no_proxy: noProxy };\r\n}\r\n\r\n/** 检查命令是否存在于当前 PATH。 */\r\nasync function hasBin(command: string): Promise<boolean> {\r\n const paths = command.includes(\"/\") || command.includes(\"\\\\\")\r\n ? [\"\"] : process.env.PATH?.split(delimiter) ?? [];\r\n const names = process.platform === \"win32\" && !/\\.[^\\\\/]+$/.test(command)\r\n ? [command, ...(process.env.PATHEXT ?? \".COM;.EXE;.BAT;.CMD\").split(\";\").map((ext) => `${command}${ext}`)]\r\n : [command];\r\n\r\n for (const path of paths) {\r\n for (const name of names) {\r\n try {\r\n await access(join(path, name), constants.X_OK);\r\n return true;\r\n } catch {\r\n // 当前候选项未命中时继续检查 PATH 或 Windows 扩展名。\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/** 依据保存的配置创建仅影响当前子进程的自定义 Agent 启动器。 */\r\nexport function customAdapter(id: string, config: CustomAgent): AgentAdapter {\r\n return {\r\n id,\r\n label: config.label,\r\n command: config.command,\r\n protocol: config.protocol,\r\n detect: () => hasBin(config.command),\r\n upstream: async () => config.upstream,\r\n launch: (proxyUrl, args) => {\r\n const env = launchEnv();\r\n const inject = config.inject.type === \"env\" ? []\r\n : config.inject.args.map((arg) => arg.replaceAll(\"{baseUrl}\", proxyUrl));\r\n if (config.inject.type === \"env\") {\r\n // 未指定变量名时使用协议的标准 Base URL 环境变量。\r\n const name = config.inject.name ?? (config.protocol === \"anthropic\"\r\n ? \"ANTHROPIC_BASE_URL\" : \"OPENAI_BASE_URL\");\r\n env[name] = proxyUrl;\r\n }\r\n return { command: config.command, args: [...inject, ...config.args, ...args], env };\r\n },\r\n };\r\n}\r\n\r\n/** 判断 Codex 当前是否使用 ChatGPT 登录。 */\r\nasync function usesChatGpt(): Promise<boolean> {\r\n try {\r\n const result = await exec(\"codex\", [\"login\", \"status\"]);\r\n return result.stderr.includes(\"ChatGPT\");\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/** 从单个 Claude Code 配置文件读取上游地址。 */\r\nasync function readClaudeUrl(path: string): Promise<string | undefined> {\r\n try {\r\n const settings = JSON.parse(await readFile(path, \"utf8\")) as ClaudeSettings;\r\n const url = settings.env?.ANTHROPIC_BASE_URL;\r\n return typeof url === \"string\" && url ? url : undefined;\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\r\n return undefined;\r\n }\r\n\r\n throw new Error(`Failed to read Claude Code configuration: ${path}`, { cause: error });\r\n }\r\n}\r\n\r\n/** 按 Claude Code 配置作用域返回从高到低的配置文件路径。 */\r\nfunction claudeFiles(cwd: string, env: NodeJS.ProcessEnv): string[] {\r\n const userDir = env.CLAUDE_CONFIG_DIR ?? join(homedir(), \".claude\");\r\n return [\r\n join(cwd, \".claude\", \"settings.local.json\"),\r\n join(cwd, \".claude\", \"settings.json\"),\r\n join(userDir, \"settings.json\"),\r\n ];\r\n}\r\n\r\n/** 按显式覆盖、配置文件和官方地址的顺序确定 Claude 上游。 */\r\nexport async function claudeUpstream(\r\n cwd = process.cwd(),\r\n env: NodeJS.ProcessEnv = process.env,\r\n): Promise<string> {\r\n if (env.TRACELET_CLAUDE_UPSTREAM) {\r\n return env.TRACELET_CLAUDE_UPSTREAM;\r\n }\r\n\r\n for (const path of claudeFiles(cwd, env)) {\r\n const url = await readClaudeUrl(path);\r\n if (url) {\r\n return url;\r\n }\r\n }\r\n\r\n return \"https://api.anthropic.com\";\r\n}\r\n\r\n/** 根据 Codex 登录方式选择原始 OpenAI 上游地址。 */\r\nasync function codexUpstream(): Promise<string> {\r\n if (process.env.TRACELET_CODEX_UPSTREAM) {\r\n return process.env.TRACELET_CODEX_UPSTREAM;\r\n }\r\n\r\n return (await usesChatGpt())\r\n ? \"https://chatgpt.com/backend-api/codex\"\r\n : \"https://api.openai.com/v1\";\r\n}\r\n\r\n/** 生成 Claude Code 的临时 settings 和环境变量。 */\r\nfunction launchClaude(proxyUrl: string, args: string[]): LaunchInfo {\r\n // Claude 配置中的 env 会在启动时生效,因此用 CLI settings 再次覆盖 Base URL。\r\n const settings = JSON.stringify({ env: { ANTHROPIC_BASE_URL: proxyUrl } });\r\n return {\r\n command: \"claude\",\r\n args: [\"--settings\", settings, ...args],\r\n env: { ...launchEnv(), ANTHROPIC_BASE_URL: proxyUrl },\r\n };\r\n}\r\n\r\n/** 生成禁用 WebSocket 的 Codex 临时 Provider 配置。 */\r\nfunction providerConfig(proxyUrl: string): string {\r\n return `{ name = \"Tracelet\", base_url = ${JSON.stringify(proxyUrl)}, wire_api = \"responses\", requires_openai_auth = true, supports_websockets = false }`;\r\n}\r\n\r\n/** 生成只对当前进程生效的 Codex Provider 覆盖参数。 */\r\nfunction launchCodex(proxyUrl: string, args: string[]): LaunchInfo {\r\n return {\r\n command: \"codex\",\r\n // 参数通过 spawn 数组传递,不经过 shell 展开。\r\n args: [\r\n \"-c\",\r\n `model_provider=${JSON.stringify(codexProvider)}`,\r\n \"-c\",\r\n `model_providers.${codexProvider}=${providerConfig(proxyUrl)}`,\r\n ...args,\r\n ],\r\n env: launchEnv(),\r\n };\r\n}\r\n\r\nexport const agents: Record<AgentType, AgentAdapter> = {\r\n claude: {\r\n id: \"claude\",\r\n label: \"Claude Code\",\r\n command: \"claude\",\r\n protocol: \"anthropic\",\r\n detect: () => hasBin(\"claude\"),\r\n upstream: claudeUpstream,\r\n launch: launchClaude,\r\n },\r\n codex: {\r\n id: \"codex\",\r\n label: \"Codex\",\r\n command: \"codex\",\r\n protocol: \"openai\",\r\n detect: () => hasBin(\"codex\"),\r\n upstream: codexUpstream,\r\n launch: launchCodex,\r\n },\r\n};\r\n","/** 本文件负责安全清除 Tracelet 已记录的全部运行与会话数据。 */\r\n\r\nimport { mkdir, rm } from \"node:fs/promises\";\r\nimport { homedir } from \"node:os\";\r\nimport { join, parse, resolve } from \"node:path\";\r\n\r\n/** 校验数据目录并返回其运行记录目录。 */\r\nfunction runsDir(root: string): string {\r\n const data = resolve(root);\r\n\r\n // 禁止将文件系统根目录或用户目录直接作为清理目标。\r\n if (data === parse(data).root || data === resolve(homedir())) {\r\n throw new Error(`Refusing to clear unsafe data directory: ${data}`);\r\n }\r\n\r\n return join(data, \"runs\");\r\n}\r\n\r\n/** 删除全部运行记录,并重新创建空的运行记录目录。 */\r\nexport async function clearData(root: string): Promise<void> {\r\n const runs = runsDir(root);\r\n\r\n // 只删除 runs,保留数据根目录及其中可能存在的其他文件。\r\n await rm(runs, { recursive: true, force: true });\r\n await mkdir(runs, { recursive: true });\r\n}\r\n","/** 本文件负责自定义 Agent 的新增、编辑、删除及启动交互。 */\r\n\r\nimport { confirm, input, select } from \"@inquirer/prompts\";\r\nimport type { Protocol } from \"@tracelet/shared\";\r\nimport { loadSettings, removeAgent, saveAgent, type CustomAgent } from \"./settings.js\";\r\n\r\ntype Field = \"label\" | \"command\" | \"args\" | \"protocol\" | \"upstream\" | \"inject\" | \"save\" | \"cancel\";\r\n\r\n/** 返回协议对应的默认 Base URL 环境变量名。 */\r\nfunction baseEnv(protocol: Protocol): string {\r\n return protocol === \"anthropic\" ? \"ANTHROPIC_BASE_URL\" : \"OPENAI_BASE_URL\";\r\n}\r\n\r\n/** 校验非空输入。 */\r\nfunction required(value: string): true | string {\r\n return value.trim() ? true : \"This field is required.\";\r\n}\r\n\r\n/** 解析保持参数边界的 JSON 字符串数组。 */\r\nfunction parseArgs(value: string): string[] {\r\n const args = JSON.parse(value) as unknown;\r\n if (!Array.isArray(args) || !args.every((arg) => typeof arg === \"string\")) {\r\n throw new Error(\"Enter a JSON array of strings.\");\r\n }\r\n return args;\r\n}\r\n\r\n/** 提示输入命令参数数组,避免按空格切分带引号的参数。 */\r\nasync function askArgs(message: string, args: string[], needsUrl = false): Promise<string[]> {\r\n const value = await input({\r\n message,\r\n default: JSON.stringify(args),\r\n validate: (text) => {\r\n try {\r\n const parsed = parseArgs(text);\r\n if (needsUrl && !parsed.some((arg) => arg.includes(\"{baseUrl}\"))) {\r\n return \"Include {baseUrl} in one argument.\";\r\n }\r\n return true;\r\n } catch {\r\n return \"Enter a JSON array of strings, for example [\\\"--profile\\\",\\\"work\\\"].\";\r\n }\r\n },\r\n });\r\n return parseArgs(value);\r\n}\r\n\r\n/** 校验上游 HTTP 地址。 */\r\nfunction validUrl(value: string): true | string {\r\n try {\r\n return [\"http:\", \"https:\"].includes(new URL(value).protocol)\r\n ? true : \"Use an http:// or https:// URL.\";\r\n } catch {\r\n return \"Enter a valid upstream URL.\";\r\n }\r\n}\r\n\r\n/** 选择协议及其默认上游地址。 */\r\nasync function askProtocol(current?: Protocol): Promise<Protocol> {\r\n return select<Protocol>({\r\n message: \"Protocol\",\r\n choices: [\r\n { name: \"Anthropic Messages\", value: \"anthropic\" },\r\n { name: \"OpenAI Responses\", value: \"openai\" },\r\n ],\r\n default: current,\r\n });\r\n}\r\n\r\n/** 选择通过环境变量或命令参数注入本地 Base URL。 */\r\nasync function askInject(protocol: Protocol, current?: CustomAgent[\"inject\"]): Promise<CustomAgent[\"inject\"]> {\r\n const type = await select<\"env\" | \"args\">({\r\n message: \"How should Tracelet pass its local Base URL?\",\r\n choices: [\r\n { name: \"Environment variable (recommended)\", value: \"env\" },\r\n { name: \"Command arguments\", value: \"args\" },\r\n ],\r\n default: current?.type ?? \"env\",\r\n });\r\n if (type === \"env\") {\r\n const fallback = baseEnv(protocol);\r\n const name = await input({\r\n message: `Environment variable (blank uses ${fallback})`,\r\n default: current?.type === \"env\" ? current.name ?? \"\" : \"\",\r\n validate: (value) => !value || /^[A-Za-z_][A-Za-z0-9_]*$/.test(value)\r\n ? true : \"Enter a valid environment variable name.\",\r\n });\r\n return { type: \"env\", ...(name ? { name } : {}) };\r\n }\r\n const args = await askArgs(\"Base URL arguments (JSON array containing {baseUrl})\",\r\n current?.type === \"args\" ? current.args : [\"--base-url\", \"{baseUrl}\"], true);\r\n return { type: \"args\", args };\r\n}\r\n\r\n/** 为新 Agent 生成不与现有配置冲突的固定内部 ID。 */\r\nfunction nextId(label: string, used: Record<string, CustomAgent>): string {\r\n const slug = label.toLowerCase().normalize(\"NFKD\").replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\") || \"agent\";\r\n const base = `custom-${slug}`;\r\n let id = base;\r\n let count = 2;\r\n while (used[id]) {\r\n id = `${base}-${count++}`;\r\n }\r\n return id;\r\n}\r\n\r\n/** 展示待保存的 Agent 配置摘要。 */\r\nfunction showAgent(id: string, agent: CustomAgent): void {\r\n console.log(`\\n${agent.label} (${id})`);\r\n console.log(` Command: ${JSON.stringify([agent.command, ...agent.args])}`);\r\n console.log(` Protocol: ${agent.protocol}`);\r\n console.log(` Upstream: ${agent.upstream}`);\r\n console.log(` Base URL: ${agent.inject.type === \"env\"\r\n ? `env ${agent.inject.name ?? baseEnv(agent.protocol)}`\r\n : `args ${JSON.stringify(agent.inject.args)}`}\\n`);\r\n}\r\n\r\n/** 引导创建新 Agent,保存后可立即启动。 */\r\nasync function addAgent(): Promise<string | undefined> {\r\n const settings = await loadSettings();\r\n const label = await input({ message: \"Agent name\", validate: required });\r\n const id = nextId(label, settings.customAgents);\r\n const command = await input({ message: \"Executable command\", validate: required });\r\n const args = await askArgs(\"Default arguments (JSON array)\", []);\r\n const protocol = await askProtocol();\r\n const inject = await askInject(protocol);\r\n const envName = inject.type === \"env\" ? inject.name ?? baseEnv(protocol) : baseEnv(protocol);\r\n const upstream = await input({\r\n message: \"Original upstream URL\",\r\n default: process.env[envName] ?? (protocol === \"anthropic\"\r\n ? \"https://api.anthropic.com\" : \"https://api.openai.com/v1\"),\r\n validate: validUrl,\r\n });\r\n const agent: CustomAgent = { label, command, args, protocol, upstream, inject };\r\n showAgent(id, agent);\r\n if (!(await confirm({ message: \"Save this agent?\", default: true }))) {\r\n return undefined;\r\n }\r\n await saveAgent(id, agent);\r\n console.log(`Agent saved: ${id}`);\r\n return await confirm({ message: \"Launch it now?\", default: false }) ? id : undefined;\r\n}\r\n\r\n/** 从已保存列表中选择自定义 Agent。 */\r\nasync function chooseAgent(message: string): Promise<string | undefined> {\r\n const entries = Object.entries((await loadSettings()).customAgents);\r\n if (entries.length === 0) {\r\n console.log(\"No custom agents configured.\");\r\n return undefined;\r\n }\r\n return select<string>({\r\n message,\r\n choices: [\r\n ...entries.map(([id, agent]) => ({ name: `${agent.label} (${id})`, value: id })),\r\n { name: \"Back\", value: \"back\" },\r\n ],\r\n });\r\n}\r\n\r\n/** 在内存草稿中按字段修改 Agent,保存前不影响已有配置。 */\r\nasync function editAgent(): Promise<void> {\r\n const id = await chooseAgent(\"Select an agent to edit\");\r\n if (!id || id === \"back\") return;\r\n const draft = structuredClone((await loadSettings()).customAgents[id]!);\r\n showAgent(id, draft);\r\n for (;;) {\r\n const field = await select<Field>({\r\n message: \"Select a field to edit\",\r\n // 一次展示全部字段,并在首尾停止方向键导航。\r\n pageSize: 8,\r\n loop: false,\r\n choices: [\r\n { name: `Name: ${draft.label}`, value: \"label\" },\r\n { name: `Command: ${draft.command}`, value: \"command\" },\r\n { name: `Default arguments: ${JSON.stringify(draft.args)}`, value: \"args\" },\r\n { name: `Protocol: ${draft.protocol}`, value: \"protocol\" },\r\n { name: `Upstream: ${draft.upstream}`, value: \"upstream\" },\r\n { name: \"Base URL injection\", value: \"inject\" },\r\n { name: \"Save changes\", value: \"save\" },\r\n { name: \"Cancel\", value: \"cancel\" },\r\n ],\r\n });\r\n if (field === \"cancel\") return;\r\n if (field === \"save\") {\r\n await saveAgent(id, draft);\r\n console.log(`Agent updated: ${id}`);\r\n return;\r\n }\r\n if (field === \"label\") draft.label = await input({ message: \"Agent name\", default: draft.label, validate: required });\r\n if (field === \"command\") draft.command = await input({ message: \"Executable command\", default: draft.command, validate: required });\r\n if (field === \"args\") draft.args = await askArgs(\"Default arguments (JSON array)\", draft.args);\r\n if (field === \"protocol\") draft.protocol = await askProtocol(draft.protocol);\r\n if (field === \"upstream\") draft.upstream = await input({ message: \"Original upstream URL\", default: draft.upstream, validate: validUrl });\r\n if (field === \"inject\") draft.inject = await askInject(draft.protocol, draft.inject);\r\n }\r\n}\r\n\r\n/** 确认删除自定义配置及代理覆盖项,保留所有历史记录。 */\r\nasync function deleteAgent(): Promise<void> {\r\n const id = await chooseAgent(\"Select an agent to delete\");\r\n if (!id || id === \"back\") return;\r\n const agent = (await loadSettings()).customAgents[id]!;\r\n if (!(await confirm({ message: `Delete ${agent.label} (${id})? Recorded history will be kept.`, default: false }))) {\r\n console.log(\"Delete cancelled.\");\r\n return;\r\n }\r\n await removeAgent(id);\r\n console.log(`Agent deleted: ${id}. Recorded history was kept.`);\r\n}\r\n\r\n/** 循环展示自定义 Agent 管理菜单,返回可选的立即启动目标。 */\r\nexport async function manageAgents(): Promise<string | undefined> {\r\n if (!process.stdin.isTTY) throw new Error(\"The agent command requires an interactive terminal.\");\r\n for (;;) {\r\n const action = await select<\"add\" | \"edit\" | \"delete\" | \"back\">({\r\n message: \"Manage custom agents\",\r\n choices: [\r\n { name: \"Add agent\", value: \"add\" },\r\n { name: \"Edit agent\", value: \"edit\" },\r\n { name: \"Delete agent\", value: \"delete\" },\r\n { name: \"Back\", value: \"back\" },\r\n ],\r\n });\r\n if (action === \"back\") return undefined;\r\n if (action === \"add\") {\r\n const id = await addAgent();\r\n if (id) return id;\r\n }\r\n if (action === \"edit\") await editAgent();\r\n if (action === \"delete\") await deleteAgent();\r\n }\r\n}\r\n","/** 本文件负责读取和保存用户目录中的 Tracelet 配置。 */\r\n\r\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\r\nimport { dirname } from \"node:path\";\r\nimport type { Protocol } from \"@tracelet/shared\";\r\nimport { settingsFile } from \"./paths.js\";\r\n\r\nexport type ProxyMode = \"direct\" | \"system\";\r\nexport type ProxyTarget = string;\r\n\r\nexport interface CustomAgent {\r\n label: string;\r\n command: string;\r\n args: string[];\r\n protocol: Protocol;\r\n upstream: string;\r\n inject: { type: \"env\"; name?: string } | { type: \"args\"; args: string[] };\r\n}\r\n\r\nexport interface ProxyConfig {\r\n mode: ProxyMode;\r\n}\r\n\r\nexport interface Settings {\r\n customAgents: Record<string, CustomAgent>;\r\n proxy: {\r\n default: ProxyConfig;\r\n agents: Record<string, ProxyConfig>;\r\n };\r\n}\r\n\r\n/** 校验自定义 Agent 的完整配置并返回可安全保存的副本。 */\r\nfunction readAgent(value: unknown, id: string): CustomAgent {\r\n if (!/^custom-[a-z0-9]+(?:-[a-z0-9]+)*$/.test(id) || !isObject(value)) {\r\n throw new Error(`Invalid custom agent: ${id}`);\r\n }\r\n const { label, command, args, protocol, upstream, inject } = value;\r\n if (typeof label !== \"string\" || !label.trim() || typeof command !== \"string\" || !command.trim()\r\n || !Array.isArray(args) || !args.every((arg) => typeof arg === \"string\")\r\n || (protocol !== \"anthropic\" && protocol !== \"openai\") || typeof upstream !== \"string\"\r\n || !isObject(inject) || (inject.type !== \"env\" && inject.type !== \"args\")) {\r\n throw new Error(`Invalid custom agent: ${id}`);\r\n }\r\n try {\r\n if (![\"http:\", \"https:\"].includes(new URL(upstream).protocol)) {\r\n throw new Error(\"Unsupported protocol\");\r\n }\r\n } catch {\r\n throw new Error(`Invalid upstream URL for custom agent: ${id}`);\r\n }\r\n if (inject.type === \"env\") {\r\n if (inject.name !== undefined && (typeof inject.name !== \"string\"\r\n || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(inject.name))) {\r\n throw new Error(`Invalid environment variable for custom agent: ${id}`);\r\n }\r\n return { label: label.trim(), command: command.trim(), args, protocol, upstream, inject: {\r\n type: \"env\", ...(inject.name ? { name: inject.name } : {}),\r\n } };\r\n }\r\n if (!Array.isArray(inject.args) || !inject.args.every((arg) => typeof arg === \"string\")\r\n || !inject.args.some((arg) => arg.includes(\"{baseUrl}\"))) {\r\n throw new Error(`Invalid Base URL argument template for custom agent: ${id}`);\r\n }\r\n return { label: label.trim(), command: command.trim(), args, protocol, upstream,\r\n inject: { type: \"args\", args: inject.args } };\r\n}\r\n\r\n/** 判断配置值是否为普通对象。 */\r\nfunction isObject(value: unknown): value is Record<string, unknown> {\r\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\r\n}\r\n\r\n/** 读取原始配置对象,文件不存在时返回空配置。 */\r\nasync function readRaw(path: string): Promise<Record<string, unknown>> {\r\n try {\r\n const value = JSON.parse(await readFile(path, \"utf8\")) as unknown;\r\n if (!isObject(value)) {\r\n throw new Error(\"Settings root must be an object\");\r\n }\r\n return value;\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\r\n return {};\r\n }\r\n throw new Error(`Failed to read Tracelet settings: ${path}`, { cause: error });\r\n }\r\n}\r\n\r\n/** 读取并校验单个代理配置。 */\r\nfunction readProxy(value: unknown, name: string): ProxyConfig {\r\n if (!isObject(value) || (value.mode !== \"direct\" && value.mode !== \"system\")) {\r\n throw new Error(`Invalid proxy mode: ${name}`);\r\n }\r\n return { mode: value.mode };\r\n}\r\n\r\n/** 将原始对象转换为按 Agent 区分的 Tracelet 配置。 */\r\nfunction parseSettings(value: Record<string, unknown>, path: string): Settings {\r\n if (value.customAgents !== undefined && !isObject(value.customAgents)) {\r\n throw new Error(`Invalid custom agents: ${path}`);\r\n }\r\n const customAgents: Record<string, CustomAgent> = {};\r\n if (isObject(value.customAgents)) {\r\n for (const [id, config] of Object.entries(value.customAgents)) {\r\n customAgents[id] = readAgent(config, id);\r\n }\r\n }\r\n if (value.proxy !== undefined && !isObject(value.proxy)) {\r\n throw new Error(`Invalid proxy settings: ${path}`);\r\n }\r\n\r\n const proxy = isObject(value.proxy) ? value.proxy : {};\r\n const defaultConfig = proxy.default === undefined\r\n ? { mode: \"direct\" as const }\r\n : readProxy(proxy.default, \"default\");\r\n if (proxy.agents !== undefined && !isObject(proxy.agents)) {\r\n throw new Error(`Invalid agent proxy settings: ${path}`);\r\n }\r\n\r\n const agents: Record<string, ProxyConfig> = {};\r\n if (isObject(proxy.agents)) {\r\n for (const [agentId, config] of Object.entries(proxy.agents)) {\r\n agents[agentId] = readProxy(config, agentId);\r\n }\r\n }\r\n\r\n return { customAgents, proxy: { default: defaultConfig, agents } };\r\n}\r\n\r\n/** 保存配置对象并保持用户设置文件仅当前用户可读。 */\r\nasync function writeSettings(path: string, value: Record<string, unknown>): Promise<void> {\r\n await mkdir(dirname(path), { recursive: true });\r\n await writeFile(path, `${JSON.stringify(value, null, 2)}\\n`, { encoding: \"utf8\", mode: 0o600 });\r\n}\r\n\r\n/** 读取并校验 Tracelet 配置,缺省 Agent 使用默认直连配置。 */\r\nexport async function loadSettings(path = settingsFile()): Promise<Settings> {\r\n return parseSettings(await readRaw(path), path);\r\n}\r\n\r\n/** 返回指定 Agent 最终使用的代理模式。 */\r\nexport function proxyMode(settings: Settings, agentId: string): ProxyMode {\r\n return settings.proxy.agents[agentId]?.mode ?? settings.proxy.default.mode;\r\n}\r\n\r\n/** 保存单个或全部 Agent 的代理模式,同时保留其他顶层配置。 */\r\nexport async function saveProxy(target: ProxyTarget, mode: ProxyMode, path = settingsFile()): Promise<void> {\r\n const value = await readRaw(path);\r\n const current = parseSettings(value, path);\r\n const agents = { ...current.proxy.agents };\r\n let defaultConfig = current.proxy.default;\r\n\r\n if (target === \"all\") {\r\n // 全部 Agent 使用新的默认值,并移除已有的单独覆盖项。\r\n defaultConfig = { mode };\r\n for (const agentId of Object.keys(agents)) {\r\n delete agents[agentId];\r\n }\r\n } else if (mode === defaultConfig.mode) {\r\n delete agents[target];\r\n } else {\r\n agents[target] = { mode };\r\n }\r\n\r\n const next = { ...value, proxy: { default: defaultConfig, agents } };\r\n\r\n // settings.json 独立于记录目录,始终保存在当前用户的 Tracelet 目录下。\r\n await writeSettings(path, next);\r\n}\r\n\r\n/** 新增或更新一个自定义 Agent,同时保留其他设置。 */\r\nexport async function saveAgent(id: string, agent: CustomAgent, path = settingsFile()): Promise<void> {\r\n const value = await readRaw(path);\r\n const current = parseSettings(value, path);\r\n const customAgents = { ...current.customAgents, [id]: readAgent(agent, id) };\r\n await writeSettings(path, { ...value, customAgents });\r\n}\r\n\r\n/** 删除自定义 Agent 及其代理覆盖配置,但不触及历史记录。 */\r\nexport async function removeAgent(id: string, path = settingsFile()): Promise<void> {\r\n const value = await readRaw(path);\r\n const current = parseSettings(value, path);\r\n const customAgents = { ...current.customAgents };\r\n const proxyAgents = { ...current.proxy.agents };\r\n delete customAgents[id];\r\n delete proxyAgents[id];\r\n await writeSettings(path, { ...value, customAgents,\r\n proxy: { default: current.proxy.default, agents: proxyAgents } });\r\n}\r\n","/** 本文件负责确定 CLI 使用的数据目录和 Dashboard 构建目录。 */\r\n\r\nimport { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { resolve } from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\n\r\n/** 返回用户指定或默认的 Tracelet 数据目录。 */\r\nexport function dataDir(value?: string): string {\r\n return resolve(value ?? process.env.TRACELET_DATA_DIR ?? resolve(homedir(), \".tracelet\", \"data\"));\r\n}\r\n\r\n/** 返回当前用户的 Tracelet 配置文件路径。 */\r\nexport function settingsFile(): string {\r\n return resolve(homedir(), \".tracelet\", \"settings.json\");\r\n}\r\n\r\n/** 查找开发环境或构建产物中的 Dashboard 目录。 */\r\nexport function dashboardDir(): string {\r\n const bundled = fileURLToPath(new URL(\"./dashboard\", import.meta.url));\r\n const workspace = resolve(process.cwd(), \"apps/dashboard/dist\");\r\n return existsSync(bundled) ? bundled : workspace;\r\n}\r\n","/** 本文件负责规范化并脱敏需要持久化的 HTTP Header。 */\r\n\r\nimport type { IncomingHttpHeaders } from \"node:http\";\r\nimport type { HeaderMap } from \"./types.js\";\r\n\r\nconst secrets = new Set([\r\n \"authorization\",\r\n \"proxy-authorization\",\r\n \"x-api-key\",\r\n \"cookie\",\r\n \"set-cookie\",\r\n]);\r\n\r\n/** 把 Node Header 转成可序列化对象,并隐藏认证信息。 */\r\nexport function redactHeaders(headers: IncomingHttpHeaders): HeaderMap {\r\n const result: HeaderMap = {};\r\n\r\n for (const [name, value] of Object.entries(headers)) {\r\n if (value === undefined) {\r\n continue;\r\n }\r\n\r\n // 认证 Header 只保留存在性,避免令牌进入记录文件。\r\n result[name] = secrets.has(name.toLowerCase()) ? \"[REDACTED]\" : value;\r\n }\r\n\r\n return result;\r\n}\r\n","/** 本文件负责生成 Tracelet 内部使用的唯一标识。 */\r\n\r\nimport { randomUUID } from \"node:crypto\";\r\n\r\n/** 生成带业务前缀的唯一标识。 */\r\nexport function makeId(prefix: string): string {\r\n return `${prefix}_${randomUUID().replaceAll(\"-\", \"\")}`;\r\n}\r\n","/** 本文件负责提供记录流量时使用的时间工具。 */\r\n\r\n/** 获取当前 ISO 时间。 */\r\nexport function nowIso(): string {\r\n return new Date().toISOString();\r\n}\r\n\r\n/** 将高精度时间差转换为微秒。 */\r\nexport function elapsedUs(start: bigint): number {\r\n return Number((process.hrtime.bigint() - start) / 1_000n);\r\n}\r\n","/** 本文件负责组合 HTTP 代理、记录器、文件存储和 Dashboard 服务。 */\r\n\r\nimport http, { type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\r\nimport { ProxyServer } from \"@tracelet/proxy\";\r\nimport { Recorder } from \"@tracelet/recorder\";\r\nimport type { Protocol, RouteInfo, RunMeta } from \"@tracelet/shared\";\r\nimport { FileStore } from \"@tracelet/storage\";\r\nimport { serveApi } from \"./api.js\";\r\nimport { LiveBus } from \"./live.js\";\r\nimport { serveStatic } from \"./static.js\";\r\n\r\nexport interface ServerOptions {\r\n dataDir: string;\r\n dashboardDir: string;\r\n host?: string;\r\n}\r\n\r\nexport class TraceletServer {\r\n readonly dataDir: string;\r\n private readonly host: string;\r\n private readonly dashboardDir: string;\r\n private readonly store: FileStore;\r\n private readonly recorder: Recorder;\r\n private readonly proxy: ProxyServer;\r\n private readonly live = new LiveBus();\r\n private readonly routes = new Map<string, RouteInfo>();\r\n private readonly server: Server;\r\n private port = 0;\r\n\r\n /** 创建本地 Tracelet HTTP 服务。 */\r\n constructor(options: ServerOptions) {\r\n this.dataDir = options.dataDir;\r\n this.host = options.host ?? \"127.0.0.1\";\r\n this.dashboardDir = options.dashboardDir;\r\n this.store = new FileStore(this.dataDir);\r\n this.recorder = new Recorder(this.store, (meta) => this.live.publish(\"change\", { id: meta.id }));\r\n this.proxy = new ProxyServer(this.recorder);\r\n this.server = http.createServer((req, res) => {\r\n this.handle(req, res).catch((error: unknown) => {\r\n if (!res.headersSent) {\r\n res.writeHead(500, { \"content-type\": \"application/json; charset=utf-8\" });\r\n res.end(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }));\r\n } else {\r\n res.destroy();\r\n }\r\n });\r\n });\r\n }\r\n\r\n /** 初始化文件存储并监听本地端口。 */\r\n async listen(port: number): Promise<void> {\r\n await this.store.init();\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n /** 监听成功后记录系统实际分配的端口。 */\r\n const onListen = (): void => {\r\n const address = this.server.address();\r\n this.port = typeof address === \"object\" && address ? address.port : port;\r\n resolve();\r\n };\r\n\r\n this.server.once(\"error\", reject);\r\n this.server.listen(port, this.host, onListen);\r\n });\r\n }\r\n\r\n /** 返回当前 Dashboard 地址。 */\r\n url(): string {\r\n return `http://${this.host}:${this.port}`;\r\n }\r\n\r\n /** 注册一次 agent 运行及其固定上游地址。 */\r\n async addRun(run: RunMeta, protocol: Protocol, upstream: string, proxy?: string): Promise<string> {\r\n await this.store.startRun(run);\r\n const prefix = `/_tracelet/p/${run.id}/${protocol}`;\r\n this.routes.set(prefix, { runId: run.id, protocol, upstream, prefix, ...(proxy ? { proxy } : {}) });\r\n return `${this.url()}${prefix}`;\r\n }\r\n\r\n /** 更新运行结束信息并广播 Dashboard。 */\r\n async finishRun(run: RunMeta): Promise<void> {\r\n await this.store.finishRun(run);\r\n this.live.publish(\"change\", { runId: run.id });\r\n }\r\n\r\n /** 等待记录写入完成并关闭 HTTP 服务。 */\r\n async close(): Promise<void> {\r\n await this.recorder.drain();\r\n this.live.close();\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n /** 将 Node 回调式 close 转换为 Promise。 */\r\n function onClose(error?: Error): void {\r\n if (error) {\r\n reject(error);\r\n } else {\r\n resolve();\r\n }\r\n }\r\n\r\n this.server.close(onClose);\r\n });\r\n this.proxy.close();\r\n }\r\n\r\n /** 将请求分发到代理、Dashboard API 或静态资源。 */\r\n private async handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\r\n const url = new URL(req.url ?? \"/\", this.url());\r\n const route = this.findRoute(url.pathname);\r\n\r\n if (route) {\r\n await this.proxy.handle(req, res, route);\r\n return;\r\n }\r\n\r\n if (url.pathname.startsWith(\"/api/\") && (await serveApi(req, res, url.pathname, this.dataDir, this.live))) {\r\n return;\r\n }\r\n\r\n if (req.method !== \"GET\") {\r\n res.writeHead(404);\r\n res.end();\r\n return;\r\n }\r\n\r\n await serveStatic(this.dashboardDir, url.pathname, res);\r\n }\r\n\r\n /** 查找一个本地代理路径对应的运行路由。 */\r\n private findRoute(path: string): RouteInfo | undefined {\r\n return [...this.routes.values()].find(\r\n (item) => path === item.prefix || path.startsWith(`${item.prefix}/`),\r\n );\r\n }\r\n\r\n}\r\n","/** 本文件负责透明转发 HTTP 请求与流式响应,并把流量副本交给 Recorder。 */\r\n\r\nimport http, { type ClientRequest, type IncomingMessage, type ServerResponse } from \"node:http\";\r\nimport https from \"node:https\";\r\nimport { HttpProxyAgent } from \"http-proxy-agent\";\r\nimport { HttpsProxyAgent } from \"https-proxy-agent\";\r\nimport type { Capture, Recorder } from \"@tracelet/recorder\";\r\nimport type { RouteInfo } from \"@tracelet/shared\";\r\nimport { requestHeaders, responseHeaders } from \"./headers.js\";\r\nimport { targetUrl } from \"./target.js\";\r\n\r\n/** 将记录任务交给 Recorder 后台收尾。 */\r\nfunction finishCapture(recorder: Recorder, capture: Capture | undefined): void {\r\n if (capture) {\r\n recorder.track(capture.end());\r\n }\r\n}\r\n\r\n/** 在记录器可用时标记捕获失败。 */\r\nfunction failCapture(recorder: Recorder, capture: Capture | undefined, error: Error): void {\r\n if (capture) {\r\n recorder.track(capture.fail(error));\r\n }\r\n}\r\n\r\nexport class ProxyServer {\r\n private readonly recorder: Recorder;\r\n private readonly agents = new Map<string, HttpProxyAgent<string> | HttpsProxyAgent<string>>();\r\n\r\n /** 创建共享 Recorder 的透明代理。 */\r\n constructor(recorder: Recorder) {\r\n this.recorder = recorder;\r\n }\r\n\r\n /** 返回当前上游协议可复用的代理 Agent。 */\r\n private agent(target: URL, proxy: string | undefined): HttpProxyAgent<string> | HttpsProxyAgent<string> | undefined {\r\n if (!proxy) {\r\n return undefined;\r\n }\r\n\r\n const key = `${target.protocol}:${proxy}`;\r\n const cached = this.agents.get(key);\r\n if (cached) {\r\n return cached;\r\n }\r\n\r\n const agent = target.protocol === \"https:\"\r\n ? new HttpsProxyAgent(proxy, { keepAlive: true })\r\n : new HttpProxyAgent(proxy, { keepAlive: true });\r\n this.agents.set(key, agent);\r\n return agent;\r\n }\r\n\r\n /** 关闭全部系统代理连接。 */\r\n close(): void {\r\n for (const agent of this.agents.values()) {\r\n agent.destroy();\r\n }\r\n this.agents.clear();\r\n }\r\n\r\n /** 转发一次请求,并同步记录请求体与响应流。 */\r\n async handle(req: IncomingMessage, res: ServerResponse, route: RouteInfo): Promise<void> {\r\n const target = targetUrl(route, req.url ?? \"/\");\r\n const recorder = this.recorder;\r\n let capture: Capture | undefined;\r\n let upstreamReq: ClientRequest | undefined;\r\n let settled = false;\r\n\r\n try {\r\n capture = await this.recorder.start({\r\n runId: route.runId,\r\n protocol: route.protocol,\r\n method: req.method ?? \"GET\",\r\n path: `${target.pathname}${target.search}`,\r\n headers: req.headers,\r\n });\r\n } catch (error) {\r\n // 记录器不可用时仍继续转发,避免改变 agent 的执行结果。\r\n console.error(\"Tracelet failed to start recording:\", error);\r\n }\r\n\r\n const transport = target.protocol === \"https:\" ? https : http;\r\n upstreamReq = transport.request(\r\n target,\r\n {\r\n method: req.method,\r\n headers: requestHeaders(req.headers, target.host),\r\n // Proxy Agent 只改变上游连接路径,不修改请求内容。\r\n agent: this.agent(target, route.proxy),\r\n },\r\n (upstreamRes) => {\r\n capture?.resStart(upstreamRes.statusCode ?? 502, upstreamRes.headers);\r\n res.writeHead(upstreamRes.statusCode ?? 502, responseHeaders(upstreamRes.headers));\r\n\r\n /** 立即转发响应 chunk,同时保留其原始副本。 */\r\n function onData(chunk: Buffer): void {\r\n capture?.resChunk(chunk);\r\n if (!res.write(chunk)) {\r\n upstreamRes.pause();\r\n res.once(\"drain\", () => upstreamRes.resume());\r\n }\r\n }\r\n\r\n /** 正常结束下游响应与捕获任务。 */\r\n function onEnd(): void {\r\n settled = true;\r\n res.end();\r\n finishCapture(recorder, capture);\r\n }\r\n\r\n /** 将上游响应流错误传递给客户端并终止捕获。 */\r\n function onError(error: Error): void {\r\n settled = true;\r\n res.destroy(error);\r\n failCapture(recorder, capture, error);\r\n }\r\n\r\n upstreamRes.on(\"data\", onData);\r\n upstreamRes.once(\"end\", onEnd);\r\n upstreamRes.once(\"error\", onError);\r\n },\r\n );\r\n\r\n /** 转发并记录请求 body chunk。 */\r\n function onReqData(chunk: Buffer): void {\r\n capture?.reqChunk(chunk);\r\n upstreamReq?.write(chunk);\r\n }\r\n\r\n /** 请求体结束后完成解析并关闭上游写入端。 */\r\n function onReqEnd(): void {\r\n capture?.reqEnd();\r\n upstreamReq?.end();\r\n }\r\n\r\n /** 处理建立上游连接时发生的错误。 */\r\n const onUpstreamError = (error: Error): void => {\r\n if (settled) {\r\n return;\r\n }\r\n\r\n settled = true;\r\n if (!res.headersSent) {\r\n res.writeHead(502, { \"content-type\": \"application/json; charset=utf-8\" });\r\n res.end(JSON.stringify({ error: \"upstream_unavailable\" }));\r\n } else {\r\n res.destroy(error);\r\n }\r\n failCapture(this.recorder, capture, error);\r\n };\r\n\r\n /** 客户端提前断开时同步取消上游请求。 */\r\n function onClientClose(): void {\r\n if (!res.writableEnded && !settled) {\r\n upstreamReq?.destroy(new Error(\"Client disconnected\"));\r\n }\r\n }\r\n\r\n upstreamReq.once(\"error\", onUpstreamError);\r\n req.on(\"data\", onReqData);\r\n req.once(\"end\", onReqEnd);\r\n res.once(\"close\", onClientClose);\r\n }\r\n}\r\n","/** 本文件负责过滤代理转发时不能逐跳传递的 HTTP Header。 */\r\n\r\nimport type { IncomingHttpHeaders, OutgoingHttpHeaders } from \"node:http\";\r\n\r\nconst hopHeaders = new Set([\r\n \"connection\",\r\n \"keep-alive\",\r\n \"proxy-authenticate\",\r\n \"proxy-authorization\",\r\n \"te\",\r\n \"trailer\",\r\n \"transfer-encoding\",\r\n \"upgrade\",\r\n]);\r\n\r\n/** 复制端到端 Header,并为上游请求设置正确 Host。 */\r\nexport function requestHeaders(headers: IncomingHttpHeaders, host: string): OutgoingHttpHeaders {\r\n const result: OutgoingHttpHeaders = {};\r\n\r\n for (const [name, value] of Object.entries(headers)) {\r\n if (!hopHeaders.has(name.toLowerCase()) && value !== undefined) {\r\n result[name] = value;\r\n }\r\n }\r\n\r\n result.host = host;\r\n return result;\r\n}\r\n\r\n/** 过滤上游响应中的逐跳 Header。 */\r\nexport function responseHeaders(headers: IncomingHttpHeaders): OutgoingHttpHeaders {\r\n const result: OutgoingHttpHeaders = {};\r\n\r\n for (const [name, value] of Object.entries(headers)) {\r\n if (!hopHeaders.has(name.toLowerCase()) && value !== undefined) {\r\n result[name] = value;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n","/** 本文件负责把 Tracelet 代理路径转换为上游地址。 */\r\n\r\nimport type { RouteInfo } from \"@tracelet/shared\";\r\n\r\n/** 将本地代理路径转换为最终上游 URL。 */\r\nexport function targetUrl(route: RouteInfo, input: string): URL {\r\n const local = new URL(input, \"http://127.0.0.1\");\r\n const target = new URL(route.upstream);\r\n const suffix = local.pathname.slice(route.prefix.length).replace(/^\\//, \"\");\r\n const basePath = target.pathname.replace(/\\/$/, \"\");\r\n\r\n target.pathname = `${basePath}/${suffix}`;\r\n target.search = local.search;\r\n return target;\r\n}\r\n","// Some numerical data is initialized as -1 even when it doesn't need initialization to help the JIT infer types\n// aliases for shorter compressed code (most minifers don't do this)\nvar ab = ArrayBuffer, u8 = Uint8Array, u16 = Uint16Array, i16 = Int16Array, u32 = Uint32Array, i32 = Int32Array;\nvar slc = function (v, s, e) {\n if (u8.prototype.slice)\n return u8.prototype.slice.call(v, s, e);\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n var n = new u8(e - s);\n n.set(v.subarray(s, e));\n return n;\n};\nvar fill = function (v, n, s, e) {\n if (u8.prototype.fill)\n return u8.prototype.fill.call(v, n, s, e);\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n for (; s < e; ++s)\n v[s] = n;\n return v;\n};\nvar cpw = function (v, t, s, e) {\n if (u8.prototype.copyWithin)\n return u8.prototype.copyWithin.call(v, t, s, e);\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n while (s < e) {\n v[t++] = v[s++];\n }\n};\n/**\n * Codes for errors generated within this library\n */\nexport var ZstdErrorCode = {\n InvalidData: 0,\n WindowSizeTooLarge: 1,\n InvalidBlockType: 2,\n FSEAccuracyTooHigh: 3,\n DistanceTooFarBack: 4,\n UnexpectedEOF: 5\n};\n// error codes\nvar ec = [\n 'invalid zstd data',\n 'window size too large (>2046MB)',\n 'invalid block type',\n 'FSE accuracy too high',\n 'match distance too far back',\n 'unexpected EOF'\n];\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\nvar rb = function (d, b, n) {\n var i = 0, o = 0;\n for (; i < n; ++i)\n o |= d[b++] << (i << 3);\n return o;\n};\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\n// read Zstandard frame header\nvar rzfh = function (dat, w) {\n var n3 = dat[0] | (dat[1] << 8) | (dat[2] << 16);\n if (n3 == 0x2FB528 && dat[3] == 253) {\n // Zstandard\n var flg = dat[4];\n // single segment checksum dict flag frame content flag\n var ss = (flg >> 5) & 1, cc = (flg >> 2) & 1, df = flg & 3, fcf = flg >> 6;\n if (flg & 8)\n err(0);\n // byte\n var bt = 6 - ss;\n // dict bytes\n var db = df == 3 ? 4 : df;\n // dictionary id\n var di = rb(dat, bt, db);\n bt += db;\n // frame size bytes\n var fsb = fcf ? (1 << fcf) : ss;\n // frame source size\n var fss = rb(dat, bt, fsb) + ((fcf == 1) && 256);\n // window size\n var ws = fss;\n if (!ss) {\n // window descriptor\n var wb = 1 << (10 + (dat[5] >> 3));\n ws = wb + (wb >> 3) * (dat[5] & 7);\n }\n if (ws > 2145386496)\n err(1);\n var buf = new u8((w == 1 ? (fss || ws) : w ? 0 : ws) + 12);\n buf[0] = 1, buf[4] = 4, buf[8] = 8;\n return {\n b: bt + fsb,\n y: 0,\n l: 0,\n d: di,\n w: (w && w != 1) ? w : buf.subarray(12),\n e: ws,\n o: new i32(buf.buffer, 0, 3),\n u: fss,\n c: cc,\n m: Math.min(131072, ws)\n };\n }\n else if (((n3 >> 4) | (dat[3] << 20)) == 0x184D2A5) {\n // skippable\n return b4(dat, 4) + 8;\n }\n err(0);\n};\n// most significant bit for nonzero\nvar msb = function (val) {\n var bits = 0;\n for (; (1 << bits) <= val; ++bits)\n ;\n return bits - 1;\n};\n// read finite state entropy\nvar rfse = function (dat, bt, mal) {\n // table pos\n var tpos = (bt << 3) + 4;\n // accuracy log\n var al = (dat[bt] & 15) + 5;\n if (al > mal)\n err(3);\n // size\n var sz = 1 << al;\n // probabilities symbols repeat index high threshold\n var probs = sz, sym = -1, re = -1, i = -1, ht = sz;\n // optimization: single allocation is much faster\n var buf = new ab(512 + (sz << 2));\n var freq = new i16(buf, 0, 256);\n // same view as freq\n var dstate = new u16(buf, 0, 256);\n var nstate = new u16(buf, 512, sz);\n var bb1 = 512 + (sz << 1);\n var syms = new u8(buf, bb1, sz);\n var nbits = new u8(buf, bb1 + sz);\n while (sym < 255 && probs > 0) {\n var bits = msb(probs + 1);\n var cbt = tpos >> 3;\n // mask\n var msk = (1 << (bits + 1)) - 1;\n var val = ((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (tpos & 7)) & msk;\n // mask (1 fewer bit)\n var msk1fb = (1 << bits) - 1;\n // max small value\n var msv = msk - probs - 1;\n // small value\n var sval = val & msk1fb;\n if (sval < msv)\n tpos += bits, val = sval;\n else {\n tpos += bits + 1;\n if (val > msk1fb)\n val -= msv;\n }\n freq[++sym] = --val;\n if (val == -1) {\n probs += val;\n syms[--ht] = sym;\n }\n else\n probs -= val;\n if (!val) {\n do {\n // repeat byte\n var rbt = tpos >> 3;\n re = ((dat[rbt] | (dat[rbt + 1] << 8)) >> (tpos & 7)) & 3;\n tpos += 2;\n sym += re;\n } while (re == 3);\n }\n }\n if (sym > 255 || probs)\n err(0);\n var sympos = 0;\n // sym step (coprime with sz - formula from zstd source)\n var sstep = (sz >> 1) + (sz >> 3) + 3;\n // sym mask\n var smask = sz - 1;\n for (var s = 0; s <= sym; ++s) {\n var sf = freq[s];\n if (sf < 1) {\n dstate[s] = -sf;\n continue;\n }\n // This is split into two loops in zstd to avoid branching, but as JS is higher-level that is unnecessary\n for (i = 0; i < sf; ++i) {\n syms[sympos] = s;\n do {\n sympos = (sympos + sstep) & smask;\n } while (sympos >= ht);\n }\n }\n // After spreading symbols, should be zero again\n if (sympos)\n err(0);\n for (i = 0; i < sz; ++i) {\n // next state\n var ns = dstate[syms[i]]++;\n // num bits\n var nb = nbits[i] = al - msb(ns);\n nstate[i] = (ns << nb) - sz;\n }\n return [(tpos + 7) >> 3, {\n b: al,\n s: syms,\n n: nbits,\n t: nstate\n }];\n};\n// read huffman\nvar rhu = function (dat, bt) {\n // index weight count\n var i = 0, wc = -1;\n // buffer header byte\n var buf = new u8(292), hb = dat[bt];\n // huffman weights\n var hw = buf.subarray(0, 256);\n // rank count\n var rc = buf.subarray(256, 268);\n // rank index\n var ri = new u16(buf.buffer, 268);\n // NOTE: at this point bt is 1 less than expected\n if (hb < 128) {\n // end byte, fse decode table\n var _a = rfse(dat, bt + 1, 6), ebt = _a[0], fdt = _a[1];\n bt += hb;\n var epos = ebt << 3;\n // last byte\n var lb = dat[bt];\n if (!lb)\n err(0);\n // state1 state2 state1 bits state2 bits\n var st1 = 0, st2 = 0, btr1 = fdt.b, btr2 = btr1;\n // fse pos\n // pre-increment to account for original deficit of 1\n var fpos = (++bt << 3) - 8 + msb(lb);\n for (;;) {\n fpos -= btr1;\n if (fpos < epos)\n break;\n var cbt = fpos >> 3;\n st1 += ((dat[cbt] | (dat[cbt + 1] << 8)) >> (fpos & 7)) & ((1 << btr1) - 1);\n hw[++wc] = fdt.s[st1];\n fpos -= btr2;\n if (fpos < epos)\n break;\n cbt = fpos >> 3;\n st2 += ((dat[cbt] | (dat[cbt + 1] << 8)) >> (fpos & 7)) & ((1 << btr2) - 1);\n hw[++wc] = fdt.s[st2];\n btr1 = fdt.n[st1];\n st1 = fdt.t[st1];\n btr2 = fdt.n[st2];\n st2 = fdt.t[st2];\n }\n if (++wc > 255)\n err(0);\n }\n else {\n wc = hb - 127;\n for (; i < wc; i += 2) {\n var byte = dat[++bt];\n hw[i] = byte >> 4;\n hw[i + 1] = byte & 15;\n }\n ++bt;\n }\n // weight exponential sum\n var wes = 0;\n for (i = 0; i < wc; ++i) {\n var wt = hw[i];\n // bits must be at most 11, same as weight\n if (wt > 11)\n err(0);\n wes += wt && (1 << (wt - 1));\n }\n // max bits\n var mb = msb(wes) + 1;\n // table size\n var ts = 1 << mb;\n // remaining sum\n var rem = ts - wes;\n // must be power of 2\n if (rem & (rem - 1))\n err(0);\n hw[wc++] = msb(rem) + 1;\n for (i = 0; i < wc; ++i) {\n var wt = hw[i];\n ++rc[hw[i] = wt && (mb + 1 - wt)];\n }\n // huf buf\n var hbuf = new u8(ts << 1);\n // symbols num bits\n var syms = hbuf.subarray(0, ts), nb = hbuf.subarray(ts);\n ri[mb] = 0;\n for (i = mb; i > 0; --i) {\n var pv = ri[i];\n fill(nb, i, pv, ri[i - 1] = pv + rc[i] * (1 << (mb - i)));\n }\n if (ri[0] != ts)\n err(0);\n for (i = 0; i < wc; ++i) {\n var bits = hw[i];\n if (bits) {\n var code = ri[bits];\n fill(syms, i, code, ri[bits] = code + (1 << (mb - bits)));\n }\n }\n return [bt, {\n n: nb,\n b: mb,\n s: syms\n }];\n};\n// Tables generated using this:\n// https://gist.github.com/101arrowz/a979452d4355992cbf8f257cbffc9edd\n// default literal length table\nvar dllt = /*#__PURE__*/ rfse(/*#__PURE__*/ new u8([\n 81, 16, 99, 140, 49, 198, 24, 99, 12, 33, 196, 24, 99, 102, 102, 134, 70, 146, 4\n]), 0, 6)[1];\n// default match length table\nvar dmlt = /*#__PURE__*/ rfse(/*#__PURE__*/ new u8([\n 33, 20, 196, 24, 99, 140, 33, 132, 16, 66, 8, 33, 132, 16, 66, 8, 33, 68, 68, 68, 68, 68, 68, 68, 68, 36, 9\n]), 0, 6)[1];\n// default offset code table\nvar doct = /*#__PURE__ */ rfse(/*#__PURE__*/ new u8([\n 32, 132, 16, 66, 102, 70, 68, 68, 68, 68, 36, 73, 2\n]), 0, 5)[1];\n// bits to baseline\nvar b2bl = function (b, s) {\n var len = b.length, bl = new i32(len);\n for (var i = 0; i < len; ++i) {\n bl[i] = s;\n s += 1 << b[i];\n }\n return bl;\n};\n// literal length bits\nvar llb = /*#__PURE__ */ new u8(( /*#__PURE__ */new i32([\n 0, 0, 0, 0, 16843009, 50528770, 134678020, 202050057, 269422093\n])).buffer, 0, 36);\n// literal length baseline\nvar llbl = /*#__PURE__ */ b2bl(llb, 0);\n// match length bits\nvar mlb = /*#__PURE__ */ new u8(( /*#__PURE__ */new i32([\n 0, 0, 0, 0, 0, 0, 0, 0, 16843009, 50528770, 117769220, 185207048, 252579084, 16\n])).buffer, 0, 53);\n// match length baseline\nvar mlbl = /*#__PURE__ */ b2bl(mlb, 3);\n// decode huffman stream\nvar dhu = function (dat, out, hu) {\n var len = dat.length, ss = out.length, lb = dat[len - 1], msk = (1 << hu.b) - 1, eb = -hu.b;\n if (!lb)\n err(0);\n var st = 0, btr = hu.b, pos = (len << 3) - 8 + msb(lb) - btr, i = -1;\n for (; pos > eb && i < ss;) {\n var cbt = pos >> 3;\n var val = (dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (pos & 7);\n st = ((st << btr) | val) & msk;\n out[++i] = hu.s[st];\n pos -= (btr = hu.n[st]);\n }\n if (pos != eb || i + 1 != ss)\n err(0);\n};\n// decode huffman stream 4x\n// TODO: use workers to parallelize\nvar dhu4 = function (dat, out, hu) {\n var bt = 6;\n var ss = out.length, sz1 = (ss + 3) >> 2, sz2 = sz1 << 1, sz3 = sz1 + sz2;\n dhu(dat.subarray(bt, bt += dat[0] | (dat[1] << 8)), out.subarray(0, sz1), hu);\n dhu(dat.subarray(bt, bt += dat[2] | (dat[3] << 8)), out.subarray(sz1, sz2), hu);\n dhu(dat.subarray(bt, bt += dat[4] | (dat[5] << 8)), out.subarray(sz2, sz3), hu);\n dhu(dat.subarray(bt), out.subarray(sz3), hu);\n};\n// read Zstandard block\nvar rzb = function (dat, st, out) {\n var _a;\n var bt = st.b;\n // byte 0 block type\n var b0 = dat[bt], btype = (b0 >> 1) & 3;\n st.l = b0 & 1;\n var sz = (b0 >> 3) | (dat[bt + 1] << 5) | (dat[bt + 2] << 13);\n // end byte for block\n var ebt = (bt += 3) + sz;\n if (btype == 1) {\n if (bt >= dat.length)\n return;\n st.b = bt + 1;\n if (out) {\n fill(out, dat[bt], st.y, st.y += sz);\n return out;\n }\n return fill(new u8(sz), dat[bt]);\n }\n if (ebt > dat.length)\n return;\n if (btype == 0) {\n st.b = ebt;\n if (out) {\n out.set(dat.subarray(bt, ebt), st.y);\n st.y += sz;\n return out;\n }\n return slc(dat, bt, ebt);\n }\n if (btype == 2) {\n // byte 3 lit btype size format\n var b3 = dat[bt], lbt = b3 & 3, sf = (b3 >> 2) & 3;\n // lit src size lit cmp sz 4 streams\n var lss = b3 >> 4, lcs = 0, s4 = 0;\n if (lbt < 2) {\n if (sf & 1)\n lss |= (dat[++bt] << 4) | ((sf & 2) && (dat[++bt] << 12));\n else\n lss = b3 >> 3;\n }\n else {\n s4 = sf;\n if (sf < 2)\n lss |= ((dat[++bt] & 63) << 4), lcs = (dat[bt] >> 6) | (dat[++bt] << 2);\n else if (sf == 2)\n lss |= (dat[++bt] << 4) | ((dat[++bt] & 3) << 12), lcs = (dat[bt] >> 2) | (dat[++bt] << 6);\n else\n lss |= (dat[++bt] << 4) | ((dat[++bt] & 63) << 12), lcs = (dat[bt] >> 6) | (dat[++bt] << 2) | (dat[++bt] << 10);\n }\n ++bt;\n // add literals to end - can never overlap with backreferences because unused literals always appended\n var buf = out ? out.subarray(st.y, st.y + st.m) : new u8(st.m);\n // starting point for literals\n var spl = buf.length - lss;\n if (lbt == 0)\n buf.set(dat.subarray(bt, bt += lss), spl);\n else if (lbt == 1)\n fill(buf, dat[bt++], spl);\n else {\n // huffman table\n var hu = st.h;\n if (lbt == 2) {\n var hud = rhu(dat, bt);\n // subtract description length\n lcs += bt - (bt = hud[0]);\n st.h = hu = hud[1];\n }\n else if (!hu)\n err(0);\n (s4 ? dhu4 : dhu)(dat.subarray(bt, bt += lcs), buf.subarray(spl), hu);\n }\n // num sequences\n var ns = dat[bt++];\n if (ns) {\n if (ns == 255)\n ns = (dat[bt++] | (dat[bt++] << 8)) + 0x7F00;\n else if (ns > 127)\n ns = ((ns - 128) << 8) | dat[bt++];\n // symbol compression modes\n var scm = dat[bt++];\n if (scm & 3)\n err(0);\n var dts = [dmlt, doct, dllt];\n for (var i = 2; i > -1; --i) {\n var md = (scm >> ((i << 1) + 2)) & 3;\n if (md == 1) {\n // rle buf\n var rbuf = new u8([0, 0, dat[bt++]]);\n dts[i] = {\n s: rbuf.subarray(2, 3),\n n: rbuf.subarray(0, 1),\n t: new u16(rbuf.buffer, 0, 1),\n b: 0\n };\n }\n else if (md == 2) {\n // accuracy log 8 for offsets, 9 for others\n _a = rfse(dat, bt, 9 - (i & 1)), bt = _a[0], dts[i] = _a[1];\n }\n else if (md == 3) {\n if (!st.t)\n err(0);\n dts[i] = st.t[i];\n }\n }\n var _b = st.t = dts, mlt = _b[0], oct = _b[1], llt = _b[2];\n var lb = dat[ebt - 1];\n if (!lb)\n err(0);\n var spos = (ebt << 3) - 8 + msb(lb) - llt.b, cbt = spos >> 3, oubt = 0;\n var lst = ((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << llt.b) - 1);\n cbt = (spos -= oct.b) >> 3;\n var ost = ((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << oct.b) - 1);\n cbt = (spos -= mlt.b) >> 3;\n var mst = ((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << mlt.b) - 1);\n for (++ns; --ns;) {\n var llc = llt.s[lst];\n var lbtr = llt.n[lst];\n var mlc = mlt.s[mst];\n var mbtr = mlt.n[mst];\n var ofc = oct.s[ost];\n var obtr = oct.n[ost];\n cbt = (spos -= ofc) >> 3;\n var ofp = 1 << ofc;\n var off = ofp + (((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16) | (dat[cbt + 3] << 24)) >>> (spos & 7)) & (ofp - 1));\n cbt = (spos -= mlb[mlc]) >> 3;\n var ml = mlbl[mlc] + (((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (spos & 7)) & ((1 << mlb[mlc]) - 1));\n cbt = (spos -= llb[llc]) >> 3;\n var ll = llbl[llc] + (((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (spos & 7)) & ((1 << llb[llc]) - 1));\n cbt = (spos -= lbtr) >> 3;\n lst = llt.t[lst] + (((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << lbtr) - 1));\n cbt = (spos -= mbtr) >> 3;\n mst = mlt.t[mst] + (((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << mbtr) - 1));\n cbt = (spos -= obtr) >> 3;\n ost = oct.t[ost] + (((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << obtr) - 1));\n if (off > 3) {\n st.o[2] = st.o[1];\n st.o[1] = st.o[0];\n st.o[0] = off -= 3;\n }\n else {\n var idx = off - (ll != 0);\n if (idx) {\n off = idx == 3 ? st.o[0] - 1 : st.o[idx];\n if (idx > 1)\n st.o[2] = st.o[1];\n st.o[1] = st.o[0];\n st.o[0] = off;\n }\n else\n off = st.o[0];\n }\n for (var i = 0; i < ll; ++i) {\n buf[oubt + i] = buf[spl + i];\n }\n oubt += ll, spl += ll;\n var stin = oubt - off;\n if (stin < 0) {\n var len = -stin;\n var bs = st.e + stin;\n if (len > ml)\n len = ml;\n for (var i = 0; i < len; ++i) {\n buf[oubt + i] = st.w[bs + i];\n }\n oubt += len, ml -= len, stin = 0;\n }\n for (var i = 0; i < ml; ++i) {\n buf[oubt + i] = buf[stin + i];\n }\n oubt += ml;\n }\n if (oubt != spl) {\n while (spl < buf.length) {\n buf[oubt++] = buf[spl++];\n }\n }\n else\n oubt = buf.length;\n if (out)\n st.y += oubt;\n else\n buf = slc(buf, 0, oubt);\n }\n else if (out) {\n st.y += lss;\n if (spl) {\n for (var i = 0; i < lss; ++i) {\n buf[i] = buf[spl + i];\n }\n }\n }\n else if (spl)\n buf = slc(buf, spl);\n st.b = ebt;\n return buf;\n }\n err(2);\n};\n// concat\nvar cct = function (bufs, ol) {\n if (bufs.length == 1)\n return bufs[0];\n var buf = new u8(ol);\n for (var i = 0, b = 0; i < bufs.length; ++i) {\n var chk = bufs[i];\n buf.set(chk, b);\n b += chk.length;\n }\n return buf;\n};\n/**\n * Decompresses Zstandard data\n * @param dat The input data\n * @param buf The output buffer. If unspecified, the function will allocate\n * exactly enough memory to fit the decompressed data. If your\n * data has multiple frames and you know the output size, specifying\n * it will yield better performance.\n * @returns The decompressed data\n */\nexport function decompress(dat, buf) {\n var bufs = [], nb = +!buf;\n var bt = 0, ol = 0;\n for (; dat.length;) {\n var st = rzfh(dat, nb || buf);\n if (typeof st == 'object') {\n if (nb) {\n buf = null;\n if (st.w.length == st.u) {\n bufs.push(buf = st.w);\n ol += st.u;\n }\n }\n else {\n bufs.push(buf);\n st.e = 0;\n }\n for (; !st.l;) {\n var blk = rzb(dat, st, buf);\n if (!blk)\n err(5);\n if (buf)\n st.e = st.y;\n else {\n bufs.push(blk);\n ol += blk.length;\n cpw(st.w, 0, blk.length);\n st.w.set(blk, st.w.length - blk.length);\n }\n }\n bt = st.b + (st.c * 4);\n }\n else\n bt = st;\n dat = dat.subarray(bt);\n }\n return cct(bufs, ol);\n}\n/**\n * Decompressor for Zstandard streamed data\n */\nvar Decompress = /*#__PURE__*/ (function () {\n /**\n * Creates a Zstandard decompressor\n * @param ondata The handler for stream data\n */\n function Decompress(ondata) {\n this.ondata = ondata;\n this.c = [];\n this.l = 0;\n this.z = 0;\n }\n /**\n * Pushes data to be decompressed\n * @param chunk The chunk of data to push\n * @param final Whether or not this is the last chunk in the stream\n */\n Decompress.prototype.push = function (chunk, final) {\n if (typeof this.s == 'number') {\n var sub = Math.min(chunk.length, this.s);\n chunk = chunk.subarray(sub);\n this.s -= sub;\n }\n var sl = chunk.length;\n var ncs = sl + this.l;\n if (!this.s) {\n if (final) {\n if (!ncs) {\n this.ondata(new u8(0), true);\n return;\n }\n // min for frame + one block\n if (ncs < 5)\n err(5);\n }\n else if (ncs < 18) {\n this.c.push(chunk);\n this.l = ncs;\n return;\n }\n if (this.l) {\n this.c.push(chunk);\n chunk = cct(this.c, ncs);\n this.c = [];\n this.l = 0;\n }\n if (typeof (this.s = rzfh(chunk)) == 'number')\n return this.push(chunk, final);\n }\n if (typeof this.s != 'number') {\n if (ncs < (this.z || 3)) {\n if (final)\n err(5);\n this.c.push(chunk);\n this.l = ncs;\n return;\n }\n if (this.l) {\n this.c.push(chunk);\n chunk = cct(this.c, ncs);\n this.c = [];\n this.l = 0;\n }\n if (!this.z && ncs < (this.z = (chunk[this.s.b] & 2) ? 4 : 3 + ((chunk[this.s.b] >> 3) | (chunk[this.s.b + 1] << 5) | (chunk[this.s.b + 2] << 13)))) {\n if (final)\n err(5);\n this.c.push(chunk);\n this.l = ncs;\n return;\n }\n else\n this.z = 0;\n for (;;) {\n var blk = rzb(chunk, this.s);\n if (!blk) {\n if (final)\n err(5);\n var adc = chunk.subarray(this.s.b);\n this.s.b = 0;\n this.c.push(adc), this.l += adc.length;\n return;\n }\n else {\n this.ondata(blk, false);\n cpw(this.s.w, 0, blk.length);\n this.s.w.set(blk, this.s.w.length - blk.length);\n }\n if (this.s.l) {\n var rest = chunk.subarray(this.s.b);\n this.s = this.s.c * 4;\n this.push(rest, final);\n return;\n }\n }\n }\n else if (final)\n err(5);\n };\n return Decompress;\n}());\nexport { Decompress };\n","/** 本文件负责解码代理保留的 HTTP 请求体副本。 */\r\n\r\nimport type { HeaderValue } from \"@tracelet/shared\";\r\nimport { decompress } from \"fzstd\";\r\n\r\n/** 返回规范化后的单一 Content-Encoding。 */\r\nfunction encoding(value: HeaderValue | undefined): string {\r\n return (Array.isArray(value) ? value[0] : value)?.trim().toLowerCase() ?? \"identity\";\r\n}\r\n\r\n/** 按 Content-Encoding 解码请求体,且不修改传入的原始字节。 */\r\nexport function decodeBody(body: Uint8Array, value?: HeaderValue): Uint8Array {\r\n const name = encoding(value);\r\n if (name === \"identity\") {\r\n return body;\r\n }\r\n if (name === \"zstd\") {\r\n return decompress(body);\r\n }\r\n\r\n throw new Error(`暂不支持的 Content-Encoding:${name}`);\r\n}\r\n","/** 本文件负责解析代理捕获到的完整 LLM 请求体。 */\r\n\r\nimport type { ParsedRequest } from \"@tracelet/shared\";\r\n\r\n/** 解析请求 JSON,并提取 Dashboard 常用字段。 */\r\nexport function parseRequest(text: string): ParsedRequest {\r\n const body = JSON.parse(text) as Record<string, unknown>;\r\n const model = typeof body?.model === \"string\" ? body.model : undefined;\r\n\r\n return {\r\n ...(model ? { model } : {}),\r\n stream: body?.stream === true,\r\n body,\r\n };\r\n}\r\n","function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\")\n throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f)\n throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver))\n throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return kind === \"a\" ? f.call(receiver, value) : f ? (f.value = value) : state.set(receiver, value), value;\n}\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f)\n throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver))\n throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\nexport { __classPrivateFieldSet, __classPrivateFieldGet };\n","/**\n * Single source of truth for the `x-stainless-helper` telemetry header — the\n * key, the closed value vocabulary, and per-object helper tagging. The\n * append-don't-clobber merge for the header itself lives in\n * {@link import('../internal/headers').buildHeaders} via `APPEND_HEADERS`.\n */\n\n/**\n * Telemetry header naming the SDK helper(s) a request came from. Always this\n * lowercase form; `buildHeaders` matches it case-insensitively for its append\n * semantics, but a single canonical casing keeps every call site greppable.\n */\nexport const STAINLESS_HELPER_HEADER = 'x-stainless-helper';\n\n/** Telemetry header naming the SDK method (e.g. `stream`) in use. */\nexport const STAINLESS_HELPER_METHOD_HEADER = 'x-stainless-helper-method';\n\n/**\n * The closed set of helper telemetry tags, shared verbatim across SDKs. A\n * typo at any call site is a type error rather than silently mistagged\n * telemetry. Existing values keep their original spellings — telemetry\n * consumers match on them, so renames lose history. New tags are hyphenated\n * lowercase.\n */\nexport type StainlessHelperHeaderValue =\n | 'BetaToolRunner'\n | 'betaZodTool'\n | 'compaction'\n | 'environments-work-poller'\n | 'environments-worker'\n | 'fallback-refusal-middleware'\n | 'mcpContent'\n | 'mcpMessage'\n | 'mcpResourceToContent'\n | 'mcpResourceToFile'\n | 'mcpTool'\n | 'session-tool-runner';\n\n/**\n * The `{ 'x-stainless-helper': value }` header dict, for passing into\n * `buildHeaders` (which comma-appends `x-stainless-helper` across sources)\n * or as `defaultHeaders`/per-request `headers`.\n */\nexport function helperHeader(value: StainlessHelperHeaderValue): { [STAINLESS_HELPER_HEADER]: string } {\n return { [STAINLESS_HELPER_HEADER]: value };\n}\n\n/**\n * Symbol used to mark objects created by SDK helpers for tracking.\n * The value is the helper name (e.g., 'mcpTool', 'betaZodTool').\n */\nexport const SDK_HELPER_SYMBOL = Symbol('anthropic.sdk.stainlessHelper');\n\ntype StainlessHelperObject = { [SDK_HELPER_SYMBOL]: string };\n\nexport function wasCreatedByStainlessHelper(value: unknown): value is StainlessHelperObject {\n return typeof value === 'object' && value !== null && SDK_HELPER_SYMBOL in value;\n}\n\n/**\n * Collects helper names from tools and messages arrays.\n * Returns a deduplicated array of helper names found.\n */\nexport function collectStainlessHelpers(\n tools: readonly unknown[] | undefined,\n messages: readonly unknown[] | undefined,\n): string[] {\n const helpers = new Set<string>();\n\n // Collect from tools\n if (tools) {\n for (const tool of tools) {\n if (wasCreatedByStainlessHelper(tool)) {\n helpers.add(tool[SDK_HELPER_SYMBOL]);\n }\n }\n }\n\n // Collect from messages and their content blocks\n if (messages) {\n for (const message of messages) {\n if (wasCreatedByStainlessHelper(message)) {\n helpers.add(message[SDK_HELPER_SYMBOL]);\n }\n\n const content = (message as { content?: unknown }).content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (wasCreatedByStainlessHelper(block)) {\n helpers.add(block[SDK_HELPER_SYMBOL]);\n }\n }\n }\n }\n }\n\n return Array.from(helpers);\n}\n\n/**\n * Builds x-stainless-helper header value from tools and messages.\n * Returns an empty object if no helpers are found.\n */\nexport function stainlessHelperHeader(\n tools: readonly unknown[] | undefined,\n messages: readonly unknown[] | undefined,\n): { 'x-stainless-helper'?: string } {\n const helpers = collectStainlessHelpers(tools, messages);\n if (helpers.length === 0) return {};\n return { [STAINLESS_HELPER_HEADER]: helpers.join(', ') };\n}\n\n/**\n * Builds x-stainless-helper header value from a file object.\n * Returns an empty object if the file is not marked with a helper.\n */\nexport function stainlessHelperHeaderFromFile(file: unknown): { 'x-stainless-helper'?: string } {\n if (wasCreatedByStainlessHelper(file)) {\n return { [STAINLESS_HELPER_HEADER]: file[SDK_HELPER_SYMBOL] };\n }\n return {};\n}\n","export function isAbortError(err: unknown) {\n return (\n typeof err === 'object' &&\n err !== null &&\n // Spec-compliant fetch implementations\n (('name' in err && (err as any).name === 'AbortError') ||\n // Expo fetch\n ('message' in err && String((err as any).message).includes('FetchRequestCanceledException')))\n );\n}\n\nexport const castToError = (err: any): Error => {\n if (err instanceof Error) return err;\n if (typeof err === 'object' && err !== null) {\n try {\n const tag = Object.prototype.toString.call(err);\n // cross-realm errors (e.g. undici's abort `DOMException` under jest) fail `instanceof Error`\n if (tag === '[object Error]' || tag === '[object DOMException]') {\n // @ts-ignore - not all envs have native support for cause yet\n const error = new Error(err.message, err.cause ? { cause: err.cause } : {});\n if (err.stack) error.stack = err.stack;\n // @ts-ignore - not all envs have native support for cause yet\n if (err.cause && !error.cause) error.cause = err.cause;\n if (err.name) error.name = err.name;\n return error;\n }\n } catch {}\n try {\n return new Error(JSON.stringify(err));\n } catch {}\n }\n return new Error(err);\n};\n","import { castToError } from '../internal/errors';\nimport type { ErrorType } from '../resources/shared';\n\nexport class AnthropicError extends Error {}\n\nexport class APIError<\n TStatus extends number | undefined = number | undefined,\n THeaders extends Headers | undefined = Headers | undefined,\n TError extends Object | undefined = Object | undefined,\n> extends AnthropicError {\n /** HTTP status for the response that caused the error */\n readonly status: TStatus;\n /** HTTP headers for the response that caused the error */\n readonly headers: THeaders;\n /** JSON body of the response that caused the error */\n readonly error: TError;\n\n readonly requestID: string | null | undefined;\n readonly workspaceID: string | null | undefined;\n\n /** The `error.type` from the API response body, e.g. `\"rate_limit_error\"` */\n readonly type: ErrorType | null;\n\n constructor(\n status: TStatus,\n error: TError,\n message: string | undefined,\n headers: THeaders,\n type?: ErrorType | null,\n ) {\n super(`${APIError.makeMessage(status, error, message)}`);\n this.status = status;\n this.headers = headers;\n this.requestID = headers?.get('request-id');\n this.workspaceID = headers?.get('anthropic-workspace-id');\n this.error = error;\n this.type = type ?? null;\n }\n\n private static makeMessage(status: number | undefined, error: any, message: string | undefined) {\n const msg =\n error?.message ?\n typeof error.message === 'string' ?\n error.message\n : JSON.stringify(error.message)\n : error ? JSON.stringify(error)\n : message;\n\n if (status && msg) {\n return `${status} ${msg}`;\n }\n if (status) {\n return `${status} status code (no body)`;\n }\n if (msg) {\n return msg;\n }\n return '(no status code or body)';\n }\n\n static generate(\n status: number | undefined,\n errorResponse: Object | undefined,\n message: string | undefined,\n headers: Headers | undefined,\n ): APIError {\n if (!status || !headers) {\n return new APIConnectionError({ message, cause: castToError(errorResponse) });\n }\n\n const error = errorResponse as Record<string, any>;\n const type = error?.['error']?.['type'] as ErrorType | undefined;\n\n if (status === 400) {\n return new BadRequestError(status, error, message, headers, type);\n }\n\n if (status === 401) {\n return new AuthenticationError(status, error, message, headers, type);\n }\n\n if (status === 403) {\n return new PermissionDeniedError(status, error, message, headers, type);\n }\n\n if (status === 404) {\n return new NotFoundError(status, error, message, headers, type);\n }\n\n if (status === 409) {\n return new ConflictError(status, error, message, headers, type);\n }\n\n if (status === 422) {\n return new UnprocessableEntityError(status, error, message, headers, type);\n }\n\n if (status === 429) {\n return new RateLimitError(status, error, message, headers, type);\n }\n\n if (status >= 500) {\n return new InternalServerError(status, error, message, headers, type);\n }\n\n return new APIError(status, error, message, headers, type);\n }\n}\n\nexport class APIUserAbortError extends APIError<undefined, undefined, undefined> {\n constructor({ message }: { message?: string } = {}) {\n super(undefined, undefined, message || 'Request was aborted.', undefined);\n }\n}\n\nexport class APIConnectionError extends APIError<undefined, undefined, undefined> {\n constructor({ message, cause }: { message?: string | undefined; cause?: Error | undefined }) {\n super(undefined, undefined, message || 'Connection error.', undefined);\n // in some environments the 'cause' property is already declared\n // @ts-ignore\n if (cause) this.cause = cause;\n }\n}\n\nexport class APIConnectionTimeoutError extends APIConnectionError {\n constructor({ message }: { message?: string } = {}) {\n super({ message: message ?? 'Request timed out.' });\n }\n}\n\n/**\n * An error that opts into the SDK's retry policy: throw it (e.g. from\n * middleware) to have the attempt retried.\n *\n * Note that the request will only be retried when `maxRetries` has not been exhausted.\n */\nexport class RetryableError extends AnthropicError {\n constructor(message?: string, { cause }: { cause?: unknown } = {}) {\n super(message ?? 'Retryable error.');\n // in some environments the 'cause' property is already declared\n // @ts-ignore\n if (cause !== undefined) this.cause = cause;\n }\n}\n\nexport class BadRequestError extends APIError<400, Headers> {}\n\nexport class AuthenticationError extends APIError<401, Headers> {}\n\nexport class PermissionDeniedError extends APIError<403, Headers> {}\n\nexport class NotFoundError extends APIError<404, Headers> {}\n\nexport class ConflictError extends APIError<409, Headers> {}\n\nexport class UnprocessableEntityError extends APIError<422, Headers> {}\n\nexport class RateLimitError extends APIError<429, Headers> {}\n\nexport class InternalServerError extends APIError<number, Headers> {}\n","import { AnthropicError } from '../../core/error';\n\n// https://url.spec.whatwg.org/#url-scheme-string\nconst startsWithSchemeRegexp = /^[a-z][a-z0-9+.-]*:/i;\n\nexport const isAbsoluteURL = (url: string): boolean => {\n return startsWithSchemeRegexp.test(url);\n};\n\nexport let isArray = (val: unknown): val is unknown[] => ((isArray = Array.isArray), isArray(val));\nexport let isReadonlyArray = isArray as (val: unknown) => val is readonly unknown[];\n\n/** Returns an object if the given value isn't an object, otherwise returns as-is */\nexport function maybeObj(x: unknown): object {\n if (typeof x !== 'object') {\n return {};\n }\n\n return x ?? {};\n}\n\n// https://stackoverflow.com/a/34491287\nexport function isEmptyObj(obj: Object | null | undefined): boolean {\n if (!obj) return true;\n for (const _k in obj) return false;\n return true;\n}\n\n// https://eslint.org/docs/latest/rules/no-prototype-builtins\nexport function hasOwn<T extends object = object>(obj: T, key: PropertyKey): key is keyof T {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexport function isObj(obj: unknown): obj is Record<string, unknown> {\n return obj != null && typeof obj === 'object' && !Array.isArray(obj);\n}\n\nexport const ensurePresent = <T>(value: T | null | undefined): T => {\n if (value == null) {\n throw new AnthropicError(`Expected a value to be given but received ${value} instead.`);\n }\n\n return value;\n};\n\nexport const validatePositiveInteger = (name: string, n: unknown): number => {\n if (typeof n !== 'number' || !Number.isInteger(n)) {\n throw new AnthropicError(`${name} must be an integer`);\n }\n if (n < 0) {\n throw new AnthropicError(`${name} must be a positive integer`);\n }\n return n;\n};\n\nexport const coerceInteger = (value: unknown): number => {\n if (typeof value === 'number') return Math.round(value);\n if (typeof value === 'string') return parseInt(value, 10);\n\n throw new AnthropicError(`Could not coerce ${value} (type: ${typeof value}) into a number`);\n};\n\nexport const coerceFloat = (value: unknown): number => {\n if (typeof value === 'number') return value;\n if (typeof value === 'string') return parseFloat(value);\n\n throw new AnthropicError(`Could not coerce ${value} (type: ${typeof value}) into a number`);\n};\n\nexport const coerceBoolean = (value: unknown): boolean => {\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') return value === 'true';\n return Boolean(value);\n};\n\nexport const maybeCoerceInteger = (value: unknown): number | undefined => {\n if (value == null) {\n return undefined;\n }\n return coerceInteger(value);\n};\n\nexport const maybeCoerceFloat = (value: unknown): number | undefined => {\n if (value == null) {\n return undefined;\n }\n return coerceFloat(value);\n};\n\nexport const maybeCoerceBoolean = (value: unknown): boolean | undefined => {\n if (value == null) {\n return undefined;\n }\n return coerceBoolean(value);\n};\n\nexport const safeJSON = (text: string) => {\n try {\n return JSON.parse(text);\n } catch (err) {\n return undefined;\n }\n};\n\n// Gets a value from an object, deletes the key, and returns the value (or undefined if not found)\nexport const pop = <T extends Record<string, any>, K extends string>(obj: T, key: K): T[K] => {\n const value = obj[key];\n delete obj[key];\n return value;\n};\n\n/**\n * Compile-time exhaustiveness check: passing a value here only type-checks once every\n * member of its union has been handled. Does nothing at runtime, so unknown values from a\n * newer API version fall through instead of throwing.\n */\nexport function checkNever(_value: never): void {}\n","/**\n * This module provides internal shims and utility functions for environments where certain Node.js or global types may not be available.\n *\n * These are used to ensure we can provide a consistent behaviour between different JavaScript environments and good error\n * messages in cases where an environment isn't fully supported.\n */\n\nimport type { Fetch } from './builtin-types';\nimport type { ReadableStream } from './shim-types';\n\nexport function getDefaultFetch(): Fetch {\n if (typeof fetch !== 'undefined') {\n return fetch as any;\n }\n\n throw new Error(\n '`fetch` is not defined as a global; Either pass `fetch` to the client, `new Anthropic({ fetch })` or polyfill the global, `globalThis.fetch = fetch`',\n );\n}\n\ntype ReadableStreamArgs = ConstructorParameters<typeof ReadableStream>;\n\nexport function makeReadableStream(...args: ReadableStreamArgs): ReadableStream {\n const ReadableStream = (globalThis as any).ReadableStream;\n if (typeof ReadableStream === 'undefined') {\n // Note: All of the platforms / runtimes we officially support already define\n // `ReadableStream` as a global, so this should only ever be hit on unsupported runtimes.\n throw new Error(\n '`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`',\n );\n }\n\n return new ReadableStream(...args);\n}\n\nexport function ReadableStreamFrom<T>(iterable: Iterable<T> | AsyncIterable<T>): ReadableStream<T> {\n let iter: AsyncIterator<T> | Iterator<T> =\n Symbol.asyncIterator in iterable ? iterable[Symbol.asyncIterator]() : iterable[Symbol.iterator]();\n\n return makeReadableStream({\n start() {},\n async pull(controller: any) {\n const { done, value } = await iter.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n async cancel() {\n await iter.return?.();\n },\n });\n}\n\n/**\n * Most browsers don't yet have async iterable support for ReadableStream,\n * and Node has a very different way of reading bytes from its \"ReadableStream\".\n *\n * This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490\n */\nexport function ReadableStreamToAsyncIterable<T>(stream: any): AsyncIterableIterator<T> {\n if (stream[Symbol.asyncIterator]) return stream;\n\n const reader = stream.getReader();\n return {\n async next() {\n try {\n const result = await reader.read();\n if (result?.done) reader.releaseLock(); // release lock when stream becomes closed\n return result;\n } catch (e) {\n reader.releaseLock(); // release lock when stream becomes errored\n throw e;\n }\n },\n async return() {\n const cancelPromise = reader.cancel();\n reader.releaseLock();\n await cancelPromise;\n return { done: true, value: undefined };\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n}\n\n/**\n * Cancels a ReadableStream we don't need to consume.\n * See https://undici.nodejs.org/#/?id=garbage-collection\n */\nexport async function CancelReadableStream(stream: any): Promise<void> {\n if (stream === null || typeof stream !== 'object') return;\n\n if (stream[Symbol.asyncIterator]) {\n await stream[Symbol.asyncIterator]().return?.();\n return;\n }\n\n const reader = stream.getReader();\n const cancelPromise = reader.cancel();\n reader.releaseLock();\n await cancelPromise;\n}\n","export function concatBytes(buffers: Uint8Array[]): Uint8Array {\n let length = 0;\n for (const buffer of buffers) {\n length += buffer.length;\n }\n const output = new Uint8Array(length);\n let index = 0;\n for (const buffer of buffers) {\n output.set(buffer, index);\n index += buffer.length;\n }\n\n return output;\n}\n\nlet encodeUTF8_: (str: string) => Uint8Array;\nexport function encodeUTF8(str: string) {\n let encoder;\n return (\n encodeUTF8_ ??\n ((encoder = new (globalThis as any).TextEncoder()), (encodeUTF8_ = encoder.encode.bind(encoder)))\n )(str);\n}\n\nlet decodeUTF8_: (bytes: Uint8Array) => string;\nexport function decodeUTF8(bytes: Uint8Array) {\n let decoder;\n return (\n decodeUTF8_ ??\n ((decoder = new (globalThis as any).TextDecoder()), (decodeUTF8_ = decoder.decode.bind(decoder)))\n )(bytes);\n}\n","import { concatBytes, decodeUTF8, encodeUTF8 } from '../utils/bytes';\n\nexport type Bytes = string | ArrayBuffer | Uint8Array | null | undefined;\n\n/**\n * A re-implementation of httpx's `LineDecoder` in Python that handles incrementally\n * reading lines from text.\n *\n * https://github.com/encode/httpx/blob/920333ea98118e9cf617f246905d7b202510941c/httpx/_decoders.py#L258\n */\nexport class LineDecoder {\n // prettier-ignore\n static NEWLINE_CHARS = new Set(['\\n', '\\r']);\n static NEWLINE_REGEXP = /\\r\\n|[\\n\\r]/g;\n\n #buffer: Uint8Array;\n #carriageReturnIndex: number | null;\n\n constructor() {\n this.#buffer = new Uint8Array();\n this.#carriageReturnIndex = null;\n }\n\n decode(chunk: Bytes): string[] {\n if (chunk == null) {\n return [];\n }\n\n const binaryChunk =\n chunk instanceof ArrayBuffer ? new Uint8Array(chunk)\n : typeof chunk === 'string' ? encodeUTF8(chunk)\n : chunk;\n\n this.#buffer = concatBytes([this.#buffer, binaryChunk]);\n\n const lines: string[] = [];\n let patternIndex;\n while ((patternIndex = findNewlineIndex(this.#buffer, this.#carriageReturnIndex)) != null) {\n if (patternIndex.carriage && this.#carriageReturnIndex == null) {\n // skip until we either get a corresponding `\\n`, a new `\\r` or nothing\n this.#carriageReturnIndex = patternIndex.index;\n continue;\n }\n\n // we got double \\r or \\rtext\\n\n if (\n this.#carriageReturnIndex != null &&\n (patternIndex.index !== this.#carriageReturnIndex + 1 || patternIndex.carriage)\n ) {\n lines.push(decodeUTF8(this.#buffer.subarray(0, this.#carriageReturnIndex - 1)));\n this.#buffer = this.#buffer.subarray(this.#carriageReturnIndex);\n this.#carriageReturnIndex = null;\n continue;\n }\n\n const endIndex =\n this.#carriageReturnIndex !== null ? patternIndex.preceding - 1 : patternIndex.preceding;\n\n const line = decodeUTF8(this.#buffer.subarray(0, endIndex));\n lines.push(line);\n\n this.#buffer = this.#buffer.subarray(patternIndex.index);\n this.#carriageReturnIndex = null;\n }\n\n return lines;\n }\n\n flush(): string[] {\n if (!this.#buffer.length) {\n return [];\n }\n return this.decode('\\n');\n }\n}\n\n/**\n * This function searches the buffer for the end patterns, (\\r or \\n)\n * and returns an object with the index preceding the matched newline and the\n * index after the newline char. `null` is returned if no new line is found.\n *\n * ```ts\n * findNewLineIndex('abc\\ndef') -> { preceding: 2, index: 3 }\n * ```\n */\nfunction findNewlineIndex(\n buffer: Uint8Array,\n startIndex: number | null,\n): { preceding: number; index: number; carriage: boolean } | null {\n const newline = 0x0a; // \\n\n const carriage = 0x0d; // \\r\n\n for (let i = startIndex ?? 0; i < buffer.length; i++) {\n if (buffer[i] === newline) {\n return { preceding: i, index: i + 1, carriage: false };\n }\n\n if (buffer[i] === carriage) {\n return { preceding: i, index: i + 1, carriage: true };\n }\n }\n\n return null;\n}\n\nexport function findDoubleNewlineIndex(buffer: Uint8Array): number {\n // This function searches the buffer for the end patterns (\\r\\r, \\n\\n, \\r\\n\\r\\n)\n // and returns the index right after the first occurrence of any pattern,\n // or -1 if none of the patterns are found.\n const newline = 0x0a; // \\n\n const carriage = 0x0d; // \\r\n\n for (let i = 0; i < buffer.length - 1; i++) {\n if (buffer[i] === newline && buffer[i + 1] === newline) {\n // \\n\\n\n return i + 2;\n }\n if (buffer[i] === carriage && buffer[i + 1] === carriage) {\n // \\r\\r\n return i + 2;\n }\n if (\n buffer[i] === carriage &&\n buffer[i + 1] === newline &&\n i + 3 < buffer.length &&\n buffer[i + 2] === carriage &&\n buffer[i + 3] === newline\n ) {\n // \\r\\n\\r\\n\n return i + 4;\n }\n }\n\n return -1;\n}\n","import { hasOwn } from './values';\nimport { readEnv } from './env';\nimport { type BaseAnthropic } from '../../client';\nimport { RequestOptions } from '../request-options';\n\ntype LogFn = (message: string, ...rest: unknown[]) => void;\nexport type Logger = {\n error: LogFn;\n warn: LogFn;\n info: LogFn;\n debug: LogFn;\n};\nexport type LogLevel = 'off' | 'error' | 'warn' | 'info' | 'debug';\n\nexport const defaultLogLevel: LogLevel = 'warn';\n\nconst levelNumbers = {\n off: 0,\n error: 200,\n warn: 300,\n info: 400,\n debug: 500,\n};\n\nexport const parseLogLevel = (\n maybeLevel: string | undefined,\n sourceName: string,\n logger: Logger,\n): LogLevel | undefined => {\n if (!maybeLevel) {\n return undefined;\n }\n if (hasOwn(levelNumbers, maybeLevel)) {\n return maybeLevel;\n }\n logger.warn(\n `${sourceName} was set to ${JSON.stringify(maybeLevel)}, expected one of ${JSON.stringify(\n Object.keys(levelNumbers),\n )}`,\n );\n return undefined;\n};\n\nfunction noop() {}\n\nfunction makeLogFn(fnLevel: keyof Logger, logger: Logger | undefined, logLevel: LogLevel) {\n if (!logger || levelNumbers[fnLevel] > levelNumbers[logLevel]) {\n return noop;\n } else {\n // Don't wrap logger functions, we want the stacktrace intact!\n return logger[fnLevel].bind(logger);\n }\n}\n\nconst noopLogger = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n};\n\nlet cachedLoggers = /* @__PURE__ */ new WeakMap<Logger, [LogLevel, Logger]>();\n\nfunction filterLogger(logger: Logger, logLevel: LogLevel): Logger {\n const cachedLogger = cachedLoggers.get(logger);\n if (cachedLogger && cachedLogger[0] === logLevel) {\n return cachedLogger[1];\n }\n\n const levelLogger = {\n error: makeLogFn('error', logger, logLevel),\n warn: makeLogFn('warn', logger, logLevel),\n info: makeLogFn('info', logger, logLevel),\n debug: makeLogFn('debug', logger, logLevel),\n };\n\n cachedLoggers.set(logger, [logLevel, levelLogger]);\n\n return levelLogger;\n}\n\nexport function loggerFor(client: BaseAnthropic): Logger {\n const logger = client.logger;\n const logLevel = client.logLevel ?? 'off';\n if (!logger) {\n return noopLogger;\n }\n return filterLogger(logger, logLevel);\n}\n\nlet lastEnvLevel: string | undefined;\nlet cachedDefaultLogger: Logger | undefined;\n\n/**\n * A logger matching the client defaults — `console`, filtered to\n * `ANTHROPIC_LOG` or {@link defaultLogLevel} — for contexts with no client to\n * read the configured `logger`/`logLevel` from.\n *\n * Cached per `ANTHROPIC_LOG` value so an invalid value warns once, like a\n * client construction does, rather than on every request.\n */\nexport function defaultLogger(): Logger {\n const envLevel = readEnv('ANTHROPIC_LOG');\n if (!cachedDefaultLogger || envLevel !== lastEnvLevel) {\n lastEnvLevel = envLevel;\n cachedDefaultLogger = filterLogger(\n console,\n parseLogLevel(envLevel, \"process.env['ANTHROPIC_LOG']\", filterLogger(console, defaultLogLevel)) ??\n defaultLogLevel,\n );\n }\n return cachedDefaultLogger;\n}\n\nexport const formatRequestDetails = (details: {\n options?: RequestOptions | undefined;\n headers?: Headers | Record<string, string> | undefined;\n retryOfRequestLogID?: string | undefined;\n retryOf?: string | undefined;\n url?: string | undefined;\n status?: number | undefined;\n method?: string | undefined;\n durationMs?: number | undefined;\n message?: unknown;\n body?: unknown;\n}) => {\n if (details.options) {\n details.options = { ...details.options };\n delete details.options['headers']; // redundant + leaks internals\n }\n if (details.headers) {\n details.headers = Object.fromEntries(\n (details.headers instanceof Headers ? [...details.headers] : Object.entries(details.headers)).map(\n ([name, value]) => [\n name,\n (\n name.toLowerCase() === 'authorization' ||\n name.toLowerCase() === 'api-key' ||\n name.toLowerCase() === 'x-api-key' ||\n name.toLowerCase() === 'cookie' ||\n name.toLowerCase() === 'set-cookie'\n ) ?\n '***'\n : value,\n ],\n ),\n );\n }\n if ('retryOfRequestLogID' in details) {\n if (details.retryOfRequestLogID) {\n details.retryOf = details.retryOfRequestLogID;\n }\n delete details.retryOfRequestLogID;\n }\n return details;\n};\n","/**\n * Tracks the removal of the per-request abort listener that\n * `fetchWithTimeout` attaches to a caller-provided signal, so the listener's\n * lifetime matches the request instead of the signal.\n *\n * Without removal, a long-lived signal (e.g. one AbortController reused for\n * a whole session) accumulates one `{ once: true }` listener plus its bound\n * AbortController per HTTP attempt until the signal fires or is collected,\n * and Node warns at the 11th listener. The listener must survive until the\n * response body is settled - removing it when fetch resolves (headers) would\n * break aborting an in-flight body read - so the code that finishes the body\n * (response parsing, stream teardown, retry/error handling) calls\n * `releaseRequestSignal` with the request's controller.\n */\nconst cleanups = new WeakMap<AbortController, () => void>();\n\n// Backstop for requests that never reach an explicit release point: a caller\n// that partially iterates a stream (or receives a raw binary Response) and\n// drops the reference never completes, errors, or cancels it, so the only\n// remaining lifecycle event is the response being collected. Finalization\n// timing is GC-driven and not guaranteed, so this only bounds abandonment -\n// the explicit release calls stay the primary cleanup. The held value must\n// not reference the response, or it could never be collected. Typed\n// structurally because the compiler lib is es2020.\ntype AbandonmentRegistry = {\n register(target: object, heldValue: AbortController, token: object): void;\n unregister(token: object): void;\n};\n\nconst registry: AbandonmentRegistry | null =\n typeof (globalThis as any).FinalizationRegistry === 'function' ?\n new (globalThis as any).FinalizationRegistry((controller: AbortController) =>\n releaseRequestSignal(controller),\n )\n : null;\n\n// Module-scope factory so the cleanup closure captures exactly the signal and\n// the listener - built at the `fetchWithTimeout` call site it would share that\n// scope's context and retain the request body for as long as the cleanup is\n// held (same reason `_makeAbort` exists in client.ts).\nfunction makeCleanup(signal: AbortSignal, listener: () => void): () => void {\n return () => signal.removeEventListener('abort', listener);\n}\n\nexport function registerRequestSignalCleanup(\n controller: AbortController,\n signal: AbortSignal,\n listener: () => void,\n): void {\n cleanups.set(controller, makeCleanup(signal, listener));\n}\n\n// The registered target is the response BODY, not the Response: a caller can\n// keep a reader on the body and drop the Response wrapper (`.asResponse()`),\n// and the listener must survive for as long as anything can still read - the\n// body is what a live read keeps alive.\nexport function armAbandonmentBackstop(body: object, controller: AbortController): void {\n if (cleanups.has(controller)) registry?.register(body, controller, controller);\n}\n\nexport function releaseRequestSignal(controller: AbortController): void {\n const cleanup = cleanups.get(controller);\n if (cleanup) {\n cleanups.delete(controller);\n registry?.unregister(controller);\n cleanup();\n }\n}\n","import { AnthropicError } from './error';\nimport { type ReadableStream } from '../internal/shim-types';\nimport { makeReadableStream } from '../internal/shims';\nimport { findDoubleNewlineIndex, LineDecoder } from '../internal/decoders/line';\nimport { ReadableStreamToAsyncIterable } from '../internal/shims';\nimport { isAbortError } from '../internal/errors';\nimport { safeJSON } from '../internal/utils/values';\nimport { encodeUTF8 } from '../internal/utils/bytes';\nimport { loggerFor } from '../internal/utils/log';\nimport type { BaseAnthropic } from '../client';\n\nimport { APIError } from './error';\nimport type { ErrorType } from '../resources/shared';\nimport { releaseRequestSignal } from '../internal/request-signal';\n\ntype Bytes = string | ArrayBuffer | Uint8Array | null | undefined;\n\nexport type ServerSentEvent = {\n event: string | null;\n data: string;\n raw: string[];\n};\n\nexport class Stream<Item> implements AsyncIterable<Item> {\n controller: AbortController;\n #client: BaseAnthropic | undefined;\n\n constructor(\n private iterator: () => AsyncIterator<Item>,\n controller: AbortController,\n client?: BaseAnthropic,\n ) {\n this.controller = controller;\n this.#client = client;\n }\n\n /**\n * Iterate the raw Server-Sent Events from `response` — `{event, data, raw}`\n * objects, before any JSON parsing or event-name filtering.\n *\n * This reads `response.body` directly (not a clone), so the response is\n * consumed. Use this in middleware that fully replaces the stream body; for\n * read-only observation of parsed events, use `ctx.parse()` instead.\n */\n static rawEvents(\n response: Response,\n controller: AbortController = new AbortController(),\n ): AsyncGenerator<ServerSentEvent, void, unknown> {\n return _iterSSEMessages(response, controller);\n }\n\n static fromSSEResponse<Item>(\n response: Response,\n controller: AbortController,\n client?: BaseAnthropic,\n ): Stream<Item> {\n let consumed = false;\n const logger = client ? loggerFor(client) : console;\n\n async function* iterator(): AsyncIterator<Item, any, undefined> {\n if (consumed) {\n throw new AnthropicError('Cannot iterate over a consumed stream, use `.tee()` to split the stream.');\n }\n consumed = true;\n let done = false;\n try {\n for await (const sse of _iterSSEMessages(response, controller)) {\n if (sse.event === 'completion') {\n try {\n yield JSON.parse(sse.data) as Item;\n } catch (e) {\n logger.error(`Could not parse message into JSON:`, sse.data);\n logger.error(`From chunk:`, sse.raw);\n throw e;\n }\n }\n\n if (\n sse.event === 'message_start' ||\n sse.event === 'message_delta' ||\n sse.event === 'message_stop' ||\n sse.event === 'content_block_start' ||\n sse.event === 'content_block_delta' ||\n sse.event === 'content_block_stop' ||\n sse.event === 'message' ||\n sse.event === 'user.message' ||\n sse.event === 'user.interrupt' ||\n sse.event === 'user.tool_confirmation' ||\n sse.event === 'user.custom_tool_result' ||\n sse.event === 'user.tool_result' ||\n sse.event === 'agent.message' ||\n sse.event === 'agent.thinking' ||\n sse.event === 'agent.tool_use' ||\n sse.event === 'agent.tool_result' ||\n sse.event === 'agent.mcp_tool_use' ||\n sse.event === 'agent.mcp_tool_result' ||\n sse.event === 'agent.custom_tool_use' ||\n sse.event === 'agent.thread_context_compacted' ||\n sse.event === 'session.status_running' ||\n sse.event === 'session.status_idle' ||\n sse.event === 'session.status_rescheduled' ||\n sse.event === 'session.status_terminated' ||\n sse.event === 'session.error' ||\n sse.event === 'session.deleted' ||\n sse.event === 'session.updated' ||\n sse.event === 'span.model_request_start' ||\n sse.event === 'span.model_request_end' ||\n sse.event === 'span.outcome_evaluation_start' ||\n sse.event === 'span.outcome_evaluation_ongoing' ||\n sse.event === 'span.outcome_evaluation_end' ||\n sse.event === 'user.define_outcome' ||\n sse.event === 'agent.thread_message_received' ||\n sse.event === 'agent.thread_message_sent' ||\n sse.event === 'agent.session_thread_message_received' ||\n sse.event === 'agent.session_thread_message_sent' ||\n sse.event === 'session.thread_created' ||\n sse.event === 'session.thread_status_created' ||\n sse.event === 'session.thread_status_running' ||\n sse.event === 'session.thread_status_idle' ||\n sse.event === 'session.thread_status_rescheduled' ||\n sse.event === 'session.thread_status_terminated' ||\n sse.event === 'event_start' ||\n sse.event === 'event_delta' ||\n sse.event === 'system.message'\n ) {\n try {\n yield JSON.parse(sse.data) as Item;\n } catch (e) {\n logger.error(`Could not parse message into JSON:`, sse.data);\n logger.error(`From chunk:`, sse.raw);\n throw e;\n }\n }\n\n if (sse.event === 'ping') {\n continue;\n }\n\n if (sse.event === 'error') {\n const body = safeJSON(sse.data) ?? sse.data;\n const type = body?.error?.type as ErrorType | undefined;\n throw new APIError(undefined, body, undefined, response.headers, type);\n }\n }\n done = true;\n } catch (e) {\n // If the user calls `stream.controller.abort()`, we should exit without throwing.\n if (isAbortError(e)) return;\n throw e;\n } finally {\n // If the user `break`s, abort the ongoing request.\n if (!done) controller.abort();\n releaseRequestSignal(controller);\n }\n }\n\n return new Stream(iterator, controller, client);\n }\n\n /**\n * Generates a Stream from a newline-separated ReadableStream\n * where each item is a JSON value.\n */\n static fromReadableStream<Item>(\n readableStream: ReadableStream,\n controller: AbortController,\n client?: BaseAnthropic,\n ): Stream<Item> {\n let consumed = false;\n\n async function* iterLines(): AsyncGenerator<string, void, unknown> {\n const lineDecoder = new LineDecoder();\n\n const iter = ReadableStreamToAsyncIterable<Bytes>(readableStream);\n for await (const chunk of iter) {\n for (const line of lineDecoder.decode(chunk)) {\n yield line;\n }\n }\n\n for (const line of lineDecoder.flush()) {\n yield line;\n }\n }\n\n async function* iterator(): AsyncIterator<Item, any, undefined> {\n if (consumed) {\n throw new AnthropicError('Cannot iterate over a consumed stream, use `.tee()` to split the stream.');\n }\n consumed = true;\n let done = false;\n try {\n for await (const line of iterLines()) {\n if (done) continue;\n if (line) yield JSON.parse(line) as Item;\n }\n done = true;\n } catch (e) {\n // If the user calls `stream.controller.abort()`, we should exit without throwing.\n if (isAbortError(e)) return;\n throw e;\n } finally {\n // If the user `break`s, abort the ongoing request.\n if (!done) controller.abort();\n releaseRequestSignal(controller);\n }\n }\n\n return new Stream(iterator, controller, client);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<Item> {\n return this.iterator();\n }\n\n /**\n * Splits the stream into two streams which can be\n * independently read from at different speeds.\n */\n tee(): [Stream<Item>, Stream<Item>] {\n const left: Array<Promise<IteratorResult<Item>>> = [];\n const right: Array<Promise<IteratorResult<Item>>> = [];\n const iterator = this.iterator();\n\n const teeIterator = (queue: Array<Promise<IteratorResult<Item>>>): AsyncIterator<Item> => {\n return {\n next: () => {\n if (queue.length === 0) {\n const result = iterator.next();\n left.push(result);\n right.push(result);\n }\n return queue.shift()!;\n },\n };\n };\n\n return [\n new Stream(() => teeIterator(left), this.controller, this.#client),\n new Stream(() => teeIterator(right), this.controller, this.#client),\n ];\n }\n\n /**\n * Converts this stream to a newline-separated ReadableStream of\n * JSON stringified values in the stream\n * which can be turned back into a Stream with `Stream.fromReadableStream()`.\n */\n toReadableStream(): ReadableStream {\n const self = this;\n let iter: AsyncIterator<Item>;\n\n return makeReadableStream({\n async start() {\n iter = self[Symbol.asyncIterator]();\n },\n async pull(ctrl: any) {\n try {\n const { value, done } = await iter.next();\n if (done) return ctrl.close();\n\n const bytes = encodeUTF8(JSON.stringify(value) + '\\n');\n\n ctrl.enqueue(bytes);\n } catch (err) {\n ctrl.error(err);\n }\n },\n async cancel() {\n await iter.return?.();\n },\n });\n }\n}\n\nexport async function* _iterSSEMessages(\n response: Response,\n controller: AbortController,\n): AsyncGenerator<ServerSentEvent, void, unknown> {\n if (!response.body) {\n controller.abort();\n if (\n typeof (globalThis as any).navigator !== 'undefined' &&\n (globalThis as any).navigator.product === 'ReactNative'\n ) {\n throw new AnthropicError(\n `The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api`,\n );\n }\n throw new AnthropicError(`Attempted to iterate over a response with no body`);\n }\n\n const sseDecoder = new SSEDecoder();\n const lineDecoder = new LineDecoder();\n\n const iter = ReadableStreamToAsyncIterable<Bytes>(response.body);\n for await (const sseChunk of iterSSEChunks(iter)) {\n for (const line of lineDecoder.decode(sseChunk)) {\n const sse = sseDecoder.decode(line);\n if (sse) yield sse;\n }\n }\n\n for (const line of lineDecoder.flush()) {\n const sse = sseDecoder.decode(line);\n if (sse) yield sse;\n }\n}\n\n/**\n * Given an async iterable iterator, iterates over it and yields full\n * SSE chunks, i.e. yields when a double new-line is encountered.\n */\nasync function* iterSSEChunks(iterator: AsyncIterableIterator<Bytes>): AsyncGenerator<Uint8Array> {\n let data = new Uint8Array();\n\n for await (const chunk of iterator) {\n if (chunk == null) {\n continue;\n }\n\n const binaryChunk =\n chunk instanceof ArrayBuffer ? new Uint8Array(chunk)\n : typeof chunk === 'string' ? encodeUTF8(chunk)\n : chunk;\n\n let newData = new Uint8Array(data.length + binaryChunk.length);\n newData.set(data);\n newData.set(binaryChunk, data.length);\n data = newData;\n\n // Yield views, not copies, so a chunk holding many events is not re-copied\n // once per event. This relies on newData never being written again.\n let patternIndex;\n while ((patternIndex = findDoubleNewlineIndex(data)) !== -1) {\n yield data.subarray(0, patternIndex);\n data = data.subarray(patternIndex);\n }\n }\n\n if (data.length > 0) {\n yield data;\n }\n}\n\nclass SSEDecoder {\n private data: string[];\n private event: string | null;\n private chunks: string[];\n\n constructor() {\n this.event = null;\n this.data = [];\n this.chunks = [];\n }\n\n decode(line: string) {\n if (line.endsWith('\\r')) {\n line = line.substring(0, line.length - 1);\n }\n\n if (!line) {\n // empty line and we didn't previously encounter any messages\n if (!this.event && !this.data.length) return null;\n\n const sse: ServerSentEvent = {\n event: this.event,\n data: this.data.join('\\n'),\n raw: this.chunks,\n };\n\n this.event = null;\n this.data = [];\n this.chunks = [];\n\n return sse;\n }\n\n this.chunks.push(line);\n\n if (line.startsWith(':')) {\n return null;\n }\n\n let [fieldname, _, value] = partition(line, ':');\n\n if (value.startsWith(' ')) {\n value = value.substring(1);\n }\n\n if (fieldname === 'event') {\n this.event = value;\n } else if (fieldname === 'data') {\n this.data.push(value);\n }\n\n return null;\n }\n}\n\nfunction partition(str: string, delimiter: string): [string, string, string] {\n const index = str.indexOf(delimiter);\n if (index !== -1) {\n return [str.substring(0, index), delimiter, str.substring(index + delimiter.length)];\n }\n\n return [str, '', ''];\n}\n","import type { Logger } from '../client';\nimport { AnthropicError } from '../core/error';\nimport {\n ContentBlock,\n JSONOutputFormat,\n Message,\n OutputConfig,\n TextBlock,\n MessageCreateParams,\n} from '../resources/messages/messages';\n\n// vendored from typefest just to make things look a bit nicer on hover\ntype Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {};\n\ntype AutoParseableOutputConfig = Omit<OutputConfig, 'format'> & {\n format?: JSONOutputFormat | AutoParseableOutputFormat<any> | null;\n};\n\nexport type ParseableMessageCreateParams = Simplify<\n Omit<MessageCreateParams, 'output_config'> & {\n output_config?: AutoParseableOutputConfig | null;\n }\n>;\n\nexport type ExtractParsedContentFromParams<Params extends ParseableMessageCreateParams> =\n Params['output_config'] extends { format: AutoParseableOutputFormat<infer P> } ? P : null;\n\nexport type AutoParseableOutputFormat<ParsedT> = JSONOutputFormat & {\n parse(content: string): ParsedT;\n};\n\nexport type ParsedMessage<ParsedT> = Message & {\n content: Array<ParsedContentBlock<ParsedT>>;\n parsed_output: ParsedT | null;\n};\n\nexport type ParsedContentBlock<ParsedT> =\n | (TextBlock & { parsed_output: ParsedT | null })\n | Exclude<ContentBlock, TextBlock>;\n\nfunction getOutputFormat(\n params: ParseableMessageCreateParams | null,\n): JSONOutputFormat | AutoParseableOutputFormat<any> | null | undefined {\n return params?.output_config?.format;\n}\n\nexport function maybeParseMessage<Params extends ParseableMessageCreateParams | null>(\n message: Message,\n params: Params,\n opts: { logger: Logger },\n): ParsedMessage<ExtractParsedContentFromParams<NonNullable<Params>>> {\n const outputFormat = getOutputFormat(params);\n if (!params || !('parse' in (outputFormat ?? {}))) {\n return {\n ...message,\n content: message.content.map((block) => {\n if (block.type === 'text') {\n const parsedBlock = Object.defineProperty({ ...block }, 'parsed_output', {\n value: null,\n enumerable: false,\n }) as ParsedContentBlock<ExtractParsedContentFromParams<NonNullable<Params>>>;\n\n return parsedBlock;\n }\n return block;\n }),\n parsed_output: null,\n } as ParsedMessage<ExtractParsedContentFromParams<NonNullable<Params>>>;\n }\n\n return parseMessage(message, params, opts);\n}\n\nexport function parseMessage<Params extends ParseableMessageCreateParams>(\n message: Message,\n params: Params,\n opts: { logger: Logger },\n): ParsedMessage<ExtractParsedContentFromParams<Params>> {\n let firstParsedOutput: ReturnType<typeof parseOutputFormat<Params>> | null = null;\n\n const content: Array<ParsedContentBlock<ExtractParsedContentFromParams<Params>>> = message.content.map(\n (block) => {\n if (block.type === 'text') {\n const parsedOutput = parseOutputFormat(params, block.text);\n\n if (firstParsedOutput === null) {\n firstParsedOutput = parsedOutput;\n }\n\n const parsedBlock = Object.defineProperty({ ...block }, 'parsed_output', {\n value: parsedOutput,\n enumerable: false,\n }) as ParsedContentBlock<ExtractParsedContentFromParams<Params>>;\n return parsedBlock;\n }\n return block;\n },\n );\n\n return {\n ...message,\n content,\n parsed_output: firstParsedOutput,\n } as ParsedMessage<ExtractParsedContentFromParams<Params>>;\n}\n\nfunction parseOutputFormat<Params extends ParseableMessageCreateParams>(\n params: Params,\n content: string,\n): ExtractParsedContentFromParams<Params> | null {\n const outputFormat = getOutputFormat(params);\n if (outputFormat?.type !== 'json_schema') {\n return null;\n }\n\n try {\n if ('parse' in outputFormat) {\n return outputFormat.parse(content);\n }\n\n return JSON.parse(content);\n } catch (error) {\n throw new AnthropicError(`Failed to parse structured output: ${error}`);\n }\n}\n","type Token = {\n type: string;\n value: string;\n};\n\nconst tokenize = (input: string): Token[] => {\n let current = 0;\n let tokens: Token[] = [];\n\n while (current < input.length) {\n let char = input[current];\n\n if (char === '\\\\') {\n current++;\n continue;\n }\n\n if (char === '{') {\n tokens.push({\n type: 'brace',\n value: '{',\n });\n\n current++;\n continue;\n }\n\n if (char === '}') {\n tokens.push({\n type: 'brace',\n value: '}',\n });\n\n current++;\n continue;\n }\n\n if (char === '[') {\n tokens.push({\n type: 'paren',\n value: '[',\n });\n\n current++;\n continue;\n }\n\n if (char === ']') {\n tokens.push({\n type: 'paren',\n value: ']',\n });\n\n current++;\n continue;\n }\n\n if (char === ':') {\n tokens.push({\n type: 'separator',\n value: ':',\n });\n\n current++;\n continue;\n }\n\n if (char === ',') {\n tokens.push({\n type: 'delimiter',\n value: ',',\n });\n\n current++;\n continue;\n }\n\n if (char === '\"') {\n let value = '';\n let danglingQuote = false;\n\n char = input[++current];\n\n while (char !== '\"') {\n if (current === input.length) {\n danglingQuote = true;\n break;\n }\n\n if (char === '\\\\') {\n current++;\n if (current === input.length) {\n danglingQuote = true;\n break;\n }\n value += char + input[current];\n char = input[++current];\n } else {\n value += char;\n char = input[++current];\n }\n }\n\n char = input[++current];\n\n if (!danglingQuote) {\n tokens.push({\n type: 'string',\n value,\n });\n }\n continue;\n }\n\n let WHITESPACE = /\\s/;\n if (char && WHITESPACE.test(char)) {\n current++;\n continue;\n }\n\n let NUMBERS = /[0-9]/;\n if ((char && NUMBERS.test(char)) || char === '-' || char === '.') {\n let value = '';\n\n if (char === '-') {\n value += char;\n char = input[++current];\n }\n\n while (\n char &&\n (NUMBERS.test(char) ||\n char === '.' ||\n // exponent marker, e.g. `1e10` or `1.5E-9`\n char === 'e' ||\n char === 'E' ||\n // exponent sign, only valid immediately after the exponent marker\n ((char === '-' || char === '+') &&\n (value[value.length - 1] === 'e' || value[value.length - 1] === 'E')))\n ) {\n value += char;\n char = input[++current];\n }\n\n tokens.push({\n type: 'number',\n value,\n });\n continue;\n }\n\n let LETTERS = /[a-z]/i;\n if (char && LETTERS.test(char)) {\n let value = '';\n\n while (char && LETTERS.test(char)) {\n if (current === input.length) {\n break;\n }\n value += char;\n char = input[++current];\n }\n\n if (value == 'true' || value == 'false' || value === 'null') {\n tokens.push({\n type: 'name',\n value,\n });\n } else {\n // unknown token, e.g. `nul` which isn't quite `null`\n current++;\n continue;\n }\n continue;\n }\n\n current++;\n }\n\n return tokens;\n },\n strip = (tokens: Token[]): Token[] => {\n if (tokens.length === 0) {\n return tokens;\n }\n\n let lastToken = tokens[tokens.length - 1]!;\n\n switch (lastToken.type) {\n case 'separator':\n tokens = tokens.slice(0, tokens.length - 1);\n return strip(tokens);\n break;\n case 'number':\n let lastCharacterOfLastToken = lastToken.value[lastToken.value.length - 1];\n if (\n lastCharacterOfLastToken === '.' ||\n lastCharacterOfLastToken === '-' ||\n lastCharacterOfLastToken === '+' ||\n lastCharacterOfLastToken === 'e' ||\n lastCharacterOfLastToken === 'E'\n ) {\n tokens = tokens.slice(0, tokens.length - 1);\n return strip(tokens);\n }\n case 'string':\n let tokenBeforeTheLastToken = tokens[tokens.length - 2];\n if (tokenBeforeTheLastToken?.type === 'delimiter') {\n tokens = tokens.slice(0, tokens.length - 1);\n return strip(tokens);\n } else if (tokenBeforeTheLastToken?.type === 'brace' && tokenBeforeTheLastToken.value === '{') {\n tokens = tokens.slice(0, tokens.length - 1);\n return strip(tokens);\n }\n break;\n case 'delimiter':\n tokens = tokens.slice(0, tokens.length - 1);\n return strip(tokens);\n break;\n }\n\n return tokens;\n },\n unstrip = (tokens: Token[]): Token[] => {\n let tail: string[] = [];\n\n tokens.map((token) => {\n if (token.type === 'brace') {\n if (token.value === '{') {\n tail.push('}');\n } else {\n tail.splice(tail.lastIndexOf('}'), 1);\n }\n }\n if (token.type === 'paren') {\n if (token.value === '[') {\n tail.push(']');\n } else {\n tail.splice(tail.lastIndexOf(']'), 1);\n }\n }\n });\n\n if (tail.length > 0) {\n tail.reverse().map((item) => {\n if (item === '}') {\n tokens.push({\n type: 'brace',\n value: '}',\n });\n } else if (item === ']') {\n tokens.push({\n type: 'paren',\n value: ']',\n });\n }\n });\n }\n\n return tokens;\n },\n generate = (tokens: Token[]): string => {\n let output = '';\n\n tokens.map((token) => {\n switch (token.type) {\n case 'string':\n output += '\"' + token.value + '\"';\n break;\n default:\n output += token.value;\n break;\n }\n });\n\n return output;\n },\n partialParse = (input: string): unknown => JSON.parse(generate(unstrip(strip(tokenize(input)))));\n\nexport { partialParse };\n","import { partialParse } from '../_vendor/partial-json-parser/parser';\n\nexport const JSON_BUF_PROPERTY = '__json_buf';\n\n/**\n * Copies a tool-use block with an updated `__json_buf`, installing `.input` as\n * a memoized getter so the partial-JSON parse happens on first read instead of\n * on every delta.\n */\nexport function withLazyInput<T extends { input: unknown }>(prev: T, jsonBuf: string): T {\n const next = {} as T;\n for (const key of Object.keys(prev) as (keyof T)[]) {\n if (key !== 'input') next[key] = prev[key];\n }\n Object.defineProperty(next, JSON_BUF_PROPERTY, { value: jsonBuf, enumerable: false, writable: true });\n let input: unknown;\n let parsed = false;\n Object.defineProperty(next, 'input', {\n enumerable: true,\n configurable: true,\n get() {\n if (!parsed) {\n input = jsonBuf ? partialParse(jsonBuf) : {};\n parsed = true;\n }\n return input;\n },\n });\n return next;\n}\n","import { STAINLESS_HELPER_METHOD_HEADER } from '../internal/stainless-helper-header';\nimport { isAbortError } from '../internal/errors';\nimport { checkNever } from '../internal/utils/values';\nimport { AnthropicError, APIUserAbortError } from '../error';\nimport {\n type ContentBlock,\n Messages,\n type Message,\n type MessageStreamEvent,\n type MessageParam,\n type MessageCreateParams,\n type MessageCreateParamsBase,\n type TextBlock,\n type TextCitation,\n type ToolUseBlock,\n type ServerToolUseBlock,\n} from '../resources/messages';\nimport { Stream } from '../streaming';\nimport { RequestOptions } from '../internal/request-options';\nimport type { Logger } from '../client';\nimport { maybeParseMessage, type ParsedMessage } from './parser';\nimport { JSON_BUF_PROPERTY, withLazyInput } from '../internal/message-stream-utils';\n\nexport interface MessageStreamEvents<ParsedT = null> {\n connect: () => void;\n streamEvent: (event: MessageStreamEvent, snapshot: Message) => void;\n text: (textDelta: string, textSnapshot: string) => void;\n citation: (citation: TextCitation, citationsSnapshot: TextCitation[]) => void;\n inputJson: (partialJson: string, jsonSnapshot: unknown) => void;\n thinking: (thinkingDelta: string, thinkingSnapshot: string) => void;\n signature: (signature: string) => void;\n message: (message: ParsedMessage<ParsedT>) => void;\n contentBlock: (content: ContentBlock) => void;\n finalMessage: (message: ParsedMessage<ParsedT>) => void;\n error: (error: AnthropicError) => void;\n abort: (error: APIUserAbortError) => void;\n end: () => void;\n}\n\ntype MessageStreamEventListeners<ParsedT, Event extends keyof MessageStreamEvents<ParsedT>> = {\n listener: MessageStreamEvents<ParsedT>[Event];\n once?: boolean;\n}[];\n\nexport type TracksToolInput = ToolUseBlock | ServerToolUseBlock;\n\nfunction tracksToolInput(content: ContentBlock): content is TracksToolInput {\n return content.type === 'tool_use' || content.type === 'server_tool_use';\n}\n\nexport class MessageStream<ParsedT = null> implements AsyncIterable<MessageStreamEvent> {\n messages: MessageParam[] = [];\n receivedMessages: ParsedMessage<ParsedT>[] = [];\n #currentMessageSnapshot: Message | undefined;\n #params: MessageCreateParams | null = null;\n\n controller: AbortController = new AbortController();\n\n #connectedPromise: Promise<Response | null>;\n #resolveConnectedPromise: (response: Response | null) => void = () => {};\n #rejectConnectedPromise: (error: AnthropicError) => void = () => {};\n\n #endPromise: Promise<void>;\n #resolveEndPromise: () => void = () => {};\n #rejectEndPromise: (error: AnthropicError) => void = () => {};\n\n #listeners: {\n [Event in keyof MessageStreamEvents<ParsedT>]?: MessageStreamEventListeners<ParsedT, Event>;\n } = {};\n\n #ended = false;\n #errored = false;\n #aborted = false;\n #catchingPromiseCreated = false;\n #response: Response | null | undefined;\n #request_id: string | null | undefined;\n #workspace_id: string | null | undefined;\n #logger: Logger;\n\n constructor(params: MessageCreateParamsBase | null, opts?: { logger?: Logger | undefined }) {\n this.#connectedPromise = new Promise<Response | null>((resolve, reject) => {\n this.#resolveConnectedPromise = resolve;\n this.#rejectConnectedPromise = reject;\n });\n\n this.#endPromise = new Promise<void>((resolve, reject) => {\n this.#resolveEndPromise = resolve;\n this.#rejectEndPromise = reject;\n });\n\n // Don't let these promises cause unhandled rejection errors.\n // we will manually cause an unhandled rejection error later\n // if the user hasn't registered any error listener or called\n // any promise-returning method.\n this.#connectedPromise.catch(() => {});\n this.#endPromise.catch(() => {});\n\n this.#params = params;\n this.#logger = opts?.logger ?? console;\n }\n\n get response(): Response | null | undefined {\n return this.#response;\n }\n\n get request_id(): string | null | undefined {\n return this.#request_id;\n }\n\n get workspace_id(): string | null | undefined {\n return this.#workspace_id;\n }\n\n /**\n * Returns the `MessageStream` data, the raw `Response` instance and the ID of the request,\n * returned vie the `request-id` header which is useful for debugging requests and resporting\n * issues to Anthropic.\n *\n * This is the same as the `APIPromise.withResponse()` method.\n *\n * This method will raise an error if you created the stream using `MessageStream.fromReadableStream`\n * as no `Response` is available.\n */\n async withResponse(): Promise<{\n data: MessageStream<ParsedT>;\n response: Response;\n request_id: string | null | undefined;\n workspace_id: string | null | undefined;\n }> {\n this.#catchingPromiseCreated = true;\n\n const response = await this.#connectedPromise;\n if (!response) {\n throw new Error('Could not resolve a `Response` object');\n }\n\n return {\n data: this,\n response,\n request_id: response.headers.get('request-id'),\n workspace_id: response.headers.get('anthropic-workspace-id'),\n };\n }\n\n /**\n * Intended for use on the frontend, consuming a stream produced with\n * `.toReadableStream()` on the backend.\n *\n * Note that messages sent to the model do not appear in `.on('message')`\n * in this context.\n */\n static fromReadableStream(stream: ReadableStream): MessageStream {\n const runner = new MessageStream(null);\n runner._run(() => runner._fromReadableStream(stream));\n return runner;\n }\n\n static createMessage<ParsedT>(\n messages: Messages,\n params: MessageCreateParamsBase,\n options?: RequestOptions,\n { logger }: { logger?: Logger | undefined } = {},\n ): MessageStream<ParsedT> {\n const runner = new MessageStream<ParsedT>(params, { logger });\n for (const message of params.messages) {\n runner._addMessageParam(message);\n }\n runner.#params = { ...params, stream: true };\n runner._run(() =>\n runner._createMessage(\n messages,\n { ...params, stream: true },\n { ...options, headers: { ...options?.headers, [STAINLESS_HELPER_METHOD_HEADER]: 'stream' } },\n ),\n );\n return runner;\n }\n\n protected _run(executor: () => Promise<any>) {\n executor().then(() => {\n this._emitFinal();\n this._emit('end');\n }, this.#handleError);\n }\n\n protected _addMessageParam(message: MessageParam) {\n this.messages.push(message);\n }\n\n protected _addMessage(message: ParsedMessage<ParsedT>, emit = true) {\n this.receivedMessages.push(message);\n if (emit) {\n this._emit('message', message);\n }\n }\n\n protected async _createMessage(\n messages: Messages,\n params: MessageCreateParams,\n options?: RequestOptions,\n ): Promise<void> {\n const signal = options?.signal;\n let abortHandler: (() => void) | undefined;\n if (signal) {\n if (signal.aborted) this.controller.abort();\n abortHandler = this.controller.abort.bind(this.controller);\n signal.addEventListener('abort', abortHandler);\n }\n try {\n this.#beginRequest();\n const { response, data: stream } = await messages\n .create({ ...params, stream: true }, { ...options, signal: this.controller.signal })\n .withResponse();\n this._connected(response);\n for await (const event of stream) {\n this.#addStreamEvent(event);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n this.#endRequest();\n } finally {\n if (signal && abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n }\n\n protected _connected(response: Response | null) {\n if (this.ended) return;\n this.#response = response;\n this.#request_id = response?.headers.get('request-id');\n this.#workspace_id = response?.headers.get('anthropic-workspace-id');\n this.#resolveConnectedPromise(response);\n this._emit('connect');\n }\n\n get ended(): boolean {\n return this.#ended;\n }\n\n get errored(): boolean {\n return this.#errored;\n }\n\n get aborted(): boolean {\n return this.#aborted;\n }\n\n abort() {\n this.controller.abort();\n }\n\n /**\n * Adds the listener function to the end of the listeners array for the event.\n * No checks are made to see if the listener has already been added. Multiple calls passing\n * the same combination of event and listener will result in the listener being added, and\n * called, multiple times.\n * @returns this MessageStream, so that calls can be chained\n */\n on<Event extends keyof MessageStreamEvents<ParsedT>>(\n event: Event,\n listener: MessageStreamEvents<ParsedT>[Event],\n ): this {\n const listeners: MessageStreamEventListeners<ParsedT, Event> =\n this.#listeners[event] || (this.#listeners[event] = []);\n listeners.push({ listener });\n return this;\n }\n\n /**\n * Removes the specified listener from the listener array for the event.\n * off() will remove, at most, one instance of a listener from the listener array. If any single\n * listener has been added multiple times to the listener array for the specified event, then\n * off() must be called multiple times to remove each instance.\n * @returns this MessageStream, so that calls can be chained\n */\n off<Event extends keyof MessageStreamEvents<ParsedT>>(\n event: Event,\n listener: MessageStreamEvents<ParsedT>[Event],\n ): this {\n const listeners = this.#listeners[event];\n if (!listeners) return this;\n const index = listeners.findIndex((l) => l.listener === listener);\n if (index >= 0) listeners.splice(index, 1);\n return this;\n }\n\n /**\n * Adds a one-time listener function for the event. The next time the event is triggered,\n * this listener is removed and then invoked.\n * @returns this MessageStream, so that calls can be chained\n */\n once<Event extends keyof MessageStreamEvents<ParsedT>>(\n event: Event,\n listener: MessageStreamEvents<ParsedT>[Event],\n ): this {\n const listeners: MessageStreamEventListeners<ParsedT, Event> =\n this.#listeners[event] || (this.#listeners[event] = []);\n listeners.push({ listener, once: true });\n return this;\n }\n\n /**\n * This is similar to `.once()`, but returns a Promise that resolves the next time\n * the event is triggered, instead of calling a listener callback.\n * @returns a Promise that resolves the next time given event is triggered,\n * or rejects if an error is emitted. (If you request the 'error' event,\n * returns a promise that resolves with the error).\n *\n * Example:\n *\n * const message = await stream.emitted('message') // rejects if the stream errors\n */\n emitted<Event extends keyof MessageStreamEvents<ParsedT>>(\n event: Event,\n ): Promise<\n Parameters<MessageStreamEvents<ParsedT>[Event]> extends [infer Param] ? Param\n : Parameters<MessageStreamEvents<ParsedT>[Event]> extends [] ? void\n : Parameters<MessageStreamEvents<ParsedT>[Event]>\n > {\n return new Promise((resolve, reject) => {\n this.#catchingPromiseCreated = true;\n if (event !== 'error') this.once('error', reject);\n this.once(event, resolve as any);\n });\n }\n\n async done(): Promise<void> {\n this.#catchingPromiseCreated = true;\n await this.#endPromise;\n }\n\n get currentMessage(): Message | undefined {\n return this.#currentMessageSnapshot;\n }\n\n #getFinalMessage(): ParsedMessage<ParsedT> {\n if (this.receivedMessages.length === 0) {\n throw new AnthropicError('stream ended without producing a Message with role=assistant');\n }\n return this.receivedMessages.at(-1)!;\n }\n\n /**\n * @returns a promise that resolves with the the final assistant Message response,\n * or rejects if an error occurred or the stream ended prematurely without producing a Message.\n * If structured outputs were used, this will be a ParsedMessage with a `parsed_output` field.\n */\n async finalMessage(): Promise<ParsedMessage<ParsedT>> {\n await this.done();\n return this.#getFinalMessage();\n }\n\n #getFinalText(): string {\n if (this.receivedMessages.length === 0) {\n throw new AnthropicError('stream ended without producing a Message with role=assistant');\n }\n const textBlocks = this.receivedMessages\n .at(-1)!\n .content.filter((block): block is TextBlock => block.type === 'text')\n .map((block) => block.text);\n if (textBlocks.length === 0) {\n throw new AnthropicError('stream ended without producing a content block with type=text');\n }\n return textBlocks.join(' ');\n }\n\n /**\n * @returns a promise that resolves with the the final assistant Message's text response, concatenated\n * together if there are more than one text blocks.\n * Rejects if an error occurred or the stream ended prematurely without producing a Message.\n */\n async finalText(): Promise<string> {\n await this.done();\n return this.#getFinalText();\n }\n\n #handleError = (error: unknown) => {\n this.#errored = true;\n if (isAbortError(error)) {\n error = new APIUserAbortError();\n }\n if (error instanceof APIUserAbortError) {\n this.#aborted = true;\n return this._emit('abort', error);\n }\n if (error instanceof AnthropicError) {\n return this._emit('error', error);\n }\n if (error instanceof Error) {\n const anthropicError: AnthropicError = new AnthropicError(error.message);\n // @ts-ignore\n anthropicError.cause = error;\n return this._emit('error', anthropicError);\n }\n return this._emit('error', new AnthropicError(String(error)));\n };\n\n protected _emit<Event extends keyof MessageStreamEvents<ParsedT>>(\n event: Event,\n ...args: Parameters<MessageStreamEvents<ParsedT>[Event]>\n ) {\n // make sure we don't emit any MessageStreamEvents after end\n if (this.#ended) return;\n\n if (event === 'end') {\n this.#ended = true;\n this.#resolveEndPromise();\n }\n\n const listeners: MessageStreamEventListeners<ParsedT, Event> | undefined = this.#listeners[event];\n if (listeners) {\n this.#listeners[event] = listeners.filter((l: { once?: boolean }) => !l.once) as any;\n listeners.forEach(({ listener }: any) => listener(...args));\n }\n\n if (event === 'abort') {\n const error = args[0] as APIUserAbortError;\n if (!this.#catchingPromiseCreated && !listeners?.length) {\n Promise.reject(error);\n }\n this.#rejectConnectedPromise(error);\n this.#rejectEndPromise(error);\n this._emit('end');\n return;\n }\n\n if (event === 'error') {\n // NOTE: _emit('error', error) should only be called from #handleError().\n\n const error = args[0] as AnthropicError;\n if (!this.#catchingPromiseCreated && !listeners?.length) {\n // Trigger an unhandled rejection if the user hasn't registered any error handlers.\n // If you are seeing stack traces here, make sure to handle errors via either:\n // - runner.on('error', () => ...)\n // - await runner.done()\n // - await runner.final...()\n // - etc.\n Promise.reject(error);\n }\n this.#rejectConnectedPromise(error);\n this.#rejectEndPromise(error);\n this._emit('end');\n }\n }\n\n protected _emitFinal() {\n const finalMessage = this.receivedMessages.at(-1);\n if (finalMessage) {\n this._emit('finalMessage', this.#getFinalMessage());\n }\n }\n\n #beginRequest() {\n if (this.ended) return;\n this.#currentMessageSnapshot = undefined;\n }\n #addStreamEvent(event: MessageStreamEvent) {\n if (this.ended) return;\n const messageSnapshot = this.#accumulateMessage(event);\n this._emit('streamEvent', event, messageSnapshot);\n\n switch (event.type) {\n case 'content_block_delta': {\n const content = messageSnapshot.content.at(-1)!;\n switch (event.delta.type) {\n case 'text_delta': {\n if (content.type === 'text') {\n this._emit('text', event.delta.text, content.text || '');\n }\n break;\n }\n case 'citations_delta': {\n if (content.type === 'text') {\n this._emit('citation', event.delta.citation, content.citations ?? []);\n }\n break;\n }\n case 'input_json_delta': {\n if (tracksToolInput(content) && this.#listeners.inputJson?.length) {\n this._emit('inputJson', event.delta.partial_json, content.input);\n }\n break;\n }\n case 'thinking_delta': {\n if (content.type === 'thinking') {\n this._emit('thinking', event.delta.thinking, content.thinking);\n }\n break;\n }\n case 'signature_delta': {\n if (content.type === 'thinking') {\n this._emit('signature', content.signature);\n }\n break;\n }\n default:\n checkNever(event.delta);\n }\n break;\n }\n case 'message_stop': {\n this._addMessageParam(messageSnapshot);\n this._addMessage(maybeParseMessage(messageSnapshot, this.#params, { logger: this.#logger }), true);\n break;\n }\n case 'content_block_stop': {\n this._emit('contentBlock', messageSnapshot.content.at(-1)!);\n break;\n }\n case 'message_start': {\n this.#currentMessageSnapshot = messageSnapshot;\n break;\n }\n case 'content_block_start':\n case 'message_delta':\n break;\n }\n }\n #endRequest(): ParsedMessage<ParsedT> {\n if (this.ended) {\n throw new AnthropicError(`stream has ended, this shouldn't happen`);\n }\n const snapshot = this.#currentMessageSnapshot;\n if (!snapshot) {\n throw new AnthropicError(`request ended without sending any chunks`);\n }\n this.#currentMessageSnapshot = undefined;\n return maybeParseMessage(snapshot, this.#params, { logger: this.#logger });\n }\n\n protected async _fromReadableStream(\n readableStream: ReadableStream,\n options?: RequestOptions,\n ): Promise<void> {\n const signal = options?.signal;\n let abortHandler: (() => void) | undefined;\n if (signal) {\n if (signal.aborted) this.controller.abort();\n abortHandler = this.controller.abort.bind(this.controller);\n signal.addEventListener('abort', abortHandler);\n }\n try {\n this.#beginRequest();\n this._connected(null);\n const stream = Stream.fromReadableStream<MessageStreamEvent>(readableStream, this.controller);\n for await (const event of stream) {\n this.#addStreamEvent(event);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n this.#endRequest();\n } finally {\n if (signal && abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n }\n\n /**\n * Mutates this.#currentMessage with the current event. Handling the accumulation of multiple messages\n * will be needed to be handled by the caller, this method will throw if you try to accumulate for multiple\n * messages.\n */\n #accumulateMessage(event: MessageStreamEvent): Message {\n let snapshot = this.#currentMessageSnapshot;\n\n if (event.type === 'message_start') {\n if (snapshot) {\n throw new AnthropicError(`Unexpected event order, got ${event.type} before receiving \"message_stop\"`);\n }\n return event.message;\n }\n\n if (!snapshot) {\n throw new AnthropicError(`Unexpected event order, got ${event.type} before \"message_start\"`);\n }\n\n switch (event.type) {\n case 'message_stop':\n return snapshot;\n case 'message_delta':\n snapshot.stop_reason = event.delta.stop_reason;\n snapshot.stop_sequence = event.delta.stop_sequence;\n snapshot.stop_details = event.delta.stop_details;\n snapshot.usage.output_tokens = event.usage.output_tokens;\n\n if (event.delta.container != null) {\n snapshot.container = event.delta.container;\n }\n\n // The remaining usage counters are cumulative whole-message totals that are\n // omitted when they don't apply, so overwrite when present and never add.\n if (event.usage.input_tokens != null) {\n snapshot.usage.input_tokens = event.usage.input_tokens;\n }\n\n if (event.usage.cache_creation_input_tokens != null) {\n snapshot.usage.cache_creation_input_tokens = event.usage.cache_creation_input_tokens;\n }\n\n if (event.usage.cache_read_input_tokens != null) {\n snapshot.usage.cache_read_input_tokens = event.usage.cache_read_input_tokens;\n }\n\n if (event.usage.server_tool_use != null) {\n snapshot.usage.server_tool_use = event.usage.server_tool_use;\n }\n\n if (event.usage.output_tokens_details != null) {\n snapshot.usage.output_tokens_details = event.usage.output_tokens_details;\n }\n\n return snapshot;\n case 'content_block_start':\n snapshot.content.push({ ...event.content_block });\n return snapshot;\n case 'content_block_delta': {\n const snapshotContent = snapshot.content.at(event.index);\n\n switch (event.delta.type) {\n case 'text_delta': {\n if (snapshotContent?.type === 'text') {\n snapshot.content[event.index] = {\n ...snapshotContent,\n text: (snapshotContent.text || '') + event.delta.text,\n };\n }\n break;\n }\n case 'citations_delta': {\n if (snapshotContent?.type === 'text') {\n snapshot.content[event.index] = {\n ...snapshotContent,\n citations: [...(snapshotContent.citations ?? []), event.delta.citation],\n };\n }\n break;\n }\n case 'input_json_delta': {\n if (snapshotContent && tracksToolInput(snapshotContent)) {\n const jsonBuf = ((snapshotContent as any)[JSON_BUF_PROPERTY] || '') + event.delta.partial_json;\n snapshot.content[event.index] = withLazyInput(snapshotContent, jsonBuf);\n }\n break;\n }\n case 'thinking_delta': {\n if (snapshotContent?.type === 'thinking') {\n snapshot.content[event.index] = {\n ...snapshotContent,\n thinking: snapshotContent.thinking + event.delta.thinking,\n };\n }\n break;\n }\n case 'signature_delta': {\n if (snapshotContent?.type === 'thinking') {\n snapshot.content[event.index] = {\n ...snapshotContent,\n signature: event.delta.signature,\n };\n }\n break;\n }\n default:\n checkNever(event.delta);\n }\n\n return snapshot;\n }\n case 'content_block_stop': {\n const snapshotContent = snapshot.content.at(event.index);\n if (snapshotContent && tracksToolInput(snapshotContent) && JSON_BUF_PROPERTY in snapshotContent) {\n Object.defineProperty(snapshotContent, 'input', {\n value: snapshotContent.input,\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n return snapshot;\n }\n }\n }\n\n [Symbol.asyncIterator](): AsyncIterator<MessageStreamEvent> {\n const pushQueue: MessageStreamEvent[] = [];\n const readQueue: {\n resolve: (chunk: MessageStreamEvent | undefined) => void;\n reject: (error: unknown) => void;\n }[] = [];\n let done = false;\n\n this.on('streamEvent', (event) => {\n const reader = readQueue.shift();\n if (reader) {\n reader.resolve(event);\n } else {\n pushQueue.push(event);\n }\n });\n\n this.on('end', () => {\n done = true;\n for (const reader of readQueue) {\n reader.resolve(undefined);\n }\n readQueue.length = 0;\n });\n\n this.on('abort', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n\n this.on('error', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n\n return {\n next: async (): Promise<IteratorResult<MessageStreamEvent>> => {\n if (!pushQueue.length) {\n if (done) {\n return { value: undefined, done: true };\n }\n return new Promise<MessageStreamEvent | undefined>((resolve, reject) =>\n readQueue.push({ resolve, reject }),\n ).then((chunk) => (chunk ? { value: chunk, done: false } : { value: undefined, done: true }));\n }\n const chunk = pushQueue.shift()!;\n return { value: chunk, done: false };\n },\n return: async () => {\n this.abort();\n return { value: undefined, done: true };\n },\n };\n }\n\n toReadableStream(): ReadableStream {\n const stream = new Stream(this[Symbol.asyncIterator].bind(this), this.controller);\n return stream.toReadableStream();\n }\n}\n","function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\")\n throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f)\n throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver))\n throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return kind === \"a\" ? f.call(receiver, value) : f ? (f.value = value) : state.set(receiver, value), value;\n}\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f)\n throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver))\n throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\nfunction __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\"))\n throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\nexport { __classPrivateFieldSet, __classPrivateFieldGet, __classPrivateFieldIn };\n","export function isAbortError(err: unknown) {\n return (\n typeof err === 'object' &&\n err !== null &&\n // Spec-compliant fetch implementations\n (('name' in err && (err as any).name === 'AbortError') ||\n // Expo fetch\n ('message' in err && String((err as any).message).includes('FetchRequestCanceledException')))\n );\n}\n\nexport const castToError = (err: any): Error => {\n if (err instanceof Error) return err;\n if (typeof err === 'object' && err !== null) {\n try {\n if (Object.prototype.toString.call(err) === '[object Error]') {\n const hasCause = 'cause' in err;\n // @ts-ignore - not all envs have native support for cause yet\n const error = new Error(err.message, hasCause ? { cause: err.cause } : {});\n if (err.stack) error.stack = err.stack;\n // @ts-ignore - not all envs have native support for cause yet\n if (hasCause && !Object.prototype.hasOwnProperty.call(error, 'cause')) error.cause = err.cause;\n if (err.name) error.name = err.name;\n return error;\n }\n } catch {}\n try {\n return new Error(JSON.stringify(err));\n } catch {}\n }\n return new Error(err);\n};\n","import { castToError } from '../internal/errors';\nimport type { OAuthErrorCode } from '../resources/shared';\n\nexport class OpenAIError extends Error {}\n\nexport class APIError<\n TStatus extends number | undefined = number | undefined,\n THeaders extends Headers | undefined = Headers | undefined,\n TError extends Object | undefined = Object | undefined,\n> extends OpenAIError {\n /** HTTP status for the response that caused the error */\n readonly status: TStatus;\n /** HTTP headers for the response that caused the error */\n readonly headers: THeaders;\n /** JSON body of the response that caused the error */\n readonly error: TError;\n\n readonly code: string | null | undefined;\n readonly param: string | null | undefined;\n readonly type: string | undefined;\n\n readonly requestID: string | null | undefined;\n\n constructor(status: TStatus, error: TError, message: string | undefined, headers: THeaders) {\n super(`${APIError.makeMessage(status, error, message)}`);\n this.status = status;\n this.headers = headers;\n this.requestID = headers?.get('x-request-id');\n this.error = error;\n\n const data = error as Record<string, any>;\n this.code = data?.['code'];\n this.param = data?.['param'];\n this.type = data?.['type'];\n }\n\n private static makeMessage(status: number | undefined, error: any, message: string | undefined) {\n const msg = error?.message\n ? typeof error.message === 'string'\n ? error.message\n : JSON.stringify(error.message)\n : error\n ? JSON.stringify(error)\n : message;\n\n if (status && msg) {\n return `${status} ${msg}`;\n }\n if (status) {\n return `${status} status code (no body)`;\n }\n if (msg) {\n return msg;\n }\n return '(no status code or body)';\n }\n\n static generate(\n status: number | undefined,\n errorResponse: Object | undefined,\n message: string | undefined,\n headers: Headers | undefined,\n ): APIError {\n if (!status || !headers) {\n return new APIConnectionError({ message, cause: castToError(errorResponse) });\n }\n\n const error = (errorResponse as Record<string, any>)?.['error'];\n\n if (status === 400) {\n return new BadRequestError(status, error, message, headers);\n }\n\n if (status === 401) {\n return new AuthenticationError(status, error, message, headers);\n }\n\n if (status === 403) {\n return new PermissionDeniedError(status, error, message, headers);\n }\n\n if (status === 404) {\n return new NotFoundError(status, error, message, headers);\n }\n\n if (status === 409) {\n return new ConflictError(status, error, message, headers);\n }\n\n if (status === 422) {\n return new UnprocessableEntityError(status, error, message, headers);\n }\n\n if (status === 429) {\n return new RateLimitError(status, error, message, headers);\n }\n\n if (status >= 500) {\n return new InternalServerError(status, error, message, headers);\n }\n\n return new APIError(status, error, message, headers);\n }\n}\n\nexport class APIUserAbortError extends APIError<undefined, undefined, undefined> {\n constructor({ message }: { message?: string } = {}) {\n super(undefined, undefined, message || 'Request was aborted.', undefined);\n }\n}\n\nexport class APIConnectionError extends APIError<undefined, undefined, undefined> {\n constructor({ message, cause }: { message?: string | undefined; cause?: Error | undefined }) {\n super(undefined, undefined, message || 'Connection error.', undefined);\n // in some environments the 'cause' property is already declared\n // @ts-ignore\n if (cause) this.cause = cause;\n }\n}\n\nexport class APIConnectionTimeoutError extends APIConnectionError {\n constructor({ message }: { message?: string } = {}) {\n super({ message: message ?? 'Request timed out.' });\n }\n}\n\nexport class BadRequestError extends APIError<400, Headers> {}\n\nexport class AuthenticationError extends APIError<401, Headers> {}\n\nexport class PermissionDeniedError extends APIError<403, Headers> {}\n\nexport class NotFoundError extends APIError<404, Headers> {}\n\nexport class ConflictError extends APIError<409, Headers> {}\n\nexport class UnprocessableEntityError extends APIError<422, Headers> {}\n\nexport class RateLimitError extends APIError<429, Headers> {}\n\nexport class InternalServerError extends APIError<number, Headers> {}\n\nexport class LengthFinishReasonError extends OpenAIError {\n constructor() {\n super(`Could not parse response content as the length limit was reached`);\n }\n}\n\nexport class ContentFilterFinishReasonError extends OpenAIError {\n constructor() {\n super(`Could not parse response content as the request was rejected by the content filter`);\n }\n}\n\nexport class InvalidWebhookSignatureError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\n/**\n * Error thrown by the API server during OAuth token exchange.\n * Can have status codes 400, 401, or 403.\n * Other status codes from OAuth endpoints are raised as normal APIError types.\n */\nexport class OAuthError extends APIError<400 | 401 | 403, Headers> {\n readonly error_code: OAuthErrorCode | undefined;\n\n constructor(status: 400 | 401 | 403, error: Object | undefined, headers: Headers) {\n let finalMessage = 'OAuth2 authentication error';\n let error_code: OAuthErrorCode | undefined = undefined;\n\n if (error && typeof error === 'object') {\n const errorData = error as Record<string, any>;\n error_code = errorData['error'];\n const description = errorData['error_description'];\n if (description && typeof description === 'string') {\n finalMessage = description;\n } else if (error_code) {\n finalMessage = error_code;\n }\n }\n\n super(status, error, finalMessage, headers);\n this.error_code = error_code;\n }\n}\n\nexport class SubjectTokenProviderError extends OpenAIError {\n readonly provider: string;\n readonly cause: Error | undefined;\n\n constructor(message: string, provider: string, cause?: Error) {\n super(message);\n this.provider = provider;\n this.cause = cause;\n }\n}\n","import {\n APIConnectionError,\n APIConnectionTimeoutError,\n APIError,\n APIUserAbortError,\n AuthenticationError,\n BadRequestError,\n ConflictError,\n ContentFilterFinishReasonError,\n InternalServerError,\n InvalidWebhookSignatureError,\n LengthFinishReasonError,\n NotFoundError,\n OAuthError,\n OpenAIError,\n PermissionDeniedError,\n RateLimitError,\n SubjectTokenProviderError,\n UnprocessableEntityError,\n} from '../error';\nimport type { EmittedEventResult } from './EventEmitter';\n\nconst MAX_BUFFERED_ITERATOR_EVENTS = 4096;\nconst MAX_BUFFERED_ITERATOR_BYTES = 8 * 1024 * 1024;\n// Typed-array own-key enumeration materializes every dense index before custom keys.\nconst MAX_INSPECTABLE_TYPED_ARRAY_ELEMENTS = 4096;\n// Structured JSON may nest 128 levels before stream-event wrappers are added.\nconst MAX_BUFFERED_EVENT_DEPTH = 256;\nconst bufferedJSONStringify = JSON.stringify;\nconst bufferedJSONParse = JSON.parse;\nconst sdkOwnedBufferedEventArguments = new WeakSet<object>();\n\nconst typedArrayBufferGetter = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(Uint8Array.prototype) as object,\n 'buffer',\n)?.get;\nconst typedArrayLengthGetter = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(Uint8Array.prototype) as object,\n 'length',\n)?.get;\nconst dataViewBufferGetter = Object.getOwnPropertyDescriptor(DataView.prototype, 'buffer')?.get;\nconst symbolDescriptionGetter = Object.getOwnPropertyDescriptor(Symbol.prototype, 'description')?.get;\nconst dateTimestampGetter = Date.prototype.getTime;\nconst arrayBufferByteLengthGetter = Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'byteLength')?.get;\nconst sharedArrayBufferByteLengthGetter =\n typeof SharedArrayBuffer === 'function'\n ? Object.getOwnPropertyDescriptor(SharedArrayBuffer.prototype, 'byteLength')?.get\n : undefined;\n// V8 uses the same trusted lazy-stack accessor pair for native Error instances.\nconst errorStackDescriptor = Object.getOwnPropertyDescriptor(new Error('native stack descriptor'), 'stack');\nconst functionToString = Function.prototype.toString;\nconst objectToString = Object.prototype.toString;\nconst errorBrandDescriptor = Object.getOwnPropertyDescriptor(Error, 'isError');\nconst nativeErrorBrand =\n errorBrandDescriptor && 'value' in errorBrandDescriptor && typeof errorBrandDescriptor.value === 'function'\n ? (errorBrandDescriptor.value as (value: unknown) => boolean)\n : undefined;\nconst nativeErrorConstructorSource = functionToString.call(Error);\nconst nativeDateConstructorSource = functionToString.call(Date);\nconst nativeFunctionConstructorSource = functionToString.call(Function);\nconst trustedIntrinsicPrototypes = new Set<object>([\n APIConnectionError.prototype,\n APIConnectionTimeoutError.prototype,\n APIError.prototype,\n OpenAIError.prototype,\n APIUserAbortError.prototype,\n AuthenticationError.prototype,\n BadRequestError.prototype,\n ConflictError.prototype,\n ContentFilterFinishReasonError.prototype,\n InternalServerError.prototype,\n InvalidWebhookSignatureError.prototype,\n LengthFinishReasonError.prototype,\n NotFoundError.prototype,\n OAuthError.prototype,\n PermissionDeniedError.prototype,\n RateLimitError.prototype,\n SubjectTokenProviderError.prototype,\n UnprocessableEntityError.prototype,\n]);\nconst trustedNativeConstructorSources = new Set<string>();\nconst canonicalIntrinsicDescriptors = new Map<string, ReadonlyMap<PropertyKey, PropertyDescriptor>>();\nconst foreignErrorStackDescriptors = new WeakMap<object, PropertyDescriptor>();\n\ntype NativeErrorConstructor = (...args: never[]) => unknown;\n\nfunction captureNativeProxyDetector(): ((value: object) => boolean) | undefined {\n if (typeof process === 'undefined') {\n return undefined;\n }\n\n try {\n const loader = Object.getOwnPropertyDescriptor(process, 'getBuiltinModule');\n if (!loader || !('value' in loader) || typeof loader.value !== 'function') {\n return undefined;\n }\n const util: unknown = Reflect.apply(loader.value, process, ['node:util']);\n if (typeof util !== 'object' || util === null) {\n return undefined;\n }\n const types = Object.getOwnPropertyDescriptor(util, 'types');\n if (!types || !('value' in types) || typeof types.value !== 'object' || types.value === null) {\n return undefined;\n }\n const detector = Object.getOwnPropertyDescriptor(types.value, 'isProxy');\n if (!detector || !('value' in detector) || typeof detector.value !== 'function') {\n return undefined;\n }\n return detector.value as (value: object) => boolean;\n } catch {\n return undefined;\n }\n}\n\n// Transparent proxies have no portable ECMAScript brand. Newer Node runtimes\n// expose one without adding a Node-only import to browser-compatible bundles.\nconst nativeProxyDetector = captureNativeProxyDetector();\n\nfunction rememberTrustedIntrinsic(constructor: unknown): void {\n if (typeof constructor !== 'function') {\n return;\n }\n\n const prototypeDescriptor = Object.getOwnPropertyDescriptor(constructor, 'prototype');\n if (\n !prototypeDescriptor ||\n !('value' in prototypeDescriptor) ||\n (typeof prototypeDescriptor.value !== 'object' && typeof prototypeDescriptor.value !== 'function')\n ) {\n return;\n }\n\n trustedIntrinsicPrototypes.add(prototypeDescriptor.value as object);\n const source = functionToString.call(constructor);\n if (\n /^function [A-Za-z_$][\\w$]*\\(\\) \\{ \\[native code\\] \\}$/u.test(source) &&\n prototypeDescriptor.configurable === false &&\n prototypeDescriptor.writable === false\n ) {\n trustedNativeConstructorSources.add(source);\n const descriptors = new Map<PropertyKey, PropertyDescriptor>();\n for (const key of Reflect.ownKeys(prototypeDescriptor.value)) {\n const descriptor = Object.getOwnPropertyDescriptor(prototypeDescriptor.value, key);\n if (descriptor) {\n descriptors.set(key, descriptor);\n }\n }\n canonicalIntrinsicDescriptors.set(source, descriptors);\n }\n}\n\nfor (const constructor of [\n Object,\n Function,\n Array,\n Date,\n Map,\n Set,\n ArrayBuffer,\n DataView,\n Error,\n EvalError,\n RangeError,\n ReferenceError,\n SyntaxError,\n TypeError,\n URIError,\n Uint8Array,\n Uint8ClampedArray,\n Uint16Array,\n Uint32Array,\n Int8Array,\n Int16Array,\n Int32Array,\n Float32Array,\n Float64Array,\n]) {\n rememberTrustedIntrinsic(constructor);\n}\n\nfor (const name of [\n 'SharedArrayBuffer',\n 'AggregateError',\n 'Float16Array',\n 'BigInt64Array',\n 'BigUint64Array',\n 'Blob',\n 'File',\n 'Headers',\n] as const) {\n const descriptor = Object.getOwnPropertyDescriptor(globalThis, name);\n if (descriptor && 'value' in descriptor) {\n rememberTrustedIntrinsic(descriptor.value);\n }\n}\n\nconst typedArrayConstructorDescriptor = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(Uint8Array.prototype) as object,\n 'constructor',\n);\nif (typedArrayConstructorDescriptor && 'value' in typedArrayConstructorDescriptor) {\n rememberTrustedIntrinsic(typedArrayConstructorDescriptor.value);\n}\n\nif (typeof Buffer === 'function') {\n rememberTrustedIntrinsic(Buffer);\n}\n\nconst blobInternalHandlePrototype = (() => {\n if (typeof Blob !== 'function') {\n return undefined;\n }\n\n try {\n const blob = new Blob([]);\n for (const key of Object.getOwnPropertySymbols(blob)) {\n const descriptor = Object.getOwnPropertyDescriptor(blob, key);\n if (descriptor && 'value' in descriptor && typeof descriptor.value === 'object' && descriptor.value) {\n return Object.getPrototypeOf(descriptor.value) as object;\n }\n }\n } catch {\n return undefined;\n }\n\n return undefined;\n})();\nconst mapEntries = Map.prototype.entries;\nconst setValues = Set.prototype.values;\nconst headersEntriesDescriptor =\n typeof Headers === 'function' ? Object.getOwnPropertyDescriptor(Headers.prototype, 'entries') : undefined;\nconst headersEntries =\n headersEntriesDescriptor &&\n 'value' in headersEntriesDescriptor &&\n typeof headersEntriesDescriptor.value === 'function'\n ? (headersEntriesDescriptor.value as typeof Headers.prototype.entries)\n : undefined;\nconst retainedStorageBrands = new Set([\n 'ArrayBuffer',\n 'SharedArrayBuffer',\n 'Blob',\n 'File',\n 'Map',\n 'Date',\n 'Set',\n 'Headers',\n]);\n\ninterface TrustedForeignIntrinsic {\n constructor: NativeErrorConstructor;\n descriptors: ReadonlyMap<PropertyKey, PropertyDescriptor>;\n functionPrototype: object;\n}\n\nfunction getTrustedForeignIntrinsic(prototype: object): TrustedForeignIntrinsic | undefined {\n const descriptor = Object.getOwnPropertyDescriptor(prototype, 'constructor');\n if (!descriptor || !('value' in descriptor) || typeof descriptor.value !== 'function') {\n return undefined;\n }\n\n const constructor = descriptor.value as NativeErrorConstructor;\n const source = functionToString.call(constructor);\n const descriptors = canonicalIntrinsicDescriptors.get(source);\n if (!trustedNativeConstructorSources.has(source) || !descriptors) {\n return undefined;\n }\n\n const constructorPrototype = Object.getOwnPropertyDescriptor(constructor, 'prototype');\n if (\n !constructorPrototype ||\n !('value' in constructorPrototype) ||\n constructorPrototype.value !== prototype ||\n constructorPrototype.configurable !== false ||\n constructorPrototype.writable !== false\n ) {\n return undefined;\n }\n\n return { constructor, descriptors, functionPrototype: Object.getPrototypeOf(constructor) as object };\n}\n\nfunction isTrustedIntrinsicPrototype(prototype: object): boolean {\n return trustedIntrinsicPrototypes.has(prototype) || getTrustedForeignIntrinsic(prototype) !== undefined;\n}\n\nfunction isCanonicalIntrinsicFunction(\n value: unknown,\n canonical: unknown,\n functionPrototype: object,\n): boolean {\n if (canonical === undefined) {\n return value === undefined;\n }\n\n if (typeof value !== 'function' || typeof canonical !== 'function') {\n return false;\n }\n\n const source = functionToString.call(canonical);\n if (functionToString.call(value) !== source) {\n return false;\n }\n\n const actualFunctionPrototype = Object.getPrototypeOf(value) as object;\n if (actualFunctionPrototype === functionPrototype) {\n return true;\n }\n if (!/^function [A-Za-z_$][\\w$]*\\(\\) \\{ \\[native code\\] \\}$/u.test(source)) {\n return false;\n }\n\n const intrinsic = getTrustedForeignIntrinsic(actualFunctionPrototype);\n return (\n intrinsic !== undefined &&\n functionToString.call(intrinsic.constructor) === nativeFunctionConstructorSource\n );\n}\n\nfunction isCanonicalIntrinsicDescriptor(\n descriptor: PropertyDescriptor,\n canonical: PropertyDescriptor | undefined,\n functionPrototype: object,\n): boolean {\n if (\n !canonical ||\n descriptor.configurable !== canonical.configurable ||\n descriptor.enumerable !== canonical.enumerable ||\n 'value' in descriptor !== 'value' in canonical\n ) {\n return false;\n }\n\n if ('value' in descriptor && 'value' in canonical) {\n if (descriptor.writable !== canonical.writable) {\n return false;\n }\n if (typeof canonical.value === 'function') {\n return isCanonicalIntrinsicFunction(descriptor.value, canonical.value, functionPrototype);\n }\n if (canonical.value !== null && typeof canonical.value === 'object') {\n return false;\n }\n return Object.is(descriptor.value, canonical.value);\n }\n\n return (\n isCanonicalIntrinsicFunction(descriptor.get, canonical.get, functionPrototype) &&\n isCanonicalIntrinsicFunction(descriptor.set, canonical.set, functionPrototype)\n );\n}\n\nfunction hasNativeErrorBrand(current: object): boolean {\n if (nativeErrorBrand) {\n return nativeErrorBrand.call(Error, current);\n }\n\n let prototype: object | null = current;\n for (let depth = 0; prototype !== null && depth < MAX_BUFFERED_EVENT_DEPTH; depth += 1) {\n if (Object.getOwnPropertyDescriptor(prototype, Symbol.toStringTag)) {\n return false;\n }\n prototype = Object.getPrototypeOf(prototype) as object | null;\n }\n\n return prototype === null && objectToString.call(current) === '[object Error]';\n}\n\nfunction getVerifiedForeignErrorConstructor(\n current: object,\n stackDescriptor: PropertyDescriptor,\n): { constructor: NativeErrorConstructor; prototype: object } | undefined {\n if (typeof stackDescriptor.get !== 'function' || typeof stackDescriptor.set !== 'function') {\n return undefined;\n }\n\n let prototype = Object.getPrototypeOf(current) as object | null;\n for (let depth = 0; prototype !== null && depth < MAX_BUFFERED_EVENT_DEPTH; depth += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(prototype, 'constructor');\n if (descriptor && 'value' in descriptor && typeof descriptor.value === 'function') {\n const constructor = descriptor.value as NativeErrorConstructor;\n if (\n functionToString.call(constructor) === nativeErrorConstructorSource &&\n isTrustedIntrinsicPrototype(prototype)\n ) {\n const functionPrototype = Object.getPrototypeOf(constructor) as object;\n if (\n Object.getPrototypeOf(stackDescriptor.get) === functionPrototype &&\n Object.getPrototypeOf(stackDescriptor.set) === functionPrototype\n ) {\n return { constructor, prototype };\n }\n return undefined;\n }\n }\n prototype = Object.getPrototypeOf(prototype) as object | null;\n }\n\n return undefined;\n}\n\nfunction isTrustedNativeErrorStack(current: object, descriptor: PropertyDescriptor): boolean {\n if (!hasNativeErrorBrand(current)) {\n return false;\n }\n\n if (\n errorStackDescriptor &&\n !('value' in errorStackDescriptor) &&\n typeof errorStackDescriptor.get === 'function' &&\n Object.prototype.isPrototypeOf.call(Error.prototype, current) &&\n descriptor.get === errorStackDescriptor.get &&\n descriptor.set === errorStackDescriptor.set\n ) {\n return true;\n }\n\n const verified = getVerifiedForeignErrorConstructor(current, descriptor);\n if (!verified) {\n return false;\n }\n\n let canonicalDescriptor = foreignErrorStackDescriptors.get(verified.prototype);\n if (!canonicalDescriptor) {\n const canonical = Reflect.construct(verified.constructor, []) as unknown;\n if (\n typeof canonical !== 'object' ||\n canonical === null ||\n !hasNativeErrorBrand(canonical) ||\n Object.getPrototypeOf(canonical) !== verified.prototype\n ) {\n return false;\n }\n\n canonicalDescriptor = Object.getOwnPropertyDescriptor(canonical, 'stack');\n if (\n !canonicalDescriptor ||\n 'value' in canonicalDescriptor ||\n typeof canonicalDescriptor.get !== 'function' ||\n typeof canonicalDescriptor.set !== 'function'\n ) {\n return false;\n }\n foreignErrorStackDescriptors.set(verified.prototype, canonicalDescriptor);\n }\n\n return descriptor.get === canonicalDescriptor.get && descriptor.set === canonicalDescriptor.set;\n}\n\ntype RetainedStorage = {\n bytes: number;\n kind: 'typed-array' | 'data-view' | 'buffer' | 'blob' | 'map' | 'date' | 'set' | 'headers';\n};\n\ntype EventQueue<Value> = {\n readonly length: number;\n enqueue: (value: Value) => void;\n dequeue: () => Value | undefined;\n clear: () => void;\n};\n\nfunction createEventQueue<Value>(): EventQueue<Value> {\n let entries: (Value | undefined)[] = [];\n let head = 0;\n\n return {\n get length() {\n return entries.length - head;\n },\n enqueue(value) {\n entries.push(value);\n },\n dequeue() {\n if (head === entries.length) {\n return undefined;\n }\n\n const value = entries[head];\n entries[head] = undefined;\n head += 1;\n\n if (head === entries.length) {\n entries = [];\n head = 0;\n } else if (head >= 1024 && head * 2 >= entries.length) {\n entries = entries.slice(head);\n head = 0;\n }\n\n return value;\n },\n clear() {\n entries = [];\n head = 0;\n },\n };\n}\n\nfunction getRetainedStorageBrand(current: object): string | undefined {\n let prototype = Object.getPrototypeOf(current) as object | null;\n\n for (let depth = 0; prototype !== null && depth < MAX_BUFFERED_EVENT_DEPTH; depth += 1) {\n if (prototype === Date.prototype) {\n return 'Date';\n }\n if (!trustedIntrinsicPrototypes.has(prototype)) {\n const constructor = Object.getOwnPropertyDescriptor(prototype, 'constructor');\n if (\n constructor &&\n 'value' in constructor &&\n typeof constructor.value === 'function' &&\n functionToString.call(constructor.value) === nativeDateConstructorSource &&\n getTrustedForeignIntrinsic(prototype)\n ) {\n return 'Date';\n }\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(prototype, Symbol.toStringTag);\n if (\n descriptor &&\n 'value' in descriptor &&\n typeof descriptor.value === 'string' &&\n retainedStorageBrands.has(descriptor.value)\n ) {\n return descriptor.value;\n }\n prototype = Object.getPrototypeOf(prototype) as object | null;\n }\n\n return undefined;\n}\n\nfunction estimateRetainedBufferBytes(\n current: object,\n visit: (value: unknown, depth: number) => void,\n depth: number,\n): RetainedStorage | undefined {\n if (ArrayBuffer.isView(current)) {\n let buffer: unknown;\n let kind: RetainedStorage['kind'] = 'typed-array';\n\n try {\n buffer = typedArrayBufferGetter?.call(current) as unknown;\n } catch {\n kind = 'data-view';\n buffer = dataViewBufferGetter?.call(current) as unknown;\n }\n\n if (typeof buffer !== 'object' || buffer === null) {\n return { bytes: Number.POSITIVE_INFINITY, kind };\n }\n\n // Even a one-byte cross-realm view retains its complete backing allocation.\n visit(buffer, depth + 1);\n return { bytes: 0, kind };\n }\n\n const brand = getRetainedStorageBrand(current);\n if (!brand) {\n return undefined;\n }\n\n let getter: (() => unknown) | undefined;\n const kind: RetainedStorage['kind'] = 'buffer';\n switch (brand) {\n case 'ArrayBuffer': {\n getter = arrayBufferByteLengthGetter;\n break;\n }\n case 'SharedArrayBuffer': {\n getter = sharedArrayBufferByteLengthGetter;\n break;\n }\n case 'Blob':\n case 'File': {\n // Blob slices can retain an arbitrarily larger native backing allocation,\n // and neither browser nor Node exposes its extent or ownership. Detached\n // queues must fail closed; waiting readers bypass retained-size inspection.\n return { bytes: Number.POSITIVE_INFINITY, kind: 'blob' };\n }\n case 'Map': {\n return { bytes: 0, kind: 'map' };\n }\n case 'Date': {\n Reflect.apply(dateTimestampGetter, current, []);\n return { bytes: 8, kind: 'date' };\n }\n case 'Set': {\n return { bytes: 0, kind: 'set' };\n }\n case 'Headers': {\n return { bytes: 0, kind: 'headers' };\n }\n default: {\n return undefined;\n }\n }\n\n const bytes = getter?.call(current);\n return {\n bytes:\n typeof bytes === 'number' && Number.isSafeInteger(bytes) && bytes >= 0\n ? bytes\n : Number.POSITIVE_INFINITY,\n kind,\n };\n}\n\nfunction visitHiddenEventValues(\n current: object,\n kind: RetainedStorage['kind'] | undefined,\n visit: (value: unknown, overhead: number) => boolean,\n): boolean {\n if (kind === 'map') {\n for (const [key, entry] of mapEntries.call(current)) {\n if (!visit(key, 8) || !visit(entry, 8)) {\n return false;\n }\n }\n }\n\n if (kind === 'set') {\n for (const entry of setValues.call(current)) {\n if (!visit(entry, 8)) {\n return false;\n }\n }\n }\n\n if (kind === 'headers') {\n if (!headersEntries) {\n return false;\n }\n for (const [name, value] of headersEntries.call(current as Headers)) {\n if (!visit(name, 8) || !visit(value, 8)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\nfunction getInspectableEventKeys(\n current: object,\n kind: RetainedStorage['kind'] | undefined,\n availableBytes: number,\n): (string | symbol)[] | undefined {\n if (Array.isArray(current)) {\n const descriptor = Object.getOwnPropertyDescriptor(current, 'length');\n const length: unknown = descriptor && 'value' in descriptor ? descriptor.value : undefined;\n if (\n typeof length !== 'number' ||\n !Number.isSafeInteger(length) ||\n length < 0 ||\n length > Math.floor(availableBytes / 16)\n ) {\n return undefined;\n }\n }\n\n if (kind !== 'typed-array') {\n return Reflect.ownKeys(current);\n }\n\n const length: unknown = typedArrayLengthGetter?.call(current);\n if (\n typeof length !== 'number' ||\n !Number.isSafeInteger(length) ||\n length < 0 ||\n length > MAX_INSPECTABLE_TYPED_ARRAY_ELEMENTS\n ) {\n return undefined;\n }\n\n return Reflect.ownKeys(current).filter((key) => {\n if (typeof key !== 'string') {\n return true;\n }\n\n const index = Number(key);\n return !Number.isInteger(index) || index < 0 || index >= length || String(index) !== key;\n });\n}\n\nfunction visitInspectableEventProperties(\n current: object,\n kind: RetainedStorage['kind'] | undefined,\n depth: number,\n availableBytes: () => number,\n charge: (bytes: number) => boolean,\n visit: (value: unknown, depth: number, isBlobInternalHandle?: boolean) => void,\n): boolean {\n const keys = getInspectableEventKeys(current, kind, availableBytes());\n if (keys === undefined) {\n return false;\n }\n\n for (const key of keys) {\n if (!charge(typeof key === 'string' ? key.length * 2 + 8 : 8)) {\n return false;\n }\n if (typeof key === 'symbol') {\n visit(key, depth + 1);\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(current, key);\n if (!descriptor) {\n return false;\n }\n if (!('value' in descriptor)) {\n if (key === 'stack' && isTrustedNativeErrorStack(current, descriptor)) {\n continue;\n }\n return false;\n }\n visit(descriptor.value, depth + 1, kind === 'blob');\n }\n\n return true;\n}\n\nfunction visitRetainedEventPrototypes(\n current: object,\n depth: number,\n isBlobInternalHandle: boolean,\n visited: WeakSet<object>,\n availableBytes: () => number,\n charge: (bytes: number) => boolean,\n visit: (value: unknown, depth: number, isBlobInternalHandle?: boolean) => void,\n retainPrototype: (prototype: object, inspect: () => boolean) => boolean,\n): boolean {\n let prototype = Object.getPrototypeOf(current) as object | null;\n\n for (let prototypeDepth = depth + 1; prototype !== null; prototypeDepth += 1) {\n if (prototypeDepth >= MAX_BUFFERED_EVENT_DEPTH) {\n return false;\n }\n if (\n trustedIntrinsicPrototypes.has(prototype) ||\n (isBlobInternalHandle && prototype === blobInternalHandlePrototype)\n ) {\n return true;\n }\n if (visited.has(prototype)) {\n visit(prototype, prototypeDepth);\n return availableBytes() >= 0;\n }\n\n visited.add(prototype);\n const retainedPrototype = prototype;\n const retained = retainPrototype(retainedPrototype, () => {\n if (!charge(16)) {\n return false;\n }\n\n const intrinsic = getTrustedForeignIntrinsic(retainedPrototype);\n if (!intrinsic) {\n return visitInspectableEventProperties(\n retainedPrototype,\n undefined,\n prototypeDepth,\n availableBytes,\n charge,\n visit,\n );\n }\n\n for (const key of Reflect.ownKeys(retainedPrototype)) {\n const descriptor = Object.getOwnPropertyDescriptor(retainedPrototype, key);\n if (!descriptor) {\n return false;\n }\n if (\n isCanonicalIntrinsicDescriptor(\n descriptor,\n intrinsic.descriptors.get(key),\n intrinsic.functionPrototype,\n )\n ) {\n continue;\n }\n if (!charge(typeof key === 'string' ? key.length * 2 + 8 : 8) || !('value' in descriptor)) {\n return false;\n }\n if (typeof key === 'symbol') {\n visit(key, prototypeDepth + 1);\n }\n visit(descriptor.value, prototypeDepth + 1);\n }\n\n return availableBytes() >= 0;\n });\n if (!retained) {\n return false;\n }\n\n prototype = Object.getPrototypeOf(retainedPrototype) as object | null;\n }\n\n return true;\n}\n\ntype BufferedRetainedIdentity = object | symbol;\n\ntype BufferedInspectedNode = {\n bytes: number;\n edges: Set<BufferedRetainedIdentity>;\n};\n\ntype BufferedInspectedGraph = {\n scalarBytes: number;\n roots: Set<BufferedRetainedIdentity>;\n nodes: Map<BufferedRetainedIdentity, BufferedInspectedNode>;\n};\n\ntype BufferedLedgerEntry = {\n scalarBytes: number;\n roots: Set<BufferedRetainedIdentity>;\n identities: Set<BufferedRetainedIdentity>;\n};\n\ntype BufferedLedgerRecord = BufferedInspectedNode & {\n owners: Set<BufferedLedgerEntry>;\n};\n\ntype BufferedLedgerChange = {\n node: BufferedInspectedNode;\n ownerDelta: number;\n};\n\nconst BUFFERED_LEDGER_ENTRY_BYTES = 32;\nconst BUFFERED_LEDGER_NODE_BYTES = 32;\nconst BUFFERED_LEDGER_EDGE_BYTES = 8;\nconst BUFFERED_LEDGER_OWNER_BYTES = 16;\nconst MAX_BUFFERED_LEDGER_RECONCILIATION_WORK = 128 * 1024;\n\nfunction inspectBufferedEventGraph(\n value: unknown,\n remainingBytes: number,\n): BufferedInspectedGraph | undefined {\n let bytes = 0;\n let scalarBytes = 0;\n const visited = new WeakSet<object>();\n const visitedSymbols = new Set<symbol>();\n const roots = new Set<BufferedRetainedIdentity>();\n const nodes = new Map<BufferedRetainedIdentity, BufferedInspectedNode>();\n let activeNode: BufferedInspectedNode | undefined;\n const availableBytes = (): number => remainingBytes - bytes;\n const charge = (amount: number): boolean => {\n if (!Number.isSafeInteger(amount) || amount < 0) {\n bytes = remainingBytes + 1;\n return false;\n }\n\n bytes += amount;\n if (activeNode) {\n activeNode.bytes += amount;\n } else {\n scalarBytes += amount;\n }\n return bytes <= remainingBytes;\n };\n const addIdentity = (identity: BufferedRetainedIdentity): void => {\n if (activeNode) {\n activeNode.edges.add(identity);\n } else {\n roots.add(identity);\n }\n };\n const retainIdentity = (identity: BufferedRetainedIdentity, inspect: () => boolean): boolean => {\n addIdentity(identity);\n const node: BufferedInspectedNode = { bytes: 0, edges: new Set() };\n nodes.set(identity, node);\n const previous = activeNode;\n activeNode = node;\n try {\n return inspect();\n } finally {\n activeNode = previous;\n }\n };\n\n const visitSymbol = (current: symbol): void => {\n if (visitedSymbols.has(current)) {\n addIdentity(current);\n charge(8);\n return;\n }\n visitedSymbols.add(current);\n\n if (\n !retainIdentity(current, () => {\n if (!symbolDescriptionGetter) {\n return false;\n }\n const description = Reflect.apply(symbolDescriptionGetter, current, []) as string | undefined;\n return charge(8 + (description?.length ?? 0) * 2);\n })\n ) {\n bytes = remainingBytes + 1;\n }\n };\n\n const visit = (current: unknown, depth: number, isBlobInternalHandle = false): void => {\n if (bytes > remainingBytes) {\n return;\n }\n\n if (typeof current === 'string') {\n charge(current.length * 2);\n return;\n }\n\n if (typeof current === 'symbol') {\n visitSymbol(current);\n return;\n }\n\n if (typeof current === 'function') {\n bytes = remainingBytes + 1;\n return;\n }\n\n if (current === null || typeof current !== 'object') {\n charge(8);\n return;\n }\n\n if (nativeProxyDetector?.(current)) {\n bytes = remainingBytes + 1;\n return;\n }\n\n if (depth >= MAX_BUFFERED_EVENT_DEPTH) {\n bytes = remainingBytes + 1;\n return;\n }\n\n if (visited.has(current)) {\n addIdentity(current);\n charge(8);\n return;\n }\n visited.add(current);\n\n if (\n !retainIdentity(current, () => {\n if (!charge(16)) {\n return false;\n }\n\n const retainedStorage = estimateRetainedBufferBytes(current, visit, depth);\n if (\n !visitRetainedEventPrototypes(\n current,\n depth,\n isBlobInternalHandle,\n visited,\n availableBytes,\n charge,\n visit,\n retainIdentity,\n )\n ) {\n return false;\n }\n if (retainedStorage !== undefined && !charge(retainedStorage.bytes)) {\n return false;\n }\n\n if (\n !visitHiddenEventValues(current, retainedStorage?.kind, (hiddenValue, overhead) => {\n if (!charge(overhead)) {\n return false;\n }\n visit(hiddenValue, depth + 1);\n return bytes <= remainingBytes;\n })\n ) {\n return false;\n }\n\n return visitInspectableEventProperties(\n current,\n retainedStorage?.kind,\n depth,\n availableBytes,\n charge,\n visit,\n );\n })\n ) {\n bytes = remainingBytes + 1;\n }\n };\n\n try {\n visit(value, 0);\n } catch {\n return undefined;\n }\n\n return bytes <= remainingBytes ? { scalarBytes, roots, nodes } : undefined;\n}\n\nfunction areBufferedRetainedEdgesEqual(\n first: Set<BufferedRetainedIdentity>,\n second: Set<BufferedRetainedIdentity>,\n): boolean {\n if (first.size !== second.size) {\n return false;\n }\n for (const identity of first) {\n if (!second.has(identity)) {\n return false;\n }\n }\n return true;\n}\n\nfunction getBufferedLedgerNodeBytes(node: BufferedInspectedNode, owners: number): number {\n return (\n node.bytes +\n BUFFERED_LEDGER_NODE_BYTES +\n node.edges.size * BUFFERED_LEDGER_EDGE_BYTES +\n owners * BUFFERED_LEDGER_OWNER_BYTES\n );\n}\n\nfunction getBufferedLedgerEntryBytes(entry: Pick<BufferedLedgerEntry, 'scalarBytes' | 'roots'>): number {\n return BUFFERED_LEDGER_ENTRY_BYTES + entry.scalarBytes + entry.roots.size * BUFFERED_LEDGER_EDGE_BYTES;\n}\n\nfunction collectBufferedLedgerIdentities(\n roots: Set<BufferedRetainedIdentity>,\n candidate: Map<BufferedRetainedIdentity, BufferedInspectedNode>,\n records: Map<BufferedRetainedIdentity, BufferedLedgerRecord>,\n work: { remaining: number },\n): Set<BufferedRetainedIdentity> | undefined {\n const identities = new Set<BufferedRetainedIdentity>();\n const pending = [...roots];\n\n while (pending.length) {\n work.remaining -= 1;\n if (work.remaining < 0) {\n return undefined;\n }\n\n const identity = pending.pop()!;\n if (identities.has(identity)) {\n continue;\n }\n const node = candidate.get(identity) ?? records.get(identity);\n if (!node) {\n return undefined;\n }\n identities.add(identity);\n for (const edge of node.edges) {\n pending.push(edge);\n }\n }\n\n return identities;\n}\n\nfunction getBufferedLedgerChange(\n identity: BufferedRetainedIdentity,\n graph: BufferedInspectedGraph,\n records: Map<BufferedRetainedIdentity, BufferedLedgerRecord>,\n changes: Map<BufferedRetainedIdentity, BufferedLedgerChange>,\n node?: BufferedInspectedNode,\n): BufferedLedgerChange | undefined {\n const existing = changes.get(identity);\n if (existing) {\n if (node) {\n existing.node = node;\n }\n return existing;\n }\n\n const current = node ?? graph.nodes.get(identity) ?? records.get(identity);\n if (!current) {\n return undefined;\n }\n const update = { node: current, ownerDelta: 0 };\n changes.set(identity, update);\n return update;\n}\n\nfunction findBufferedLedgerAffectedOwners(\n entry: BufferedLedgerEntry,\n graph: BufferedInspectedGraph,\n records: Map<BufferedRetainedIdentity, BufferedLedgerRecord>,\n changes: Map<BufferedRetainedIdentity, BufferedLedgerChange>,\n work: { remaining: number },\n): Set<BufferedLedgerEntry> | undefined {\n const affected = new Set<BufferedLedgerEntry>([entry]);\n\n for (const [identity, node] of graph.nodes) {\n work.remaining -= 1;\n if (work.remaining < 0) {\n return undefined;\n }\n\n const previous = records.get(identity);\n if (!previous) {\n continue;\n }\n const changedEdges = !areBufferedRetainedEdgesEqual(previous.edges, node.edges);\n if (previous.bytes !== node.bytes || changedEdges) {\n getBufferedLedgerChange(identity, graph, records, changes, node);\n }\n if (!changedEdges) {\n continue;\n }\n for (const owner of previous.owners) {\n work.remaining -= 1;\n if (work.remaining < 0) {\n return undefined;\n }\n affected.add(owner);\n }\n }\n\n return affected;\n}\n\nfunction updateBufferedLedgerMembershipChanges(\n owner: BufferedLedgerEntry,\n next: Set<BufferedRetainedIdentity>,\n graph: BufferedInspectedGraph,\n records: Map<BufferedRetainedIdentity, BufferedLedgerRecord>,\n changes: Map<BufferedRetainedIdentity, BufferedLedgerChange>,\n work: { remaining: number },\n): boolean {\n for (const identity of owner.identities) {\n work.remaining -= 1;\n if (work.remaining < 0) {\n return false;\n }\n if (!next.has(identity)) {\n const update = getBufferedLedgerChange(identity, graph, records, changes);\n if (!update) {\n return false;\n }\n update.ownerDelta -= 1;\n }\n }\n\n for (const identity of next) {\n work.remaining -= 1;\n if (work.remaining < 0) {\n return false;\n }\n if (!owner.identities.has(identity)) {\n const update = getBufferedLedgerChange(identity, graph, records, changes);\n if (!update) {\n return false;\n }\n update.ownerDelta += 1;\n }\n }\n\n return true;\n}\n\nfunction collectBufferedLedgerMemberships(\n entry: BufferedLedgerEntry,\n graph: BufferedInspectedGraph,\n affected: Set<BufferedLedgerEntry>,\n records: Map<BufferedRetainedIdentity, BufferedLedgerRecord>,\n changes: Map<BufferedRetainedIdentity, BufferedLedgerChange>,\n work: { remaining: number },\n): Map<BufferedLedgerEntry, Set<BufferedRetainedIdentity>> | undefined {\n const memberships = new Map<BufferedLedgerEntry, Set<BufferedRetainedIdentity>>();\n\n for (const owner of affected) {\n const roots = owner === entry ? graph.roots : owner.roots;\n const next = collectBufferedLedgerIdentities(roots, graph.nodes, records, work);\n if (!next || !updateBufferedLedgerMembershipChanges(owner, next, graph, records, changes, work)) {\n return undefined;\n }\n memberships.set(owner, next);\n }\n\n return memberships;\n}\n\nfunction projectBufferedLedgerBytes(\n currentBytes: number,\n entry: BufferedLedgerEntry,\n graph: BufferedInspectedGraph,\n isNew: boolean,\n changes: Map<BufferedRetainedIdentity, BufferedLedgerChange>,\n records: Map<BufferedRetainedIdentity, BufferedLedgerRecord>,\n): number | undefined {\n let projected =\n currentBytes - (isNew ? 0 : getBufferedLedgerEntryBytes(entry)) + getBufferedLedgerEntryBytes(graph);\n\n for (const [identity, update] of changes) {\n const previous = records.get(identity);\n const owners = (previous?.owners.size ?? 0) + update.ownerDelta;\n if (owners < 0) {\n return undefined;\n }\n if (previous) {\n projected -= getBufferedLedgerNodeBytes(previous, previous.owners.size);\n }\n if (owners) {\n projected += getBufferedLedgerNodeBytes(update.node, owners);\n }\n }\n\n return Number.isSafeInteger(projected) && projected >= 0 && projected <= MAX_BUFFERED_ITERATOR_BYTES\n ? projected\n : undefined;\n}\n\nfunction applyBufferedLedgerChanges(\n records: Map<BufferedRetainedIdentity, BufferedLedgerRecord>,\n changes: Map<BufferedRetainedIdentity, BufferedLedgerChange>,\n memberships: Map<BufferedLedgerEntry, Set<BufferedRetainedIdentity>>,\n): void {\n for (const [identity, update] of changes) {\n const previous = records.get(identity);\n const owners = (previous?.owners.size ?? 0) + update.ownerDelta;\n if (!owners) {\n continue;\n }\n if (previous) {\n previous.bytes = update.node.bytes;\n previous.edges = update.node.edges;\n } else {\n records.set(identity, {\n bytes: update.node.bytes,\n edges: update.node.edges,\n owners: new Set(),\n });\n }\n }\n\n for (const [owner, next] of memberships) {\n for (const identity of owner.identities) {\n if (!next.has(identity)) {\n records.get(identity)?.owners.delete(owner);\n }\n }\n for (const identity of next) {\n if (!owner.identities.has(identity)) {\n records.get(identity)!.owners.add(owner);\n }\n }\n owner.identities = next;\n }\n\n for (const identity of changes.keys()) {\n if (records.get(identity)?.owners.size === 0) {\n records.delete(identity);\n }\n }\n}\n\n/**\n * Account for queue-owned identities once while charging bounded ownership and\n * edge metadata. Shared topology changes are reconciled for every queued owner.\n */\nfunction createBufferedEventLedger(): {\n retain: (graph: BufferedInspectedGraph) => BufferedLedgerEntry | undefined;\n refresh: (entry: BufferedLedgerEntry, graph: BufferedInspectedGraph) => boolean;\n release: (entry: BufferedLedgerEntry) => void;\n clear: () => void;\n} {\n const records = new Map<BufferedRetainedIdentity, BufferedLedgerRecord>();\n let bytes = 0;\n\n const reconcile = (entry: BufferedLedgerEntry, graph: BufferedInspectedGraph, isNew: boolean): boolean => {\n const work = { remaining: MAX_BUFFERED_LEDGER_RECONCILIATION_WORK };\n const changes = new Map<BufferedRetainedIdentity, BufferedLedgerChange>();\n const affected = findBufferedLedgerAffectedOwners(entry, graph, records, changes, work);\n if (!affected) {\n return false;\n }\n const memberships = collectBufferedLedgerMemberships(entry, graph, affected, records, changes, work);\n if (!memberships) {\n return false;\n }\n const projectedBytes = projectBufferedLedgerBytes(bytes, entry, graph, isNew, changes, records);\n if (projectedBytes === undefined) {\n return false;\n }\n\n applyBufferedLedgerChanges(records, changes, memberships);\n entry.scalarBytes = graph.scalarBytes;\n entry.roots = graph.roots;\n bytes = projectedBytes;\n return true;\n };\n\n const release = (entry: BufferedLedgerEntry): void => {\n bytes -= getBufferedLedgerEntryBytes(entry);\n for (const identity of entry.identities) {\n const record = records.get(identity);\n if (!record?.owners.delete(entry)) {\n continue;\n }\n bytes -= BUFFERED_LEDGER_OWNER_BYTES;\n if (record.owners.size === 0) {\n bytes -= getBufferedLedgerNodeBytes(record, 0);\n records.delete(identity);\n }\n }\n entry.identities.clear();\n };\n\n return {\n retain(graph) {\n const entry: BufferedLedgerEntry = { scalarBytes: 0, roots: new Set(), identities: new Set() };\n return reconcile(entry, graph, true) ? entry : undefined;\n },\n refresh(entry, graph) {\n return reconcile(entry, graph, false);\n },\n release,\n clear() {\n records.clear();\n bytes = 0;\n },\n };\n}\n\n/** An abortable event stream with typed listeners, asynchronous iteration, and lifecycle state. */\nexport class EventStream<EventTypes extends BaseEvents> {\n /** Controls the underlying request; aborting this controller cancels the stream. */\n controller: AbortController = new AbortController();\n\n #connectedPromise: Promise<void>;\n // oxlint-disable class-methods-use-this -- Deferred promise resolvers are intentionally per-instance mutable callbacks.\n #resolveConnectedPromise: () => void = () => undefined;\n #rejectConnectedPromise: (error: OpenAIError) => void = () => undefined;\n\n #endPromise: Promise<void>;\n #resolveEndPromise: () => void = () => undefined;\n #rejectEndPromise: (error: OpenAIError) => void = () => undefined;\n // oxlint-enable class-methods-use-this\n\n #listeners: {\n [Event in keyof EventTypes]?: EventListeners<EventTypes, Event>;\n } = Object.create(null);\n #abortListeners: { signal: AbortSignal; listener: () => void }[] = [];\n #emittedListenerRegistrations = new WeakMap<\n object,\n { event: PropertyKey; registration: { removed?: boolean; detached?: boolean } }\n >();\n #pendingListenerCleanup = new Set<PropertyKey>();\n #pendingBufferedEventChecks = new Set<() => void>();\n #listenerDispatchDepth = 0;\n\n #ended = false;\n #errored = false;\n #aborted = false;\n #catchingPromiseCreated = false;\n // Terminal failure recorded during settlement, before `end` is emitted, so\n // iterators can surface it even when a throwing user listener prevented\n // their internal failure listeners from running.\n #terminalFailure: { kind: 'error' | 'abort'; error: OpenAIError } | undefined;\n\n /** Creates an unstarted stream with independent connection and completion lifecycle promises. */\n constructor() {\n this.#connectedPromise = new Promise<void>((resolve, reject) => {\n this.#resolveConnectedPromise = resolve;\n this.#rejectConnectedPromise = reject;\n });\n\n this.#endPromise = new Promise<void>((resolve, reject) => {\n this.#resolveEndPromise = resolve;\n this.#rejectEndPromise = reject;\n });\n\n // Don't let these promises cause unhandled rejection errors.\n // we will manually cause an unhandled rejection error later\n // if the user hasn't registered any error listener or called\n // any promise-returning method.\n this.#connectedPromise.catch(() => undefined);\n this.#endPromise.catch(() => undefined);\n }\n\n protected _run(this: EventStream<EventTypes>, executor: () => Promise<any>) {\n // Unfortunately if we call `executor()` immediately we get runtime errors about\n // references to `this` before the `super()` constructor call returns.\n setTimeout(() => {\n let failed = false;\n\n Promise.resolve()\n .then(executor)\n .catch((error) => {\n failed = true;\n this.#handleError(error);\n })\n .then(() => {\n if (failed) {\n return;\n }\n\n try {\n this._emitFinal();\n } catch (error) {\n this.#handleError(error);\n return;\n }\n this._emit('end');\n });\n }, 0);\n }\n\n protected _connected(this: EventStream<EventTypes>) {\n if (this.ended) {\n return;\n }\n this.#resolveConnectedPromise();\n this._emit('connect');\n }\n\n /** Whether the stream has finished successfully, failed, or been aborted. */\n get ended(): boolean {\n return this.#ended;\n }\n\n /** Whether an error or user cancellation has been observed. */\n get errored(): boolean {\n return this.#errored;\n }\n\n /** Whether the stream ended because its request was cancelled. */\n get aborted(): boolean {\n return this.#aborted;\n }\n\n /**\n * Cancels the underlying request; {@link done} and {@link events} observe cancellation.\n * Promises returned by {@link emitted} for other events may remain pending.\n */\n abort() {\n this.controller.abort();\n }\n\n protected _listenForAbort(signal: AbortSignal | null | undefined) {\n if (!signal || this.ended) {\n return;\n }\n if (signal.aborted) {\n this.controller.abort();\n return;\n }\n if (this.#abortListeners.some((registration) => registration.signal === signal)) {\n return;\n }\n\n const listener = () => this.controller.abort();\n signal.addEventListener('abort', listener, { once: true });\n this.#abortListeners.push({ signal, listener });\n }\n\n #removeAbortListeners() {\n for (const { signal, listener } of this.#abortListeners.splice(0)) {\n signal.removeEventListener('abort', listener);\n }\n }\n\n /**\n * Adds the listener function to the end of the listeners array for the event.\n * No checks are made to see if the listener has already been added. Multiple calls passing\n * the same combination of event and listener will result in the listener being added, and\n * called, multiple times.\n * @returns This stream, so that listener registration calls can be chained.\n */\n on<Event extends keyof EventTypes>(event: Event, listener: EventListener<EventTypes, Event>): this {\n const listeners: EventListeners<EventTypes, Event> = (this.#listeners[event] ||= []);\n listeners.push({ listener });\n return this;\n }\n\n /**\n * Removes the specified listener from the listener array for the event.\n * off() will remove, at most, one instance of a listener from the listener array. If any single\n * listener has been added multiple times to the listener array for the specified event, then\n * off() must be called multiple times to remove each instance.\n * @returns This stream, so that listener registration calls can be chained.\n */\n off<Event extends keyof EventTypes>(event: Event, listener: EventListener<EventTypes, Event>): this {\n const listeners = this.#listeners[event];\n if (!listeners) {\n return this;\n }\n\n const emittedRegistration = this.#emittedListenerRegistrations.get(listener as object);\n if (\n emittedRegistration?.event === event &&\n !emittedRegistration.registration.removed &&\n !emittedRegistration.registration.detached\n ) {\n this.#removeEmittedListener(\n event,\n emittedRegistration.registration as EventListeners<EventTypes, Event>[number],\n );\n return this;\n }\n\n const index = listeners.findIndex((l) => !l.removed && l.listener === listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n /**\n * Adds a one-time listener function for the event. The next time the event is triggered,\n * this listener is removed and then invoked.\n * @returns This stream, so that listener registration calls can be chained.\n */\n once<Event extends keyof EventTypes>(event: Event, listener: EventListener<EventTypes, Event>): this {\n const listeners: EventListeners<EventTypes, Event> = (this.#listeners[event] ||= []);\n listeners.push({ listener, once: true });\n return this;\n }\n\n #onceForEmitted<Event extends keyof EventTypes>(\n event: Event,\n listener: EventListener<EventTypes, Event>,\n ): void {\n const previousListeners = this.#listeners[event];\n const previousLength = previousListeners?.length ?? 0;\n this.once(event, listener);\n const listeners = this.#listeners[event];\n const [registration] = listeners?.slice(-1) ?? [];\n if (\n (previousListeners === undefined || listeners === previousListeners) &&\n listeners?.length === previousLength + 1 &&\n registration?.listener === listener &&\n registration.once\n ) {\n this.#emittedListenerRegistrations.set(listener as object, { event, registration });\n }\n }\n\n #removeEmittedListener<Event extends keyof EventTypes>(\n event: Event,\n registration: EventListeners<EventTypes, Event>[number],\n ): void {\n if (registration.removed) {\n return;\n }\n\n registration.removed = true;\n this.#emittedListenerRegistrations.delete(registration.listener as object);\n this.#pendingListenerCleanup.add(event);\n if (this.#listenerDispatchDepth === 0) {\n this.#cleanupEmittedListeners();\n }\n }\n\n #cleanupEmittedListeners(): void {\n for (const event of this.#pendingListenerCleanup) {\n const eventType = event as keyof EventTypes;\n const listeners = this.#listeners[eventType];\n if (listeners) {\n this.#listeners[eventType] = listeners.filter((listener) => !listener.removed) as any;\n }\n }\n this.#pendingListenerCleanup.clear();\n }\n\n /**\n * This is similar to `.once()`, but returns a Promise that resolves the next time\n * the event is triggered, instead of calling a listener callback.\n * Events without arguments resolve to `undefined`, single-argument events resolve\n * to that argument, and events with multiple arguments resolve to an argument tuple.\n *\n * @returns A promise for the next event, or a rejection if an error occurs first.\n * Requesting the `error` event resolves with the emitted error instead.\n *\n * Example:\n *\n * const message = await stream.emitted('message') // rejects if the stream errors\n */\n emitted<Event extends keyof EventTypes>(\n event: Event,\n ): Promise<EmittedEventResult<EventParameters<EventTypes, Event>>> {\n return new Promise((resolve, reject) => {\n this.#catchingPromiseCreated = true;\n const onError = (error: OpenAIError) => {\n this.off(event, onEvent as EventListener<EventTypes, Event>);\n reject(error);\n };\n const onEvent = (...values: unknown[]) => {\n if (event !== 'error') {\n this.off('error', onError);\n }\n resolve((values.length > 1 ? values : values[0]) as any);\n };\n\n if (event !== 'error') {\n this.#onceForEmitted('error', onError as EventListener<EventTypes, 'error'>);\n }\n this.#onceForEmitted(event, onEvent as EventListener<EventTypes, Event>);\n });\n }\n\n /**\n * Returns an async iterator that yields every time the event is triggered.\n * The iterator ends when the stream ends and rejects if the stream errors\n * or is aborted. If you request the 'error' or 'abort' event, the iterator\n * yields that event instead of rejecting.\n *\n * Example:\n *\n * for await (const [message] of stream.events('message')) {\n * await processMessage(message);\n * }\n */\n events<Event extends keyof EventTypes>(\n event: Event,\n ): AsyncIterableIterator<EventParameters<EventTypes, Event>> {\n type Parameters = EventParameters<EventTypes, Event>;\n return this._createIterator<Parameters>(\n (push) => {\n const onEvent = (...args: Parameters) => {\n sdkOwnedBufferedEventArguments.add(args);\n try {\n push(args);\n } finally {\n sdkOwnedBufferedEventArguments.delete(args);\n }\n };\n this.on(event, onEvent as EventListener<EventTypes, Event>);\n return () => this.off(event, onEvent as EventListener<EventTypes, Event>);\n },\n {\n // When iterating the 'error' or 'abort' event itself, yield it as a\n // value instead of rejecting the iterator.\n rejectOnError: event !== 'error',\n rejectOnAbort: event !== 'abort',\n },\n );\n }\n\n /**\n * Shared buffered async-iterator adapter over this stream's events.\n *\n * `attach` registers the producer listener(s) with the given `push` and\n * returns a cleanup function that removes them. Termination is handled\n * here: the iterator ends when the stream ends, listeners are removed on\n * end/return, and a terminal error is retained until buffered values have\n * drained so it is surfaced even when no reader was waiting when it fired.\n * Detached consumers have bounded event and byte queues; exceeding either\n * limit fails the stream and aborts its underlying request. Detached queues\n * also reject accessor-backed payloads because getter closures cannot be\n * safely sized without executing untrusted code.\n */\n protected _createIterator<T>(\n attach: (push: (value: T) => void) => () => void,\n {\n rejectOnError = true,\n rejectOnAbort = true,\n onReturn,\n }: { rejectOnError?: boolean; rejectOnAbort?: boolean; onReturn?: () => void } = {},\n ): AsyncIterableIterator<T> {\n type Result = IteratorResult<T>;\n type Reader = {\n resolve: (result: Result) => void;\n reject: (error: OpenAIError) => void;\n };\n type BufferedEvent = {\n retention: BufferedLedgerEntry;\n active: boolean;\n check: (() => void) | undefined;\n };\n\n const pushQueue = createEventQueue<T>();\n const bufferedEventSizes = createEventQueue<BufferedEvent>();\n const readQueue = createEventQueue<Reader>();\n const bufferedLedger = createBufferedEventLedger();\n let ended = this.ended;\n let failure: OpenAIError | undefined;\n let failureDelivered = false;\n let detach: () => void = () => undefined;\n\n const doneResult = (): Result => ({ value: undefined as never, done: true });\n const finishReaders = () => {\n while (readQueue.length) {\n readQueue.dequeue()!.resolve(doneResult());\n }\n };\n const rejectReader = () => {\n if (!failure || failureDelivered || !readQueue.length) {\n return;\n }\n failureDelivered = true;\n readQueue.dequeue()!.reject(failure);\n };\n const cleanup = () => {\n detach();\n this.off('end', onEnd);\n if (rejectOnError) {\n this.off('error', onFailure);\n }\n if (rejectOnAbort) {\n this.off('abort', onFailure);\n }\n };\n const deactivateBufferedEvent = (entry: BufferedEvent): void => {\n entry.active = false;\n if (entry.check) {\n this.#pendingBufferedEventChecks.delete(entry.check);\n entry.check = undefined;\n }\n };\n const failBufferedEvents = (discardRetained = false): OpenAIError => {\n if (discardRetained) {\n while (bufferedEventSizes.length) {\n deactivateBufferedEvent(bufferedEventSizes.dequeue()!);\n }\n pushQueue.clear();\n bufferedLedger.clear();\n }\n\n const error = new OpenAIError(\n `Event stream iterator buffer limit exceeded (${MAX_BUFFERED_ITERATOR_EVENTS} events or ${MAX_BUFFERED_ITERATOR_BYTES} bytes); consume events as they arrive.`,\n );\n try {\n this.#handleError(error);\n } finally {\n this.controller.abort();\n }\n return error;\n };\n\n const revalidateBufferedEvent = (value: T, entry: BufferedEvent): void => {\n if (!entry.active || this.#ended) {\n return;\n }\n\n const graph = inspectBufferedEventGraph(value, MAX_BUFFERED_ITERATOR_BYTES);\n if (!graph || !bufferedLedger.refresh(entry.retention, graph)) {\n failBufferedEvents(true);\n }\n };\n\n const push = (value: T) => {\n if (ended) {\n return;\n }\n const reader = readQueue.dequeue();\n if (reader) {\n reader.resolve({ value, done: false });\n } else {\n if (pushQueue.length >= MAX_BUFFERED_ITERATOR_EVENTS) {\n failBufferedEvents();\n return;\n }\n const graph = inspectBufferedEventGraph(value, MAX_BUFFERED_ITERATOR_BYTES);\n const retention = graph && bufferedLedger.retain(graph);\n if (!retention) {\n failBufferedEvents();\n return;\n }\n\n if (typeof value === 'object' && value !== null && sdkOwnedBufferedEventArguments.has(value)) {\n const argumentsTuple = value as unknown[];\n for (let index = 0; index < argumentsTuple.length; index += 1) {\n const argument = argumentsTuple[index];\n if (typeof argument === 'string') {\n argumentsTuple[index] = bufferedJSONParse(bufferedJSONStringify(argument)) as string;\n }\n }\n }\n\n const entry: BufferedEvent = { retention, active: true, check: undefined };\n pushQueue.enqueue(value);\n bufferedEventSizes.enqueue(entry);\n const check = () => {\n entry.check = undefined;\n revalidateBufferedEvent(value, entry);\n };\n entry.check = check;\n this.#pendingBufferedEventChecks.add(check);\n }\n };\n const onFailure = (error: OpenAIError) => {\n failure = error;\n if (!pushQueue.length) {\n rejectReader();\n }\n };\n // A throwing user listener registered before this iterator stops dispatch\n // before onFailure runs; adopt the failure the stream recorded during\n // settlement so terminal errors are never converted into clean completion.\n const adoptTerminalFailure = () => {\n if (failure) {\n return;\n }\n const terminal = this.#terminalFailure;\n if (!terminal) {\n return;\n }\n if (terminal.kind === 'error' ? rejectOnError : rejectOnAbort) {\n failure = terminal.error;\n }\n };\n const onEnd = () => {\n ended = true;\n adoptTerminalFailure();\n cleanup();\n if (!pushQueue.length) {\n rejectReader();\n finishReaders();\n }\n };\n\n if (!ended) {\n detach = attach(push);\n this.on('end', onEnd);\n if (rejectOnError) {\n this.on('error', onFailure);\n }\n if (rejectOnAbort) {\n this.on('abort', onFailure);\n }\n }\n\n return {\n next: (): Promise<Result> => {\n if (pushQueue.length) {\n const value = pushQueue.dequeue()!;\n const entry = bufferedEventSizes.dequeue()!;\n deactivateBufferedEvent(entry);\n const graph = inspectBufferedEventGraph(value, MAX_BUFFERED_ITERATOR_BYTES);\n if (!graph || !bufferedLedger.refresh(entry.retention, graph)) {\n const error = failBufferedEvents(true);\n failureDelivered = true;\n return Promise.reject(error);\n }\n bufferedLedger.release(entry.retention);\n return Promise.resolve({ value, done: false });\n }\n\n if (ended || this.ended) {\n adoptTerminalFailure();\n }\n if (failure && !failureDelivered) {\n failureDelivered = true;\n return Promise.reject(failure);\n }\n\n if (ended) {\n return Promise.resolve(doneResult());\n }\n\n return new Promise<Result>((resolve, reject) => {\n readQueue.enqueue({ resolve, reject });\n });\n },\n return: () => {\n ended = true;\n // The consumer walked away; terminal failures recorded later must not\n // resurface through this iterator.\n failureDelivered = true;\n while (bufferedEventSizes.length) {\n deactivateBufferedEvent(bufferedEventSizes.dequeue()!);\n }\n pushQueue.clear();\n bufferedLedger.clear();\n cleanup();\n finishReaders();\n if (onReturn) {\n // The consumer explicitly ended iteration, so any failure the\n // onReturn callback triggers (e.g. aborting the stream) is\n // self-inflicted; mark the stream's terminal promise as handled so\n // it does not surface as an unhandled rejection.\n void this.done().catch(() => undefined);\n onReturn();\n }\n return Promise.resolve(doneResult());\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n\n /** Resolves when the stream ends successfully or rejects when it fails or is aborted. */\n async done(): Promise<void> {\n this.#catchingPromiseCreated = true;\n await this.#endPromise;\n }\n\n #handleError(this: EventStream<EventTypes>, error: unknown) {\n this.#errored = true;\n if (error instanceof Error && error.name === 'AbortError') {\n error = new APIUserAbortError();\n }\n if (error instanceof APIUserAbortError) {\n this.#aborted = true;\n return this._emit('abort', error);\n }\n if (error instanceof OpenAIError) {\n return this._emit('error', error);\n }\n if (error instanceof Error) {\n const openAIError: OpenAIError = new OpenAIError(error.message);\n // @ts-ignore\n openAIError.cause = error;\n return this._emit('error', openAIError);\n }\n return this._emit('error', new OpenAIError(String(error)));\n }\n\n /** Returns whether an event currently has one or more registered listeners. */\n protected _hasListeners<Event extends keyof EventTypes>(event: Event): boolean {\n return Boolean(this.#listeners[event]?.some((listener) => !listener.removed));\n }\n\n #settleTerminalEvent<Event extends keyof EventTypes>(\n event: Event,\n args: EventParameters<EventTypes, Event>,\n hasListeners: boolean,\n ): void {\n if (event === 'abort') {\n const error = args[0] as APIUserAbortError;\n this.#terminalFailure ??= { kind: 'abort', error };\n if (!this.#catchingPromiseCreated && !hasListeners) {\n Promise.reject(error);\n }\n this.#rejectConnectedPromise(error);\n this.#rejectEndPromise(error);\n this._emit('end');\n return;\n }\n\n if (event === 'error') {\n // NOTE: _emit('error', error) should only be called from #handleError().\n\n const error = args[0] as OpenAIError;\n this.#terminalFailure ??= { kind: 'error', error };\n if (!this.#catchingPromiseCreated && !hasListeners) {\n // Trigger an unhandled rejection if the user hasn't registered any error handlers.\n // If you are seeing stack traces here, make sure to handle errors via either:\n // - runner.on('error', () => ...)\n // - await runner.done()\n // - await runner.finalChatCompletion()\n // - etc.\n Promise.reject(error);\n }\n this.#rejectConnectedPromise(error);\n this.#rejectEndPromise(error);\n this._emit('end');\n }\n }\n\n /** Dispatches a connection, failure, cancellation, or completion lifecycle event. */\n _emit<Event extends keyof BaseEvents>(event: Event, ...args: EventParameters<BaseEvents, Event>): void;\n /** Dispatches a typed stream event to all listeners registered for that event. */\n _emit<Event extends keyof EventTypes>(event: Event, ...args: EventParameters<EventTypes, Event>): void;\n /** Dispatches a stream event and performs the associated lifecycle transitions. */\n _emit<Event extends keyof EventTypes>(\n this: EventStream<EventTypes>,\n event: Event,\n ...args: EventParameters<EventTypes, Event>\n ) {\n // make sure we don't emit any events after end\n if (this.#ended) {\n return;\n }\n\n if (event === 'end') {\n this.#removeAbortListeners();\n this.#ended = true;\n this.#resolveEndPromise();\n }\n\n const listeners: EventListeners<EventTypes, Event> | undefined = this.#listeners[event];\n let dispatchError: unknown;\n let dispatchThrew = false;\n try {\n if (listeners) {\n this.#listeners[event] = listeners.filter((listener) => {\n if (listener.once) {\n listener.detached = true;\n }\n return !listener.once && !listener.removed;\n }) as any;\n this.#listenerDispatchDepth += 1;\n try {\n for (const registration of listeners as any) {\n if (!registration.removed) {\n const { listener } = registration;\n listener(...(args as any));\n }\n }\n } finally {\n this.#listenerDispatchDepth -= 1;\n if (this.#listenerDispatchDepth === 0) {\n this.#cleanupEmittedListeners();\n for (const check of this.#pendingBufferedEventChecks) {\n this.#pendingBufferedEventChecks.delete(check);\n if (!this.#ended) {\n check();\n }\n }\n }\n }\n }\n } catch (error) {\n dispatchError = error;\n dispatchThrew = true;\n }\n\n try {\n this.#settleTerminalEvent(event, args, Boolean(listeners?.length));\n } catch (error) {\n if (!dispatchThrew) {\n dispatchError = error;\n dispatchThrew = true;\n }\n }\n\n if (dispatchThrew) {\n throw dispatchError;\n }\n }\n\n // oxlint-disable-next-line class-methods-use-this -- Subclasses override this instance hook.\n protected _emitFinal(): void {\n // Hook for subclasses.\n }\n}\n\n/** The listener callback associated with one event name in a stream event map. */\ntype EventListener<Events, EventType extends keyof Events> = Events[EventType];\n\ntype EventListeners<Events, EventType extends keyof Events> = {\n listener: EventListener<Events, EventType>;\n once?: boolean;\n removed?: boolean;\n detached?: boolean;\n}[];\n\n/** The positional listener arguments associated with a named event. */\nexport type EventParameters<Events, EventType extends keyof Events> = Record<\n EventType,\n EventListener<Events, EventType> extends (...args: infer P) => any ? P : never\n>[EventType];\n\n/** Lifecycle events shared by all SDK streaming helpers. */\nexport interface BaseEvents {\n /** Called when the underlying request or readable stream is ready to produce events. */\n connect: () => void;\n /** Called when the stream fails for a reason other than user cancellation. */\n error: (error: OpenAIError) => void;\n /** Called when the underlying request is cancelled. */\n abort: (error: APIUserAbortError) => void;\n /** Called after a successful completion, failure, or cancellation. */\n end: () => void;\n}\n","import { OpenAIError } from '../../core/error';\n\n// https://url.spec.whatwg.org/#url-scheme-string\nconst startsWithSchemeRegexp = /^[a-z][a-z0-9+.-]*:/i;\n\nexport const isAbsoluteURL = (url: string): boolean => {\n return startsWithSchemeRegexp.test(url);\n};\n\nexport let isArray = (val: unknown): val is unknown[] => ((isArray = Array.isArray), isArray(val));\nexport let isReadonlyArray = isArray as (val: unknown) => val is readonly unknown[];\n\n/** Returns an object if the given value isn't an object, otherwise returns as-is */\nexport function maybeObj(x: unknown): object {\n if (typeof x !== 'object') {\n return {};\n }\n\n return x ?? {};\n}\n\n// https://stackoverflow.com/a/34491287\nexport function isEmptyObj(obj: Object | null | undefined): boolean {\n if (!obj) return true;\n for (const _k in obj) return false;\n return true;\n}\n\n// https://eslint.org/docs/latest/rules/no-prototype-builtins\nexport function hasOwn<T extends object = object>(obj: T, key: PropertyKey): key is keyof T {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexport function isObj(obj: unknown): obj is Record<string, unknown> {\n return obj != null && typeof obj === 'object' && !Array.isArray(obj);\n}\n\nexport const ensurePresent = <T>(value: T | null | undefined): T => {\n if (value == null) {\n throw new OpenAIError(`Expected a value to be given but received ${value} instead.`);\n }\n\n return value;\n};\n\nexport const validatePositiveInteger = (name: string, n: unknown): number => {\n if (typeof n !== 'number' || !Number.isInteger(n)) {\n throw new OpenAIError(`${name} must be an integer`);\n }\n if (n < 0) {\n throw new OpenAIError(`${name} must be a positive integer`);\n }\n return n;\n};\n\nexport const coerceInteger = (value: unknown): number => {\n if (typeof value === 'number') return Math.round(value);\n if (typeof value === 'string') return parseInt(value, 10);\n\n throw new OpenAIError(`Could not coerce ${value} (type: ${typeof value}) into a number`);\n};\n\nexport const coerceFloat = (value: unknown): number => {\n if (typeof value === 'number') return value;\n if (typeof value === 'string') return parseFloat(value);\n\n throw new OpenAIError(`Could not coerce ${value} (type: ${typeof value}) into a number`);\n};\n\nexport const coerceBoolean = (value: unknown): boolean => {\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') return value === 'true';\n return Boolean(value);\n};\n\nexport const maybeCoerceInteger = (value: unknown): number | undefined => {\n if (value == null) {\n return undefined;\n }\n return coerceInteger(value);\n};\n\nexport const maybeCoerceFloat = (value: unknown): number | undefined => {\n if (value == null) {\n return undefined;\n }\n return coerceFloat(value);\n};\n\nexport const maybeCoerceBoolean = (value: unknown): boolean | undefined => {\n if (value == null) {\n return undefined;\n }\n return coerceBoolean(value);\n};\n\nexport const safeJSON = (text: string) => {\n try {\n return JSON.parse(text);\n } catch (err) {\n return undefined;\n }\n};\n","/** Copies byte arrays into one contiguous `Uint8Array` while preserving their order. */\nexport function concatBytes(buffers: Uint8Array[]): Uint8Array {\n let length = 0;\n for (const buffer of buffers) {\n length += buffer.length;\n }\n const output = new Uint8Array(length);\n let index = 0;\n for (const buffer of buffers) {\n output.set(buffer, index);\n index += buffer.length;\n }\n\n return output;\n}\n\nlet encodeUTF8_: (str: string) => Uint8Array;\n\n/** Encodes text as UTF-8 bytes, reusing the platform encoder after its first call. */\nexport function encodeUTF8(str: string) {\n let encoder;\n return (\n encodeUTF8_ ??\n ((encoder = new (globalThis as any).TextEncoder()), (encodeUTF8_ = encoder.encode.bind(encoder)))\n )(str);\n}\n\nlet decodeUTF8_: (bytes: Uint8Array) => string;\n\n/** Decodes UTF-8 bytes as text, reusing the platform decoder after its first call. */\nexport function decodeUTF8(bytes: Uint8Array) {\n let decoder;\n return (\n decodeUTF8_ ??\n ((decoder = new (globalThis as any).TextDecoder()), (decodeUTF8_ = decoder.decode.bind(decoder)))\n )(bytes);\n}\n","import { hasOwn } from './values';\nimport { type OpenAI } from '../../client';\nimport { RequestOptions } from '../request-options';\n\ntype LogFn = (message: string, ...rest: unknown[]) => void;\nexport type Logger = {\n error: LogFn;\n warn: LogFn;\n info: LogFn;\n debug: LogFn;\n};\nexport type LogLevel = 'off' | 'error' | 'warn' | 'info' | 'debug';\n\nconst levelNumbers = {\n off: 0,\n error: 200,\n warn: 300,\n info: 400,\n debug: 500,\n};\n\nexport const parseLogLevel = (\n maybeLevel: string | undefined,\n sourceName: string,\n client: OpenAI,\n): LogLevel | undefined => {\n if (!maybeLevel) {\n return undefined;\n }\n if (hasOwn(levelNumbers, maybeLevel)) {\n return maybeLevel;\n }\n loggerFor(client).warn(\n `${sourceName} was set to ${JSON.stringify(maybeLevel)}, expected one of ${JSON.stringify(\n Object.keys(levelNumbers),\n )}`,\n );\n return undefined;\n};\n\nfunction noop() {}\n\nfunction makeLogFn(fnLevel: keyof Logger, logger: Logger | undefined, logLevel: LogLevel) {\n if (!logger || levelNumbers[fnLevel] > levelNumbers[logLevel]) {\n return noop;\n } else {\n // Don't wrap logger functions, we want the stacktrace intact!\n return logger[fnLevel].bind(logger);\n }\n}\n\nconst noopLogger = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n};\n\nlet cachedLoggers = /* @__PURE__ */ new WeakMap<Logger, [LogLevel, Logger]>();\n\nexport function loggerFor(client: OpenAI): Logger {\n const logger = client.logger;\n const logLevel = client.logLevel ?? 'off';\n if (!logger) {\n return noopLogger;\n }\n\n const cachedLogger = cachedLoggers.get(logger);\n if (cachedLogger && cachedLogger[0] === logLevel) {\n return cachedLogger[1];\n }\n\n const levelLogger = {\n error: makeLogFn('error', logger, logLevel),\n warn: makeLogFn('warn', logger, logLevel),\n info: makeLogFn('info', logger, logLevel),\n debug: makeLogFn('debug', logger, logLevel),\n };\n\n cachedLoggers.set(logger, [logLevel, levelLogger]);\n\n return levelLogger;\n}\n\nconst sensitiveQueryNames = new Set([\n 'apikey',\n 'accesstoken',\n 'refreshtoken',\n 'sessiontoken',\n 'sessionid',\n 'idtoken',\n 'authtoken',\n 'authorization',\n 'token',\n 'password',\n 'clientsecret',\n 'xamzsecuritytoken',\n 'xamzsignature',\n 'xamzcredential',\n]);\n\n/** Recognizes credential-bearing query names across ordinary and provider authentication. */\nexport function isSensitiveQueryParameter(name: string): boolean {\n const normalized = name.toLowerCase().replace(/[-_]/gu, '');\n return sensitiveQueryNames.has(normalized) || sensitiveQueryNames.has(normalized.replace(/^x/u, ''));\n}\n\nconst sensitiveHeaderNames = new Set([\n 'authorization',\n 'proxy-authorization',\n 'api-key',\n 'x-api-key',\n 'x-amz-security-token',\n 'cookie',\n 'set-cookie',\n 'x-session-token',\n 'x-session-id',\n 'x-auth-token',\n 'x-id-token',\n]);\n\n/** Recognizes credential-bearing request headers across provider and workload authentication. */\nexport function isSensitiveHeader(name: string): boolean {\n return sensitiveHeaderNames.has(name.toLowerCase().replace(/_/gu, '-')) || isSensitiveQueryParameter(name);\n}\n\n/** Removes credential-valued query parameters before a request URL reaches any logger. */\nexport function redactURL(value: string): string {\n const url = new URL(value);\n url.username = '';\n url.password = '';\n url.hash = '';\n for (const name of url.searchParams.keys()) {\n if (isSensitiveQueryParameter(name)) {\n url.searchParams.set(name, '***');\n }\n }\n return url.href;\n}\n\nexport const formatRequestDetails = (details: {\n options?: RequestOptions | undefined;\n headers?: Headers | Record<string, string> | undefined;\n retryOfRequestLogID?: string | undefined;\n retryOf?: string | undefined;\n url?: string | undefined;\n status?: number | undefined;\n method?: string | undefined;\n durationMs?: number | undefined;\n message?: unknown;\n body?: unknown;\n}) => {\n if (details.options) {\n details.options = { ...details.options };\n delete details.options['headers']; // redundant + leaks internals\n if (details.options.path) {\n const path = details.options.path;\n const redacted = new URL(redactURL(new URL(path, 'https://redacted.invalid').href));\n details.options.path =\n redacted.origin === 'https://redacted.invalid'\n ? `${path.startsWith('/') ? '/' : ''}${redacted.pathname.slice(1)}${redacted.search}`\n : redacted.href;\n }\n if (details.options.query) {\n details.options.query = Object.fromEntries(\n Object.entries(details.options.query).map(([name, value]) => [\n name,\n isSensitiveQueryParameter(name) ? '***' : value,\n ]),\n );\n }\n }\n if (details.url) {\n details.url = redactURL(details.url);\n }\n if (details.headers) {\n details.headers = Object.fromEntries(\n (details.headers instanceof Headers ? [...details.headers] : Object.entries(details.headers)).map(\n ([name, value]) => [name, isSensitiveHeader(name) ? '***' : value],\n ),\n );\n }\n if ('retryOfRequestLogID' in details) {\n if (details.retryOfRequestLogID) {\n details.retryOf = details.retryOfRequestLogID;\n }\n delete details.retryOfRequestLogID;\n }\n return details;\n};\n","/**\n * Stores output text lengths in a complete binary segment tree.\n *\n * Leaves begin at `capacity`; each parent contains the sum of its children.\n * Rebuilding when capacity doubles preserves every existing contribution and\n * makes growth linear in the total number of appended outputs.\n */\nexport class OutputTextIndex {\n private capacity = 1;\n private values: number[] = [0, 0];\n private size = 0;\n\n get length(): number {\n return this.size;\n }\n\n append(value: number): void {\n if (this.size === this.capacity) {\n this.grow();\n }\n\n const index = this.size;\n this.size += 1;\n this.update(index, value);\n }\n\n update(index: number, value: number): void {\n if (!Number.isSafeInteger(index) || index < 0 || index >= this.size) {\n throw new RangeError(`missing output at index ${index}`);\n }\n\n let node = this.capacity + index;\n const difference = value - (this.values[node] ?? 0);\n if (difference === 0) {\n return;\n }\n\n while (node >= 1) {\n this.values[node] = (this.values[node] ?? 0) + difference;\n node = Math.floor(node / 2);\n }\n }\n\n prefixSum(end: number): number {\n if (!Number.isSafeInteger(end) || end < 0 || end > this.size) {\n throw new RangeError(`missing output at index ${end}`);\n }\n\n let start = this.capacity;\n let stop = this.capacity + end;\n let sum = 0;\n\n while (start < stop) {\n if (start % 2 === 1) {\n sum += this.values[start] ?? 0;\n start += 1;\n }\n if (stop % 2 === 1) {\n stop -= 1;\n sum += this.values[stop] ?? 0;\n }\n start = Math.floor(start / 2);\n stop = Math.floor(stop / 2);\n }\n\n return sum;\n }\n\n private grow(): void {\n const previousCapacity = this.capacity;\n this.capacity *= 2;\n const values = Array.from({ length: this.capacity * 2 }, () => 0);\n\n for (let index = 0; index < this.size; index += 1) {\n values[this.capacity + index] = this.values[previousCapacity + index] ?? 0;\n }\n\n for (let index = this.capacity - 1; index > 0; index -= 1) {\n values[index] = (values[index * 2] ?? 0) + (values[index * 2 + 1] ?? 0);\n }\n\n this.values = values;\n }\n}\n","import type { Response } from '../../resources/responses/responses';\nimport { OutputTextIndex } from './output-text-index';\n\ntype ResponseOutput = Response['output'][number];\n\nexport interface ResponseAccumulatorContext {\n canonicalSnapshot: Response | undefined;\n outputTextLengths: WeakMap<ResponseOutput, number>;\n outputTextIndex: OutputTextIndex;\n}\n\nexport function createCanonicalResponseContext(): ResponseAccumulatorContext {\n return {\n canonicalSnapshot: undefined,\n outputTextLengths: new WeakMap(),\n outputTextIndex: new OutputTextIndex(),\n };\n}\n\nexport function getOutputText(context: ResponseAccumulatorContext, output: ResponseOutput): string {\n if (output.type !== 'message') {\n return '';\n }\n\n let text = '';\n for (const content of output.content) {\n if (content.type === 'output_text') {\n text += content.text;\n }\n }\n context.outputTextLengths.set(output, text.length);\n return text;\n}\n\nexport function ensureCanonicalOutputText(context: ResponseAccumulatorContext, snapshot: Response): void {\n if (context.canonicalSnapshot === snapshot) {\n return;\n }\n\n const outputTextIndex = new OutputTextIndex();\n let text = '';\n for (const output of snapshot.output) {\n const outputText = getOutputText(context, output);\n text += outputText;\n outputTextIndex.append(outputText.length);\n }\n // Comparing independently accumulated strings can scan all preceding text on\n // every delta. The recount is authoritative, so assign it without comparing.\n snapshot.output_text = text;\n context.outputTextIndex = outputTextIndex;\n context.canonicalSnapshot = snapshot;\n}\n\nexport function cloneResponse(context: ResponseAccumulatorContext, response: Response): Response {\n context.canonicalSnapshot = undefined;\n context.outputTextLengths = new WeakMap();\n context.outputTextIndex = new OutputTextIndex();\n const snapshot = structuredClone(response);\n if (\n !Object.getOwnPropertyDescriptor(snapshot, 'output_text') ||\n snapshot.output_text === null ||\n snapshot.output_text === undefined\n ) {\n ensureCanonicalOutputText(context, snapshot);\n } else if (snapshot.output.length === 0 && snapshot.output_text === '') {\n context.canonicalSnapshot = snapshot;\n }\n return snapshot;\n}\n\nexport function updateCachedOutputTextLength(\n context: ResponseAccumulatorContext,\n output: ResponseOutput,\n outputIndex: number,\n previousText: string,\n nextText: string,\n): void {\n const length = context.outputTextLengths.get(output);\n if (length !== undefined) {\n const nextLength = length - previousText.length + nextText.length;\n context.outputTextLengths.set(output, nextLength);\n context.outputTextIndex.update(outputIndex, nextLength);\n }\n}\n\nfunction replaceOutputTextSuffix(snapshot: Response, previousText: string, nextText: string): void {\n if (previousText.length === 0) {\n snapshot.output_text += nextText;\n return;\n }\n\n snapshot.output_text =\n snapshot.output_text.slice(0, snapshot.output_text.length - previousText.length) + nextText;\n}\n\nfunction getPrecedingContentTextLength(\n context: ResponseAccumulatorContext,\n output: ResponseOutput | undefined,\n contentIndex: number | undefined,\n nextText: string,\n): number {\n if (contentIndex === undefined || output?.type !== 'message') {\n return 0;\n }\n\n if (contentIndex < output.content.length - contentIndex - 1) {\n let precedingContentLength = 0;\n for (let index = 0; index < contentIndex; index += 1) {\n const precedingContent = output.content[index];\n if (precedingContent?.type === 'output_text') {\n precedingContentLength += precedingContent.text.length;\n }\n }\n return precedingContentLength;\n }\n\n let followingContentLength = 0;\n for (let index = contentIndex + 1; index < output.content.length; index += 1) {\n const followingContent = output.content[index];\n if (followingContent?.type === 'output_text') {\n followingContentLength += followingContent.text.length;\n }\n }\n const outputTextLength = context.outputTextLengths.get(output) ?? getOutputText(context, output).length;\n return outputTextLength - followingContentLength - nextText.length;\n}\n\nexport function updateOutputText(\n context: ResponseAccumulatorContext,\n snapshot: Response,\n outputIndex: number,\n previousText: string,\n nextText: string,\n contentIndex?: number,\n): void {\n if (previousText === nextText) {\n return;\n }\n\n const output = snapshot.output[outputIndex];\n if (\n outputIndex === snapshot.output.length - 1 &&\n (contentIndex === undefined || (output?.type === 'message' && contentIndex === output.content.length - 1))\n ) {\n replaceOutputTextSuffix(snapshot, previousText, nextText);\n return;\n }\n\n const precedingContentLength = getPrecedingContentTextLength(context, output, contentIndex, nextText);\n const offset = context.outputTextIndex.prefixSum(outputIndex) + precedingContentLength;\n if (offset + previousText.length === snapshot.output_text.length) {\n replaceOutputTextSuffix(snapshot, previousText, nextText);\n return;\n }\n\n snapshot.output_text =\n snapshot.output_text.slice(0, offset) +\n nextText +\n snapshot.output_text.slice(offset + previousText.length);\n}\n","import type { Response, ResponseOutputText, ResponseStreamEvent } from '../../resources/responses/responses';\nimport type { ResponseAccumulatorContext } from './canonical-output-text';\nimport { OpenAIError } from '../../error';\nimport { hasOwn } from '../utils';\nimport {\n cloneResponse,\n createCanonicalResponseContext,\n ensureCanonicalOutputText,\n getOutputText,\n updateCachedOutputTextLength,\n updateOutputText,\n} from './canonical-output-text';\n\ninterface ResponseKeepAliveEvent {\n type: 'keepalive';\n sequence_number: number;\n}\n\ntype ResponseAccumulatorEvent = ResponseStreamEvent | ResponseKeepAliveEvent;\ntype ResponseItemScopedEvent = Extract<ResponseAccumulatorEvent, { item_id: string; output_index: number }>;\ntype ResponseOutputItemEvent = Extract<\n ResponseAccumulatorEvent,\n { type: 'response.output_item.added' | 'response.output_item.done' }\n>;\ntype ResponseContentPartAddedEvent = Extract<\n ResponseAccumulatorEvent,\n { type: 'response.content_part.added' }\n>;\ntype ResponseContentPartDoneEvent = Extract<ResponseAccumulatorEvent, { type: 'response.content_part.done' }>;\ntype ResponseOutputTextEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.output_text.delta'\n | 'response.output_text.done'\n | 'response.output_text.annotation.added';\n }\n>;\ntype ResponseRefusalAndArgumentsEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.refusal.delta'\n | 'response.refusal.done'\n | 'response.function_call_arguments.delta'\n | 'response.function_call_arguments.done'\n | 'response.custom_tool_call_input.delta'\n | 'response.custom_tool_call_input.done'\n | 'response.mcp_call_arguments.delta'\n | 'response.mcp_call_arguments.done';\n }\n>;\ntype ResponseShellEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.shell_call_command.added'\n | 'response.shell_call_command.delta'\n | 'response.shell_call_command.done'\n | 'response.shell_call_output_content.delta'\n | 'response.shell_call_output_content.done';\n }\n>;\ntype ResponseReasoningEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.reasoning_text.delta'\n | 'response.reasoning_text.done'\n | 'response.reasoning_summary_part.added'\n | 'response.reasoning_summary_part.done'\n | 'response.reasoning_summary_text.delta'\n | 'response.reasoning_summary_text.done';\n }\n>;\ntype ResponseCodeInterpreterEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.code_interpreter_call_code.delta'\n | 'response.code_interpreter_call_code.done'\n | 'response.code_interpreter_call.in_progress'\n | 'response.code_interpreter_call.interpreting'\n | 'response.code_interpreter_call.completed';\n }\n>;\ntype ResponseSearchStatusEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.file_search_call.in_progress'\n | 'response.file_search_call.searching'\n | 'response.file_search_call.completed'\n | 'response.web_search_call.in_progress'\n | 'response.web_search_call.searching'\n | 'response.web_search_call.completed';\n }\n>;\ntype ResponseImageAndMcpStatusEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.image_generation_call.in_progress'\n | 'response.image_generation_call.generating'\n | 'response.image_generation_call.completed'\n | 'response.mcp_call.in_progress'\n | 'response.mcp_call.completed'\n | 'response.mcp_call.failed';\n }\n>;\ntype ResponseLifecycleEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.created'\n | 'response.queued'\n | 'response.in_progress'\n | 'response.completed'\n | 'response.failed'\n | 'response.incomplete';\n }\n>;\ntype ResponseIgnoredEvent = Extract<\n ResponseAccumulatorEvent,\n {\n type:\n | 'response.audio.delta'\n | 'response.audio.done'\n | 'response.audio.transcript.delta'\n | 'response.audio.transcript.done'\n | 'response.image_generation_call.partial_image'\n | 'response.mcp_list_tools.in_progress'\n | 'response.mcp_list_tools.completed'\n | 'response.mcp_list_tools.failed'\n | 'keepalive'\n | 'error';\n }\n>;\n\ninterface ResponseOutputIdentityIndex {\n snapshot: Response;\n output: Response['output'];\n length: number;\n identities: Set<string>;\n}\n\nconst responseOutputIdentityIndexes = new WeakMap<ResponseAccumulatorContext, ResponseOutputIdentityIndex>();\n\nfunction validateArrayIndex(\n collection: readonly unknown[],\n index: number,\n kind: 'output' | 'content' | 'annotation' | 'command',\n allowAppend = false,\n): void {\n if (\n !Array.isArray(collection) ||\n !Number.isSafeInteger(index) ||\n index < 0 ||\n index > collection.length ||\n (index === collection.length ? !allowAppend || index in collection : !hasOwn(collection, index))\n ) {\n throw new OpenAIError(`missing ${kind} at index ${index}`);\n }\n}\n\nfunction validateArrayAppend(\n collection: readonly unknown[],\n index: number,\n kind: 'output' | 'content',\n): void {\n if (index !== collection.length) {\n throw new OpenAIError(`missing ${kind} at index ${index}`);\n }\n validateArrayIndex(collection, index, kind, true);\n}\n\nfunction getOutput(snapshot: Response, outputIndex: number): Response['output'][number] {\n validateArrayIndex(snapshot.output, outputIndex, 'output');\n const output = snapshot.output[outputIndex];\n if (!output) {\n throw new OpenAIError(`missing output at index ${outputIndex}`);\n }\n return output;\n}\n\nfunction hasRoutedOutputCallIdentity(\n output: Response['output'][number],\n): output is Extract<\n Response['output'][number],\n { type: 'function_call' | 'custom_tool_call' | 'shell_call' | 'shell_call_output' }\n> {\n return (\n output.type === 'function_call' ||\n output.type === 'custom_tool_call' ||\n output.type === 'shell_call' ||\n output.type === 'shell_call_output'\n );\n}\n\nfunction getOutputItemIdentityKeys(output: Response['output'][number], eventType: string): string[] {\n if (!hasOwn(output, 'type') || typeof output.type !== 'string') {\n throw new OpenAIError(`expected an own output item type for ${eventType}`);\n }\n\n const optionalPlatformID = output.type === 'function_call' || output.type === 'custom_tool_call';\n const identities: string[] = [];\n\n if (hasOwn(output, 'id')) {\n if (typeof output.id !== 'string' || output.id.length === 0) {\n throw new OpenAIError(`expected a non-empty output item id for ${eventType}`);\n }\n identities.push(`id:${output.id}`);\n } else if (!optionalPlatformID) {\n throw new OpenAIError(`expected a non-empty output item id for ${eventType}`);\n }\n\n if (hasRoutedOutputCallIdentity(output)) {\n if (!hasOwn(output, 'call_id') || typeof output.call_id !== 'string' || output.call_id.length === 0) {\n throw new OpenAIError(`expected a non-empty output item call_id for ${eventType}`);\n }\n identities.push(`call:${output.type}:${output.call_id}`);\n }\n\n return identities;\n}\n\nfunction assertOutputItemIdentitiesAvailable(identities: Set<string>, keys: readonly string[]): void {\n for (const key of keys) {\n if (identities.has(key)) {\n throw new OpenAIError(`duplicate output item identity '${key}'`);\n }\n }\n}\n\nfunction addOutputItemIdentities(identities: Set<string>, keys: readonly string[]): void {\n assertOutputItemIdentitiesAvailable(identities, keys);\n for (const key of keys) {\n identities.add(key);\n }\n}\n\nfunction createResponseOutputIdentityIndex(snapshot: Response): ResponseOutputIdentityIndex {\n const identityIndex: ResponseOutputIdentityIndex = {\n snapshot,\n output: snapshot.output,\n length: snapshot.output.length,\n identities: new Set(),\n };\n\n for (let index = 0; index < snapshot.output.length; index += 1) {\n const output = getOutput(snapshot, index);\n addOutputItemIdentities(identityIndex.identities, getOutputItemIdentityKeys(output, 'response snapshot'));\n }\n\n return identityIndex;\n}\n\nfunction getResponseOutputIdentityIndex(\n context: ResponseAccumulatorContext,\n snapshot: Response,\n): ResponseOutputIdentityIndex {\n const cached = responseOutputIdentityIndexes.get(context);\n if (\n cached &&\n cached.snapshot === snapshot &&\n cached.output === snapshot.output &&\n cached.length === snapshot.output.length\n ) {\n return cached;\n }\n\n const identityIndex = createResponseOutputIdentityIndex(snapshot);\n responseOutputIdentityIndexes.set(context, identityIndex);\n return identityIndex;\n}\n\nfunction cloneValidatedResponse(context: ResponseAccumulatorContext, response: Response): Response {\n const nextContext = createCanonicalResponseContext();\n const snapshot = cloneResponse(nextContext, response);\n const identityIndex = createResponseOutputIdentityIndex(snapshot);\n\n context.canonicalSnapshot = nextContext.canonicalSnapshot;\n context.outputTextLengths = nextContext.outputTextLengths;\n context.outputTextIndex = nextContext.outputTextIndex;\n responseOutputIdentityIndexes.set(context, identityIndex);\n\n return snapshot;\n}\n\nconst expectedOutputItemTypes = {\n 'response.output_text.delta': 'message',\n 'response.output_text.done': 'message',\n 'response.output_text.annotation.added': 'message',\n 'response.refusal.delta': 'message',\n 'response.refusal.done': 'message',\n 'response.function_call_arguments.delta': 'function_call',\n 'response.function_call_arguments.done': 'function_call',\n 'response.custom_tool_call_input.delta': 'custom_tool_call',\n 'response.custom_tool_call_input.done': 'custom_tool_call',\n 'response.mcp_call_arguments.delta': 'mcp_call',\n 'response.mcp_call_arguments.done': 'mcp_call',\n 'response.mcp_call.in_progress': 'mcp_call',\n 'response.mcp_call.completed': 'mcp_call',\n 'response.mcp_call.failed': 'mcp_call',\n 'response.shell_call_output_content.delta': 'shell_call_output',\n 'response.shell_call_output_content.done': 'shell_call_output',\n 'response.reasoning_text.delta': 'reasoning',\n 'response.reasoning_text.done': 'reasoning',\n 'response.reasoning_summary_part.added': 'reasoning',\n 'response.reasoning_summary_part.done': 'reasoning',\n 'response.reasoning_summary_text.delta': 'reasoning',\n 'response.reasoning_summary_text.done': 'reasoning',\n 'response.code_interpreter_call_code.delta': 'code_interpreter_call',\n 'response.code_interpreter_call_code.done': 'code_interpreter_call',\n 'response.code_interpreter_call.in_progress': 'code_interpreter_call',\n 'response.code_interpreter_call.interpreting': 'code_interpreter_call',\n 'response.code_interpreter_call.completed': 'code_interpreter_call',\n 'response.file_search_call.in_progress': 'file_search_call',\n 'response.file_search_call.searching': 'file_search_call',\n 'response.file_search_call.completed': 'file_search_call',\n 'response.web_search_call.in_progress': 'web_search_call',\n 'response.web_search_call.searching': 'web_search_call',\n 'response.web_search_call.completed': 'web_search_call',\n 'response.image_generation_call.in_progress': 'image_generation_call',\n 'response.image_generation_call.generating': 'image_generation_call',\n 'response.image_generation_call.completed': 'image_generation_call',\n 'response.image_generation_call.partial_image': 'image_generation_call',\n 'response.mcp_list_tools.in_progress': 'mcp_list_tools',\n 'response.mcp_list_tools.completed': 'mcp_list_tools',\n 'response.mcp_list_tools.failed': 'mcp_list_tools',\n} satisfies Record<\n Exclude<ResponseItemScopedEvent['type'], 'response.content_part.added' | 'response.content_part.done'>,\n Response['output'][number]['type']\n>;\n\nfunction getExpectedOutputItemType(event: ResponseItemScopedEvent): Response['output'][number]['type'] {\n if (event.type === 'response.content_part.added' || event.type === 'response.content_part.done') {\n return event.part.type === 'reasoning_text' ? 'reasoning' : 'message';\n }\n\n return expectedOutputItemTypes[event.type];\n}\n\nfunction validateCompletedOutputItemIdentity(\n event: Extract<ResponseOutputItemEvent, { type: 'response.output_item.done' }>,\n snapshot: Response,\n): void {\n const output = getOutput(snapshot, event.output_index);\n const replacement = event.item;\n getOutputItemIdentityKeys(output, event.type);\n getOutputItemIdentityKeys(replacement, event.type);\n\n if (!hasOwn(replacement, 'type') || output.type !== replacement.type) {\n throw new OpenAIError(`expected output item type '${output.type}', got '${replacement.type}'`);\n }\n\n const outputID = hasOwn(output, 'id') ? output.id : undefined;\n const replacementID = hasOwn(replacement, 'id') ? replacement.id : undefined;\n if (outputID !== replacementID) {\n throw new OpenAIError(`expected output item id '${outputID}', got '${replacementID}'`);\n }\n\n if (\n hasRoutedOutputCallIdentity(output) &&\n hasRoutedOutputCallIdentity(replacement) &&\n output.call_id !== replacement.call_id\n ) {\n throw new OpenAIError(`expected output item call_id '${output.call_id}', got '${replacement.call_id}'`);\n }\n}\n\nfunction validateOutputItemIdentity(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n rejectInvalidShellTargets: boolean,\n): void {\n if (event.type === 'response.output_item.done') {\n validateCompletedOutputItemIdentity(event, snapshot);\n return;\n }\n\n if (\n rejectInvalidShellTargets &&\n (event.type === 'response.shell_call_command.added' ||\n event.type === 'response.shell_call_command.delta' ||\n event.type === 'response.shell_call_command.done')\n ) {\n const output = getOutput(snapshot, event.output_index);\n if (!hasOwn(output, 'type') || output.type !== 'shell_call') {\n throw new OpenAIError(`expected output item type 'shell_call', got '${output.type}'`);\n }\n return;\n }\n\n if (\n event.type !== 'response.content_part.added' &&\n event.type !== 'response.content_part.done' &&\n !hasOwn(expectedOutputItemTypes, event.type)\n ) {\n return;\n }\n\n const itemEvent = event as ResponseItemScopedEvent;\n if (!hasOwn(event, 'item_id') || typeof itemEvent.item_id !== 'string' || itemEvent.item_id.length === 0) {\n throw new OpenAIError(`expected a non-empty item_id for ${event.type}`);\n }\n\n const output = getOutput(snapshot, itemEvent.output_index);\n const outputID = hasOwn(output, 'id') ? output.id : undefined;\n if (outputID !== itemEvent.item_id) {\n throw new OpenAIError(`expected item_id '${outputID}', got '${itemEvent.item_id}'`);\n }\n\n const expectedType = getExpectedOutputItemType(itemEvent);\n if (output.type !== expectedType) {\n throw new OpenAIError(`expected output item type '${expectedType}', got '${output.type}'`);\n }\n}\n\nfunction getContent<T>(content: T[], contentIndex: number): T {\n validateArrayIndex(content, contentIndex, 'content');\n const part = content[contentIndex];\n if (!part) {\n throw new OpenAIError(`missing content at index ${contentIndex}`);\n }\n return part;\n}\n\nfunction getShellOutputContent(\n snapshot: Response,\n output: Extract<Response['output'][number], { type: 'shell_call_output' }>,\n commandIndex: number,\n): (typeof output.output)[number] {\n const shellCall = snapshot.output.find(\n (item): item is Extract<Response['output'][number], { type: 'shell_call' }> =>\n item.type === 'shell_call' && item.call_id === output.call_id,\n );\n\n if (shellCall) {\n validateArrayIndex(shellCall.action.commands, commandIndex, 'command');\n } else {\n validateArrayIndex(output.output, commandIndex, 'content', true);\n }\n\n while (output.output.length <= commandIndex) {\n output.output.push({\n stdout: '',\n stderr: '',\n outcome: { type: 'exit', exit_code: 0 },\n });\n }\n\n return getContent(output.output, commandIndex);\n}\n\nfunction createSupportedResponseEventTypes<EventTypes extends readonly ResponseAccumulatorEvent['type'][]>(\n eventTypes: EventTypes &\n (Exclude<ResponseAccumulatorEvent['type'], EventTypes[number]> extends never ? unknown : never),\n): ReadonlySet<ResponseAccumulatorEvent['type']> {\n return new Set(eventTypes);\n}\n\nconst supportedResponseEventTypes = createSupportedResponseEventTypes([\n 'response.output_item.added',\n 'response.output_item.done',\n 'response.content_part.added',\n 'response.content_part.done',\n 'response.output_text.delta',\n 'response.output_text.done',\n 'response.output_text.annotation.added',\n 'response.refusal.delta',\n 'response.refusal.done',\n 'response.function_call_arguments.delta',\n 'response.function_call_arguments.done',\n 'response.custom_tool_call_input.delta',\n 'response.custom_tool_call_input.done',\n 'response.mcp_call_arguments.delta',\n 'response.mcp_call_arguments.done',\n 'response.shell_call_command.added',\n 'response.shell_call_command.done',\n 'response.shell_call_command.delta',\n 'response.shell_call_output_content.delta',\n 'response.shell_call_output_content.done',\n 'response.reasoning_text.delta',\n 'response.reasoning_text.done',\n 'response.reasoning_summary_part.added',\n 'response.reasoning_summary_part.done',\n 'response.reasoning_summary_text.delta',\n 'response.reasoning_summary_text.done',\n 'response.code_interpreter_call_code.delta',\n 'response.code_interpreter_call_code.done',\n 'response.code_interpreter_call.in_progress',\n 'response.code_interpreter_call.interpreting',\n 'response.code_interpreter_call.completed',\n 'response.file_search_call.in_progress',\n 'response.file_search_call.searching',\n 'response.file_search_call.completed',\n 'response.web_search_call.in_progress',\n 'response.web_search_call.searching',\n 'response.web_search_call.completed',\n 'response.image_generation_call.in_progress',\n 'response.image_generation_call.generating',\n 'response.image_generation_call.completed',\n 'response.mcp_call.in_progress',\n 'response.mcp_call.completed',\n 'response.mcp_call.failed',\n 'response.created',\n 'response.queued',\n 'response.in_progress',\n 'response.completed',\n 'response.failed',\n 'response.incomplete',\n 'response.audio.delta',\n 'response.audio.done',\n 'response.audio.transcript.delta',\n 'response.audio.transcript.done',\n 'response.image_generation_call.partial_image',\n 'response.mcp_list_tools.in_progress',\n 'response.mcp_list_tools.completed',\n 'response.mcp_list_tools.failed',\n 'keepalive',\n 'error',\n] as const);\n\nfunction assertNever(_value: never): never {\n throw new OpenAIError('Unhandled response stream event: unknown');\n}\n\nconst responseEventRoutingFields = [\n 'item_id',\n 'output_index',\n 'content_index',\n 'annotation_index',\n 'command_index',\n 'summary_index',\n] as const;\n\nfunction sanitizeResponseEvent(event: ResponseAccumulatorEvent): ResponseAccumulatorEvent {\n let descriptor: PropertyDescriptor | undefined;\n try {\n descriptor = Object.getOwnPropertyDescriptor(event, 'type');\n } catch {\n return assertNever(event as never);\n }\n\n const type: unknown = descriptor?.value;\n if (\n typeof type !== 'string' ||\n !supportedResponseEventTypes.has(type as ResponseAccumulatorEvent['type'])\n ) {\n return assertNever(event as never);\n }\n\n const stableValues = new Map<PropertyKey, unknown>([['type', type]]);\n const itemScoped =\n type === 'response.output_item.added' ||\n type === 'response.output_item.done' ||\n type === 'response.content_part.added' ||\n type === 'response.content_part.done' ||\n type === 'response.shell_call_command.added' ||\n type === 'response.shell_call_command.delta' ||\n type === 'response.shell_call_command.done' ||\n hasOwn(expectedOutputItemTypes, type);\n\n if (itemScoped) {\n try {\n for (const field of responseEventRoutingFields) {\n const routingDescriptor = Object.getOwnPropertyDescriptor(event, field);\n stableValues.set(field, routingDescriptor ? Reflect.get(event, field, event) : undefined);\n }\n\n if (type === 'response.output_item.done') {\n stableValues.set('item', structuredClone(Reflect.get(event, 'item', event)));\n } else if (type === 'response.content_part.added' || type === 'response.content_part.done') {\n stableValues.set('part', structuredClone(Reflect.get(event, 'part', event)));\n }\n } catch {\n return assertNever(event as never);\n }\n }\n\n return new Proxy(event, {\n get(target, property) {\n return stableValues.has(property) ? stableValues.get(property) : Reflect.get(target, property, target);\n },\n });\n}\n\nfunction accumulateOutputItemEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n context: ResponseAccumulatorContext,\n): event is ResponseOutputItemEvent {\n switch (event.type) {\n case 'response.output_item.added': {\n validateArrayAppend(snapshot.output, event.output_index, 'output');\n const identityIndex = getResponseOutputIdentityIndex(context, snapshot);\n const output = structuredClone(event.item);\n const identities = getOutputItemIdentityKeys(output, event.type);\n assertOutputItemIdentitiesAvailable(identityIndex.identities, identities);\n if (output.type === 'message') {\n ensureCanonicalOutputText(context, snapshot);\n }\n snapshot.output.push(output);\n addOutputItemIdentities(identityIndex.identities, identities);\n identityIndex.length = snapshot.output.length;\n const text = getOutputText(context, output);\n if (context.canonicalSnapshot === snapshot) {\n context.outputTextIndex.append(text.length);\n }\n if (text) {\n snapshot.output_text += text;\n }\n return true;\n }\n case 'response.output_item.done': {\n const output = getOutput(snapshot, event.output_index);\n const previousText = getOutputText(context, output);\n const replacement = event.item;\n if (output.type === 'message' || replacement.type === 'message') {\n ensureCanonicalOutputText(context, snapshot);\n }\n snapshot.output[event.output_index] = replacement;\n const nextText = getOutputText(context, replacement);\n if (context.canonicalSnapshot === snapshot) {\n context.outputTextIndex.update(event.output_index, nextText.length);\n }\n updateOutputText(context, snapshot, event.output_index, previousText, nextText);\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateContentPartAddedEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n context: ResponseAccumulatorContext,\n): event is ResponseContentPartAddedEvent {\n switch (event.type) {\n case 'response.content_part.added': {\n const output = getOutput(snapshot, event.output_index);\n const { type } = output;\n const { part } = event;\n if (type === 'message' && part.type !== 'reasoning_text') {\n validateArrayAppend(output.content, event.content_index, 'content');\n const content = part;\n if (content.type === 'output_text') {\n ensureCanonicalOutputText(context, snapshot);\n }\n output.content.push(content);\n if (content.type === 'output_text') {\n updateCachedOutputTextLength(context, output, event.output_index, '', content.text);\n updateOutputText(context, snapshot, event.output_index, '', content.text, event.content_index);\n }\n } else if (type === 'reasoning' && part.type === 'reasoning_text') {\n const content = output.content ?? [];\n validateArrayAppend(content, event.content_index, 'content');\n if (!output.content) {\n output.content = content;\n }\n content.push(part);\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateContentPartDoneEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n context: ResponseAccumulatorContext,\n): event is ResponseContentPartDoneEvent {\n switch (event.type) {\n case 'response.content_part.done': {\n const output = getOutput(snapshot, event.output_index);\n const { part } = event;\n if (output.type === 'message' && part.type !== 'reasoning_text') {\n const content = getContent(output.content, event.content_index);\n const previousText = content.type === 'output_text' ? content.text : '';\n const replacement = part;\n if (content.type === 'output_text' || replacement.type === 'output_text') {\n ensureCanonicalOutputText(context, snapshot);\n }\n output.content[event.content_index] = replacement;\n const nextText = replacement.type === 'output_text' ? replacement.text : '';\n updateCachedOutputTextLength(context, output, event.output_index, previousText, nextText);\n updateOutputText(context, snapshot, event.output_index, previousText, nextText, event.content_index);\n } else if (output.type === 'reasoning' && part.type === 'reasoning_text') {\n const { content } = output;\n if (!content) {\n throw new OpenAIError(`missing content at index ${event.content_index}`);\n }\n getContent(content, event.content_index);\n content[event.content_index] = part;\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateOutputTextEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n context: ResponseAccumulatorContext,\n): event is ResponseOutputTextEvent {\n switch (event.type) {\n case 'response.output_text.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'message') {\n const content = getContent(output.content, event.content_index);\n if (content.type !== 'output_text') {\n throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);\n }\n const previousText = content.text;\n ensureCanonicalOutputText(context, snapshot);\n content.text = previousText + event.delta;\n updateCachedOutputTextLength(context, output, event.output_index, previousText, content.text);\n if (\n event.output_index === snapshot.output.length - 1 &&\n event.content_index === output.content.length - 1\n ) {\n snapshot.output_text += event.delta;\n } else {\n updateOutputText(\n context,\n snapshot,\n event.output_index,\n previousText,\n content.text,\n event.content_index,\n );\n }\n }\n return true;\n }\n case 'response.output_text.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'message') {\n const content = getContent(output.content, event.content_index);\n if (content.type !== 'output_text') {\n throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);\n }\n const previousText = content.text;\n ensureCanonicalOutputText(context, snapshot);\n content.text = event.text;\n updateCachedOutputTextLength(context, output, event.output_index, previousText, event.text);\n updateOutputText(\n context,\n snapshot,\n event.output_index,\n previousText,\n event.text,\n event.content_index,\n );\n }\n return true;\n }\n case 'response.output_text.annotation.added': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'message') {\n const content = getContent(output.content, event.content_index);\n if (content.type !== 'output_text') {\n throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);\n }\n validateArrayIndex(content.annotations, event.annotation_index, 'annotation', true);\n content.annotations[event.annotation_index] = structuredClone(\n event.annotation,\n ) as ResponseOutputText['annotations'][number];\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateRefusalAndArgumentsEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n): event is ResponseRefusalAndArgumentsEvent {\n switch (event.type) {\n case 'response.refusal.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'message') {\n const content = getContent(output.content, event.content_index);\n if (content.type !== 'refusal') {\n throw new OpenAIError(`expected content to be 'refusal', got ${content.type}`);\n }\n content.refusal += event.delta;\n }\n return true;\n }\n case 'response.refusal.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'message') {\n const content = getContent(output.content, event.content_index);\n if (content.type !== 'refusal') {\n throw new OpenAIError(`expected content to be 'refusal', got ${content.type}`);\n }\n content.refusal = event.refusal;\n }\n return true;\n }\n case 'response.function_call_arguments.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'function_call') {\n output.arguments += event.delta;\n }\n return true;\n }\n case 'response.function_call_arguments.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'function_call') {\n output.arguments = event.arguments;\n }\n return true;\n }\n case 'response.custom_tool_call_input.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'custom_tool_call') {\n output.input += event.delta;\n }\n return true;\n }\n case 'response.custom_tool_call_input.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'custom_tool_call') {\n output.input = event.input;\n }\n return true;\n }\n case 'response.mcp_call_arguments.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'mcp_call') {\n output.arguments += event.delta;\n }\n return true;\n }\n case 'response.mcp_call_arguments.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'mcp_call') {\n output.arguments = event.arguments;\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateShellEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n): event is ResponseShellEvent {\n switch (event.type) {\n case 'response.shell_call_command.added':\n case 'response.shell_call_command.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'shell_call') {\n const allowAppend = event.type === 'response.shell_call_command.added';\n validateArrayIndex(output.action.commands, event.command_index, 'command', allowAppend);\n output.action.commands[event.command_index] = event.command;\n }\n return true;\n }\n case 'response.shell_call_command.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'shell_call') {\n validateArrayIndex(output.action.commands, event.command_index, 'command');\n output.action.commands[event.command_index] += event.delta;\n }\n return true;\n }\n case 'response.shell_call_output_content.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'shell_call_output') {\n const content = getShellOutputContent(snapshot, output, event.command_index);\n content.stdout += event.delta.stdout ?? '';\n content.stderr += event.delta.stderr ?? '';\n }\n return true;\n }\n case 'response.shell_call_output_content.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'shell_call_output') {\n const content = getContent(event.output, 0);\n getShellOutputContent(snapshot, output, event.command_index);\n output.output[event.command_index] = structuredClone(content);\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateReasoningEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n): event is ResponseReasoningEvent {\n switch (event.type) {\n case 'response.reasoning_text.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'reasoning') {\n if (!output.content) {\n throw new OpenAIError(`missing content at index ${event.content_index}`);\n }\n const content = getContent(output.content, event.content_index);\n if (content.type !== 'reasoning_text') {\n throw new OpenAIError(`expected content to be 'reasoning_text', got ${content.type}`);\n }\n content.text += event.delta;\n }\n return true;\n }\n case 'response.reasoning_text.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'reasoning') {\n if (!output.content) {\n throw new OpenAIError(`missing content at index ${event.content_index}`);\n }\n const content = getContent(output.content, event.content_index);\n if (content.type !== 'reasoning_text') {\n throw new OpenAIError(`expected content to be 'reasoning_text', got ${content.type}`);\n }\n content.text = event.text;\n }\n return true;\n }\n case 'response.reasoning_summary_part.added': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'reasoning') {\n validateArrayAppend(output.summary, event.summary_index, 'content');\n output.summary.push(structuredClone(event.part));\n }\n return true;\n }\n case 'response.reasoning_summary_part.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'reasoning') {\n getContent(output.summary, event.summary_index);\n output.summary[event.summary_index] = structuredClone(event.part);\n }\n return true;\n }\n case 'response.reasoning_summary_text.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'reasoning') {\n const part = getContent(output.summary, event.summary_index);\n part.text += event.delta;\n }\n return true;\n }\n case 'response.reasoning_summary_text.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'reasoning') {\n const part = getContent(output.summary, event.summary_index);\n part.text = event.text;\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateCodeInterpreterEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n): event is ResponseCodeInterpreterEvent {\n switch (event.type) {\n case 'response.code_interpreter_call_code.delta': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'code_interpreter_call') {\n output.code = (output.code ?? '') + event.delta;\n }\n return true;\n }\n case 'response.code_interpreter_call_code.done': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'code_interpreter_call') {\n output.code = event.code;\n }\n return true;\n }\n case 'response.code_interpreter_call.in_progress': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'code_interpreter_call') {\n output.status = 'in_progress';\n }\n return true;\n }\n case 'response.code_interpreter_call.interpreting': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'code_interpreter_call') {\n output.status = 'interpreting';\n }\n return true;\n }\n case 'response.code_interpreter_call.completed': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'code_interpreter_call') {\n output.status = 'completed';\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateSearchStatusEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n): event is ResponseSearchStatusEvent {\n switch (event.type) {\n case 'response.file_search_call.in_progress': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'file_search_call') {\n output.status = 'in_progress';\n }\n return true;\n }\n case 'response.file_search_call.searching': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'file_search_call') {\n output.status = 'searching';\n }\n return true;\n }\n case 'response.file_search_call.completed': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'file_search_call') {\n output.status = 'completed';\n }\n return true;\n }\n case 'response.web_search_call.in_progress': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'web_search_call') {\n output.status = 'in_progress';\n }\n return true;\n }\n case 'response.web_search_call.searching': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'web_search_call') {\n output.status = 'searching';\n }\n return true;\n }\n case 'response.web_search_call.completed': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'web_search_call') {\n output.status = 'completed';\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction accumulateImageAndMcpStatusEvent(\n event: ResponseAccumulatorEvent,\n snapshot: Response,\n): event is ResponseImageAndMcpStatusEvent {\n switch (event.type) {\n case 'response.image_generation_call.in_progress': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'image_generation_call') {\n output.status = 'in_progress';\n }\n return true;\n }\n case 'response.image_generation_call.generating': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'image_generation_call') {\n output.status = 'generating';\n }\n return true;\n }\n case 'response.image_generation_call.completed': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'image_generation_call') {\n output.status = 'completed';\n }\n return true;\n }\n case 'response.mcp_call.in_progress': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'mcp_call') {\n output.status = 'in_progress';\n }\n return true;\n }\n case 'response.mcp_call.completed': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'mcp_call') {\n output.status = 'completed';\n }\n return true;\n }\n case 'response.mcp_call.failed': {\n const output = getOutput(snapshot, event.output_index);\n if (output.type === 'mcp_call') {\n output.status = 'failed';\n }\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction isResponseLifecycleEvent(event: ResponseAccumulatorEvent): event is ResponseLifecycleEvent {\n switch (event.type) {\n case 'response.created':\n case 'response.queued':\n case 'response.in_progress':\n case 'response.completed':\n case 'response.failed':\n case 'response.incomplete': {\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nfunction isIgnoredResponseEvent(event: ResponseAccumulatorEvent): event is ResponseIgnoredEvent {\n switch (event.type) {\n case 'response.audio.delta':\n case 'response.audio.done':\n case 'response.audio.transcript.delta':\n case 'response.audio.transcript.done':\n case 'response.image_generation_call.partial_image':\n case 'response.mcp_list_tools.in_progress':\n case 'response.mcp_list_tools.completed':\n case 'response.mcp_list_tools.failed':\n case 'keepalive':\n case 'error': {\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nexport function createResponseContext(): ResponseAccumulatorContext {\n return createCanonicalResponseContext();\n}\n\nexport function accumulateResponseWithContext(\n event: ResponseAccumulatorEvent,\n snapshot: Response | undefined,\n context: ResponseAccumulatorContext,\n rejectInvalidShellTargets = false,\n onSanitizedEvent?: (event: ResponseStreamEvent) => void,\n): Response {\n const dispatchEvent = sanitizeResponseEvent(event);\n if (onSanitizedEvent && dispatchEvent.type !== 'keepalive') {\n onSanitizedEvent(dispatchEvent);\n }\n\n if (!snapshot) {\n if (dispatchEvent.type !== 'response.created') {\n throw new OpenAIError(\n `When snapshot hasn't been set yet, expected 'response.created' event, got ${dispatchEvent.type}`,\n );\n }\n return cloneValidatedResponse(context, dispatchEvent.response);\n }\n\n validateOutputItemIdentity(dispatchEvent, snapshot, rejectInvalidShellTargets);\n\n if (accumulateOutputItemEvent(dispatchEvent, snapshot, context)) {\n return snapshot;\n }\n if (accumulateContentPartAddedEvent(dispatchEvent, snapshot, context)) {\n return snapshot;\n }\n if (accumulateContentPartDoneEvent(dispatchEvent, snapshot, context)) {\n return snapshot;\n }\n if (accumulateOutputTextEvent(dispatchEvent, snapshot, context)) {\n return snapshot;\n }\n if (accumulateRefusalAndArgumentsEvent(dispatchEvent, snapshot)) {\n return snapshot;\n }\n if (accumulateShellEvent(dispatchEvent, snapshot)) {\n return snapshot;\n }\n if (accumulateReasoningEvent(dispatchEvent, snapshot)) {\n return snapshot;\n }\n if (accumulateCodeInterpreterEvent(dispatchEvent, snapshot)) {\n return snapshot;\n }\n if (accumulateSearchStatusEvent(dispatchEvent, snapshot)) {\n return snapshot;\n }\n if (accumulateImageAndMcpStatusEvent(dispatchEvent, snapshot)) {\n return snapshot;\n }\n\n if (isResponseLifecycleEvent(dispatchEvent)) {\n return cloneValidatedResponse(context, dispatchEvent.response);\n }\n if (isIgnoredResponseEvent(dispatchEvent)) {\n return snapshot;\n }\n return assertNever(dispatchEvent);\n}\n","import { ContentFilterFinishReasonError, LengthFinishReasonError, OpenAIError } from '../error';\nimport type {\n ChatCompletion,\n ChatCompletionCreateParams,\n ChatCompletionCreateParamsBase,\n ChatCompletionFunctionTool,\n ChatCompletionMessage,\n ChatCompletionMessageFunctionToolCall,\n ChatCompletionMessageToolCall,\n ChatCompletionStreamingToolRunnerParams,\n ChatCompletionStreamingToolRunnerParamsWithContext,\n ChatCompletionStreamParams,\n ChatCompletionToolRunnerParams,\n ChatCompletionToolRunnerParamsWithContext,\n ParsedChatCompletion,\n ParsedChatCompletionMessageToolCall,\n ParsedChoice,\n} from '../resources/chat/completions';\nimport type { ResponseFormatTextJSONSchemaConfig } from '../resources/responses/responses';\nimport type { ResponseFormatJSONSchema } from '../resources/shared';\n\n/** Chat completion creation, parsing, streaming, or tool-runner request parameters. */\ntype AnyChatCompletionCreateParams =\n | ChatCompletionCreateParams\n | ChatCompletionToolRunnerParams<any>\n | ChatCompletionToolRunnerParamsWithContext<any, any>\n | ChatCompletionStreamingToolRunnerParams<any>\n | ChatCompletionStreamingToolRunnerParamsWithContext<any, any>\n | ChatCompletionStreamParams;\n\n/** Extracts the element type from an array while preserving non-array values. */\ntype Unpacked<T> = T extends (infer U)[] ? U : T;\n\n/** One optional tool definition accepted by a chat completion request. */\ntype ToolCall = Unpacked<ChatCompletionCreateParamsBase['tools']>;\n\n/** Returns whether an optional chat completion tool contains a function-tool definition. */\nexport function isChatCompletionFunctionTool(tool: ToolCall): tool is ChatCompletionFunctionTool {\n return tool !== undefined && 'function' in tool && tool.function !== undefined;\n}\n\n/** Infers parsed output for each member of a possibly optional response-format union. */\ntype ParsedResponseFormat<Format> = [Format] extends [never]\n ? null\n : Format extends AutoParseableResponseFormat<infer ParsedT>\n ? ParsedT\n : Format extends ResponseFormatJSONSchema\n ? unknown\n : null;\n\n/**\n * Resolves the type of `message.parsed` / `content[].parsed` for the given params.\n *\n * This must stay in sync with {@link isParseableResponseFormat} and\n * {@link parseResponseFormatContent}: formats built by an SDK helper carry their\n * parsed type in the brand, while a raw `{ type: 'json_schema' }` format is parsed\n * with `JSON.parse()` and so can only be described as `unknown`.\n */\nexport type ExtractParsedContentFromParams<Params extends AnyChatCompletionCreateParams> =\n ParsedResponseFormat<Params['response_format']>;\n\n/** A Chat Completions JSON Schema response format with an attached structured-output parser. */\nexport type AutoParseableResponseFormat<ParsedT> = ResponseFormatJSONSchema & {\n /** Type-only marker used to infer the parser's output; this property does not exist at runtime. */\n __output: ParsedT; // type-level only\n\n /** Non-enumerable SDK marker identifying a response format with an attached parser. */\n $brand: 'auto-parseable-response-format';\n /** Parses the completed raw assistant text into the response format's output type. */\n $parseRaw(content: string): ParsedT;\n};\n\n/** Copies a JSON Schema response format and attaches a non-enumerable structured-output parser. */\nexport function makeParseableResponseFormat<ParsedT>(\n response_format: ResponseFormatJSONSchema,\n parser: (content: string) => ParsedT,\n): AutoParseableResponseFormat<ParsedT> {\n const obj = { ...response_format, type: 'json_schema' as const };\n obj.json_schema = { ...obj.json_schema };\n delete (obj as { toJSON?: unknown }).toJSON;\n delete (obj.json_schema as { toJSON?: unknown }).toJSON;\n\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-response-format',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n });\n\n return obj as AutoParseableResponseFormat<ParsedT>;\n}\n\n/** A Responses API JSON Schema text format with an attached structured-output parser. */\nexport type AutoParseableTextFormat<ParsedT> = ResponseFormatTextJSONSchemaConfig & {\n /** Type-only marker used to infer the parser's output; this property does not exist at runtime. */\n __output: ParsedT; // type-level only\n\n /** Non-enumerable SDK marker identifying a text format with an attached parser. */\n $brand: 'auto-parseable-response-format';\n /** Parses completed output text into the text format's structured output type. */\n $parseRaw(content: string): ParsedT;\n};\n\n/** Copies a Responses API text format and attaches a non-enumerable structured-output parser. */\nexport function makeParseableTextFormat<ParsedT>(\n response_format: ResponseFormatTextJSONSchemaConfig,\n parser: (content: string) => ParsedT,\n): AutoParseableTextFormat<ParsedT> {\n const obj = { ...response_format, type: 'json_schema' as const };\n delete (obj as { toJSON?: unknown }).toJSON;\n\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-response-format',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n });\n\n return obj as AutoParseableTextFormat<ParsedT>;\n}\n\n/**\n * Whether the given format was built by an SDK helper (e.g. `zodResponseFormat()`)\n * and therefore carries its own `$parseRaw` callback.\n *\n * Prefer {@link isParseableResponseFormat} when deciding whether output should be\n * parsed at all; raw `{ type: 'json_schema' }` formats are parsed too, but are not\n * branded.\n */\nexport function isAutoParsableResponseFormat<ParsedT>(\n response_format: any,\n): response_format is AutoParseableResponseFormat<ParsedT> {\n return response_format?.['$brand'] === 'auto-parseable-response-format';\n}\n\n/**\n * The canonical definition of an auto-parseable response format, covering both the\n * Chat Completions `response_format` and the Responses `text.format` shapes.\n *\n * Every gate that decides whether output should be parsed must go through this\n * predicate so the runtime, the streaming events and\n * {@link ExtractParsedContentFromParams} cannot drift apart.\n */\nexport function isParseableResponseFormat(format: unknown): boolean {\n return isAutoParsableResponseFormat(format) || (format as { type?: string } | null)?.type === 'json_schema';\n}\n\n/**\n * The canonical parser for auto-parseable response formats. This is the only place\n * that chooses between an existing `$parseRaw` callback and generic `JSON.parse()`.\n *\n * Returns `null` for formats that are not auto-parseable.\n */\nexport function parseResponseFormatContent<ParsedT>(format: unknown, content: string): ParsedT | null {\n if (!isParseableResponseFormat(format)) {\n return null;\n }\n\n if (\n typeof format === 'object' &&\n format !== null &&\n '$parseRaw' in format &&\n typeof format.$parseRaw === 'function'\n ) {\n return format.$parseRaw(content) as ParsedT;\n }\n\n try {\n return JSON.parse(content) as ParsedT;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new SyntaxError('Error reading response: invalid structured output JSON.');\n }\n\n throw error;\n }\n}\n\n/** Type-level details used to infer a chat function tool's parser and execution callback. */\ntype ToolOptions = {\n /** Model-visible function name used to match generated tool calls. */\n name: string;\n /** Parsed argument value accepted by the optional execution callback. */\n arguments: any;\n /** Optional callback invoked by chat completion tool-running helpers. */\n function?: ((args: any) => any) | undefined;\n};\n\n/** A Chat Completions function tool with an argument parser and optional executable callback. */\nexport type AutoParseableTool<\n OptionsT extends ToolOptions,\n HasFunction = OptionsT['function'] extends (...args: never[]) => unknown ? true : false,\n> = ChatCompletionFunctionTool & {\n /** Type-only marker for parsed tool arguments; this property does not exist at runtime. */\n __arguments: OptionsT['arguments']; // type-level only\n /** Type-only marker for the tool name; this property does not exist at runtime. */\n __name: OptionsT['name']; // type-level only\n /** Type-only marker indicating whether a runnable callback was supplied. */\n __hasFunction: HasFunction; // type-level only\n\n /** Non-enumerable SDK marker identifying a tool with an attached argument parser. */\n $brand: 'auto-parseable-tool';\n /** Optional runnable callback used by `.runTools()` after arguments are parsed. */\n $callback: ((args: OptionsT['arguments']) => any) | undefined;\n /** Parses the raw JSON argument string into the callback's typed argument value. */\n $parseRaw(args: string): OptionsT['arguments'];\n};\n\n/** Parser and optional callback supplied when creating a custom chat function tool. */\ntype ToolParserOptions<OptionsT extends ToolOptions> = {\n /** Converts the raw JSON argument string into the tool's typed argument value. */\n parser: (content: string) => OptionsT['arguments'];\n /** Optional callback invoked by a chat completion tool runner. */\n callback: ((args: OptionsT['arguments']) => any) | undefined;\n};\n\n/** Creates a runnable function tool with a guaranteed execution callback. */\nexport function makeParseableTool<OptionsT extends ToolOptions>(\n tool: ChatCompletionFunctionTool,\n options: ToolParserOptions<OptionsT> & {\n /** Callback invoked with the parsed tool arguments. */\n callback: (args: OptionsT['arguments']) => any;\n },\n): AutoParseableTool<OptionsT, true>;\n\n/** Creates a parse-only function tool without an execution callback. */\nexport function makeParseableTool<OptionsT extends ToolOptions>(\n tool: ChatCompletionFunctionTool,\n options: ToolParserOptions<OptionsT> & {\n /** No execution callback is attached to this tool. */\n callback: undefined;\n },\n): AutoParseableTool<OptionsT, false>;\n\n/** Creates a function tool whose execution callback may be unavailable. */\nexport function makeParseableTool<OptionsT extends ToolOptions>(\n tool: ChatCompletionFunctionTool,\n options: ToolParserOptions<OptionsT>,\n): AutoParseableTool<OptionsT, boolean>;\n\n/** Copies a function tool and attaches non-enumerable parsing and callback metadata. */\nexport function makeParseableTool<OptionsT extends ToolOptions>(\n tool: ChatCompletionFunctionTool,\n { parser, callback }: ToolParserOptions<OptionsT>,\n): AutoParseableTool<OptionsT, boolean> {\n const obj = { ...tool };\n\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-tool',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n $callback: {\n value: callback,\n enumerable: false,\n },\n });\n\n return obj as AutoParseableTool<OptionsT, boolean>;\n}\n\n/** Returns whether a Chat Completions tool carries the SDK's argument-parser marker. */\nexport function isAutoParsableTool(tool: any): tool is AutoParseableTool<any> {\n return tool?.['$brand'] === 'auto-parseable-tool';\n}\n\n/**\n * Adds parsed-content fields to a chat completion, invoking parsers only when the\n * request includes an auto-parseable response format or a strict function tool.\n */\nexport function maybeParseChatCompletion<\n Params extends ChatCompletionCreateParams | null,\n ParsedT = Params extends null ? null : ExtractParsedContentFromParams<NonNullable<Params>>,\n>(completion: ChatCompletion, params: Params): ParsedChatCompletion<ParsedT> {\n if (!params || !hasAutoParseableInput(params)) {\n return {\n ...completion,\n choices: completion.choices.map((choice) => ({\n ...choice,\n message: {\n ...choice.message,\n parsed: null,\n ...(choice.message.tool_calls\n ? {\n tool_calls: choice.message.tool_calls,\n }\n : undefined),\n },\n })),\n };\n }\n\n return parseChatCompletion(completion, params);\n}\n\n/**\n * Parses structured assistant content and strict function-tool arguments.\n *\n * @throws {LengthFinishReasonError} If generation stopped at its token limit.\n * @throws {ContentFilterFinishReasonError} If generation stopped because of content filtering.\n * @throws {OpenAIError} If the completion contains an unsupported tool-call type.\n */\nexport function parseChatCompletion<\n Params extends ChatCompletionCreateParams,\n ParsedT = ExtractParsedContentFromParams<Params>,\n>(completion: ChatCompletion, params: Params): ParsedChatCompletion<ParsedT> {\n const choices: ParsedChoice<ParsedT>[] = completion.choices.map((choice): ParsedChoice<ParsedT> => {\n if (choice.finish_reason === 'length') {\n throw new LengthFinishReasonError();\n }\n\n if (choice.finish_reason === 'content_filter') {\n throw new ContentFilterFinishReasonError();\n }\n\n return {\n ...choice,\n message: {\n ...choice.message,\n ...(choice.message.tool_calls\n ? {\n tool_calls:\n choice.message.tool_calls?.map((toolCall) => parseToolCall(params, toolCall)) ?? undefined,\n }\n : undefined),\n parsed:\n choice.message.content !== null &&\n choice.message.content !== undefined &&\n !choice.message.refusal &&\n (choice.message.content !== '' ||\n (!choice.message.tool_calls?.length && !choice.message.function_call))\n ? parseResponseFormat(params, choice.message.content)\n : null,\n },\n };\n });\n\n return { ...completion, choices };\n}\n\nfunction parseResponseFormat<\n Params extends ChatCompletionCreateParams,\n ParsedT = ExtractParsedContentFromParams<Params>,\n>(params: Params, content: string): ParsedT | null {\n return parseResponseFormatContent<ParsedT>(params.response_format, content);\n}\n\nfunction parseToolCall<Params extends ChatCompletionCreateParams>(\n params: Params,\n toolCall: ChatCompletionMessageToolCall,\n): ParsedChatCompletionMessageToolCall {\n if (toolCall.type === 'custom') {\n return toolCall;\n }\n\n if (toolCall.type !== 'function') {\n const unsupportedType = (toolCall as { type: string }).type;\n throw new OpenAIError(\n `Currently only \\`function\\` and \\`custom\\` tool calls are supported; Received \\`${unsupportedType}\\``,\n );\n }\n\n const inputTool = params.tools?.find(\n (inputTool) =>\n isChatCompletionFunctionTool(inputTool) && inputTool.function?.name === toolCall.function.name,\n ) as ChatCompletionFunctionTool | undefined; // TS doesn't narrow based on isChatCompletionTool\n let parsedArguments: unknown = null;\n if (isAutoParsableTool(inputTool)) {\n parsedArguments = inputTool.$parseRaw(toolCall.function.arguments);\n } else if (inputTool?.function.strict) {\n parsedArguments = parseResponseFormatContent(\n { type: 'json_schema', $parseRaw: undefined },\n toolCall.function.arguments,\n );\n }\n\n return {\n ...toolCall,\n function: {\n ...toolCall.function,\n parsed_arguments: parsedArguments,\n },\n };\n}\n\n/** Returns whether a tool call matches a strict or auto-parseable function in the request. */\nexport function shouldParseToolCall(\n params: ChatCompletionCreateParams | null | undefined,\n // accepts partially accumulated tool calls so streaming snapshots can be checked as they build up\n toolCall: {\n type?: ChatCompletionMessageToolCall['type'];\n function?: { name?: string };\n },\n): boolean {\n if (!params || !('tools' in params) || !params.tools || toolCall.type !== 'function') {\n return false;\n }\n\n const inputTool = params.tools?.find(\n (inputTool) =>\n isChatCompletionFunctionTool(inputTool) && inputTool.function?.name === toolCall.function?.name,\n );\n return (\n isChatCompletionFunctionTool(inputTool) &&\n (isAutoParsableTool(inputTool) || inputTool?.function.strict || false)\n );\n}\n\n/** Returns whether the request contains an auto-parseable response format or strict function tool. */\nexport function hasAutoParseableInput(params: AnyChatCompletionCreateParams): boolean {\n if (isParseableResponseFormat(params.response_format)) {\n return true;\n }\n\n return (\n params.tools?.some(\n (t) => isAutoParsableTool(t) || (t.type === 'function' && t.function.strict === true),\n ) ?? false\n );\n}\n\n/**\n * Narrows completion tool calls to function calls supported by parsing helpers.\n *\n * @throws {OpenAIError} If any tool call has a non-function type.\n */\nexport function assertToolCallsAreChatCompletionFunctionToolCalls(\n toolCalls: ChatCompletionMessage['tool_calls'],\n): asserts toolCalls is ChatCompletionMessageFunctionToolCall[] {\n for (const toolCall of toolCalls || []) {\n if (toolCall.type !== 'function') {\n throw new OpenAIError(\n `Currently only \\`function\\` tool calls are supported; Received \\`${toolCall.type}\\``,\n );\n }\n }\n}\n\n/**\n * Validates strict function tools while preserving supported custom tools.\n *\n * @throws {OpenAIError} If a tool is unsupported or a function is missing `strict: true`.\n */\nexport function validateInputTools(tools: ChatCompletionCreateParamsBase['tools']) {\n for (const tool of tools ?? []) {\n if (tool.type === 'custom') {\n continue;\n }\n\n if (tool.type !== 'function') {\n const unsupportedType = (tool as { type: string }).type;\n throw new OpenAIError(\n `Currently only \\`function\\` and \\`custom\\` tool types are supported; Received \\`${unsupportedType}\\``,\n );\n }\n\n if (tool.function.strict !== true) {\n throw new OpenAIError(\n `The \\`${tool.function.name}\\` tool is not marked with \\`strict: true\\`. Only strict function tools can be auto-parsed`,\n );\n }\n }\n}\n","import { OpenAIError } from '../error';\nimport type { ChatCompletionTool } from '../resources/chat/completions';\nimport type {\n FunctionTool,\n NamespaceTool,\n ParsedContent,\n ParsedResponse,\n ParsedResponseFunctionToolCall,\n ParsedResponseOutputItem,\n Response,\n ResponseCreateParamsBase,\n ResponseCreateParamsNonStreaming,\n ResponseFormatTextJSONSchemaConfig,\n ResponseFunctionToolCall,\n ResponseTextConfig,\n Tool,\n} from '../resources/responses/responses';\nimport { isParseableResponseFormat, parseResponseFormatContent } from '../lib/parser';\nimport type { AutoParseableTextFormat } from '../lib/parser';\n\n/** Response tools, a compatible chat completion tool, or no tools. */\nexport type ParseableToolsParams = Tool[] | ChatCompletionTool | null;\n\n/** Response-creation parameters that may include tools recognized by parsing helpers. */\nexport type ResponseCreateParamsWithTools = ResponseCreateParamsBase & {\n /** Tools available to the model while producing the response. */\n tools?: ParseableToolsParams;\n};\n\n/** Request fields that can select a plain-text or structured Responses API output format. */\ntype TextConfigParams = {\n /** Optional text output configuration, including its structured JSON format. */\n text?: ResponseTextConfig;\n};\n\n/** Infers parsed output for each member of a possibly optional text-format union. */\ntype ParsedTextFormat<Format> = [Format] extends [never]\n ? null\n : Format extends AutoParseableTextFormat<infer ParsedT>\n ? ParsedT\n : Format extends ResponseFormatTextJSONSchemaConfig\n ? unknown\n : null;\n\n/**\n * Resolves the type of `output_parsed` / `content[].parsed` for the given params.\n *\n * This must stay in sync with `isParseableResponseFormat()` and\n * `parseResponseFormatContent()`: formats built by an SDK helper carry their parsed\n * type in the brand, while a raw `{ type: 'json_schema' }` format is parsed with\n * `JSON.parse()` and so can only be described as `unknown`.\n */\nexport type ExtractParsedContentFromParams<Params extends TextConfigParams> = ParsedTextFormat<\n NonNullable<Params['text']>['format']\n>;\n\n/**\n * Adds parsed-output fields to a response, invoking parsers only when its request\n * includes an auto-parseable text format or strict function tool.\n */\nexport function maybeParseResponse<\n Params extends ResponseCreateParamsBase | null,\n ParsedT = Params extends null ? null : ExtractParsedContentFromParams<NonNullable<Params>>,\n>(response: Response, params: Params): ParsedResponse<ParsedT> {\n if (!params || !hasAutoParseableInput(params)) {\n const parsed = {\n ...response,\n output_parsed: null,\n output: response.output.map((item) => {\n if (item.type === 'function_call') {\n return {\n ...item,\n parsed_arguments: null,\n };\n }\n\n if (item.type === 'message') {\n return {\n ...item,\n content: item.content.map((content) => ({\n ...content,\n parsed: null,\n })),\n };\n }\n return item;\n }),\n };\n\n if (needsOutputText(response, parsed)) {\n addOutputText(parsed as Response);\n }\n\n return parsed;\n }\n\n return parseResponse(response, params);\n}\n\n/**\n * Parses completed response text and strict function-tool arguments, matching\n * namespaced functions by both namespace and name.\n *\n * Incomplete or nonterminal responses keep their parsed values as `null`, and\n * `output_parsed` returns the first successfully parsed output-text item.\n */\nexport function parseResponse<\n Params extends ResponseCreateParamsBase,\n ParsedT = ExtractParsedContentFromParams<Params>,\n>(response: Response, params: Params): ParsedResponse<ParsedT> {\n const shouldParse = !response.status || response.status === 'completed';\n const output: ParsedResponseOutputItem<ParsedT>[] = response.output.map(\n (item): ParsedResponseOutputItem<ParsedT> => {\n if (item.type === 'function_call') {\n return shouldParse ? parseToolCall(params, item) : { ...item, parsed_arguments: null };\n }\n if (item.type === 'message') {\n const content: ParsedContent<ParsedT>[] = item.content.map((content) => {\n if (content.type === 'output_text') {\n return {\n ...content,\n parsed: shouldParse ? parseTextFormat(params, content.text) : null,\n };\n }\n\n return content;\n });\n\n return {\n ...item,\n content,\n };\n }\n\n return item;\n },\n );\n\n const parsed: Omit<ParsedResponse<ParsedT>, 'output_parsed'> = { ...response, output };\n if (needsOutputText(response, parsed)) {\n addOutputText(parsed);\n }\n\n Object.defineProperty(parsed, 'output_parsed', {\n enumerable: true,\n get() {\n for (const output of parsed.output) {\n if (output.type !== 'message') {\n continue;\n }\n\n for (const content of output.content) {\n if (content.type === 'output_text' && content.parsed !== null) {\n return content.parsed;\n }\n }\n }\n\n return null;\n },\n });\n\n return parsed as ParsedResponse<ParsedT>;\n}\n\nfunction parseTextFormat<\n Params extends ResponseCreateParamsBase,\n ParsedT = ExtractParsedContentFromParams<Params>,\n>(params: Params, content: string): ParsedT | null {\n return parseResponseFormatContent<ParsedT>(params.text?.format, content);\n}\n\n/** Returns whether the request includes an auto-parseable text format or strict function tool. */\nexport function hasAutoParseableInput(params: ResponseCreateParamsWithTools): boolean {\n if (isParseableResponseFormat(params.text?.format)) {\n return true;\n }\n\n return (\n Array.isArray(params.tools) &&\n params.tools.some(\n (tool) =>\n isAutoParsableTool(tool) ||\n (tool.type === 'function' && tool.strict === true) ||\n (tool.type === 'namespace' &&\n tool.tools.some(\n (nested) => nested.type === 'function' && (isAutoParsableTool(nested) || nested.strict === true),\n )),\n )\n );\n}\n\n/** Type-level details used to infer a Responses API function tool's parser and callback. */\ntype ToolOptions = {\n /** Model-visible function name used to match generated tool calls. */\n name: string;\n /** Parsed argument value accepted by the optional execution callback. */\n arguments: any;\n /** Optional callback metadata associated with the parsed function tool. */\n function?: ((args: any) => any) | undefined;\n};\n\n/** A Responses API function tool with an argument parser and optional executable callback. */\nexport type AutoParseableResponseTool<\n OptionsT extends ToolOptions,\n HasFunction = OptionsT['function'] extends (...args: never[]) => unknown ? true : false,\n> = FunctionTool & {\n /** Type-only marker for parsed tool arguments; this property does not exist at runtime. */\n __arguments: OptionsT['arguments']; // type-level only\n /** Type-only marker for the function name; this property does not exist at runtime. */\n __name: OptionsT['name']; // type-level only\n\n /** Non-enumerable SDK marker identifying a tool with an attached argument parser. */\n $brand: 'auto-parseable-tool';\n /** Optional callback available to helpers that execute parsed function tools. */\n $callback: ((args: OptionsT['arguments']) => any) | undefined;\n /** Parses the raw JSON argument string into the function's typed argument value. */\n $parseRaw(args: string): OptionsT['arguments'];\n};\n\n/** Copies a Responses API function tool and attaches non-enumerable parser and callback metadata. */\nexport function makeParseableResponseTool<OptionsT extends ToolOptions>(\n tool: FunctionTool,\n {\n parser,\n callback,\n }: {\n /** Converts the raw JSON argument string into the function's typed argument value. */\n parser: (content: string) => OptionsT['arguments'];\n /** Optional callback available to helpers that execute the parsed function. */\n callback: ((args: OptionsT['arguments']) => any) | undefined;\n },\n): AutoParseableResponseTool<OptionsT> {\n const obj = { ...tool };\n\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-tool',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n $callback: {\n value: callback,\n enumerable: false,\n },\n });\n\n return obj as AutoParseableResponseTool<OptionsT>;\n}\n\n/** Returns whether a Responses API tool carries the SDK's argument-parser marker. */\nexport function isAutoParsableTool(tool: any): tool is AutoParseableResponseTool<any> {\n return tool?.['$brand'] === 'auto-parseable-tool';\n}\n\nfunction getInputToolByName(\n input_tools: Tool[],\n name: string,\n namespace?: string,\n): FunctionTool | NamespaceTool.Function | undefined {\n for (const tool of input_tools) {\n if (namespace == null) {\n if (tool.type === 'function' && tool.name === name) {\n return tool;\n }\n } else if (tool.type === 'namespace' && tool.name === namespace) {\n return tool.tools.find(\n (nested): nested is NamespaceTool.Function => nested.type === 'function' && nested.name === name,\n );\n }\n }\n return undefined;\n}\n\nfunction parseToolCall<Params extends ResponseCreateParamsBase>(\n params: Params,\n toolCall: ResponseFunctionToolCall,\n): ParsedResponseFunctionToolCall {\n const inputTool = getInputToolByName(params.tools ?? [], toolCall.name, toolCall.namespace);\n\n let parsedArguments: unknown = null;\n if (isAutoParsableTool(inputTool)) {\n parsedArguments = inputTool.$parseRaw(toolCall.arguments);\n } else if (inputTool?.strict) {\n parsedArguments = parseResponseFormatContent(\n { type: 'json_schema', $parseRaw: undefined },\n toolCall.arguments,\n );\n }\n\n return {\n ...toolCall,\n parsed_arguments: parsedArguments,\n };\n}\n\n/** Matches a response function call to a strict or auto-parseable tool by namespace and name. */\nexport function shouldParseToolCall(\n params: ResponseCreateParamsNonStreaming | null | undefined,\n toolCall: ResponseFunctionToolCall,\n): boolean {\n if (!params) {\n return false;\n }\n\n const inputTool = getInputToolByName(params.tools ?? [], toolCall.name, toolCall.namespace);\n return isAutoParsableTool(inputTool) || inputTool?.strict || false;\n}\n\n/**\n * Validates that compatible chat completion tools can be automatically parsed.\n *\n * @throws {OpenAIError} If a tool is not a function or is missing `strict: true`.\n */\nexport function validateInputTools(tools: ChatCompletionTool[] | undefined) {\n for (const tool of tools ?? []) {\n if (tool.type !== 'function') {\n throw new OpenAIError(\n `Currently only \\`function\\` tool types support auto-parsing; Received \\`${tool.type}\\``,\n );\n }\n\n if (tool.function.strict !== true) {\n throw new OpenAIError(\n `The \\`${tool.function.name}\\` tool is not marked with \\`strict: true\\`. Only strict function tools can be auto-parsed`,\n );\n }\n }\n}\n\nfunction needsOutputText(\n response: Response,\n target: { output_text?: Response['output_text'] | null },\n): boolean {\n return !Object.getOwnPropertyDescriptor(response, 'output_text') || target.output_text == null;\n}\n\n/** Replaces `output_text` with the concatenated text from every response output message. */\nexport function addOutputText(rsp: Response): void {\n const texts: string[] = [];\n for (const output of rsp.output) {\n if (output.type !== 'message') {\n continue;\n }\n\n for (const content of output.content) {\n if (content.type === 'output_text') {\n texts.push(content.text);\n }\n }\n }\n\n rsp.output_text = texts.join('');\n}\n","/**\n * This module provides internal shims and utility functions for environments where certain Node.js or global types may not be available.\n *\n * These are used to ensure we can provide a consistent behaviour between different JavaScript environments and good error\n * messages in cases where an environment isn't fully supported.\n */\n\nimport type { Fetch } from './builtin-types';\nimport type { ReadableStream } from './shim-types';\n\nexport function getDefaultFetch(): Fetch {\n if (typeof fetch !== 'undefined') {\n return fetch as any;\n }\n\n throw new Error(\n '`fetch` is not defined as a global; Either pass `fetch` to the client, `new OpenAI({ fetch })` or polyfill the global, `globalThis.fetch = fetch`',\n );\n}\n\ntype ReadableStreamArgs = ConstructorParameters<typeof ReadableStream>;\n\nexport function makeReadableStream(...args: ReadableStreamArgs): ReadableStream {\n const ReadableStream = (globalThis as any).ReadableStream;\n if (typeof ReadableStream === 'undefined') {\n // Note: All of the platforms / runtimes we officially support already define\n // `ReadableStream` as a global, so this should only ever be hit on unsupported runtimes.\n throw new Error(\n '`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`',\n );\n }\n\n return new ReadableStream(...args);\n}\n\nexport function ReadableStreamFrom<T>(iterable: Iterable<T> | AsyncIterable<T>): ReadableStream<T> {\n let iter: AsyncIterator<T> | Iterator<T> =\n Symbol.asyncIterator in iterable ? iterable[Symbol.asyncIterator]() : iterable[Symbol.iterator]();\n\n return makeReadableStream({\n start() {},\n async pull(controller: any) {\n const { done, value } = await iter.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n async cancel() {\n await iter.return?.();\n },\n });\n}\n\n/**\n * Most browsers don't yet have async iterable support for ReadableStream,\n * and Node has a very different way of reading bytes from its \"ReadableStream\".\n *\n * This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490\n */\nexport function ReadableStreamToAsyncIterable<T>(stream: any): AsyncIterableIterator<T> {\n if (stream[Symbol.asyncIterator]) return stream;\n\n const reader = stream.getReader();\n return {\n async next() {\n try {\n const result = await reader.read();\n if (result?.done) reader.releaseLock(); // release lock when stream becomes closed\n return result;\n } catch (e) {\n reader.releaseLock(); // release lock when stream becomes errored\n throw e;\n }\n },\n async return() {\n const cancelPromise = reader.cancel();\n reader.releaseLock();\n await cancelPromise;\n return { done: true, value: undefined };\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n}\n\n/**\n * Cancels a ReadableStream we don't need to consume.\n * See https://undici.nodejs.org/#/?id=garbage-collection\n */\nexport async function CancelReadableStream(stream: any): Promise<void> {\n if (stream === null || typeof stream !== 'object') return;\n\n if (stream[Symbol.asyncIterator]) {\n await stream[Symbol.asyncIterator]().return?.();\n return;\n }\n\n const reader = stream.getReader();\n const cancelPromise = reader.cancel();\n reader.releaseLock();\n await cancelPromise;\n}\n","import { decodeUTF8, encodeUTF8 } from '../utils/bytes';\n\n/** Text or UTF-8 bytes accepted by the incremental line decoder. */\nexport type Bytes = string | ArrayBuffer | Uint8Array | null | undefined;\n\n/** Maximum backing-buffer capacity retained when completed lines leave little active data. */\nconst MAX_RETAINED_BUFFER_BYTES = 64 * 1024;\n\n/**\n * Incrementally decodes UTF-8 text into lines without losing partial characters\n * or newline sequences that span multiple chunks.\n *\n * Supports `\\n`, `\\r`, and `\\r\\n` line endings. Call {@link flush} after the\n * final chunk to emit a trailing line that does not end with a newline.\n *\n * Based on the line decoder used by the Python `httpx` project:\n * https://github.com/encode/httpx/blob/920333ea98118e9cf617f246905d7b202510941c/httpx/_decoders.py#L258\n */\nexport class LineDecoder {\n // prettier-ignore\n /** Individual characters recognized as possible line terminators. */\n static NEWLINE_CHARS = new Set(['\\n', '\\r']);\n\n /** Matches complete CRLF terminators as well as standalone CR and LF characters. */\n static NEWLINE_REGEXP = /\\r\\n|[\\n\\r]/g;\n\n #buffer: Uint8Array;\n #start: number;\n #end: number;\n #searchIndex: number;\n #skipLeadingLF: boolean;\n\n /** Creates a decoder with no buffered bytes or pending newline continuation. */\n constructor() {\n this.#buffer = new Uint8Array();\n this.#start = 0;\n this.#end = 0;\n this.#searchIndex = 0;\n this.#skipLeadingLF = false;\n }\n\n /**\n * Appends a text or UTF-8 byte chunk and returns every newly completed line.\n *\n * Incomplete lines remain buffered for the next call. A trailing `\\r`\n * completes its line immediately, and a following `\\n` is consumed as its\n * continuation. `null` and `undefined` are ignored and do not flush buffered\n * content.\n */\n decode(chunk: Bytes): string[] {\n if (chunk == null) {\n return [];\n }\n\n let binaryChunk: Uint8Array;\n if (chunk instanceof ArrayBuffer) {\n binaryChunk = new Uint8Array(chunk);\n } else if (typeof chunk === 'string') {\n binaryChunk = encodeUTF8(chunk);\n } else {\n binaryChunk = chunk;\n }\n\n if (binaryChunk.length === 0) {\n return [];\n }\n\n if (this.#skipLeadingLF) {\n this.#skipLeadingLF = false;\n if (binaryChunk[0] === 0x0a) {\n binaryChunk = binaryChunk.subarray(1);\n }\n if (binaryChunk.length === 0) {\n return [];\n }\n }\n\n this.#append(binaryChunk);\n\n const lines: string[] = [];\n let patternIndex;\n while ((patternIndex = findNewlineIndex(this.#buffer, this.#searchIndex, this.#end)) != null) {\n const line = decodeUTF8(this.#buffer.subarray(this.#start, patternIndex.preceding));\n lines.push(line);\n\n this.#start = patternIndex.index;\n if (patternIndex.carriage) {\n if (this.#start < this.#end && this.#buffer[this.#start] === 0x0a) {\n this.#start += 1;\n } else if (this.#start === this.#end) {\n this.#skipLeadingLF = true;\n }\n }\n this.#searchIndex = this.#start;\n }\n\n this.#searchIndex = this.#end;\n if (this.#start === this.#end) {\n this.#start = 0;\n this.#end = 0;\n this.#searchIndex = 0;\n if (this.#buffer.length > MAX_RETAINED_BUFFER_BYTES) {\n this.#buffer = new Uint8Array();\n }\n } else if (lines.length > 0 && this.#buffer.length > MAX_RETAINED_BUFFER_BYTES) {\n const length = this.#end - this.#start;\n if (length <= MAX_RETAINED_BUFFER_BYTES || this.#buffer.length > length * 4) {\n const capacity =\n length <= MAX_RETAINED_BUFFER_BYTES\n ? Math.min(Math.max(length * 2, 256), MAX_RETAINED_BUFFER_BYTES)\n : length * 2;\n const buffer = new Uint8Array(capacity);\n buffer.set(this.#buffer.subarray(this.#start, this.#end));\n this.#buffer = buffer;\n this.#start = 0;\n this.#end = length;\n this.#searchIndex = length;\n }\n }\n\n return lines;\n }\n\n #append(chunk: Uint8Array): void {\n if (this.#end + chunk.length > this.#buffer.length) {\n const length = this.#end - this.#start;\n if (this.#start >= this.#buffer.length / 2 && length + chunk.length <= this.#buffer.length) {\n this.#buffer.copyWithin(0, this.#start, this.#end);\n } else {\n const capacity = Math.max(this.#buffer.length * 2, length + chunk.length, 256);\n const buffer = new Uint8Array(capacity);\n buffer.set(this.#buffer.subarray(this.#start, this.#end));\n this.#buffer = buffer;\n }\n\n this.#searchIndex -= this.#start;\n this.#end = length;\n this.#start = 0;\n }\n\n this.#buffer.set(chunk, this.#end);\n this.#end += chunk.length;\n }\n\n /** Emits the remaining unterminated line, or returns an empty array when idle. */\n flush(): string[] {\n this.#skipLeadingLF = false;\n if (this.#start === this.#end) {\n return [];\n }\n return this.decode('\\n');\n }\n}\n\n/**\n * Searches the active buffer range for the next CR or LF byte and returns its\n * zero-based position, the position immediately after it, and whether the byte\n * was a carriage return. Returns `null` when the range contains no newline byte.\n *\n * ```ts\n * findNewlineIndex(new TextEncoder().encode('abc\\ndef'), 0, 7)\n * // => { preceding: 3, index: 4, carriage: false }\n * ```\n */\nfunction findNewlineIndex(\n buffer: Uint8Array,\n start: number,\n end: number,\n): { preceding: number; index: number; carriage: boolean } | null {\n const newline = 0x0a; // \\n\n const carriage = 0x0d; // \\r\n\n for (let i = start; i < end; i++) {\n if (buffer[i] === newline) {\n return { preceding: i, index: i + 1, carriage: false };\n }\n\n if (buffer[i] === carriage) {\n return { preceding: i, index: i + 1, carriage: true };\n }\n }\n\n return null;\n}\n\n/**\n * Finds the first blank-line separator used to delimit streamed event records.\n *\n * @returns The byte offset immediately after the first pair of consecutive\n * line endings, or `-1` when the buffer contains no complete separator.\n */\nexport function findDoubleNewlineIndex(buffer: Uint8Array): number {\n for (let i = 0; i < buffer.length - 1; i++) {\n const firstEndingLength = lineEndingLength(buffer, i);\n if (firstEndingLength > 0) {\n const secondEndingIndex = i + firstEndingLength;\n const secondEndingLength = lineEndingLength(buffer, secondEndingIndex);\n if (secondEndingLength > 0) {\n return secondEndingIndex + secondEndingLength;\n }\n }\n }\n\n return -1;\n}\n\nfunction lineEndingLength(buffer: Uint8Array, index: number): number {\n const newline = 0x0a; // \\n\n const carriage = 0x0d; // \\r\n\n if (buffer[index] === newline) {\n return 1;\n }\n if (buffer[index] === carriage) {\n return buffer[index + 1] === newline ? 2 : 1;\n }\n return 0;\n}\n","import { OpenAIError, APIError } from './error';\nimport type { ReadableStream } from '../internal/shim-types';\nimport { makeReadableStream, ReadableStreamToAsyncIterable } from '../internal/shims';\nimport { findDoubleNewlineIndex, LineDecoder } from '../internal/decoders/line';\nimport { isAbortError } from '../internal/errors';\nimport { encodeUTF8 } from '../internal/utils/bytes';\nimport { loggerFor } from '../internal/utils/log';\nimport type { OpenAI } from '../client';\n\ntype Bytes = string | ArrayBuffer | Uint8Array | null | undefined;\n\nfunction isTransportAbortError(error: unknown): boolean {\n return !(error instanceof APIError) && isAbortError(error);\n}\n\ntype StreamTeeQueue<Item> = {\n readonly length: number;\n readonly canceled: boolean;\n enqueue: (value: Promise<IteratorResult<Item>>) => void;\n dequeue: () => Promise<IteratorResult<Item>> | undefined;\n cancel: () => void;\n};\n\nfunction createStreamTeeQueue<Item>(): StreamTeeQueue<Item> {\n let entries: (Promise<IteratorResult<Item>> | undefined)[] = [];\n let head = 0;\n let canceled = false;\n\n return {\n get length() {\n return entries.length - head;\n },\n get canceled() {\n return canceled;\n },\n enqueue(value) {\n if (!canceled) {\n entries.push(value);\n }\n },\n dequeue() {\n if (head === entries.length) {\n return undefined;\n }\n\n const value = entries[head];\n entries[head] = undefined;\n head += 1;\n\n if (head === entries.length) {\n entries = [];\n head = 0;\n } else if (head >= 1024 && head * 2 >= entries.length) {\n entries = entries.slice(head);\n head = 0;\n }\n\n return value;\n },\n cancel() {\n canceled = true;\n entries.length = 0;\n head = 0;\n },\n };\n}\n\n/** A decoded server-sent event before its JSON payload has been parsed. */\nexport type ServerSentEvent = {\n /** Explicit SSE event name, or `null` when the event has no `event:` field. */\n event: string | null;\n /** Joined contents of the event's `data:` fields. */\n data: string;\n /** Original event lines retained for diagnostics when parsing fails. */\n raw: string[];\n};\n\n/**\n * A single-consumption asynchronous API response stream.\n *\n * Use {@link Stream.tee} when two consumers need the same events. Breaking out of\n * a response-backed stream early aborts its request; branches created by `tee()`\n * instead share {@link Stream.controller} for explicit cancellation.\n */\nexport class Stream<Item> implements AsyncIterable<Item> {\n /** Abort controller for the underlying request and all branches created with `tee()`. */\n controller: AbortController;\n #client: OpenAI | undefined;\n #isTeeBranch = false;\n private iterator: () => AsyncIterator<Item>;\n\n /** Wraps an asynchronous event iterator and the controller that owns its request. */\n constructor(iterator: () => AsyncIterator<Item>, controller: AbortController, client?: OpenAI) {\n this.iterator = iterator;\n this.controller = controller;\n this.#client = client;\n }\n\n /**\n * Decodes an SSE response into parsed JSON events.\n *\n * The resulting stream can be consumed only once, ignores events after `[DONE]`, and\n * surfaces API error payloads as `APIError` instances. When\n * `synthesizeEventData` is enabled, each item also includes its SSE event name.\n */\n static fromSSEResponse<Item>(\n response: Response,\n controller: AbortController,\n client?: OpenAI,\n synthesizeEventData?: boolean,\n ): Stream<Item> {\n let consumed = false;\n const logger = client ? loggerFor(client) : console;\n\n async function* iterator(): AsyncIterator<Item, any, undefined> {\n if (consumed) {\n throw new OpenAIError('Cannot iterate over a consumed stream, use `.tee()` to split the stream.');\n }\n consumed = true;\n let done = false;\n let receivedCompletionSentinel = false;\n const messages = _iterSSEMessages(response, controller);\n const closeMessages = messages.return.bind(messages);\n messages.return = (value) => {\n // Abort before nested iterator cleanup can wait on the response body's cancellation.\n if (!receivedCompletionSentinel) {\n controller.abort();\n }\n return closeMessages(value);\n };\n try {\n for await (const sse of messages) {\n if (sse.data === '[DONE]') {\n receivedCompletionSentinel = true;\n break;\n }\n\n if (sse.event === null || !sse.event.startsWith('thread.')) {\n let data;\n\n try {\n data = JSON.parse(sse.data) as any;\n } catch {\n logger.error(`Could not parse message into JSON:`);\n logger.error(`From chunk:`);\n throw new SyntaxError('Error reading response: malformed server-sent event JSON.');\n }\n\n if (sse.event === 'error') {\n throw new APIError(undefined, data?.error ?? data, undefined, response.headers);\n }\n\n if (data && data.error) {\n throw new APIError(undefined, data.error, undefined, response.headers);\n }\n\n yield synthesizeEventData ? { event: sse.event, data } : data;\n } else {\n let data;\n try {\n data = JSON.parse(sse.data);\n } catch {\n logger.error(`Could not parse message into JSON:`);\n logger.error(`From chunk:`);\n throw new SyntaxError('Error reading response: malformed server-sent event JSON.');\n }\n yield { event: sse.event, data } as any;\n }\n }\n done = true;\n } catch (e) {\n // Abort errors and cleanup failures after the completion sentinel are non-fatal.\n if (\n receivedCompletionSentinel ||\n isTransportAbortError(e) ||\n (controller.signal.aborted && e === controller.signal.reason)\n ) {\n return;\n }\n throw e;\n } finally {\n // If the user `break`s, abort the ongoing request.\n if (!done) {\n controller.abort();\n }\n }\n }\n\n return new Stream(iterator, controller, client);\n }\n\n /**\n * Generates a Stream from a newline-separated ReadableStream\n * where each item is a JSON value.\n */\n static fromReadableStream<Item>(\n readableStream: ReadableStream,\n controller: AbortController,\n client?: OpenAI,\n ): Stream<Item> {\n let consumed = false;\n\n async function* iterLines(): AsyncGenerator<string, void, unknown> {\n const lineDecoder = new LineDecoder();\n const reader = readableStream.getReader();\n let closed = false;\n let cancelPromise: Promise<void> | undefined;\n const cancel = () => {\n cancelPromise ??= reader.cancel();\n cancelPromise.catch(() => undefined);\n };\n\n controller.signal.addEventListener('abort', cancel, { once: true });\n try {\n if (controller.signal.aborted) {\n cancel();\n return;\n }\n\n while (true) {\n const { value: chunk, done } = await reader.read();\n if (done) {\n closed = true;\n break;\n }\n if (controller.signal.aborted) {\n return;\n }\n\n for (const line of lineDecoder.decode(chunk)) {\n if (controller.signal.aborted) {\n return;\n }\n yield line;\n }\n }\n\n if (controller.signal.aborted) {\n return;\n }\n for (const line of lineDecoder.flush()) {\n if (controller.signal.aborted) {\n return;\n }\n yield line;\n }\n } finally {\n controller.signal.removeEventListener('abort', cancel);\n if (!closed) {\n cancel();\n }\n reader.releaseLock();\n }\n }\n\n async function* iterator(): AsyncIterator<Item, any, undefined> {\n if (consumed) {\n throw new OpenAIError('Cannot iterate over a consumed stream, use `.tee()` to split the stream.');\n }\n consumed = true;\n let done = false;\n try {\n for await (const line of iterLines()) {\n if (line) {\n let data: Item;\n try {\n data = JSON.parse(line) as Item;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new SyntaxError('Error reading response: malformed newline-delimited JSON.');\n }\n\n throw error;\n }\n\n yield data;\n }\n }\n done = true;\n } catch (e) {\n // If the user calls `stream.controller.abort()`, we should exit without throwing.\n if (controller.signal.aborted || isAbortError(e)) {\n return;\n }\n throw e;\n } finally {\n // If the user `break`s, abort the ongoing request.\n if (!done) {\n controller.abort();\n }\n }\n }\n\n return new Stream(iterator, controller, client);\n }\n\n /** Starts consuming this stream; attempting to consume it again throws. */\n [Symbol.asyncIterator](): AsyncIterator<Item> {\n return this.iterator();\n }\n\n /**\n * Splits the stream into two streams which can be\n * independently read from at different speeds.\n * Closing a branch discards its buffered events without stopping its sibling.\n * Future reads on that branch finish immediately; previously issued `next()`\n * promises remain shared with its sibling and may still resolve with events.\n * Closing both branches invokes the source iterator's `return()` when available.\n * For {@link Stream.fromReadableStream}, closing both branches before iteration\n * starts does not cancel the supplied readable; cancel that readable directly.\n */\n tee(): [Stream<Item>, Stream<Item>] {\n const { controller } = this;\n const left = createStreamTeeQueue<Item>();\n const right = createStreamTeeQueue<Item>();\n const iterator = this.iterator();\n\n const teeIterator = (queue: StreamTeeQueue<Item>): AsyncIterator<Item> => ({\n next: () => {\n if (queue.canceled) {\n return Promise.resolve({ value: undefined, done: true });\n }\n if (queue.length === 0) {\n const result = iterator.next();\n left.enqueue(result);\n right.enqueue(result);\n }\n return queue.dequeue()!;\n },\n return: async () => {\n if (!queue.canceled) {\n queue.cancel();\n if (left.canceled && right.canceled) {\n await this.#cancelIterator(iterator, controller);\n }\n }\n return { value: undefined, done: true };\n },\n });\n\n const branch = (queue: StreamTeeQueue<Item>) => {\n const stream = new Stream(() => teeIterator(queue), controller, this.#client);\n stream.#isTeeBranch = true;\n return stream;\n };\n return [branch(left), branch(right)];\n }\n\n /**\n * Converts this stream to a newline-separated ReadableStream of\n * JSON stringified values in the stream\n * which can be turned back into a Stream with `Stream.fromReadableStream()`.\n * Canceling a response-backed readable aborts its request. Canceling a tee\n * branch discards its buffered events and leaves sibling consumers running.\n */\n toReadableStream(): ReadableStream {\n const { controller } = this;\n let iter: AsyncIterator<Item>;\n\n return makeReadableStream({\n start: async () => {\n iter = this[Symbol.asyncIterator]();\n },\n async pull(ctrl: any) {\n try {\n const { value, done } = await iter.next();\n if (done) {\n return ctrl.close();\n }\n\n const bytes = encodeUTF8(JSON.stringify(value) + '\\n');\n\n ctrl.enqueue(bytes);\n } catch (err) {\n ctrl.error(err);\n }\n },\n cancel: () => this.#cancelIterator(iter, controller),\n });\n }\n\n async #cancelIterator(iterator: AsyncIterator<Item>, controller: AbortController): Promise<void> {\n const returnMethod = iterator.return;\n if (returnMethod) {\n if (!this.#isTeeBranch) {\n controller.abort();\n }\n await Reflect.apply(returnMethod, iterator, []);\n }\n }\n}\n\nfunction createAbortableSSESource(body: NonNullable<Response['body']>, signal: AbortSignal) {\n const reader = typeof body.getReader === 'function' ? body.getReader() : undefined;\n const source = reader\n ? {\n next: () => reader.read(),\n return: () => reader.cancel(),\n }\n : ReadableStreamToAsyncIterable<Bytes>(body)[Symbol.asyncIterator]();\n const ended: IteratorResult<Bytes> = { value: undefined, done: true };\n let closed = false;\n let canceled = false;\n let cancellation: Promise<unknown> | undefined;\n let interrupt: (() => void) | undefined;\n\n const waitForAbort = () =>\n // oxlint-disable-next-line promise/avoid-new -- AbortSignal callbacks need a portable Promise bridge.\n new Promise<void>((resolve) => {\n interrupt = resolve;\n });\n\n const cancel = () => {\n if (canceled || closed) {\n return cancellation;\n }\n canceled = true;\n try {\n cancellation = Promise.resolve(source.return?.());\n } catch (error) {\n cancellation = Promise.reject(error);\n }\n cancellation.catch(() => undefined);\n return cancellation;\n };\n const abort = () => {\n queueMicrotask(() => {\n interrupt?.();\n cancel();\n });\n };\n const iterator: AsyncIterableIterator<Bytes> = {\n async next() {\n if (signal.aborted) {\n return ended;\n }\n const aborted = waitForAbort().then(() => ended);\n try {\n const result = await Promise.race([source.next(), aborted]);\n if (signal.aborted) {\n return ended;\n }\n if (result.done) {\n closed = true;\n return ended;\n }\n return { value: result.value, done: false };\n } catch (error) {\n if (signal.aborted && (isAbortError(error) || error === signal.reason)) {\n return ended;\n }\n throw error;\n } finally {\n interrupt = undefined;\n }\n },\n async return() {\n const pending = cancel();\n if (pending && !signal.aborted) {\n const aborted = waitForAbort();\n try {\n if (!signal.aborted) {\n await Promise.race([pending, aborted]);\n }\n } finally {\n interrupt = undefined;\n }\n }\n return ended;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n\n return {\n iterator,\n start() {\n signal.addEventListener('abort', abort, { once: true });\n if (signal.aborted) {\n abort();\n }\n },\n async cleanup(failed: boolean) {\n let cleanupError: unknown;\n try {\n signal.removeEventListener('abort', abort);\n } catch (error) {\n cleanupError = error;\n }\n if (!closed) {\n const pending = cancel();\n if (pending && !failed && !signal.aborted) {\n try {\n await pending;\n } catch (error) {\n cleanupError ??= error;\n }\n }\n }\n if (reader) {\n try {\n reader.releaseLock();\n } catch (error) {\n cleanupError ??= error;\n }\n }\n if (cleanupError !== undefined && !failed && !signal.aborted) {\n throw cleanupError;\n }\n },\n };\n}\n\n/**\n * Decodes complete SSE records from a response and aborts when its body is absent.\n * Complete events are decoded on demand without imposing a line or event size limit.\n *\n * @yields {ServerSentEvent} Each decoded server-sent event in wire order.\n */\nexport async function* _iterSSEMessages(\n response: Response,\n controller: AbortController,\n): AsyncGenerator<ServerSentEvent, void, unknown> {\n if (!response.body) {\n controller.abort();\n if (\n (globalThis as any).navigator !== undefined &&\n (globalThis as any).navigator.product === 'ReactNative'\n ) {\n throw new OpenAIError(\n `The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api`,\n );\n }\n throw new OpenAIError(`Attempted to iterate over a response with no body`);\n }\n\n const sseDecoder = new SSEDecoder();\n const lineDecoder = new LineDecoder();\n const { signal } = controller;\n const source = createAbortableSSESource(response.body, signal);\n let failed = false;\n\n try {\n source.start();\n for await (const sseChunk of iterSSEChunks(source.iterator)) {\n if (signal.aborted) {\n return;\n }\n for (const line of lineDecoder.decode(sseChunk)) {\n if (signal.aborted) {\n return;\n }\n const sse = sseDecoder.decode(line);\n if (sse) {\n yield sse;\n }\n }\n }\n if (signal.aborted) {\n return;\n }\n for (const line of lineDecoder.flush()) {\n if (signal.aborted) {\n return;\n }\n const sse = sseDecoder.decode(line);\n if (sse) {\n yield sse;\n }\n }\n } catch (error) {\n failed = true;\n if (!signal.aborted || (!isAbortError(error) && error !== signal.reason)) {\n throw error;\n }\n } finally {\n await source.cleanup(failed);\n }\n}\n\n// A `\\r\\n\\r\\n` separator may retain up to three bytes from the previous chunk.\nconst DOUBLE_NEWLINE_DELIMITER_MAX_OVERLAP_BYTES = 3;\n\n/**\n * Given an async iterable iterator, iterates over it and yields full\n * SSE chunks, i.e. yields when a double new-line is encountered.\n *\n * @yields {Uint8Array} A complete SSE chunk.\n */\nasync function* iterSSEChunks(iterator: AsyncIterableIterator<Bytes>): AsyncGenerator<Uint8Array> {\n let data = new Uint8Array();\n let dataStart = 0;\n let dataEnd = 0;\n let searchStartIndex = 0;\n\n for await (const chunk of iterator) {\n if (chunk == null) {\n continue;\n }\n\n let binaryChunk: Uint8Array;\n if (chunk instanceof ArrayBuffer) {\n binaryChunk = new Uint8Array(chunk);\n } else if (typeof chunk === 'string') {\n binaryChunk = encodeUTF8(chunk);\n } else {\n binaryChunk = chunk;\n }\n\n if (dataEnd + binaryChunk.length > data.length) {\n const bufferedLength = dataEnd - dataStart;\n\n // Compact only when it reclaims substantial space without moving a large live tail repeatedly.\n if (dataStart >= data.length / 2 && bufferedLength + binaryChunk.length <= data.length) {\n data.copyWithin(0, dataStart, dataEnd);\n } else {\n const newData = new Uint8Array(Math.max(data.length * 2, bufferedLength + binaryChunk.length));\n newData.set(data.subarray(dataStart, dataEnd));\n data = newData;\n }\n\n searchStartIndex -= dataStart;\n dataStart = 0;\n dataEnd = bufferedLength;\n }\n\n data.set(binaryChunk, dataEnd);\n dataEnd += binaryChunk.length;\n\n let patternIndex;\n while ((patternIndex = findDoubleNewlineIndex(data.subarray(searchStartIndex, dataEnd))) !== -1) {\n patternIndex += searchStartIndex;\n yield data.slice(dataStart, patternIndex);\n dataStart = patternIndex;\n searchStartIndex = dataStart;\n }\n\n searchStartIndex = Math.max(dataStart, dataEnd - DOUBLE_NEWLINE_DELIMITER_MAX_OVERLAP_BYTES);\n }\n\n if (dataEnd > dataStart) {\n yield data.slice(dataStart, dataEnd);\n }\n}\n\nclass SSEDecoder {\n private data: string[];\n private event: string | null = null;\n private chunks: string[];\n\n constructor() {\n this.data = [];\n this.chunks = [];\n }\n\n decode(line: string) {\n if (line.endsWith('\\r')) {\n line = line.slice(0, -1);\n }\n\n if (!line) {\n // empty line and we didn't previously encounter any messages\n if (!this.event && !this.data.length) {\n return null;\n }\n\n const sse: ServerSentEvent = {\n event: this.event,\n data: this.data.join('\\n'),\n raw: this.chunks,\n };\n\n this.event = null;\n this.data = [];\n this.chunks = [];\n\n return sse;\n }\n\n this.chunks.push(line);\n\n if (line.startsWith(':')) {\n return null;\n }\n\n const [fieldname, , initialValue] = partition(line, ':');\n let value = initialValue;\n\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n\n if (fieldname === 'event') {\n this.event = value;\n } else if (fieldname === 'data') {\n this.data.push(value);\n }\n\n return null;\n }\n}\n\nfunction partition(str: string, delimiter: string): [string, string, string] {\n const index = str.indexOf(delimiter);\n if (index !== -1) {\n return [str.slice(0, index), delimiter, str.slice(index + delimiter.length)];\n }\n\n return [str, '', ''];\n}\n","import type {\n ParsedResponse,\n Response,\n ResponseCreateParamsBase,\n ResponseCreateParamsStreaming,\n ResponseStreamEvent,\n ResponseTextConfig,\n} from '../../resources/responses/responses';\nimport type { RequestOptions } from '../../internal/request-options';\nimport type { ReadableStream } from '../../internal/shim-types';\nimport { APIError, APIUserAbortError, OpenAIError } from '../../error';\nimport type OpenAI from '../../index';\nimport { EventStream } from '../EventStream';\nimport type { BaseEvents } from '../EventStream';\nimport type { ResponseFunctionCallArgumentsDeltaEvent, ResponseTextDeltaEvent } from './EventTypes';\nimport {\n accumulateResponseWithContext,\n createResponseContext,\n} from '../../internal/responses/response-accumulator';\nimport type { ParseableToolsParams } from '../ResponsesParser';\nimport { maybeParseResponse } from '../ResponsesParser';\nimport { Stream } from '../../streaming';\n\n/** Parameters for starting a new response stream or replaying an existing response. */\nexport type ResponseStreamParams = ResponseCreateAndStreamParams | ResponseStreamByIdParams;\n\n/** Response-creation parameters accepted by the streaming convenience helper. */\nexport type ResponseCreateAndStreamParams = Omit<ResponseCreateParamsBase, 'stream'> & {\n /** Streaming is always enabled by the helper and may be specified explicitly. */\n stream?: true;\n};\n\n/** Parameters for replaying an existing response and optionally filtering emitted events. */\nexport type ResponseStreamByIdParams = {\n /**\n * The ID of the response to stream.\n */\n response_id: string;\n /**\n * If provided, events with a sequence number less than or equal to this value\n * will not be emitted. The helper still replays them internally to build a\n * complete snapshot for later events and `finalResponse()`.\n */\n starting_after?: number;\n /**\n * Configuration options for a text response from the model. Can be plain text or\n * structured JSON data. Learn more:\n *\n * - [Text inputs and outputs](https://platform.openai.com/docs/guides/text)\n * - [Structured Outputs](https://platform.openai.com/docs/guides/structured-outputs)\n */\n text?: ResponseTextConfig;\n\n /**\n * An array of tools the model may call while generating a response. When continuing a stream, provide\n * the same tools as the original request.\n */\n tools?: ParseableToolsParams;\n};\n\n/** Raw Responses API events, lifecycle notifications, and snapshot-enhanced delta listeners. */\ntype ResponseEvents = BaseEvents &\n Omit<\n {\n [K in ResponseStreamEvent['type']]: (\n event: Extract<\n ResponseStreamEvent,\n {\n /** Event discriminator that selects the listener's precise server-event payload. */\n type: K;\n }\n >,\n ) => void;\n },\n 'response.output_text.delta' | 'response.function_call_arguments.delta' | 'error'\n > & {\n /** Called for every raw response event that passes the replay sequence filter. */\n event: (event: ResponseStreamEvent) => void;\n /** Called with each text fragment and the complete text accumulated for its content part. */\n 'response.output_text.delta': (event: ResponseTextDeltaEvent) => void;\n /** Called with each argument fragment and the complete JSON accumulated for its function call. */\n 'response.function_call_arguments.delta': (event: ResponseFunctionCallArgumentsDeltaEvent) => void;\n };\n\n/** Response request parameters retained to parse structured output and tool arguments. */\nexport type ResponseStreamingParams = Omit<ResponseCreateParamsBase, 'stream'> & {\n /** Streaming is always enabled by the helper and may be specified explicitly. */\n stream?: true;\n};\n\n/** Streams Responses API events while accumulating the latest response and parsed output. */\nexport class ResponseStream<ParsedT = null>\n extends EventStream<ResponseEvents>\n implements AsyncIterable<ResponseStreamEvent>\n{\n #params: ResponseStreamingParams | null;\n #currentResponseSnapshot: Response | undefined;\n #finalResponse: ParsedResponse<ParsedT> | undefined;\n #accumulatorContext = createResponseContext();\n\n /** Creates an unstarted stream, retaining request parameters for structured-output parsing. */\n constructor(params: ResponseStreamingParams | null) {\n super();\n this.#params = params;\n }\n\n /** Starts a new response stream or replays an existing response by its identifier. */\n static createResponse<ParsedT>(\n client: OpenAI,\n params: ResponseStreamParams,\n options?: RequestOptions,\n ): ResponseStream<ParsedT> {\n const runner = new ResponseStream<ParsedT>(params as ResponseCreateParamsStreaming);\n runner._run(() =>\n runner._createOrRetrieveResponse(client, params, {\n ...options,\n __metadata: { ...options?.__metadata, helperMethod: 'stream' },\n }),\n );\n return runner;\n }\n\n /** Consumes serialized response events from a readable stream in another runtime. */\n static fromReadableStream(stream: ReadableStream): ResponseStream<null> {\n const runner = new ResponseStream(null);\n runner._run(() => runner._fromReadableStream(stream));\n return runner;\n }\n\n #beginRequest() {\n if (this.ended) {\n return;\n }\n this.#currentResponseSnapshot = undefined;\n this.#accumulatorContext = createResponseContext();\n }\n\n #addEvent(this: ResponseStream<ParsedT>, event: ResponseStreamEvent, starting_after: number | null) {\n if (this.ended) {\n return;\n }\n\n const maybeEmit = (name: string, event: ResponseStreamEvent & { snapshot?: string }) => {\n if (starting_after == null || event.sequence_number > starting_after) {\n this._emit(name as any, event);\n }\n };\n\n if (event.type === 'error') {\n // First-party providers nest their error payload; retain flat compatibility for\n // serialized events matching the currently published event schema.\n const error =\n 'error' in event && typeof event.error === 'object' && event.error !== null ? event.error : event;\n throw new APIError(undefined, error, event.message, undefined);\n }\n\n let dispatchEvent: ResponseStreamEvent = event;\n const response = accumulateResponseWithContext(\n event,\n this.#currentResponseSnapshot,\n this.#accumulatorContext,\n true,\n (sanitizedEvent) => {\n dispatchEvent = sanitizedEvent;\n },\n );\n this.#currentResponseSnapshot = response;\n maybeEmit('event', event);\n\n switch (dispatchEvent.type) {\n case 'response.output_text.delta': {\n const output = response.output[dispatchEvent.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${dispatchEvent.output_index}`);\n }\n if (output.type === 'message') {\n const content = output.content[dispatchEvent.content_index];\n if (!content) {\n throw new OpenAIError(`missing content at index ${dispatchEvent.content_index}`);\n }\n if (content.type !== 'output_text') {\n throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);\n }\n\n maybeEmit('response.output_text.delta', {\n ...dispatchEvent,\n type: dispatchEvent.type,\n item_id: dispatchEvent.item_id,\n output_index: dispatchEvent.output_index,\n content_index: dispatchEvent.content_index,\n snapshot: content.text,\n });\n }\n break;\n }\n case 'response.function_call_arguments.delta': {\n const output = response.output[dispatchEvent.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${dispatchEvent.output_index}`);\n }\n if (output.type === 'function_call') {\n maybeEmit('response.function_call_arguments.delta', {\n ...dispatchEvent,\n type: dispatchEvent.type,\n item_id: dispatchEvent.item_id,\n output_index: dispatchEvent.output_index,\n snapshot: output.arguments,\n });\n }\n break;\n }\n default: {\n maybeEmit(dispatchEvent.type, event);\n break;\n }\n }\n }\n\n #endRequest(): ParsedResponse<ParsedT> {\n if (this.ended) {\n throw new OpenAIError(`stream has ended, this shouldn't happen`);\n }\n const snapshot = this.#currentResponseSnapshot;\n if (!snapshot) {\n throw new OpenAIError(`request ended without sending any events`);\n }\n this.#currentResponseSnapshot = undefined;\n this.#accumulatorContext = createResponseContext();\n const parsedResponse = finalizeResponse<ParsedT>(snapshot, this.#params);\n this.#finalResponse = parsedResponse;\n\n return parsedResponse;\n }\n\n protected async _createOrRetrieveResponse(\n client: OpenAI,\n params: ResponseStreamParams,\n options?: RequestOptions,\n ): Promise<ParsedResponse<ParsedT>> {\n this._listenForAbort(options?.signal);\n this.#beginRequest();\n\n let stream: Stream<ResponseStreamEvent> | undefined;\n let starting_after: number | null = null;\n if ('response_id' in params) {\n // Keep the full replay so that `accumulateResponse()` sees `response.created` and can build\n // complete snapshots before locally filtering events at `starting_after`.\n stream = await client.responses.retrieve(\n params.response_id,\n { stream: true },\n { ...options, signal: this.controller.signal, stream: true },\n );\n starting_after = params.starting_after ?? null;\n } else {\n stream = await client.responses.create(\n { ...params, stream: true },\n { ...options, signal: this.controller.signal },\n );\n }\n\n this._connected();\n for await (const event of stream) {\n this.#addEvent(event, starting_after);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this.#endRequest();\n }\n\n protected async _fromReadableStream(\n readableStream: ReadableStream,\n options?: RequestOptions,\n ): Promise<ParsedResponse<ParsedT>> {\n this._listenForAbort(options?.signal);\n this.#beginRequest();\n this._connected();\n const stream = Stream.fromReadableStream<ResponseStreamEvent>(readableStream, this.controller);\n for await (const event of stream) {\n this.#addEvent(event, null);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this.#endRequest();\n }\n\n /** Iterates over response events; stopping iteration early aborts the underlying request. */\n [Symbol.asyncIterator](this: ResponseStream<ParsedT>): AsyncIterator<ResponseStreamEvent> {\n return this._createIterator<ResponseStreamEvent>(\n (push) => {\n const onEvent = (event: ResponseStreamEvent) => push(event);\n this.on('event', onEvent);\n return () => this.off('event', onEvent);\n },\n { onReturn: () => this.abort() },\n );\n }\n\n /**\n * Waits for the stream to end and returns its latest accumulated response.\n *\n * A clean end after at least one response event resolves even when the response is\n * incomplete. Network errors, cancellation, and streams without a response reject.\n */\n async finalResponse(): Promise<ParsedResponse<ParsedT>> {\n await this.done();\n const response = this.#finalResponse;\n if (!response) {\n throw new OpenAIError('stream ended without producing a Response');\n }\n return response;\n }\n}\n\nfunction finalizeResponse<ParsedT>(\n snapshot: Response,\n params: ResponseStreamingParams | null,\n): ParsedResponse<ParsedT> {\n return maybeParseResponse(snapshot, params);\n}\n","/** 本文件负责使用官方 SDK 将 SSE 事件还原为完整响应对象。 */\r\n\r\nimport { MessageStream } from \"@anthropic-ai/sdk/lib/MessageStream\";\r\nimport type { Protocol, SseRow } from \"@tracelet/shared\";\r\nimport { ResponseStream } from \"openai/lib/responses/ResponseStream\";\r\n\r\nconst encoder = new TextEncoder();\r\n\r\n/** 提取官方 SDK 可消费的逐行 JSON 事件。 */\r\nfunction jsonLines(events: SseRow[]): string[] {\r\n return events\r\n .map((event) => event.data.trim())\r\n .filter((data) => data.startsWith(\"{\") && data.endsWith(\"}\"));\r\n}\r\n\r\n/** 返回最后一个 response.completed 事件的位置。 */\r\nfunction completedIndex(values: Record<string, unknown>[]): number {\r\n for (let index = values.length - 1; index >= 0; index -= 1) {\r\n if (values[index]?.type === \"response.completed\") {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\n/** 兼容 Codex lite 终态中 output 为空的流式响应。 */\r\nfunction fixLite(lines: string[]): string[] {\r\n const values = lines.map((line) => JSON.parse(line) as Record<string, unknown>);\r\n const created = values.findIndex((value) => value.type === \"response.created\");\r\n const firstItem = values.findIndex((value) => value.type === \"response.output_item.added\");\r\n const completed = completedIndex(values);\r\n const terminal = values[completed]?.response as { output?: unknown[] } | undefined;\r\n\r\n if (created < 0 || firstItem <= created || completed <= firstItem || terminal?.output?.length !== 0) {\r\n return lines;\r\n }\r\n\r\n // 保留前置生命周期事件,再由 SDK 在 lite 终态上继续累加完整 output。\r\n return [\r\n ...lines.slice(0, firstItem),\r\n lines[completed]!,\r\n ...lines.slice(firstItem, completed),\r\n ...lines.slice(completed + 1),\r\n ];\r\n}\r\n\r\n/** 把逐行 JSON 转为官方 SDK 可消费的 ReadableStream。 */\r\nfunction toStream(lines: string[]): ReadableStream<Uint8Array> {\r\n let index = 0;\r\n\r\n return new ReadableStream<Uint8Array>({\r\n /** 每次拉取时向 SDK 提供一个完整的 JSON 事件。 */\r\n pull(controller) {\r\n const line = lines[index];\r\n if (line === undefined) {\r\n controller.close();\r\n return;\r\n }\r\n\r\n controller.enqueue(encoder.encode(`${line}\\n`));\r\n index += 1;\r\n },\r\n });\r\n}\r\n\r\n/** 使用 Anthropic SDK 的 finalMessage 生成完整 Message。 */\r\nasync function buildAnthropic(events: SseRow[]): Promise<unknown> {\r\n const stream = MessageStream.fromReadableStream(toStream(jsonLines(events)));\r\n return stream.finalMessage();\r\n}\r\n\r\n/** 使用 OpenAI SDK 的 finalResponse 生成完整 Response。 */\r\nasync function buildOpenAI(events: SseRow[]): Promise<unknown> {\r\n const stream = ResponseStream.fromReadableStream(toStream(fixLite(jsonLines(events))));\r\n return stream.finalResponse();\r\n}\r\n\r\n/** 根据协议调用对应官方 SDK 的流式累加方法。 */\r\nexport async function buildResponse(protocol: Protocol, events: SseRow[]): Promise<unknown> {\r\n return protocol === \"anthropic\" ? buildAnthropic(events) : buildOpenAI(events);\r\n}\r\n","/** 本文件负责从请求和响应链中识别持续会话。 */\r\n\r\nimport type { HeaderMap, Protocol, SessionMatch } from \"@tracelet/shared\";\r\n\r\nexport class SessionResolver {\r\n private readonly responses = new Map<string, string>();\r\n\r\n /** 根据协议显式标识和已有响应链确定会话。 */\r\n resolve(protocol: Protocol, headers: HeaderMap, body: unknown, runId: string): SessionMatch {\r\n const data = body && typeof body === \"object\" ? (body as Record<string, unknown>) : {};\r\n\r\n if (protocol === \"anthropic\") {\r\n const session = headers?.[\"x-claude-code-session-id\"];\r\n const agent = headers?.[\"x-claude-code-agent-id\"];\r\n const parent = headers?.[\"x-claude-code-parent-agent-id\"];\r\n\r\n if (typeof session === \"string\" && session) {\r\n return {\r\n id: `claude:${session}`,\r\n source: \"header\",\r\n ...(typeof agent === \"string\" ? { agentId: agent } : {}),\r\n ...(typeof parent === \"string\" ? { parentAgentId: parent } : {}),\r\n };\r\n }\r\n }\r\n\r\n if (protocol === \"openai\") {\r\n const session = headers?.[\"session-id\"] ?? headers?.[\"thread-id\"];\r\n if (typeof session === \"string\" && session) {\r\n return { id: `codex:${session}`, source: \"header\" };\r\n }\r\n }\r\n\r\n const conversation = data?.conversation;\r\n const conversationId =\r\n typeof conversation === \"string\"\r\n ? conversation\r\n : conversation && typeof conversation === \"object\"\r\n ? (conversation as Record<string, unknown>)?.id\r\n : undefined;\r\n\r\n if (typeof conversationId === \"string\" && conversationId) {\r\n return { id: `openai:${conversationId}`, source: \"conversation\" };\r\n }\r\n\r\n const previous = data?.previous_response_id;\r\n if (typeof previous === \"string\" && previous) {\r\n return {\r\n id: this.responses.get(previous) ?? `run:${runId}`,\r\n source: this.responses.has(previous) ? \"response-chain\" : \"run\",\r\n previousResponseId: previous,\r\n };\r\n }\r\n\r\n return { id: `run:${runId}`, source: \"run\" };\r\n }\r\n\r\n /** 将响应 ID 绑定到已识别的内部会话。 */\r\n bind(responseId: string, sessionId: string): void {\r\n this.responses.set(responseId, sessionId);\r\n }\r\n}\r\n","/** 本文件负责将任意网络 chunk 增量切分为完整 SSE 事件。 */\r\n\r\nimport type { SseRow } from \"@tracelet/shared\";\r\n\r\ntype EventHandler = (event: SseRow) => void;\r\n\r\nexport class SseParser {\r\n private readonly decoder = new TextDecoder();\r\n private readonly onEvent: EventHandler;\r\n private buffer = \"\";\r\n private eventSeq = 0;\r\n private firstChunk = 0;\r\n private lastChunk = 0;\r\n private lastTimeUs = 0;\r\n\r\n /** 创建一个将完整事件交给回调的 SSE 解析器。 */\r\n constructor(onEvent: EventHandler) {\r\n this.onEvent = onEvent;\r\n }\r\n\r\n /** 输入一个原始响应 chunk,并尽可能产出完整事件。 */\r\n push(chunk: Uint8Array, chunkSeq: number, tUs: number): void {\r\n if (!this.buffer) {\r\n this.firstChunk = chunkSeq;\r\n }\r\n\r\n this.lastChunk = chunkSeq;\r\n this.lastTimeUs = tUs;\r\n this.buffer += this.decoder.decode(chunk, { stream: true });\r\n this.flush(false);\r\n }\r\n\r\n /** 结束字符解码,并提交最后一个没有空行结尾的事件。 */\r\n end(): void {\r\n this.buffer += this.decoder.decode();\r\n this.flush(true);\r\n }\r\n\r\n /** 从当前缓冲区依次提取 SSE 事件。 */\r\n private flush(final: boolean): void {\r\n let match = this.buffer.match(/\\r?\\n\\r?\\n/);\r\n\r\n while (match?.index !== undefined) {\r\n const raw = this.buffer.slice(0, match.index);\r\n this.buffer = this.buffer.slice(match.index + match[0].length);\r\n this.emit(raw);\r\n this.firstChunk = this.lastChunk;\r\n match = this.buffer.match(/\\r?\\n\\r?\\n/);\r\n }\r\n\r\n if (final && this.buffer.trim()) {\r\n this.emit(this.buffer);\r\n this.buffer = \"\";\r\n }\r\n }\r\n\r\n /** 解析一个完整 SSE block 的 event 和 data 字段。 */\r\n private emit(raw: string): void {\r\n if (!raw.trim()) {\r\n return;\r\n }\r\n\r\n let event = \"message\";\r\n const data: string[] = [];\r\n\r\n for (const line of raw.split(/\\r?\\n/)) {\r\n if (line.startsWith(\"event:\")) {\r\n event = line.slice(6).trim();\r\n } else if (line.startsWith(\"data:\")) {\r\n data.push(line.slice(5).trimStart());\r\n } else if (line.startsWith(\":\")) {\r\n event = \"comment\";\r\n data.push(line.slice(1).trimStart());\r\n }\r\n }\r\n\r\n this.onEvent({\r\n seq: this.eventSeq++,\r\n event,\r\n data: data.join(\"\\n\"),\r\n raw,\r\n firstChunk: this.firstChunk,\r\n lastChunk: this.lastChunk,\r\n tUs: this.lastTimeUs,\r\n });\r\n }\r\n}\r\n","/** 本文件负责协调原始流记录、SSE 分帧、会话识别和 SDK 响应还原。 */\r\n\r\nimport type { IncomingHttpHeaders } from \"node:http\";\r\nimport { buildResponse, decodeBody, parseRequest } from \"@tracelet/protocols\";\r\nimport {\r\n elapsedUs,\r\n makeId,\r\n nowIso,\r\n redactHeaders,\r\n type ExchangeMeta,\r\n type Protocol,\r\n type SseRow,\r\n} from \"@tracelet/shared\";\r\nimport { type ExchangeWriter, FileStore } from \"@tracelet/storage\";\r\nimport { SessionResolver } from \"./session.js\";\r\nimport { SseParser } from \"./sse.js\";\r\n\r\nexport interface CaptureStart {\r\n runId: string;\r\n protocol: Protocol;\r\n method: string;\r\n path: string;\r\n headers: IncomingHttpHeaders;\r\n}\r\n\r\ntype ChangeHandler = (meta: ExchangeMeta) => void;\r\n\r\nexport class Capture {\r\n private readonly writer: ExchangeWriter;\r\n private readonly resolver: SessionResolver;\r\n private readonly onChange: ChangeHandler;\r\n private readonly clock = process.hrtime.bigint();\r\n private readonly reqParts: Buffer[] = [];\r\n private readonly resParts: Buffer[] = [];\r\n private readonly events: SseRow[] = [];\r\n private readonly parser: SseParser;\r\n private meta: ExchangeMeta;\r\n private done = false;\r\n\r\n /** 创建一次请求的完整捕获上下文。 */\r\n constructor(\r\n writer: ExchangeWriter,\r\n resolver: SessionResolver,\r\n meta: ExchangeMeta,\r\n onChange: ChangeHandler,\r\n ) {\r\n this.writer = writer;\r\n this.resolver = resolver;\r\n this.meta = meta;\r\n this.onChange = onChange;\r\n this.parser = new SseParser((event) => this.addEvent(event));\r\n }\r\n\r\n /** 记录一个请求 body chunk。 */\r\n reqChunk(chunk: Uint8Array): void {\r\n const data = Buffer.from(chunk);\r\n this.reqParts.push(data);\r\n this.meta.requestBytes += data.byteLength;\r\n this.writer.addReq(data, elapsedUs(this.clock));\r\n }\r\n\r\n /** 在请求 body 完成后解析模型参数并识别会话。 */\r\n reqEnd(): void {\r\n try {\r\n const raw = Buffer.concat(this.reqParts);\r\n const body = decodeBody(raw, this.meta.requestHeaders[\"content-encoding\"]);\r\n const text = Buffer.from(body).toString(\"utf8\");\r\n const parsed = parseRequest(text);\r\n const session = this.resolver.resolve(\r\n this.meta.protocol,\r\n this.meta.requestHeaders,\r\n parsed.body,\r\n this.meta.runId,\r\n );\r\n\r\n this.meta = {\r\n ...this.meta,\r\n sessionId: session.id,\r\n sessionSource: session.source,\r\n stream: parsed.stream,\r\n ...(parsed.model ? { model: parsed.model } : {}),\r\n ...(session.agentId ? { agentId: session.agentId } : {}),\r\n ...(session.parentAgentId ? { parentAgentId: session.parentAgentId } : {}),\r\n };\r\n this.writer.patch(this.meta);\r\n } catch {\r\n // 无法解析的请求仍然保留原始字节并归入当前 run。\r\n }\r\n }\r\n\r\n /** 记录上游响应状态和脱敏 Header。 */\r\n resStart(status: number, headers: IncomingHttpHeaders): void {\r\n this.meta = {\r\n ...this.meta,\r\n responseStatus: status,\r\n responseHeaders: redactHeaders(headers),\r\n };\r\n this.writer.patch(this.meta);\r\n }\r\n\r\n /** 记录并解析一个上游响应 chunk。 */\r\n resChunk(chunk: Uint8Array): void {\r\n const data = Buffer.from(chunk);\r\n const tUs = elapsedUs(this.clock);\r\n const seq = this.writer.addRes(data, tUs);\r\n\r\n if (!this.meta.firstByteAt) {\r\n this.meta.firstByteAt = nowIso();\r\n }\r\n\r\n this.resParts.push(data);\r\n this.meta.responseBytes += data.byteLength;\r\n this.parser.push(data, seq, tUs);\r\n }\r\n\r\n /** 完成记录,并通过对应官方 SDK 生成完整响应对象。 */\r\n async end(): Promise<void> {\r\n if (this.done) {\r\n return;\r\n }\r\n this.done = true;\r\n this.parser.end();\r\n\r\n try {\r\n const response = this.meta.stream\r\n ? await buildResponse(this.meta.protocol, this.events)\r\n : (JSON.parse(Buffer.concat(this.resParts).toString(\"utf8\")) as unknown);\r\n\r\n this.writer.saveResponse(response);\r\n this.bindResponse(response);\r\n } catch (error) {\r\n this.meta.reconstructError = error instanceof Error ? error.message : String(error);\r\n }\r\n\r\n this.meta.completedAt = nowIso();\r\n this.meta.captureComplete = true;\r\n this.writer.patch(this.meta);\r\n const writeError = await this.writer.close();\r\n\r\n if (writeError) {\r\n this.meta.captureComplete = false;\r\n this.meta.error = writeError.message;\r\n }\r\n\r\n this.onChange(this.meta);\r\n }\r\n\r\n /** 标记上游请求失败并结束当前记录。 */\r\n async fail(error: Error): Promise<void> {\r\n if (this.done) {\r\n return;\r\n }\r\n this.done = true;\r\n this.meta = {\r\n ...this.meta,\r\n error: error.message,\r\n completedAt: nowIso(),\r\n captureComplete: false,\r\n };\r\n this.writer.patch(this.meta);\r\n await this.writer.close();\r\n this.onChange(this.meta);\r\n }\r\n\r\n /** 持久化一个完整 SSE 事件。 */\r\n private addEvent(event: SseRow): void {\r\n this.events.push(event);\r\n this.writer.addEvent(event);\r\n }\r\n\r\n /** 从官方 SDK 响应对象中提取 ID 并延续 OpenAI 响应链。 */\r\n private bindResponse(response: unknown): void {\r\n if (this.meta.protocol !== \"openai\" || !response || typeof response !== \"object\") {\r\n return;\r\n }\r\n\r\n const id = (response as Record<string, unknown>)?.id;\r\n if (typeof id === \"string\" && id) {\r\n this.resolver.bind(id, this.meta.sessionId);\r\n }\r\n }\r\n}\r\n\r\nexport class Recorder {\r\n private readonly store: FileStore;\r\n private readonly resolver = new SessionResolver();\r\n private readonly onChange: ChangeHandler;\r\n private readonly active = new Set<Promise<void>>();\r\n\r\n /** 创建共享文件存储和会话状态的记录器。 */\r\n constructor(store: FileStore, onChange: ChangeHandler = () => undefined) {\r\n this.store = store;\r\n this.onChange = onChange;\r\n }\r\n\r\n /** 开始捕获一次模型 HTTP 请求。 */\r\n async start(input: CaptureStart): Promise<Capture> {\r\n const meta: ExchangeMeta = {\r\n id: makeId(\"ex\"),\r\n runId: input.runId,\r\n sessionId: `run:${input.runId}`,\r\n sessionSource: \"run\",\r\n protocol: input.protocol,\r\n method: input.method,\r\n path: input.path,\r\n stream: false,\r\n requestHeaders: redactHeaders(input.headers),\r\n startedAt: nowIso(),\r\n requestBytes: 0,\r\n responseBytes: 0,\r\n captureComplete: false,\r\n };\r\n const writer = await this.store.startExchange(meta);\r\n this.onChange(meta);\r\n return new Capture(writer, this.resolver, meta, this.onChange);\r\n }\r\n\r\n /** 跟踪后台收尾任务,确保服务退出前文件已写完。 */\r\n track(task: Promise<void>): void {\r\n this.active.add(task);\r\n task.finally(() => this.active.delete(task)).catch(() => undefined);\r\n }\r\n\r\n /** 等待所有正在写入的 exchange 完成。 */\r\n async drain(): Promise<void> {\r\n await Promise.allSettled([...this.active]);\r\n }\r\n}\r\n","/** 本文件负责扫描本地记录并为 Dashboard 组装查询结果。 */\r\n\r\nimport { readFile, readdir } from \"node:fs/promises\";\r\nimport { join } from \"node:path\";\r\nimport { buildResponse, decodeBody, parseRequest } from \"@tracelet/protocols\";\r\nimport type {\r\n ChunkRow,\r\n ChunkView,\r\n ExchangeDetail,\r\n ExchangeMeta,\r\n ExchangeSummary,\r\n ConversationDetail,\r\n RunMeta,\r\n SessionSummary,\r\n SseRow,\r\n} from \"@tracelet/shared\";\r\nimport { readJson, readJsonl } from \"./files.js\";\r\nimport { buildConversation } from \"./conversation.js\";\r\n\r\ninterface StoredMeta {\r\n dir: string;\r\n meta: ExchangeMeta;\r\n agentLabel?: string;\r\n}\r\n\r\n/** 判断一次记录是否属于 Dashboard 需要展示的模型交互。 */\r\nfunction isVisible(meta: ExchangeMeta): boolean {\r\n const path = meta.path.split(\"?\", 1)[0];\r\n if (meta.method !== \"POST\") {\r\n return false;\r\n }\r\n // 只让实际推理接口进入会话,模型列表和健康检查仍保留在磁盘。\r\n return meta.protocol === \"anthropic\"\r\n ? Boolean(path?.endsWith(\"/messages\"))\r\n : Boolean(path?.endsWith(\"/responses\") || path?.endsWith(\"/chat/completions\"));\r\n}\r\n\r\n/** 判断 Codex Exchange 是否由系统后台任务发起。 */\r\nfunction isInternal(meta: ExchangeMeta): boolean {\r\n const value = meta.requestHeaders?.[\"x-codex-turn-metadata\"];\r\n const text = Array.isArray(value) ? value[0] : value;\r\n if (!text) {\r\n return false;\r\n }\r\n try {\r\n return (JSON.parse(text) as { thread_source?: string })?.thread_source === \"system\";\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/** 使用 Codex 请求 Header 修正旧记录中的会话归属。 */\r\nfunction normalizeMeta(meta: ExchangeMeta): ExchangeMeta {\r\n if (meta.protocol !== \"openai\" || meta.sessionSource !== \"run\") {\r\n return meta;\r\n }\r\n\r\n const session = meta.requestHeaders[\"session-id\"] ?? meta.requestHeaders[\"thread-id\"];\r\n return typeof session === \"string\" && session\r\n ? { ...meta, sessionId: `codex:${session}`, sessionSource: \"header\" }\r\n : meta;\r\n}\r\n\r\n/** 按记录的 Content-Encoding 返回可展示的请求文本。 */\r\nfunction decodeText(body: Buffer, meta: ExchangeMeta): string {\r\n const decoded = decodeBody(body, meta.requestHeaders[\"content-encoding\"]);\r\n return Buffer.from(decoded).toString(\"utf8\");\r\n}\r\n\r\n/** 读取目录;目录不存在时返回空列表。 */\r\nasync function readDirs(path: string): Promise<string[]> {\r\n try {\r\n const entries = await readdir(path, { withFileTypes: true });\r\n return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\n/** 扫描全部 exchange 元数据。 */\r\nasync function scan(root: string): Promise<StoredMeta[]> {\r\n const result: StoredMeta[] = [];\r\n const runsRoot = join(root, \"runs\");\r\n\r\n for (const date of await readDirs(runsRoot)) {\r\n const dateDir = join(runsRoot, date);\r\n for (const run of await readDirs(dateDir)) {\r\n const runDir = join(dateDir, run);\r\n let agentLabel: string | undefined;\r\n try {\r\n const info = await readJson<RunMeta>(join(runDir, \"run.json\"));\r\n agentLabel = info.agentLabel ?? (info.agent === \"claude\" ? \"Claude Code\"\r\n : info.agent === \"codex\" ? \"Codex\" : info.agent);\r\n } catch {\r\n // 旧记录或损坏的 run 元数据仍允许按协议展示。\r\n }\r\n const exchangesDir = join(dateDir, run, \"exchanges\");\r\n for (const exchange of await readDirs(exchangesDir)) {\r\n const dir = join(exchangesDir, exchange);\r\n try {\r\n const meta = await readJson<ExchangeMeta>(join(dir, \"meta.json\"));\r\n result.push({ dir, meta: normalizeMeta(meta), ...(agentLabel ? { agentLabel } : {}) });\r\n } catch {\r\n // 未完成的损坏记录不进入 Dashboard 列表。\r\n }\r\n }\r\n }\r\n }\r\n\r\n return result.sort((left, right) => left.meta.startedAt.localeCompare(right.meta.startedAt));\r\n}\r\n\r\n/** 将 exchange 元数据缩减为列表摘要。 */\r\nfunction toSummary(meta: ExchangeMeta): ExchangeSummary {\r\n return {\r\n id: meta.id,\r\n runId: meta.runId,\r\n sessionId: meta.sessionId,\r\n protocol: meta.protocol,\r\n method: meta.method,\r\n path: meta.path,\r\n ...(meta.model ? { model: meta.model } : {}),\r\n ...(meta.responseStatus ? { status: meta.responseStatus } : {}),\r\n startedAt: meta.startedAt,\r\n ...(meta.completedAt ? { completedAt: meta.completedAt } : {}),\r\n responseBytes: meta.responseBytes,\r\n captureComplete: meta.captureComplete,\r\n };\r\n}\r\n\r\n/** 按会话聚合所有请求,供 Dashboard 左侧导航使用。 */\r\nexport async function listSessions(root: string): Promise<SessionSummary[]> {\r\n const groups = new Map<string, SessionSummary>();\r\n\r\n for (const item of await scan(root)) {\r\n if (!isVisible(item.meta)) {\r\n continue;\r\n }\r\n\r\n const current = groups.get(item.meta.sessionId);\r\n if (current) {\r\n current.exchanges.push(toSummary(item.meta));\r\n current.internal = current.internal === true && isInternal(item.meta);\r\n if (item.meta.completedAt) {\r\n current.endedAt = item.meta.completedAt;\r\n }\r\n continue;\r\n }\r\n\r\n groups.set(item.meta.sessionId, {\r\n id: item.meta.sessionId,\r\n protocol: item.meta.protocol,\r\n ...(item.agentLabel ? { agentLabel: item.agentLabel } : {}),\r\n startedAt: item.meta.startedAt,\r\n ...(item.meta.completedAt ? { endedAt: item.meta.completedAt } : {}),\r\n ...(isInternal(item.meta) ? { internal: true } : {}),\r\n exchanges: [toSummary(item.meta)],\r\n });\r\n }\r\n\r\n return [...groups.values()].sort((left, right) => right.startedAt.localeCompare(left.startedAt));\r\n}\r\n\r\n/** 读取一次 exchange 的完整请求、响应、chunk 和事件。 */\r\nasync function readExchange(stored: StoredMeta): Promise<ExchangeDetail> {\r\n const [requestBody, responseBody, chunkRows, events] = await Promise.all([\r\n readFile(join(stored.dir, \"request.bin\")),\r\n readFile(join(stored.dir, \"response.bin\")),\r\n readJsonl<ChunkRow>(join(stored.dir, \"response-chunks.jsonl\")),\r\n readJsonl<SseRow>(join(stored.dir, \"sse-events.jsonl\")),\r\n ]);\r\n let requestText = requestBody.toString(\"utf8\");\r\n try {\r\n requestText = decodeText(requestBody, stored.meta);\r\n } catch {\r\n // 不支持的编码仍回退到原始文本,保证旧记录可以打开。\r\n }\r\n const responseText = responseBody.toString(\"utf8\");\r\n const chunks: ChunkView[] = chunkRows.map((row) => {\r\n const data = responseBody.subarray(row.offset, row.offset + row.length);\r\n return { ...row, text: data.toString(\"utf8\"), base64: data.toString(\"base64\") };\r\n });\r\n\r\n let meta = stored.meta;\r\n let request: unknown = requestText;\r\n let response: unknown = responseText;\r\n\r\n try {\r\n const parsed = parseRequest(requestText);\r\n request = parsed.body;\r\n meta = {\r\n ...meta,\r\n stream: parsed.stream,\r\n ...(parsed.model ? { model: parsed.model } : {}),\r\n };\r\n } catch {\r\n // 非 JSON 请求仍通过原始文本展示。\r\n }\r\n\r\n try {\r\n response = await readJson<unknown>(join(stored.dir, \"reconstructed.json\"));\r\n } catch {\r\n try {\r\n if (events.length > 0) {\r\n response = await buildResponse(meta.protocol, events);\r\n const { reconstructError: _error, ...validMeta } = meta;\r\n meta = validMeta;\r\n }\r\n } catch {\r\n // 无法还原的流仍通过原始 SSE 文本展示。\r\n }\r\n }\r\n\r\n return { meta, requestText, responseText, request, response, chunks, events };\r\n}\r\n\r\n/** 读取一次 exchange 的完整请求、响应、chunk 和事件。 */\r\nexport async function getExchange(root: string, id: string): Promise<ExchangeDetail | undefined> {\r\n const stored = (await scan(root)).find((item) => item.meta.id === id);\r\n return stored ? readExchange(stored) : undefined;\r\n}\r\n\r\n/** 从现有 Exchange 动态还原指定会话。 */\r\nexport async function getConversation(root: string, sessionId: string): Promise<ConversationDetail | undefined> {\r\n const stored = (await scan(root)).filter(\r\n (item) => item.meta.sessionId === sessionId && isVisible(item.meta),\r\n );\r\n if (stored.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const exchanges = await Promise.all(stored.map((item) => readExchange(item)));\r\n const first = stored[0]!.meta;\r\n const last = stored.at(-1)!.meta;\r\n const session: SessionSummary = {\r\n id: sessionId,\r\n protocol: first.protocol,\r\n startedAt: first.startedAt,\r\n ...(last.completedAt ? { endedAt: last.completedAt } : {}),\r\n exchanges: stored.map((item) => toSummary(item.meta)),\r\n };\r\n return buildConversation(session, exchanges);\r\n}\r\n","/** 本文件负责 Tracelet 记录文件的安全读写和路径组织。 */\r\n\r\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\r\nimport { dirname, join } from \"node:path\";\r\n\r\n/** 根据运行时间生成稳定的日期目录。 */\r\nexport function dateKey(iso: string): string {\r\n return iso.slice(0, 10);\r\n}\r\n\r\n/** 计算一次运行的本地目录。 */\r\nexport function getRunDir(root: string, iso: string, runId: string): string {\r\n return join(root, \"runs\", dateKey(iso), runId);\r\n}\r\n\r\n/** 通过临时文件和 rename 原子写入 JSON。 */\r\nexport async function writeJson(path: string, value: unknown): Promise<void> {\r\n const temp = `${path}.tmp`;\r\n await mkdir(dirname(path), { recursive: true });\r\n await writeFile(temp, `${JSON.stringify(value, null, 2)}\\n`, \"utf8\");\r\n await rename(temp, path);\r\n}\r\n\r\n/** 读取并解析一个 JSON 文件。 */\r\nexport async function readJson<T>(path: string): Promise<T> {\r\n return JSON.parse(await readFile(path, \"utf8\")) as T;\r\n}\r\n\r\n/** 读取 JSONL,并忽略崩溃时可能残留的不完整尾行。 */\r\nexport async function readJsonl<T>(path: string): Promise<T[]> {\r\n let text = \"\";\r\n\r\n try {\r\n text = await readFile(path, \"utf8\");\r\n } catch {\r\n return [];\r\n }\r\n\r\n const rows: T[] = [];\r\n for (const line of text.split(\"\\n\")) {\r\n if (!line.trim()) {\r\n continue;\r\n }\r\n\r\n try {\r\n rows.push(JSON.parse(line) as T);\r\n } catch {\r\n break;\r\n }\r\n }\r\n\r\n return rows;\r\n}\r\n","/** 本文件负责从现有请求与响应记录中还原会话、消息和工具调用。 */\r\n\r\nimport type {\r\n ConversationDetail,\r\n ConversationItem,\r\n ConversationKind,\r\n ConversationRole,\r\n ConversationSystemPrompt,\r\n ConversationTurn,\r\n ExchangeDetail,\r\n HeaderValue,\r\n SessionSummary,\r\n} from \"@tracelet/shared\";\r\n\r\ntype DraftKind = ConversationKind | \"tool-result\";\r\n\r\ninterface DraftItem {\r\n sourceId?: string;\r\n kind: DraftKind;\r\n role?: ConversationRole;\r\n text?: string;\r\n name?: string;\r\n callId?: string;\r\n input?: unknown;\r\n output?: unknown;\r\n status?: \"pending\" | \"complete\" | \"error\";\r\n}\r\n\r\ninterface TurnMeta {\r\n id?: string;\r\n internal: boolean;\r\n}\r\n\r\n/** 将未知值收窄为普通对象。 */\r\nfunction record(value: unknown): Record<string, unknown> | undefined {\r\n return value && typeof value === \"object\" && !Array.isArray(value)\r\n ? value as Record<string, unknown>\r\n : undefined;\r\n}\r\n\r\n/** 将未知值收窄为数组。 */\r\nfunction array(value: unknown): unknown[] {\r\n return Array.isArray(value) ? value : [];\r\n}\r\n\r\n/** 返回非空字符串值。 */\r\nfunction string(value: unknown): string | undefined {\r\n return typeof value === \"string\" && value.trim() ? value : undefined;\r\n}\r\n\r\n/** 返回单值 Header 文本。 */\r\nfunction header(value: HeaderValue | undefined): string | undefined {\r\n return string(Array.isArray(value) ? value[0] : value);\r\n}\r\n\r\n/** 安全解析 JSON 字符串。 */\r\nfunction json(value: unknown): unknown {\r\n if (typeof value !== \"string\") {\r\n return value;\r\n }\r\n try {\r\n return JSON.parse(value) as unknown;\r\n } catch {\r\n return value;\r\n }\r\n}\r\n\r\n/** 生成可用于消息去重的稳定文本。 */\r\nfunction stable(value: unknown): string {\r\n try {\r\n return JSON.stringify(value) ?? String(value);\r\n } catch {\r\n return String(value);\r\n }\r\n}\r\n\r\n/** 判断文本是否属于 Agent 注入的运行环境上下文。 */\r\nfunction isContext(text: string): boolean {\r\n const value = text.trim();\r\n return value.startsWith(\"<system-reminder>\")\r\n || value.startsWith(\"<environment_context>\")\r\n || value.startsWith(\"<in-app-browser-context\")\r\n || value.startsWith(\"<recommended_plugins>\")\r\n || value.startsWith(\"<skills_instructions>\")\r\n || value.startsWith(\"# AGENTS.md instructions\");\r\n}\r\n\r\n/** 在缺少结构化元数据时,判断 Claude 请求是否为内部任务。 */\r\nfunction isInternalText(text: string): boolean {\r\n return text.includes(\"Write the title in the predominant language\")\r\n || text.includes(\"Generate a concise, single-line task title\")\r\n || text.includes(\"The user stepped away and is coming back. Recap\");\r\n}\r\n\r\n/** 从多形态内容中提取可展示文本,并排除运行环境注入内容。 */\r\nfunction contentText(value: unknown): string | undefined {\r\n if (typeof value === \"string\") {\r\n return isContext(value) ? undefined : string(value);\r\n }\r\n\r\n const parts = array(value)\r\n .map((item) => record(item))\r\n .filter((item) => item?.type === \"text\" || item?.type === \"input_text\" || item?.type === \"output_text\")\r\n .map((item) => string(item?.text))\r\n .filter((text): text is string => typeof text === \"string\" && !isContext(text));\r\n return string(parts.join(\"\\n\\n\"));\r\n}\r\n\r\n/** 从系统提示词的字符串或内容块中提取完整文本。 */\r\nfunction promptText(value: unknown): string | undefined {\r\n if (typeof value === \"string\") {\r\n return string(value);\r\n }\r\n\r\n const parts = array(value)\r\n .map((item) => record(item))\r\n .filter((item) => item?.type === \"text\" || item?.type === \"input_text\" || item?.type === \"output_text\")\r\n .map((item) => string(item?.text))\r\n .filter((text): text is string => Boolean(text));\r\n return string(parts.join(\"\\n\\n\"));\r\n}\r\n\r\n/** 从 Claude 或 OpenAI 请求中提取系统与 Developer 提示词。 */\r\nfunction systemText(exchange: ExchangeDetail): string | undefined {\r\n const body = record(exchange?.request);\r\n const parts = [promptText(body?.system), promptText(body?.instructions)]\r\n .filter((text): text is string => Boolean(text));\r\n\r\n for (const raw of array(body?.input)) {\r\n const item = record(raw);\r\n if (item?.type !== \"message\" || (item?.role !== \"system\" && item?.role !== \"developer\")) {\r\n continue;\r\n }\r\n const text = promptText(item?.content);\r\n if (text) {\r\n parts.push(text);\r\n }\r\n }\r\n\r\n return string(parts.join(\"\\n\\n\"));\r\n}\r\n\r\n/** 从 Reasoning 或 Thinking 内容中提取文本。 */\r\nfunction reasoningText(value: Record<string, unknown>): string | undefined {\r\n const summary = array(value?.summary)\r\n .map((item) => string(record(item)?.text))\r\n .filter((text): text is string => Boolean(text));\r\n return string(summary.join(\"\\n\\n\"))\r\n ?? string(value?.thinking)\r\n ?? contentText(value?.content);\r\n}\r\n\r\n/** 将 Claude 单条 message 展开为消息、思考和工具草稿。 */\r\nfunction claudeMessage(value: unknown, responseId?: string): DraftItem[] {\r\n const message = record(value);\r\n const role = message?.role === \"user\" || message?.role === \"assistant\" ? message.role : undefined;\r\n if (!role) {\r\n return [];\r\n }\r\n\r\n const content = message?.content;\r\n const result: DraftItem[] = [];\r\n const text = contentText(content);\r\n if (text) {\r\n result.push({\r\n ...(responseId ? { sourceId: responseId } : {}),\r\n kind: \"message\",\r\n role,\r\n text,\r\n });\r\n }\r\n\r\n for (const raw of array(content)) {\r\n const item = record(raw);\r\n const type = string(item?.type);\r\n if (type === \"thinking\") {\r\n const thinking = reasoningText(item ?? {});\r\n if (thinking) {\r\n result.push({\r\n ...(responseId ? { sourceId: `${responseId}:reasoning` } : {}),\r\n kind: \"reasoning\",\r\n role: \"assistant\",\r\n text: thinking,\r\n });\r\n }\r\n }\r\n if (type === \"tool_use\") {\r\n const callId = string(item?.id);\r\n result.push({\r\n ...(callId ? { sourceId: callId, callId } : {}),\r\n kind: \"tool\",\r\n role: \"assistant\",\r\n name: string(item?.name) ?? \"tool\",\r\n input: item?.input,\r\n status: \"pending\",\r\n });\r\n }\r\n if (type === \"tool_result\") {\r\n const callId = string(item?.tool_use_id);\r\n result.push({\r\n kind: \"tool-result\",\r\n ...(callId ? { callId } : {}),\r\n output: item?.content,\r\n status: item?.is_error === true ? \"error\" : \"complete\",\r\n });\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** 将 Codex Responses item 转为统一会话草稿。 */\r\nfunction codexItem(value: unknown): DraftItem[] {\r\n const item = record(value);\r\n const type = string(item?.type);\r\n if (!type) {\r\n return [];\r\n }\r\n\r\n if (type === \"message\") {\r\n const role = item?.role === \"user\" || item?.role === \"assistant\" ? item.role : undefined;\r\n const text = role ? contentText(item?.content) : undefined;\r\n const sourceId = string(item?.id);\r\n return role && text ? [{\r\n ...(sourceId ? { sourceId } : {}),\r\n kind: \"message\",\r\n role,\r\n text,\r\n }] : [];\r\n }\r\n\r\n if (type === \"reasoning\") {\r\n const text = reasoningText(item ?? {});\r\n const sourceId = string(item?.id);\r\n return text ? [{\r\n ...(sourceId ? { sourceId } : {}),\r\n kind: \"reasoning\",\r\n role: \"assistant\",\r\n text,\r\n }] : [];\r\n }\r\n\r\n if (type.endsWith(\"_call_output\")) {\r\n const callId = string(item?.call_id);\r\n return [{\r\n kind: \"tool-result\",\r\n ...(callId ? { callId } : {}),\r\n output: item?.output,\r\n status: \"complete\",\r\n }];\r\n }\r\n\r\n if (type.endsWith(\"_call\")) {\r\n const callId = string(item?.call_id) ?? string(item?.id);\r\n const input = item?.arguments ?? item?.input ?? item?.action;\r\n return [{\r\n ...(callId ? { sourceId: callId, callId } : {}),\r\n kind: \"tool\",\r\n role: \"assistant\",\r\n name: string(item?.name) ?? type.replace(/_call$/, \"\"),\r\n input: json(input),\r\n status: \"pending\",\r\n }];\r\n }\r\n\r\n return [];\r\n}\r\n\r\n/** 提取一次请求携带的全部会话草稿。 */\r\nfunction requestItems(exchange: ExchangeDetail): DraftItem[] {\r\n const body = record(exchange?.request);\r\n if (exchange?.meta?.protocol === \"anthropic\") {\r\n return array(body?.messages).flatMap((message) => claudeMessage(message));\r\n }\r\n return array(body?.input).flatMap((item) => codexItem(item));\r\n}\r\n\r\n/** 提取一次已还原响应产生的全部会话草稿。 */\r\nfunction responseItems(exchange: ExchangeDetail): DraftItem[] {\r\n const body = record(exchange?.response);\r\n if (exchange?.meta?.protocol === \"anthropic\") {\r\n return claudeMessage(body, string(body?.id));\r\n }\r\n return array(body?.output).flatMap((item) => codexItem(item));\r\n}\r\n\r\n/** 读取 Codex Turn 元数据,并识别内部任务。 */\r\nfunction turnMeta(exchange: ExchangeDetail): TurnMeta {\r\n const body = record(exchange?.request);\r\n const client = record(body?.client_metadata);\r\n const encoded = header(exchange?.meta?.requestHeaders?.[\"x-codex-turn-metadata\"]);\r\n const metadata = record(json(encoded));\r\n const source = string(client?.thread_source) ?? string(metadata?.thread_source);\r\n const id = string(client?.turn_id) ?? string(metadata?.turn_id);\r\n const claudeInternal = exchange?.meta?.protocol === \"anthropic\"\r\n && isInternalText(requestItems(exchange)\r\n .filter((item) => item?.kind === \"message\")\r\n .map((item) => item?.text ?? \"\")\r\n .join(\"\\n\"));\r\n\r\n return {\r\n ...(id ? { id } : {}),\r\n internal: source === \"system\" || claudeInternal,\r\n };\r\n}\r\n\r\n/** 生成会话草稿的内容指纹。 */\r\nfunction fingerprint(item: DraftItem): string {\r\n return stable({\r\n kind: item?.kind,\r\n role: item?.role,\r\n text: item?.text,\r\n name: item?.name,\r\n callId: item?.callId,\r\n input: item?.input,\r\n output: item?.output,\r\n });\r\n}\r\n\r\n/** 返回数组中最后一个用户消息的位置。 */\r\nfunction lastUser(items: DraftItem[]): number {\r\n for (let index = items.length - 1; index >= 0; index -= 1) {\r\n const item = items[index];\r\n if (item?.kind === \"message\" && item?.role === \"user\") {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\n/** 返回会话最后一次请求使用的模型。 */\r\nfunction lastModel(session: SessionSummary): string | undefined {\r\n for (let index = session.exchanges.length - 1; index >= 0; index -= 1) {\r\n const model = session.exchanges[index]?.model;\r\n if (model) {\r\n return model;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nclass Builder {\r\n private readonly session: SessionSummary;\r\n private readonly turns: ConversationTurn[] = [];\r\n private readonly turnMap = new Map<string, ConversationTurn>();\r\n private readonly tools = new Map<string, ConversationItem>();\r\n private readonly ids = new Set<string>();\r\n private readonly seen = new Set<string>();\r\n private readonly max = new Map<string, number>();\r\n private systemPrompt?: ConversationSystemPrompt;\r\n private current?: ConversationTurn;\r\n private turnSeq = 0;\r\n private itemSeq = 0;\r\n\r\n /** 创建指定会话的增量还原状态。 */\r\n constructor(session: SessionSummary) {\r\n this.session = session;\r\n }\r\n\r\n /** 将一次 Exchange 合并到当前会话。 */\r\n add(exchange: ExchangeDetail): void {\r\n const prompt = systemText(exchange);\r\n if (prompt && !this.systemPrompt) {\r\n this.systemPrompt = { text: prompt, exchangeIds: [exchange.meta.id] };\r\n } else if (prompt && this.systemPrompt?.text === prompt) {\r\n this.link(this.systemPrompt.exchangeIds, exchange.meta.id);\r\n }\r\n\r\n const meta = turnMeta(exchange);\r\n const input = this.snapshot(requestItems(exchange));\r\n const userIndex = lastUser(input);\r\n\r\n input.forEach((item, index) => {\r\n const newTurn = item?.kind === \"message\" && item?.role === \"user\";\r\n const explicit = newTurn && index === userIndex ? meta.id : undefined;\r\n const turn = newTurn\r\n ? this.turn(explicit, meta.internal, exchange, true)\r\n : this.turn(meta.id, meta.internal, exchange, false);\r\n this.item(turn, item, exchange);\r\n });\r\n\r\n for (const item of this.fresh(responseItems(exchange))) {\r\n const turn = this.turn(meta.id, meta.internal, exchange, false);\r\n this.item(turn, item, exchange);\r\n }\r\n\r\n if (this.current && exchange?.meta?.completedAt) {\r\n this.current.completedAt = exchange.meta.completedAt;\r\n }\r\n }\r\n\r\n /** 返回完成去重和工具关联的会话对象。 */\r\n build(): ConversationDetail {\r\n const model = lastModel(this.session);\r\n return {\r\n sessionId: this.session.id,\r\n protocol: this.session.protocol,\r\n ...(model ? { model } : {}),\r\n ...(this.systemPrompt ? { systemPrompt: this.systemPrompt } : {}),\r\n startedAt: this.session.startedAt,\r\n ...(this.session.endedAt ? { endedAt: this.session.endedAt } : {}),\r\n exchangeIds: this.session.exchanges.map((item) => item.id),\r\n turns: this.turns.filter((turn) => turn?.items?.length > 0),\r\n };\r\n }\r\n\r\n /** 从请求快照中筛选尚未出现的内容。 */\r\n private snapshot(items: DraftItem[]): DraftItem[] {\r\n const counts = new Map<string, number>();\r\n return items.filter((item) => {\r\n const base = fingerprint(item);\r\n const occurrence = (counts.get(base) ?? 0) + 1;\r\n counts.set(base, occurrence);\r\n const token = `${base}:${occurrence}`;\r\n const sourceId = item?.sourceId;\r\n const duplicate = this.seen.has(token) || Boolean(sourceId && this.ids.has(sourceId));\r\n this.seen.add(token);\r\n this.max.set(base, Math.max(this.max.get(base) ?? 0, occurrence));\r\n if (sourceId) {\r\n this.ids.add(sourceId);\r\n }\r\n return !duplicate;\r\n });\r\n }\r\n\r\n /** 将响应中的新内容加入全局去重集合。 */\r\n private fresh(items: DraftItem[]): DraftItem[] {\r\n return items.filter((item) => {\r\n const sourceId = item?.sourceId;\r\n if (sourceId && this.ids.has(sourceId)) {\r\n return false;\r\n }\r\n const base = fingerprint(item);\r\n const occurrence = (this.max.get(base) ?? 0) + 1;\r\n this.max.set(base, occurrence);\r\n this.seen.add(`${base}:${occurrence}`);\r\n if (sourceId) {\r\n this.ids.add(sourceId);\r\n }\r\n return true;\r\n });\r\n }\r\n\r\n /** 获取已有 Turn,或在需要时创建新 Turn。 */\r\n private turn(\r\n explicit: string | undefined,\r\n internal: boolean,\r\n exchange: ExchangeDetail,\r\n force: boolean,\r\n ): ConversationTurn {\r\n const known = explicit ? this.turnMap.get(explicit) : undefined;\r\n if (known && !force) {\r\n this.link(known.exchangeIds, exchange.meta.id);\r\n this.current = known;\r\n return known;\r\n }\r\n if (!force && this.current) {\r\n this.link(this.current.exchangeIds, exchange.meta.id);\r\n this.current.internal = this.current.internal && internal;\r\n return this.current;\r\n }\r\n\r\n const id = explicit ?? `${this.session.id}:turn:${++this.turnSeq}`;\r\n const turn: ConversationTurn = {\r\n id,\r\n internal,\r\n startedAt: exchange.meta.startedAt,\r\n ...(exchange.meta.completedAt ? { completedAt: exchange.meta.completedAt } : {}),\r\n exchangeIds: [exchange.meta.id],\r\n items: [],\r\n };\r\n this.turns.push(turn);\r\n this.turnMap.set(id, turn);\r\n this.current = turn;\r\n return turn;\r\n }\r\n\r\n /** 将草稿追加为消息、思考或工具节点。 */\r\n private item(turn: ConversationTurn, draft: DraftItem, exchange: ExchangeDetail): void {\r\n if (draft?.kind === \"tool-result\") {\r\n this.toolResult(turn, draft, exchange);\r\n return;\r\n }\r\n\r\n if (draft?.kind === \"tool\") {\r\n const callId = draft?.callId;\r\n const known = callId ? this.tools.get(callId) : undefined;\r\n if (known) {\r\n known.input ??= draft.input;\r\n this.link(known.exchangeIds, exchange.meta.id);\r\n return;\r\n }\r\n }\r\n\r\n const item: ConversationItem = {\r\n id: draft?.sourceId ?? `${exchange.meta.id}:item:${++this.itemSeq}`,\r\n kind: draft.kind as ConversationKind,\r\n ...(draft.role ? { role: draft.role } : {}),\r\n ...(draft.text ? { text: draft.text } : {}),\r\n ...(draft.name ? { name: draft.name } : {}),\r\n ...(draft.callId ? { callId: draft.callId } : {}),\r\n ...(draft.input !== undefined ? { input: draft.input } : {}),\r\n ...(draft.output !== undefined ? { output: draft.output } : {}),\r\n ...(draft.status ? { status: draft.status } : {}),\r\n startedAt: exchange.meta.startedAt,\r\n exchangeIds: [exchange.meta.id],\r\n };\r\n turn.items.push(item);\r\n if (item.kind === \"tool\" && item.callId) {\r\n this.tools.set(item.callId, item);\r\n }\r\n }\r\n\r\n /** 将工具结果绑定到同一调用卡片。 */\r\n private toolResult(turn: ConversationTurn, draft: DraftItem, exchange: ExchangeDetail): void {\r\n const known = draft?.callId ? this.tools.get(draft.callId) : undefined;\r\n if (known) {\r\n known.output = draft.output;\r\n known.status = draft.status ?? \"complete\";\r\n this.link(known.exchangeIds, exchange.meta.id);\r\n this.link(turn.exchangeIds, exchange.meta.id);\r\n return;\r\n }\r\n\r\n this.item(turn, {\r\n kind: \"tool\",\r\n role: \"assistant\",\r\n name: \"tool\",\r\n ...(draft?.callId ? { callId: draft.callId } : {}),\r\n output: draft.output,\r\n status: draft.status ?? \"complete\",\r\n }, exchange);\r\n }\r\n\r\n /** 向 ID 列表追加不重复的 Exchange。 */\r\n private link(ids: string[], id: string): void {\r\n if (!ids.includes(id)) {\r\n ids.push(id);\r\n }\r\n }\r\n}\r\n\r\n/** 从按时间排序的 Exchange 中还原完整会话。 */\r\nexport function buildConversation(\r\n session: SessionSummary,\r\n exchanges: ExchangeDetail[],\r\n): ConversationDetail {\r\n const builder = new Builder(session);\r\n const ordered = [...exchanges].sort((left, right) => left.meta.startedAt.localeCompare(right.meta.startedAt));\r\n ordered.forEach((exchange) => builder.add(exchange));\r\n return builder.build();\r\n}\r\n","/** 本文件负责管理 run 与 exchange 的目录生命周期。 */\r\n\r\nimport { mkdir } from \"node:fs/promises\";\r\nimport { join } from \"node:path\";\r\nimport type { ExchangeMeta, RunMeta } from \"@tracelet/shared\";\r\nimport { getRunDir, writeJson } from \"./files.js\";\r\nimport { ExchangeWriter } from \"./writer.js\";\r\n\r\nexport class FileStore {\r\n readonly root: string;\r\n private readonly runs = new Map<string, string>();\r\n\r\n /** 创建指定数据目录的文件存储。 */\r\n constructor(root: string) {\r\n this.root = root;\r\n }\r\n\r\n /** 初始化存储根目录。 */\r\n async init(): Promise<void> {\r\n await mkdir(join(this.root, \"runs\"), { recursive: true });\r\n }\r\n\r\n /** 创建一次运行记录并返回其目录。 */\r\n async startRun(run: RunMeta): Promise<string> {\r\n const dir = getRunDir(this.root, run.startedAt, run.id);\r\n this.runs.set(run.id, dir);\r\n await writeJson(join(dir, \"run.json\"), run);\r\n return dir;\r\n }\r\n\r\n /** 更新一次运行的结束状态。 */\r\n async finishRun(run: RunMeta): Promise<void> {\r\n const dir = this.runs.get(run.id) ?? getRunDir(this.root, run.startedAt, run.id);\r\n await writeJson(join(dir, \"run.json\"), run);\r\n }\r\n\r\n /** 为一次模型请求创建独立的追加写入器。 */\r\n async startExchange(meta: ExchangeMeta): Promise<ExchangeWriter> {\r\n const runDir = this.runs.get(meta.runId);\r\n if (!runDir) {\r\n throw new Error(`运行不存在:${meta.runId}`);\r\n }\r\n\r\n const writer = new ExchangeWriter(join(runDir, \"exchanges\", meta.id), meta);\r\n await writer.init();\r\n return writer;\r\n }\r\n}\r\n","/** 本文件负责把请求、响应、chunk 和 SSE 事件追加到本地文件。 */\r\n\r\nimport { mkdir, open, type FileHandle } from \"node:fs/promises\";\r\nimport { join } from \"node:path\";\r\nimport type { ChunkRow, ExchangeMeta, SseRow } from \"@tracelet/shared\";\r\nimport { writeJson } from \"./files.js\";\r\n\r\ntype Side = \"request\" | \"response\";\r\n\r\nexport class ExchangeWriter {\r\n readonly dir: string;\r\n private meta: ExchangeMeta;\r\n private req?: FileHandle;\r\n private reqIndex?: FileHandle;\r\n private res?: FileHandle;\r\n private resIndex?: FileHandle;\r\n private eventFile?: FileHandle;\r\n private reqSeq = 0;\r\n private resSeq = 0;\r\n private reqOffset = 0;\r\n private resOffset = 0;\r\n private pending = Promise.resolve();\r\n private writeError?: Error;\r\n\r\n /** 创建一个 exchange 文件写入器。 */\r\n constructor(dir: string, meta: ExchangeMeta) {\r\n this.dir = dir;\r\n this.meta = meta;\r\n }\r\n\r\n /** 创建目录并打开全部追加文件。 */\r\n async init(): Promise<void> {\r\n await mkdir(this.dir, { recursive: true });\r\n [this.req, this.reqIndex, this.res, this.resIndex, this.eventFile] = await Promise.all([\r\n open(join(this.dir, \"request.bin\"), \"a\"),\r\n open(join(this.dir, \"request-chunks.jsonl\"), \"a\"),\r\n open(join(this.dir, \"response.bin\"), \"a\"),\r\n open(join(this.dir, \"response-chunks.jsonl\"), \"a\"),\r\n open(join(this.dir, \"sse-events.jsonl\"), \"a\"),\r\n ]);\r\n await writeJson(join(this.dir, \"meta.json\"), this.meta);\r\n }\r\n\r\n /** 追加一个请求 body chunk,并返回其索引。 */\r\n addReq(chunk: Uint8Array, tUs: number): number {\r\n return this.addChunk(\"request\", chunk, tUs);\r\n }\r\n\r\n /** 追加一个响应 body chunk,并返回其索引。 */\r\n addRes(chunk: Uint8Array, tUs: number): number {\r\n return this.addChunk(\"response\", chunk, tUs);\r\n }\r\n\r\n /** 将解析完成的 SSE 事件追加到事件日志。 */\r\n addEvent(event: SseRow): void {\r\n this.enqueue(async () => {\r\n await this.eventFile?.write(`${JSON.stringify(event)}\\n`);\r\n });\r\n }\r\n\r\n /** 合并并持久化 exchange 元数据。 */\r\n patch(next: Partial<ExchangeMeta>): void {\r\n this.meta = { ...this.meta, ...next };\r\n const snapshot = { ...this.meta };\r\n\r\n this.enqueue(async () => {\r\n await writeJson(join(this.dir, \"meta.json\"), snapshot);\r\n });\r\n }\r\n\r\n /** 保存由官方 SDK 生成的完整响应对象。 */\r\n saveResponse(response: unknown): void {\r\n this.enqueue(async () => {\r\n await writeJson(join(this.dir, \"reconstructed.json\"), response);\r\n });\r\n }\r\n\r\n /** 等待全部写入完成并关闭文件。 */\r\n async close(): Promise<Error | undefined> {\r\n await this.pending;\r\n if (this.writeError) {\r\n this.meta = { ...this.meta, captureComplete: false, error: this.writeError.message };\r\n await writeJson(join(this.dir, \"meta.json\"), this.meta);\r\n }\r\n await Promise.all([\r\n this.req?.close(),\r\n this.reqIndex?.close(),\r\n this.res?.close(),\r\n this.resIndex?.close(),\r\n this.eventFile?.close(),\r\n ]);\r\n return this.writeError;\r\n }\r\n\r\n /** 追加原始字节和对应 chunk 索引。 */\r\n private addChunk(side: Side, chunk: Uint8Array, tUs: number): number {\r\n const data = Buffer.from(chunk);\r\n const seq = side === \"request\" ? this.reqSeq++ : this.resSeq++;\r\n const offset = side === \"request\" ? this.reqOffset : this.resOffset;\r\n const row: ChunkRow = { seq, tUs, offset, length: data.byteLength };\r\n\r\n if (side === \"request\") {\r\n this.reqOffset += data.byteLength;\r\n } else {\r\n this.resOffset += data.byteLength;\r\n }\r\n\r\n this.enqueue(async () => {\r\n const body = side === \"request\" ? this.req : this.res;\r\n const index = side === \"request\" ? this.reqIndex : this.resIndex;\r\n await body?.write(data);\r\n await index?.write(`${JSON.stringify(row)}\\n`);\r\n });\r\n\r\n return seq;\r\n }\r\n\r\n /** 串行执行文件操作,避免同一 exchange 内的写入乱序。 */\r\n private enqueue(task: () => Promise<void>): void {\r\n this.pending = this.pending.then(task).catch((error: unknown) => {\r\n this.writeError = error instanceof Error ? error : new Error(String(error));\r\n });\r\n }\r\n}\r\n","/** 本文件负责处理 Dashboard 使用的本地只读 API。 */\r\n\r\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\r\nimport { getConversation, getExchange, listSessions } from \"@tracelet/storage\";\r\nimport { LiveBus } from \"./live.js\";\r\n\r\n/** 返回 JSON 响应。 */\r\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\r\n res.writeHead(status, {\r\n \"content-type\": \"application/json; charset=utf-8\",\r\n \"cache-control\": \"no-store\",\r\n });\r\n res.end(JSON.stringify(body));\r\n}\r\n\r\n/** 处理一个 Dashboard API 请求,并返回是否已匹配。 */\r\nexport async function serveApi(\r\n req: IncomingMessage,\r\n res: ServerResponse,\r\n pathname: string,\r\n dataDir: string,\r\n live: LiveBus,\r\n): Promise<boolean> {\r\n if (req.method === \"GET\" && pathname === \"/api/live\") {\r\n live.connect(res);\r\n return true;\r\n }\r\n\r\n if (req.method === \"GET\" && pathname === \"/api/sessions\") {\r\n sendJson(res, 200, { sessions: await listSessions(dataDir) });\r\n return true;\r\n }\r\n\r\n const conversationMatch = pathname.match(/^\\/api\\/conversations\\/([^/]+)$/);\r\n if (req.method === \"GET\" && conversationMatch?.[1]) {\r\n const conversation = await getConversation(dataDir, decodeURIComponent(conversationMatch[1]));\r\n sendJson(res, conversation ? 200 : 404, conversation ?? { error: \"conversation_not_found\" });\r\n return true;\r\n }\r\n\r\n const exchangeMatch = pathname.match(/^\\/api\\/exchanges\\/([^/]+)$/);\r\n if (req.method === \"GET\" && exchangeMatch?.[1]) {\r\n const exchange = await getExchange(dataDir, decodeURIComponent(exchangeMatch[1]));\r\n sendJson(res, exchange ? 200 : 404, exchange ?? { error: \"exchange_not_found\" });\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/** 本文件负责向 Dashboard 推送本地记录变化事件。 */\r\n\r\nimport type { ServerResponse } from \"node:http\";\r\n\r\nexport class LiveBus {\r\n private readonly clients = new Set<ServerResponse>();\r\n\r\n /** 注册一个 Dashboard SSE 连接。 */\r\n connect(res: ServerResponse): void {\r\n res.writeHead(200, {\r\n \"content-type\": \"text/event-stream; charset=utf-8\",\r\n \"cache-control\": \"no-cache\",\r\n connection: \"keep-alive\",\r\n });\r\n res.write(\"event: ready\\ndata: {}\\n\\n\");\r\n this.clients.add(res);\r\n const clients = this.clients;\r\n\r\n /** 连接结束时从广播集合移除客户端。 */\r\n function remove(): void {\r\n clients.delete(res);\r\n }\r\n\r\n res.once(\"close\", remove);\r\n }\r\n\r\n /** 向全部 Dashboard 连接发送数据变化通知。 */\r\n publish(type: string, data: unknown): void {\r\n const message = `event: ${type}\\ndata: ${JSON.stringify(data)}\\n\\n`;\r\n for (const client of this.clients) {\r\n client.write(message);\r\n }\r\n }\r\n\r\n /** 关闭全部 Dashboard SSE 连接。 */\r\n close(): void {\r\n for (const client of this.clients) {\r\n client.end();\r\n }\r\n this.clients.clear();\r\n }\r\n}\r\n","/** 本文件负责安全地返回 Dashboard 静态资源。 */\r\n\r\nimport type { ServerResponse } from \"node:http\";\r\nimport { readFile, stat } from \"node:fs/promises\";\r\nimport { extname, resolve, sep } from \"node:path\";\r\n\r\nconst contentTypes: Record<string, string> = {\r\n \".css\": \"text/css; charset=utf-8\",\r\n \".html\": \"text/html; charset=utf-8\",\r\n \".js\": \"text/javascript; charset=utf-8\",\r\n \".json\": \"application/json; charset=utf-8\",\r\n \".svg\": \"image/svg+xml\",\r\n};\r\n\r\n/** 判断文件路径是否位于 Dashboard 构建目录内。 */\r\nfunction isInside(root: string, file: string): boolean {\r\n return file === root || file.startsWith(`${root}${sep}`);\r\n}\r\n\r\n/** 返回静态资源;未知前端路由回退到 index.html。 */\r\nexport async function serveStatic(root: string, pathname: string, res: ServerResponse): Promise<void> {\r\n const base = resolve(root);\r\n const requested = resolve(base, `.${pathname}`);\r\n let target = requested;\r\n\r\n if (!isInside(base, requested)) {\r\n res.writeHead(403);\r\n res.end();\r\n return;\r\n }\r\n\r\n try {\r\n if ((await stat(target)).isDirectory()) {\r\n target = resolve(target, \"index.html\");\r\n }\r\n } catch {\r\n target = resolve(base, \"index.html\");\r\n }\r\n\r\n try {\r\n const body = await readFile(target);\r\n res.writeHead(200, {\r\n \"content-type\": contentTypes?.[extname(target)] ?? \"application/octet-stream\",\r\n \"cache-control\": target.endsWith(\"index.html\") ? \"no-cache\" : \"public, max-age=31536000, immutable\",\r\n });\r\n res.end(body);\r\n } catch {\r\n res.writeHead(503, { \"content-type\": \"text/plain; charset=utf-8\" });\r\n res.end(\"Dashboard 尚未构建,请先运行 pnpm build。\\n\");\r\n }\r\n}\r\n","/** 本文件负责启动 agent 子进程并保持终端及退出信号一致。 */\r\n\r\nimport { spawn } from \"node:child_process\";\r\nimport type { LaunchInfo } from \"./agents.js\";\r\n\r\n/** 启动 agent,并返回其最终退出码。 */\r\nexport async function spawnAgent(input: LaunchInfo): Promise<number> {\r\n return new Promise<number>((resolve, reject) => {\r\n const child = spawn(input.command, input.args, {\r\n env: input.env,\r\n stdio: \"inherit\",\r\n });\r\n\r\n /** 把 Ctrl+C 转发给正在运行的 agent。 */\r\n function onSigint(): void {\r\n child.kill(\"SIGINT\");\r\n }\r\n\r\n /** 把终止信号转发给正在运行的 agent。 */\r\n function onSigterm(): void {\r\n child.kill(\"SIGTERM\");\r\n }\r\n\r\n /** 清理信号监听器,避免连续运行时重复触发。 */\r\n function cleanup(): void {\r\n process.off(\"SIGINT\", onSigint);\r\n process.off(\"SIGTERM\", onSigterm);\r\n }\r\n\r\n process.on(\"SIGINT\", onSigint);\r\n process.on(\"SIGTERM\", onSigterm);\r\n\r\n child.once(\"error\", (error) => {\r\n cleanup();\r\n reject(error);\r\n });\r\n child.once(\"close\", (code) => {\r\n cleanup();\r\n resolve(code ?? 1);\r\n });\r\n });\r\n}\r\n","/** 本文件负责读取 macOS 和 Windows 当前用户的固定系统代理。 */\r\n\r\nimport { execFile } from \"node:child_process\";\r\nimport { promisify } from \"node:util\";\r\n\r\nconst exec = promisify(execFile);\r\nconst winKey = \"HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Internet Settings\";\r\n\r\n/** 从命令输出中读取一个键的值。 */\r\nfunction lineValue(output: string, key: string): string | undefined {\r\n return output.match(new RegExp(`^\\\\s*${key}\\\\s*:\\\\s*(.+?)\\\\s*$`, \"m\"))?.[1];\r\n}\r\n\r\n/** 将主机和端口转换为 HTTP 代理 URL。 */\r\nfunction proxyUrl(value: string | undefined): string | undefined {\r\n const input = value?.trim();\r\n if (!input) {\r\n return undefined;\r\n }\r\n\r\n try {\r\n const url = new URL(/^[a-z]+:\\/\\//i.test(input) ? input : `http://${input}`);\r\n return url.protocol === \"http:\" || url.protocol === \"https:\"\r\n ? url.toString().replace(/\\/$/, \"\")\r\n : undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n/** 解析 scutil 输出中的固定 HTTPS 或 HTTP 系统代理。 */\r\nexport function parseMacProxy(output: string): string | undefined {\r\n /** 读取一个已启用协议的代理地址。 */\r\n function read(kind: \"HTTP\" | \"HTTPS\"): string | undefined {\r\n if (lineValue(output, `${kind}Enable`) !== \"1\") {\r\n return undefined;\r\n }\r\n const host = lineValue(output, `${kind}Proxy`);\r\n const port = lineValue(output, `${kind}Port`);\r\n return host && /^\\d+$/.test(port ?? \"\") ? proxyUrl(`${host}:${port}`) : undefined;\r\n }\r\n\r\n return read(\"HTTPS\") ?? read(\"HTTP\");\r\n}\r\n\r\n/** 从 reg query 输出中读取指定注册表值。 */\r\nfunction regValue(output: string, key: string): string | undefined {\r\n return output.match(new RegExp(`^\\\\s*${key}\\\\s+REG_[A-Z_]+\\\\s+(.+?)\\\\s*$`, \"mi\"))?.[1];\r\n}\r\n\r\n/** 解析 Windows 当前用户的固定系统代理。 */\r\nexport function parseWindowsProxy(output: string): string | undefined {\r\n const enabled = Number.parseInt(regValue(output, \"ProxyEnable\") ?? \"0\", 0) === 1;\r\n const server = regValue(output, \"ProxyServer\")?.trim();\r\n if (!enabled || !server) {\r\n return undefined;\r\n }\r\n\r\n if (!server.includes(\"=\")) {\r\n return proxyUrl(server);\r\n }\r\n\r\n const endpoints = new Map<string, string>();\r\n for (const item of server.split(\";\")) {\r\n const [name, value] = item.split(\"=\", 2);\r\n if (name && value) {\r\n endpoints.set(name.trim().toLowerCase(), value.trim());\r\n }\r\n }\r\n return proxyUrl(endpoints.get(\"https\")) ?? proxyUrl(endpoints.get(\"http\"));\r\n}\r\n\r\n/** 按当前操作系统读取固定系统代理,读取失败时返回直连。 */\r\nexport async function systemProxy(platform = process.platform): Promise<string | undefined> {\r\n try {\r\n if (platform === \"darwin\") {\r\n const result = await exec(\"/usr/sbin/scutil\", [\"--proxy\"]);\r\n return parseMacProxy(result.stdout);\r\n }\r\n if (platform === \"win32\") {\r\n const result = await exec(\"reg.exe\", [\"query\", winKey]);\r\n return parseWindowsProxy(result.stdout);\r\n }\r\n return undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n","/** 本文件负责组合本地服务、运行记录与 agent 子进程生命周期。 */\r\n\r\nimport type { RunMeta } from \"@tracelet/shared\";\r\nimport { makeId, nowIso } from \"@tracelet/shared\";\r\nimport { TraceletServer } from \"@tracelet/server\";\r\nimport { agents, customAdapter } from \"./agents.js\";\r\nimport { dashboardDir, dataDir } from \"./paths.js\";\r\nimport { loadSettings, proxyMode } from \"./settings.js\";\r\nimport { spawnAgent } from \"./spawn.js\";\r\nimport { systemProxy } from \"./system-proxy.js\";\r\n\r\nexport interface RunOptions {\r\n port: number;\r\n dataDir?: string;\r\n}\r\n\r\n/** 启动 Tracelet 服务和指定 agent,并在退出前完成记录落盘。 */\r\nexport async function runAgent(agentId: string, args: string[], options: RunOptions): Promise<number> {\r\n const settings = await loadSettings();\r\n const adapter = agentId === \"claude\" || agentId === \"codex\" ? agents[agentId]\r\n : settings.customAgents[agentId] ? customAdapter(agentId, settings.customAgents[agentId])\r\n : undefined;\r\n if (!adapter) {\r\n throw new Error(`Unknown agent: ${agentId}`);\r\n }\r\n if (!(await adapter.detect())) {\r\n throw new Error(`${adapter.label} command not found: ${adapter.command}`);\r\n }\r\n\r\n const mode = proxyMode(settings, agentId);\r\n // 仅在启用且成功发现系统代理时传递代理地址,否则保持原有直连行为。\r\n const proxy = mode === \"system\" ? await systemProxy() : undefined;\r\n if (mode === \"system\" && !proxy) {\r\n console.warn(\"System proxy not found. Using a direct connection.\");\r\n }\r\n\r\n const server = new TraceletServer({\r\n dataDir: dataDir(options.dataDir),\r\n dashboardDir: dashboardDir(),\r\n });\r\n await server.listen(options.port);\r\n\r\n const run: RunMeta = {\r\n id: makeId(\"run\"),\r\n agent: adapter.id,\r\n agentLabel: adapter.label,\r\n cwd: process.cwd(),\r\n command: adapter.command,\r\n startedAt: nowIso(),\r\n };\r\n const proxyUrl = await server.addRun(run, adapter.protocol, await adapter.upstream(), proxy);\r\n\r\n console.log(`Tracelet Dashboard: ${server.url()}`);\r\n console.log(`Starting ${adapter.label}...`);\r\n\r\n let exitCode = 1;\r\n try {\r\n exitCode = await spawnAgent(adapter.launch(proxyUrl, args));\r\n return exitCode;\r\n } finally {\r\n await server.finishRun({ ...run, endedAt: nowIso(), exitCode });\r\n await server.close();\r\n }\r\n}\r\n\r\n/** 启动只读 Dashboard 服务,直到用户发送终止信号。 */\r\nexport async function runDashboard(options: RunOptions): Promise<void> {\r\n const server = new TraceletServer({\r\n dataDir: dataDir(options.dataDir),\r\n dashboardDir: dashboardDir(),\r\n });\r\n await server.listen(options.port);\r\n console.log(`Tracelet Dashboard: ${server.url()}`);\r\n\r\n await new Promise<void>((resolve) => {\r\n /** 收到退出信号后结束等待。 */\r\n function stop(): void {\r\n resolve();\r\n }\r\n\r\n process.once(\"SIGINT\", stop);\r\n process.once(\"SIGTERM\", stop);\r\n });\r\n\r\n await server.close();\r\n}\r\n","/** 本文件是 Tracelet CLI 的程序入口。 */\r\n\r\nimport { createProgram } from \"./program.js\";\r\n\r\n/** 解析命令行并统一输出可读错误。 */\r\nasync function main(): Promise<void> {\r\n try {\r\n await createProgram().parseAsync(process.argv);\r\n } catch (error) {\r\n console.error(error instanceof Error ? error.message : String(error));\r\n process.exitCode = 1;\r\n }\r\n}\r\n\r\nawait main();\r\n"],"mappings":"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","names":["confirm","select","proxyUrl","homedir","join","mkdir","readFile","homedir","resolve","readFile","agents","mkdir","http","input","err","err","ReadableStream","encoder","err","delimiter","input","input","resolve","_MessageStream_getFinalMessage","_MessageStream_getFinalText","_MessageStream_beginRequest","_MessageStream_addStreamEvent","_MessageStream_endRequest","_MessageStream_accumulateMessage","err","chunk","__classPrivateFieldSet","__classPrivateFieldGet","isAbortError","err","castToError","APIError","APIConnectionError","castToError","BadRequestError","AuthenticationError","PermissionDeniedError","NotFoundError","ConflictError","UnprocessableEntityError","RateLimitError","InternalServerError","APIUserAbortError","APIConnectionError","APIError","APIUserAbortError","AuthenticationError","BadRequestError","ConflictError","InternalServerError","NotFoundError","PermissionDeniedError","RateLimitError","UnprocessableEntityError","kind","length","record","__classPrivateFieldSet","resolve","__classPrivateFieldGet","_EventStream_onceForEmitted","_EventStream_removeEmittedListener","_EventStream_cleanupEmittedListeners","_EventStream_handleError","_EventStream_settleTerminalEvent","hasOwn","encodeUTF8_","encodeUTF8","encoder","decodeUTF8_","decodeUTF8","levelNumbers","noop","makeLogFn","levelNumbers","noopLogger","cachedLoggers","loggerFor","hasOwn","output","content","output","makeReadableStream","ReadableStream","ReadableStreamToAsyncIterable","LineDecoder","_LineDecoder_buffer","__classPrivateFieldSet","encodeUTF8","__classPrivateFieldGet","findNewlineIndex","decodeUTF8","findDoubleNewlineIndex","APIError","isAbortError","Stream","_Stream_client","__classPrivateFieldSet","loggerFor","_iterSSEMessages","LineDecoder","__classPrivateFieldGet","makeReadableStream","encodeUTF8","err","_Stream_cancelIterator","ReadableStreamToAsyncIterable","resolve","SSEDecoder","iterSSEChunks","findDoubleNewlineIndex","partition","delimiter","__classPrivateFieldSet","__classPrivateFieldGet","APIUserAbortError","Stream","_ResponseStream_beginRequest","_ResponseStream_addEvent","event","APIError","_ResponseStream_endRequest","input","readFile","join","mkdir","readFile","writeFile","dirname","join","input","join","readFile","mkdir","join","mkdir","join","mkdir","join","mkdir","join","dataDir","readFile","resolve","http","resolve","input","resolve","execFile","promisify","exec","input","proxyUrl","resolve","select","confirm"]}
|