@nick3/copilot-api 1.10.29 → 1.10.30
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/admin/assets/{index-BAh4eOwM.js → index-BGmG-ckX.js} +34 -34
- package/dist/admin/index.html +1 -1
- package/dist/{auth-nO-eHeO_.js → auth-CnwhQOu6.js} +2 -2
- package/dist/{auth-nO-eHeO_.js.map → auth-CnwhQOu6.js.map} +1 -1
- package/dist/{check-usage-ZifYvA3w.js → check-usage-CseltoFJ.js} +2 -2
- package/dist/{check-usage-ZifYvA3w.js.map → check-usage-CseltoFJ.js.map} +1 -1
- package/dist/{config-CmhIPHn_.js → config-XZv75uoU.js} +15 -2
- package/dist/{config-CmhIPHn_.js.map → config-XZv75uoU.js.map} +1 -1
- package/dist/{debug-DvpksqEL.js → debug-D8xHblDV.js} +2 -2
- package/dist/{debug-DvpksqEL.js.map → debug-D8xHblDV.js.map} +1 -1
- package/dist/main.js +4 -4
- package/dist/{responses-bridge-registry-BJ5Sbh6-.js → responses-bridge-registry-JjUvTCST.js} +14 -7
- package/dist/responses-bridge-registry-JjUvTCST.js.map +1 -0
- package/dist/{server-DJ3_UGc4.js → server-BYKxAFro.js} +371 -90
- package/dist/server-BYKxAFro.js.map +1 -0
- package/dist/{start-DaB0AcjZ.js → start-DVlCJ0Ma.js} +4 -4
- package/dist/{start-DaB0AcjZ.js.map → start-DVlCJ0Ma.js.map} +1 -1
- package/dist/token-9O2KJcF5.js +946 -0
- package/dist/token-9O2KJcF5.js.map +1 -0
- package/package.json +2 -2
- package/dist/responses-bridge-registry-BJ5Sbh6-.js.map +0 -1
- package/dist/server-DJ3_UGc4.js.map +0 -1
- package/dist/token-DrFDLVxa.js +0 -365
- package/dist/token-DrFDLVxa.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server-DJ3_UGc4.js","names":["CLEANUP_INTERVAL_MS","getHeaderValue","stringifyOwnerKeys","THINKING_TEXT","path","runtimeInitialized","fs","exhaustiveCheck","CHAT_COMPLETIONS_ENDPOINT","buildRequestContext","insertRequestLog","recordSelectionFailure","selectionFailureResponse","logger","CHAT_COMPLETIONS_ENDPOINT","selectionFailureResponse","handleCompletion","buildRequestContext","handleUpstreamCreateError","isNonStreaming","streamChatCompletionsAndLog","handleCompletion","selectionFailureResponse","recordSelectionFailure","logger","resolveProviderConfig","getProviderConfigResolver","parseReasoningSignature","THINKING_TEXT","logger","getProviderFetch","resolveProviderConfig","handleOutputItemAdded","handleOutputItemDone","RESPONSES_ENDPOINT","isConfiguredResponsesApiContextManagementEnabled","isConfiguredResponsesApiWebSocketEnabled","hasVisionInput","isAsyncIterable","logger","RESPONSES_ENDPOINT","streamResponsesAndLog","insertRequestLog","logger","getCodexModels","logger","isAsyncIterable"],"sources":["../src/lib/trace.ts","../src/routes/admin-api/auth-sessions.ts","../src/routes/admin-api/config-writer.ts","../src/lib/models.ts","../src/lib/copilot-rate-limit.ts","../src/lib/request-initiator.ts","../src/services/copilot/create-chat-completions.ts","../src/lib/tokenizer.ts","../src/routes/messages/preprocess.ts","../src/routes/messages/utils.ts","../src/routes/messages/non-stream-translation.ts","../src/routes/admin-api/replay-translation.ts","../src/routes/admin-api/replay.ts","../src/routes/admin-api/route.ts","../src/routes/admin/route.ts","../src/lib/approval.ts","../src/lib/handler-utils.ts","../src/lib/process-cleanup.ts","../src/lib/logger.ts","../src/lib/rate-limit.ts","../src/routes/chat-completions/support.ts","../src/routes/chat-completions/handler.ts","../src/routes/chat-completions/route.ts","../src/services/copilot/create-embeddings.ts","../src/routes/embeddings/route.ts","../src/lib/provider-model.ts","../src/routes/provider/messages/count-tokens-handler.ts","../src/routes/messages/count-tokens-handler.ts","../src/services/copilot/create-responses.ts","../src/routes/messages/responses-translation.ts","../src/routes/messages/responses-item-ownership.ts","../src/routes/messages/stream-translation.ts","../src/services/providers/provider-proxy.ts","../src/routes/provider/messages/handler.ts","../src/routes/messages/responses-stream-translation.ts","../src/routes/responses/utils.ts","../src/services/copilot/create-messages.ts","../src/lib/subagent.ts","../src/routes/messages/subagent-marker.ts","../src/routes/messages/handler.ts","../src/routes/messages/route.ts","../src/routes/models/route.ts","../src/routes/provider/messages/route.ts","../src/services/codex/get-models.ts","../src/routes/provider/models/route.ts","../src/routes/responses/stream-id-sync.ts","../src/routes/responses/handler.ts","../src/routes/responses/route.ts","../src/routes/token/route.ts","../src/routes/usage/route.ts","../src/server.ts"],"sourcesContent":["import type { MiddlewareHandler } from \"hono\"\n\nimport { requestContext, resolveTraceId } from \"./request-context\"\n\nexport const traceIdMiddleware: MiddlewareHandler = async (c, next) => {\n const traceId = resolveTraceId(c.req.header(\"x-trace-id\"))\n\n c.header(\"x-trace-id\", traceId)\n\n const context = {\n traceId,\n startTime: Date.now(),\n userAgent: c.req.header(\"user-agent\") || \"\",\n sessionAffinity:\n c.req.header(\"x-session-affinity\") ?? c.req.header(\"x-client-request-id\"),\n parentSessionId: c.req.header(\"x-parent-session-id\"),\n }\n\n await requestContext.run(context, async () => {\n await next()\n })\n}\n","// src/routes/admin-api/auth-sessions.ts\nimport consola from \"consola\"\nimport { randomUUID } from \"node:crypto\"\n\nimport type { AccountType } from \"~/lib/types/account\"\n\nimport { accountsManager } from \"~/lib/accounts-manager\"\nimport {\n addAccountToRegistry,\n listAccountsFromRegistry,\n loadRegistry,\n saveAccountToken,\n saveRegistry,\n} from \"~/lib/accounts-registry\"\nimport { normalizeDomain } from \"~/lib/api-config\"\nimport { ensurePaths } from \"~/lib/paths\"\nimport {\n getDeviceCode,\n type DeviceCodeResponse,\n} from \"~/services/github/get-device-code\"\nimport { getGitHubUser } from \"~/services/github/get-user\"\nimport { pollAccessToken } from \"~/services/github/poll-access-token\"\n\nexport type AuthSessionStatus = \"pending\" | \"completed\" | \"failed\" | \"expired\"\n\nexport interface AuthSession {\n sessionId: string\n accountType: AccountType\n enterpriseDomain: string | null\n status: AuthSessionStatus\n userCode: string\n verificationUri: string\n expiresAt: number\n interval: number\n accountId?: string\n error?: string\n abortController: AbortController\n /** The account ID being re-authenticated (null for new accounts) */\n reauthAccountId: string | null\n}\n\nexport interface StartAuthResult {\n sessionId: string\n userCode: string\n verificationUri: string\n expiresIn: number\n interval: number\n}\n\nfunction buildOauthUrls(enterpriseDomain: string | null) {\n if (!enterpriseDomain) return undefined\n const domain = normalizeDomain(enterpriseDomain)\n if (!domain) return undefined\n return {\n deviceCodeUrl: `https://${domain}/login/device/code`,\n accessTokenUrl: `https://${domain}/login/oauth/access_token`,\n }\n}\n\nconst CLEANUP_INTERVAL_MS = 60_000\n\nexport class AuthSessionManager {\n private sessions = new Map<string, AuthSession>()\n private cleanupTimer: ReturnType<typeof setInterval> | null = null\n\n start(): void {\n if (this.cleanupTimer) return\n this.cleanupTimer = setInterval(\n () => this.cleanupExpired(),\n CLEANUP_INTERVAL_MS,\n )\n }\n\n stop(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer)\n this.cleanupTimer = null\n }\n for (const session of this.sessions.values()) {\n session.abortController.abort()\n }\n this.sessions.clear()\n }\n\n async startAuth(params: {\n accountType: AccountType\n enterpriseDomain?: string\n reauthAccountId?: string\n }): Promise<StartAuthResult> {\n const enterpriseDomain =\n params.enterpriseDomain ? normalizeDomain(params.enterpriseDomain) : null\n\n const overrideUrls = buildOauthUrls(enterpriseDomain)\n\n await ensurePaths()\n const deviceResponse = await getDeviceCode({ overrideUrls })\n\n const sessionId = randomUUID()\n const abortController = new AbortController()\n const expiresAt = Date.now() + deviceResponse.expires_in * 1000\n\n const session: AuthSession = {\n sessionId,\n accountType: params.accountType,\n enterpriseDomain,\n status: \"pending\",\n userCode: deviceResponse.user_code,\n verificationUri: deviceResponse.verification_uri,\n expiresAt,\n interval: deviceResponse.interval,\n abortController,\n reauthAccountId: params.reauthAccountId ?? null,\n }\n\n this.sessions.set(sessionId, session)\n\n // Start background polling (fire and forget)\n void this.runAuthFlow(session, deviceResponse, overrideUrls)\n\n return {\n sessionId,\n userCode: deviceResponse.user_code,\n verificationUri: deviceResponse.verification_uri,\n expiresIn: deviceResponse.expires_in,\n interval: deviceResponse.interval,\n }\n }\n\n getStatus(sessionId: string): {\n status: AuthSessionStatus\n accountId?: string\n error?: string\n } | null {\n const session = this.sessions.get(sessionId)\n if (!session) return null\n\n // Check if expired\n if (session.status === \"pending\" && Date.now() >= session.expiresAt) {\n session.status = \"expired\"\n session.abortController.abort()\n }\n\n return {\n status: session.status,\n accountId: session.accountId,\n error: session.error,\n }\n }\n\n cancel(sessionId: string): boolean {\n const session = this.sessions.get(sessionId)\n if (!session) return false\n\n session.abortController.abort()\n this.sessions.delete(sessionId)\n return true\n }\n\n private getLiveSession(sessionId: string): AuthSession | null {\n const session = this.sessions.get(sessionId)\n if (!session || session.abortController.signal.aborted) {\n return null\n }\n return session\n }\n\n private async runAuthFlow(\n session: AuthSession,\n deviceResponse: DeviceCodeResponse,\n overrideUrls: ReturnType<typeof buildOauthUrls>,\n ): Promise<void> {\n try {\n const sessionId = session.sessionId\n const signal = session.abortController.signal\n\n const token = await pollAccessToken(deviceResponse, {\n overrideUrls,\n signal,\n })\n if (!this.getLiveSession(sessionId)) return\n\n const user = await getGitHubUser({\n githubToken: token,\n accountType: session.accountType,\n })\n if (!this.getLiveSession(sessionId)) return\n\n const accountId = user.login\n\n // For reauth: check if the authenticated user matches\n if (session.reauthAccountId && session.reauthAccountId !== accountId) {\n this.failSession(\n sessionId,\n `Authenticated as \"${accountId}\" but expected \"${session.reauthAccountId}\". Use \"Add Account\" to add a different account.`,\n )\n return\n }\n\n // Save token\n if (!this.getLiveSession(sessionId)) return\n await saveAccountToken(accountId, token)\n if (!this.getLiveSession(sessionId)) return\n\n // Check if account already exists in registry\n if (!this.getLiveSession(sessionId)) return\n const existingAccounts = await listAccountsFromRegistry()\n if (!this.getLiveSession(sessionId)) return\n const alreadyExists = existingAccounts.some((acc) => acc.id === accountId)\n\n // Touch registry to trigger hot-reload when the account already exists.\n if (alreadyExists) {\n const registry = await loadRegistry()\n if (!this.getLiveSession(sessionId)) return\n await saveRegistry(registry)\n } else {\n if (!this.getLiveSession(sessionId)) return\n await addAccountToRegistry({\n id: accountId,\n accountType: session.accountType,\n addedAt: Date.now(),\n })\n }\n if (!this.getLiveSession(sessionId)) return\n\n // Wait for accountsManager to pick up the new/updated account\n // before marking the session as completed, so the frontend\n // refresh will see the account immediately.\n await accountsManager.reloadRegistryNow()\n\n this.completeSession(sessionId, accountId)\n } catch (error) {\n if (session.abortController.signal.aborted) {\n // Cancelled — don't update status (session may already be removed)\n return\n }\n\n this.failSession(\n session.sessionId,\n error instanceof Error ? error.message : String(error),\n )\n consola.error(`Auth session ${session.sessionId} failed:`, error)\n }\n }\n\n private completeSession(sessionId: string, accountId: string): void {\n const session = this.sessions.get(sessionId)\n if (!session || session.abortController.signal.aborted) return\n\n session.status = \"completed\"\n session.accountId = accountId\n }\n\n private failSession(sessionId: string, error: string): void {\n const session = this.sessions.get(sessionId)\n if (!session || session.abortController.signal.aborted) return\n\n session.status = \"failed\"\n session.error = error\n }\n\n private cleanupExpired(): void {\n const now = Date.now()\n // Clean up sessions that expired more than 5 minutes ago\n const cleanupThreshold = 5 * 60_000\n\n for (const [id, session] of this.sessions) {\n if (\n session.status !== \"pending\"\n && now - session.expiresAt > cleanupThreshold\n ) {\n session.abortController.abort()\n this.sessions.delete(id)\n }\n if (session.status === \"pending\" && now >= session.expiresAt) {\n session.status = \"expired\"\n session.abortController.abort()\n }\n }\n }\n}\n\nexport const authSessionManager = new AuthSessionManager()\n","import { randomUUID } from \"node:crypto\"\nimport fs from \"node:fs/promises\"\n\nimport type { AppConfig } from \"~/lib/config\"\n\nimport { PATHS } from \"~/lib/paths\"\n\nexport async function writeConfigFile(config: AppConfig): Promise<void> {\n await fs.mkdir(PATHS.APP_DIR, { recursive: true })\n\n const content = `${JSON.stringify(config, null, 2)}\\n`\n const tmpPath = `${PATHS.CONFIG_PATH}.tmp-${randomUUID()}`\n\n try {\n await fs.writeFile(tmpPath, content, { encoding: \"utf8\", mode: 0o600 })\n try {\n await fs.chmod(tmpPath, 0o600)\n } catch {\n // Ignore chmod errors (e.g. unsupported filesystem).\n }\n await fs.rename(tmpPath, PATHS.CONFIG_PATH)\n } catch (error) {\n await fs.rm(tmpPath, { force: true }).catch(() => {})\n throw error\n }\n}\n","import type { Model } from \"~/services/copilot/get-models\"\n\nimport { accountsManager } from \"~/lib/accounts-manager\"\n\nexport const getAvailableModels = (): Array<Model> =>\n (accountsManager.getFirstAccountModels()?.data ?? []).filter(\n (model) =>\n model.model_picker_enabled || model.capabilities.type === \"embeddings\",\n )\n\nexport interface NormalizedSdkModelId {\n family: string\n version: string\n}\n\nexport const findEndpointModel = (sdkModelId: string): Model | undefined => {\n const models = getAvailableModels()\n const exactMatch = models.find((m) => m.id === sdkModelId)\n if (exactMatch) {\n return exactMatch\n }\n\n const normalized = normalizeSdkModelId(sdkModelId)\n if (!normalized) {\n return undefined\n }\n\n const modelName = `claude-${normalized.family}-${normalized.version}`\n return models.find((m) => m.id === modelName)\n}\n\n/**\n * Normalizes an SDK model ID to extract the model family and version.\n * this method from github copilot extension\n * Examples:\n * - \"claude-opus-4-5-20251101\" -> { family: \"opus\", version: \"4.5\" }\n * - \"claude-3-5-sonnet-20241022\" -> { family: \"sonnet\", version: \"3.5\" }\n * - \"claude-sonnet-4-20250514\" -> { family: \"sonnet\", version: \"4\" }\n * - \"claude-haiku-3-5-20250514\" -> { family: \"haiku\", version: \"3.5\" }\n * - \"claude-haiku-4.5\" -> { family: \"haiku\", version: \"4.5\" }\n */\nexport const normalizeSdkModelId = (\n sdkModelId: string,\n): NormalizedSdkModelId | undefined => {\n const lower = sdkModelId.toLowerCase()\n\n // Strip date suffix (8 digits at the end)\n const withoutDate = lower.replace(/-\\d{8}$/, \"\")\n\n // Pattern 1: claude-{family}-{major}.{minor} (e.g., claude-haiku-4.5)\n const pattern1 = withoutDate.match(/^claude-(\\w+)-(\\d+)\\.(\\d+)$/)\n if (pattern1) {\n return { family: pattern1[1], version: `${pattern1[2]}.${pattern1[3]}` }\n }\n\n // Pattern 2: claude-{family}-{major}-{minor} (e.g., claude-opus-4-5, claude-haiku-3-5)\n const pattern2 = withoutDate.match(/^claude-(\\w+)-(\\d+)-(\\d+)$/)\n if (pattern2) {\n return { family: pattern2[1], version: `${pattern2[2]}.${pattern2[3]}` }\n }\n\n // Pattern 3: claude-{major}-{minor}-{family} (e.g., claude-3-5-sonnet)\n const pattern3 = withoutDate.match(/^claude-(\\d+)-(\\d+)-(\\w+)$/)\n if (pattern3) {\n return { family: pattern3[3], version: `${pattern3[1]}.${pattern3[2]}` }\n }\n\n // Pattern 4: claude-{family}-{major} (e.g., claude-sonnet-4)\n const pattern4 = withoutDate.match(/^claude-(\\w+)-(\\d+)$/)\n if (pattern4) {\n return { family: pattern4[1], version: pattern4[2] }\n }\n\n // Pattern 5: claude-{major}-{family} (e.g., claude-3-opus)\n const pattern5 = withoutDate.match(/^claude-(\\d+)-(\\w+)$/)\n if (pattern5) {\n return { family: pattern5[2], version: pattern5[1] }\n }\n\n return undefined\n}\n","import consola from \"consola\"\n\nconst copilotRateLimitTypes = [\"session\", \"weekly\"] as const\n\nexport type CopilotRateLimitType = (typeof copilotRateLimitTypes)[number]\ntype HeadersMap = Record<string, string | undefined>\ntype HeadersLike = Headers | HeadersMap\ntype QuotaSnapshotMap = Record<string, unknown>\n\nexport interface CopilotRateLimitUsage {\n type: CopilotRateLimitType\n remaining: string\n resetAt: string\n}\n\nexport interface CopilotQuotaSnapshot {\n entitlement: string\n percent_remaining: number\n overage_permitted: boolean\n overage_count: number\n reset_date: string\n}\n\nconst copilotRateLimitHeaders: Record<CopilotRateLimitType, string> = {\n session: \"x-usage-ratelimit-session\",\n weekly: \"x-usage-ratelimit-weekly\",\n}\n\nconst copilotQuotaSnapshotKeys: Record<CopilotRateLimitType, string> = {\n session: \"5Hour-Session-RateLimits\",\n weekly: \"Weekly-Session-RateLimits\",\n}\n\nconst hasGetMethod = (headers: HeadersLike): headers is Headers => {\n return \"get\" in headers && typeof headers.get === \"function\"\n}\n\nconst getHeaderValue = (\n headers: HeadersLike,\n headerName: string,\n): string | null => {\n if (hasGetMethod(headers)) {\n return headers.get(headerName)\n }\n\n const normalizedHeaderName = headerName.toLowerCase()\n const matchedEntry = Object.entries(headers).find(\n ([key]) => key.toLowerCase() === normalizedHeaderName,\n )\n\n return matchedEntry?.[1] ?? null\n}\n\nexport const parseCopilotRateLimitHeader = (\n headerValue: string,\n): Omit<CopilotRateLimitUsage, \"type\"> | null => {\n const params = new URLSearchParams(headerValue)\n const remaining = params.get(\"rem\")\n const resetAt = params.get(\"rst\")\n\n if (!remaining || !resetAt) {\n return null\n }\n\n return {\n remaining,\n resetAt,\n }\n}\n\nexport const getCopilotRateLimitUsage = (\n headers: HeadersLike,\n type: CopilotRateLimitType,\n): CopilotRateLimitUsage | null => {\n const headerName = copilotRateLimitHeaders[type]\n const headerValue = getHeaderValue(headers, headerName)\n\n if (!headerValue) {\n return null\n }\n\n const parsed = parseCopilotRateLimitHeader(headerValue)\n\n if (!parsed) {\n return null\n }\n\n return {\n type,\n ...parsed,\n }\n}\n\nexport const getCopilotRateLimitUsageFromSnapshots = (\n snapshots: QuotaSnapshotMap | undefined,\n type: CopilotRateLimitType,\n): CopilotRateLimitUsage | null => {\n const snapshot = snapshots?.[copilotQuotaSnapshotKeys[type]]\n if (!isCopilotQuotaSnapshot(snapshot)) {\n return null\n }\n\n return {\n remaining: String(snapshot.percent_remaining),\n resetAt: snapshot.reset_date,\n type,\n }\n}\n\nexport const logCopilotRateLimits = (headers: HeadersLike): void => {\n for (const type of copilotRateLimitTypes) {\n const usage = getCopilotRateLimitUsage(headers, type)\n\n if (!usage) {\n continue\n }\n\n logCopilotRateLimitUsage(usage)\n }\n}\n\nexport const logCopilotQuotaSnapshots = (\n snapshots: QuotaSnapshotMap | undefined,\n): void => {\n for (const type of copilotRateLimitTypes) {\n const usage = getCopilotRateLimitUsageFromSnapshots(snapshots, type)\n\n if (!usage) {\n continue\n }\n\n logCopilotRateLimitUsage(usage)\n }\n}\n\nconst logCopilotRateLimitUsage = (usage: CopilotRateLimitUsage): void => {\n const d = new Date(usage.resetAt)\n const dateStr = Number.isNaN(d.getTime()) ? usage.resetAt : d.toLocaleString()\n consola.log(\n `Copilot ${usage.type} quota remaining: ${usage.remaining}, resets at: ${dateStr}`,\n )\n}\n\nconst isCopilotQuotaSnapshot = (\n value: unknown,\n): value is CopilotQuotaSnapshot => {\n if (!value || typeof value !== \"object\") {\n return false\n }\n\n const record = value as Record<string, unknown>\n return (\n typeof record.entitlement === \"string\"\n && typeof record.percent_remaining === \"number\"\n && typeof record.overage_permitted === \"boolean\"\n && typeof record.overage_count === \"number\"\n && typeof record.reset_date === \"string\"\n )\n}\n","export function resolveEffectiveInitiator(\n baseInitiator: \"agent\" | \"user\",\n options: {\n isCompact?: boolean\n isSubagent?: boolean\n },\n): \"agent\" | \"user\" {\n if (options.isCompact || options.isSubagent) {\n return \"agent\"\n }\n\n return baseInitiator\n}\n","import consola from \"consola\"\nimport { events } from \"fetch-event-stream\"\n\nimport type { CompactType } from \"~/lib/compact\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type { AccountContext } from \"~/lib/types/account\"\n\nimport {\n copilotBaseUrl,\n copilotHeaders,\n prepareForCompact,\n prepareInteractionHeaders,\n} from \"~/lib/api-config\"\nimport { getReasoningEffortForModel, isForceAgentEnabled } from \"~/lib/config\"\nimport { logCopilotRateLimits } from \"~/lib/copilot-rate-limit\"\nimport { HTTPError } from \"~/lib/error\"\nimport { captureOutboundHeadersSnapshot } from \"~/lib/request-context\"\nimport { resolveEffectiveInitiator } from \"~/lib/request-initiator\"\nimport { accountFromState } from \"~/lib/state\"\n\nimport { copilotFetch } from \"./copilot-fetch\"\n\nfunction isGpt5MiniFamily(modelId: string): boolean {\n return modelId === \"gpt-5-mini\" || modelId.startsWith(\"gpt-5-mini-\")\n}\n\nfunction applyDefaultReasoningEffort(\n payload: ChatCompletionsPayload,\n): ChatCompletionsPayload {\n if (!isGpt5MiniFamily(payload.model)) return payload\n\n // Only inject when omitted/null; allow callers to explicitly override.\n if (\n payload.reasoning_effort !== null\n && payload.reasoning_effort !== undefined\n )\n return payload\n\n return {\n ...payload,\n reasoning_effort: getReasoningEffortForModel(\"gpt-5-mini\"),\n }\n}\n\nexport const getChatInitiator = (\n messages: Array<Message>,\n): \"agent\" | \"user\" => {\n if (isForceAgentEnabled()) {\n const hasAgent = messages.some((msg) =>\n [\"assistant\", \"tool\"].includes(msg.role),\n )\n return hasAgent ? \"agent\" : \"user\"\n }\n\n const lastMessage = messages.at(-1)\n if (!lastMessage) return \"user\"\n\n return [\"assistant\", \"tool\"].includes(lastMessage.role) ? \"agent\" : \"user\"\n}\n\nexport const createChatCompletions = async (\n payload: ChatCompletionsPayload,\n account?: AccountContext,\n options?: {\n upstreamRequestId?: string\n initiator?: \"agent\" | \"user\"\n subagentMarker?: SubagentMarker | null\n sessionId?: string\n compactType?: CompactType\n requestId?: string\n fetchImpl?: typeof fetch\n },\n) => {\n const ctx = account ?? accountFromState()\n if (!ctx.copilotToken) throw new Error(\"Copilot token not found\")\n\n const enableVision = payload.messages.some(\n (x) =>\n typeof x.content !== \"string\"\n && x.content?.some((x) => x.type === \"image_url\"),\n )\n\n const initiator = options?.initiator ?? getChatInitiator(payload.messages)\n const isCompact = Boolean(options?.compactType)\n\n const effectiveInitiator = resolveEffectiveInitiator(initiator, {\n isCompact,\n isSubagent: Boolean(options?.subagentMarker),\n })\n\n // Build headers and add x-initiator\n const headers: Record<string, string> = {\n ...copilotHeaders(ctx, enableVision, options?.upstreamRequestId),\n \"x-initiator\": effectiveInitiator,\n }\n\n prepareInteractionHeaders(\n options?.sessionId,\n Boolean(options?.subagentMarker),\n headers,\n )\n\n const upstreamPayload = applyDefaultReasoningEffort(payload)\n\n prepareForCompact(headers, options?.compactType)\n captureOutboundHeadersSnapshot(headers)\n\n const response = await copilotFetch(\n `${copilotBaseUrl(ctx)}/chat/completions`,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(upstreamPayload),\n },\n {\n requestId: options?.requestId,\n callSite: \"chat-completions\",\n fetchImpl: options?.fetchImpl,\n },\n )\n\n logCopilotRateLimits(response.headers)\n\n if (!response.ok) {\n consola.error(\"Failed to create chat completions\", response)\n throw new HTTPError(\"Failed to create chat completions\", response)\n }\n\n if (payload.stream) {\n return events(response)\n }\n\n return (await response.json()) as ChatCompletionResponse\n}\n\n// Streaming types\n\nexport interface ChatCompletionChunk {\n id: string\n object: \"chat.completion.chunk\"\n created: number\n model: string\n choices: Array<Choice>\n system_fingerprint?: string\n usage?: {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n prompt_tokens_details?: {\n cache_creation_input_tokens?: number\n cached_tokens?: number\n }\n completion_tokens_details?: {\n accepted_prediction_tokens: number\n rejected_prediction_tokens: number\n }\n }\n}\n\nexport interface Delta {\n content?: string | null\n role?: \"user\" | \"assistant\" | \"system\" | \"tool\"\n tool_calls?: Array<{\n index: number\n id?: string\n type?: \"function\"\n function?: {\n name?: string\n arguments?: string\n }\n }>\n reasoning_text?: string | null\n reasoning_content?: string | null\n reasoning_opaque?: string | null\n}\n\nexport interface Choice {\n index: number\n delta: Delta\n finish_reason: \"stop\" | \"length\" | \"tool_calls\" | \"content_filter\" | null\n logprobs: object | null\n}\n\n// Non-streaming types\n\nexport interface ChatCompletionResponse {\n id: string\n object: \"chat.completion\"\n created: number\n model: string\n choices: Array<ChoiceNonStreaming>\n system_fingerprint?: string\n usage?: {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n prompt_tokens_details?: {\n cache_creation_input_tokens?: number\n cached_tokens?: number\n }\n }\n}\n\ninterface ResponseMessage {\n role: \"assistant\"\n content: string | null\n reasoning_text?: string | null\n reasoning_content?: string | null\n reasoning_opaque?: string | null\n tool_calls?: Array<ToolCall>\n}\n\ninterface ChoiceNonStreaming {\n index: number\n message: ResponseMessage\n logprobs: object | null\n finish_reason: \"stop\" | \"length\" | \"tool_calls\" | \"content_filter\"\n}\n\n// Payload types\n\nexport interface ChatCompletionsPayload {\n [key: string]: unknown\n\n messages: Array<Message>\n model: string\n temperature?: number | null\n top_p?: number | null\n max_tokens?: number | null\n stop?: string | Array<string> | null\n n?: number | null\n stream?: boolean | null\n\n frequency_penalty?: number | null\n presence_penalty?: number | null\n logit_bias?: Record<string, number> | null\n logprobs?: boolean | null\n response_format?: { type: \"json_object\" } | null\n seed?: number | null\n tools?: Array<Tool> | null\n tool_choice?:\n | \"none\"\n | \"auto\"\n | \"required\"\n | { type: \"function\"; function: { name: string } }\n | null\n user?: string | null\n reasoning_effort?:\n | \"none\"\n | \"minimal\"\n | \"low\"\n | \"medium\"\n | \"high\"\n | \"xhigh\"\n | null\n stream_options?: {\n include_usage?: boolean | null\n } | null\n thinking_budget?: number\n top_k?: number | null\n parallel_tool_calls?: boolean | null\n}\n\nexport interface Tool {\n type: \"function\"\n function: {\n name: string\n description?: string\n parameters: Record<string, unknown>\n }\n}\n\nexport interface Message {\n role: \"user\" | \"assistant\" | \"system\" | \"tool\" | \"developer\"\n content: string | Array<ContentPart> | null\n\n name?: string\n tool_calls?: Array<ToolCall>\n tool_call_id?: string\n reasoning_content?: string | null\n reasoning_text?: string | null\n reasoning_opaque?: string | null\n copilot_cache_control?: CopilotCacheControl\n}\n\nexport interface ToolCall {\n id: string\n type: \"function\"\n function: {\n name: string\n arguments: string\n }\n}\n\nexport type ContentPart = TextPart | ImagePart | FilePart\n\nexport interface CacheControl {\n type: \"ephemeral\"\n}\n\nexport interface CopilotCacheControl {\n type: \"ephemeral\"\n}\n\nexport interface TextPart {\n type: \"text\"\n text: string\n cache_control?: CacheControl\n}\n\nexport interface ImagePart {\n type: \"image_url\"\n image_url: {\n url: string\n detail?: \"low\" | \"high\" | \"auto\"\n }\n cache_control?: CacheControl\n}\n\nexport interface FilePart {\n type: \"file\"\n file: {\n file_data: string\n filename?: string\n }\n cache_control?: CacheControl\n}\n","import type {\n ChatCompletionsPayload,\n ContentPart,\n Message,\n Tool,\n ToolCall,\n} from \"~/services/copilot/create-chat-completions\"\nimport type { Model } from \"~/services/copilot/get-models\"\n\n// Encoder type mapping\nconst ENCODING_MAP = {\n o200k_base: () => import(\"gpt-tokenizer/encoding/o200k_base\"),\n cl100k_base: () => import(\"gpt-tokenizer/encoding/cl100k_base\"),\n p50k_base: () => import(\"gpt-tokenizer/encoding/p50k_base\"),\n p50k_edit: () => import(\"gpt-tokenizer/encoding/p50k_edit\"),\n r50k_base: () => import(\"gpt-tokenizer/encoding/r50k_base\"),\n} as const\n\ntype SupportedEncoding = keyof typeof ENCODING_MAP\n\n// Define encoder interface\ninterface Encoder {\n encode: (text: string) => Array<number>\n}\n\n// Cache loaded encoders to avoid repeated imports\nconst encodingCache = new Map<string, Encoder>()\n\n/**\n * Calculate tokens for tool calls\n */\nconst calculateToolCallsTokens = (\n toolCalls: Array<ToolCall>,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n let tokens = 0\n for (const toolCall of toolCalls) {\n tokens += constants.funcInit\n tokens += encoder.encode(toolCall.id).length\n tokens += encoder.encode(toolCall.function.name).length\n tokens += encoder.encode(toolCall.function.arguments).length\n }\n tokens += constants.funcEnd\n return tokens\n}\n\n/**\n * Calculate tokens for content parts\n */\nconst calculateContentPartsTokens = (\n contentParts: Array<ContentPart>,\n encoder: Encoder,\n): number => {\n let tokens = 0\n for (const part of contentParts) {\n if (part.type === \"image_url\") {\n tokens += encoder.encode(part.image_url.url).length + 85\n } else if (part.type === \"file\") {\n tokens += encoder.encode(part.file.file_data).length\n if (part.file.filename) {\n tokens += encoder.encode(part.file.filename).length\n }\n } else if (part.text) {\n tokens += encoder.encode(part.text).length\n }\n }\n return tokens\n}\n\n/**\n * Calculate tokens for a single message\n */\nconst calculateMessageTokens = (\n message: Message,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n const tokensPerMessage = 3\n const tokensPerName = 1\n let tokens = tokensPerMessage\n for (const [key, value] of Object.entries(message)) {\n if (key === \"reasoning_opaque\") {\n continue\n }\n if (typeof value === \"string\") {\n tokens += encoder.encode(value).length\n }\n if (key === \"name\") {\n tokens += tokensPerName\n }\n if (key === \"tool_calls\") {\n tokens += calculateToolCallsTokens(\n value as Array<ToolCall>,\n encoder,\n constants,\n )\n }\n if (key === \"content\" && Array.isArray(value)) {\n tokens += calculateContentPartsTokens(\n value as Array<ContentPart>,\n encoder,\n )\n }\n }\n return tokens\n}\n\n/**\n * Calculate tokens using custom algorithm\n */\nconst calculateTokens = (\n messages: Array<Message>,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n if (messages.length === 0) {\n return 0\n }\n let numTokens = 0\n for (const message of messages) {\n numTokens += calculateMessageTokens(message, encoder, constants)\n }\n // every reply is primed with <|start|>assistant<|message|>\n numTokens += 3\n return numTokens\n}\n\n/**\n * Get the corresponding encoder module based on encoding type\n */\nconst getEncodeChatFunction = async (encoding: string): Promise<Encoder> => {\n if (encodingCache.has(encoding)) {\n const cached = encodingCache.get(encoding)\n if (cached) {\n return cached\n }\n }\n\n const supportedEncoding = encoding as SupportedEncoding\n if (!(supportedEncoding in ENCODING_MAP)) {\n const fallbackModule = (await ENCODING_MAP.o200k_base()) as Encoder\n encodingCache.set(encoding, fallbackModule)\n return fallbackModule\n }\n\n const encodingModule = (await ENCODING_MAP[supportedEncoding]()) as Encoder\n encodingCache.set(encoding, encodingModule)\n return encodingModule\n}\n\n/**\n * Get tokenizer type from model information\n */\nexport const getTokenizerFromModel = (model: Model): string => {\n return model.capabilities.tokenizer || \"o200k_base\"\n}\n\n/**\n * Get model-specific constants for token calculation\n */\nconst getModelConstants = (model: Model) => {\n return model.id === \"gpt-3.5-turbo\" || model.id === \"gpt-4\" ?\n {\n funcInit: 10,\n propInit: 3,\n propKey: 3,\n enumInit: -3,\n enumItem: 3,\n funcEnd: 12,\n isGpt: true,\n }\n : {\n funcInit: 7,\n propInit: 3,\n propKey: 3,\n enumInit: -3,\n enumItem: 3,\n funcEnd: 12,\n isGpt: model.id.startsWith(\"gpt-\"),\n }\n}\n\n/**\n * Calculate tokens for a single parameter\n */\nconst calculateParameterTokens = (\n key: string,\n prop: unknown,\n context: {\n encoder: Encoder\n constants: ReturnType<typeof getModelConstants>\n },\n): number => {\n const { encoder, constants } = context\n let tokens = constants.propKey\n\n // Early return if prop is not an object\n if (typeof prop !== \"object\" || prop === null) {\n return tokens\n }\n\n // Type assertion for parameter properties\n const param = prop as {\n type?: string\n description?: string\n enum?: Array<unknown>\n [key: string]: unknown\n }\n\n const paramName = key\n const paramType = param.type || \"string\"\n let paramDesc = param.description || \"\"\n\n // Handle enum values\n if (param.enum && Array.isArray(param.enum)) {\n tokens += constants.enumInit\n for (const item of param.enum) {\n tokens += constants.enumItem\n tokens += encoder.encode(String(item)).length\n }\n }\n\n // Clean up description\n if (paramDesc.endsWith(\".\")) {\n paramDesc = paramDesc.slice(0, -1)\n }\n\n // Encode the main parameter line\n const line = `${paramName}:${paramType}:${paramDesc}`\n tokens += encoder.encode(line).length\n\n if (param.type === \"array\" && param[\"items\"]) {\n tokens += calculateParametersTokens(param[\"items\"], encoder, constants)\n }\n\n // Handle additional properties (excluding standard ones)\n const excludedKeys = new Set([\"type\", \"description\", \"enum\", \"items\"])\n for (const propertyName of Object.keys(param)) {\n if (!excludedKeys.has(propertyName)) {\n const propertyValue = param[propertyName]\n const propertyText =\n typeof propertyValue === \"string\" ? propertyValue : (\n JSON.stringify(propertyValue)\n )\n tokens += encoder.encode(`${propertyName}:${propertyText}`).length\n }\n }\n\n return tokens\n}\n\n/**\n * Calculate tokens for properties object\n */\nconst calculatePropertiesTokens = (\n properties: Record<string, unknown>,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n let tokens = 0\n if (Object.keys(properties).length > 0) {\n tokens += constants.propInit\n for (const propKey of Object.keys(properties)) {\n tokens += calculateParameterTokens(propKey, properties[propKey], {\n encoder,\n constants,\n })\n }\n }\n return tokens\n}\n\n/**\n * Calculate tokens for function parameters\n */\nconst calculateParametersTokens = (\n parameters: unknown,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n if (!parameters || typeof parameters !== \"object\") {\n return 0\n }\n\n const params = parameters as Record<string, unknown>\n let tokens = 0\n\n const excludedKeys = new Set([\"$schema\", \"additionalProperties\"])\n for (const [key, value] of Object.entries(params)) {\n if (excludedKeys.has(key)) {\n continue\n }\n if (key === \"properties\") {\n tokens += calculatePropertiesTokens(\n value as Record<string, unknown>,\n encoder,\n constants,\n )\n } else {\n const paramText =\n typeof value === \"string\" ? value : JSON.stringify(value)\n tokens += encoder.encode(`${key}:${paramText}`).length\n }\n }\n\n return tokens\n}\n\n/**\n * Calculate tokens for a single tool\n */\nconst calculateToolTokens = (\n tool: Tool,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n let tokens = constants.funcInit\n const func = tool.function\n const fName = func.name\n let fDesc = func.description || \"\"\n if (fDesc.endsWith(\".\")) {\n fDesc = fDesc.slice(0, -1)\n }\n const line = fName + \":\" + fDesc\n tokens += encoder.encode(line).length\n if (\n typeof func.parameters === \"object\" // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n && func.parameters !== null\n ) {\n tokens += calculateParametersTokens(func.parameters, encoder, constants)\n }\n return tokens\n}\n\n/**\n * Calculate token count for tools based on model\n */\nexport const numTokensForTools = (\n tools: Array<Tool>,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n let funcTokenCount = 0\n if (constants.isGpt) {\n for (const tool of tools) {\n funcTokenCount += calculateToolTokens(tool, encoder, constants)\n }\n funcTokenCount += constants.funcEnd\n } else {\n for (const tool of tools) {\n funcTokenCount += encoder.encode(JSON.stringify(tool)).length\n }\n }\n return funcTokenCount\n}\n\n/**\n * Calculate the token count of messages, supporting multiple GPT encoders\n */\nexport const getTokenCount = async (\n payload: ChatCompletionsPayload,\n model: Model,\n): Promise<{ input: number; output: number }> => {\n // Get tokenizer string\n const tokenizer = getTokenizerFromModel(model)\n\n // Get corresponding encoder module\n const encoder = await getEncodeChatFunction(tokenizer)\n\n const simplifiedMessages = payload.messages\n const inputMessages = simplifiedMessages.filter(\n (msg) => msg.role !== \"assistant\",\n )\n const outputMessages = simplifiedMessages.filter(\n (msg) => msg.role === \"assistant\",\n )\n\n const constants = getModelConstants(model)\n // gpt count token https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb\n let inputTokens = calculateTokens(inputMessages, encoder, constants)\n if (payload.tools && payload.tools.length > 0) {\n inputTokens += numTokensForTools(payload.tools, encoder, constants)\n }\n const outputTokens = calculateTokens(outputMessages, encoder, constants)\n\n return {\n input: inputTokens,\n output: outputTokens,\n }\n}\n","import type { Model } from \"~/services/copilot/get-models\"\n\nimport {\n COMPACT_AUTO_CONTINUE,\n COMPACT_REQUEST,\n compactAutoContinuePromptStarts,\n compactMessageSections,\n compactSummaryPromptStart,\n compactSystemPromptStarts,\n compactTextOnlyGuard,\n type CompactType,\n} from \"~/lib/compact\"\nimport { getReasoningEffortForModel } from \"~/lib/config\"\nimport { normalizeSdkModelId } from \"~/lib/models\"\n\nimport type {\n AnthropicAssistantContentBlock,\n AnthropicCacheControl,\n AnthropicDocumentBlock,\n AnthropicImageBlock,\n AnthropicInputMessage,\n AnthropicMessage,\n AnthropicMessagesPayload,\n AnthropicTextBlock,\n AnthropicToolResultBlock,\n AnthropicToolResultContentBlock,\n AnthropicUserContentBlock,\n AnthropicUserMessage,\n} from \"./anthropic-types\"\n\nexport const TOOL_REFERENCE_TURN_BOUNDARY = \"Tool loaded.\"\nconst SYSTEM_REMINDER_START = \"<system-reminder>\"\nconst SYSTEM_REMINDER_END = \"</system-reminder>\"\nconst SUBAGENT_START_HOOK_ADDITIONAL_PREFIX = \"SubagentStart hook additional\"\n\nconst IDE_EXECUTE_CODE_TOOL = \"mcp__ide__executeCode\"\nconst IDE_GET_DIAGNOSTICS_TOOL = \"mcp__ide__getDiagnostics\"\nconst IDE_GET_DIAGNOSTICS_DESCRIPTION =\n \"Get language diagnostics from VS Code. Returns errors, warnings, information, and hints for files in the workspace.\"\nconst PDF_FILE_READ_PREFIX = \"PDF file read:\"\n\ntype AnthropicAttachmentBlock = AnthropicImageBlock | AnthropicDocumentBlock\ntype AnthropicMessageContentBlock =\n | AnthropicUserContentBlock\n | AnthropicAssistantContentBlock\n\nconst createTextBlock = (text: string): AnthropicTextBlock => ({\n type: \"text\",\n text,\n})\n\nconst appendTextSegment = (base: string, addition: string): string => {\n if (base.length === 0) {\n return addition\n }\n if (addition.length === 0) {\n return base\n }\n\n return `${base}\\n\\n${addition}`\n}\n\nconst ensureSystemReminderText = (text: string): string => {\n if (text.startsWith(SYSTEM_REMINDER_START)) {\n return text\n }\n\n return `${SYSTEM_REMINDER_START}\\n${text.trim()}\\n${SYSTEM_REMINDER_END}`\n}\n\nconst normalizeSystemStringForMerge = (\n text: string,\n): string | Array<AnthropicTextBlock> => {\n if (!text.startsWith(SUBAGENT_START_HOOK_ADDITIONAL_PREFIX)) {\n return ensureSystemReminderText(text)\n }\n\n const lineBreakMatch = /\\r?\\n/.exec(text)\n if (!lineBreakMatch) {\n return [createTextBlock(ensureSystemReminderText(text))]\n }\n\n const firstLine = text.slice(0, lineBreakMatch.index)\n const rest = text.slice(lineBreakMatch.index + lineBreakMatch[0].length)\n return [\n createTextBlock(ensureSystemReminderText(firstLine)),\n ...(rest.length > 0 ?\n [createTextBlock(ensureSystemReminderText(rest))]\n : []),\n ]\n}\n\nconst normalizeSystemContentForMerge = (\n content: string | Array<AnthropicTextBlock>,\n): string | Array<AnthropicTextBlock> => {\n if (typeof content === \"string\") {\n return normalizeSystemStringForMerge(content)\n }\n\n return content.map((block) =>\n block.text.startsWith(SYSTEM_REMINDER_START) ?\n block\n : {\n ...block,\n text: ensureSystemReminderText(block.text),\n },\n )\n}\n\nconst toSystemTextBlocks = (\n content: string | Array<AnthropicTextBlock>,\n): Array<AnthropicTextBlock> => {\n return typeof content === \"string\" ? [createTextBlock(content)] : [...content]\n}\n\nconst mergeSystemPromptContent = (\n current: string | Array<AnthropicTextBlock> | undefined,\n addition: string | Array<AnthropicTextBlock>,\n): string | Array<AnthropicTextBlock> => {\n if (current === undefined) {\n return typeof addition === \"string\" ? addition : [...addition]\n }\n\n if (typeof current === \"string\" && typeof addition === \"string\") {\n return appendTextSegment(current, addition)\n }\n\n return [...toSystemTextBlocks(current), ...toSystemTextBlocks(addition)]\n}\n\nconst prependSystemContentToUserMessage = (\n message: AnthropicUserMessage,\n addition: string | Array<AnthropicTextBlock>,\n): void => {\n if (typeof message.content === \"string\" && typeof addition === \"string\") {\n message.content = appendTextSegment(addition, message.content)\n return\n }\n\n if (Array.isArray(message.content)) {\n const lastToolResultIndex = message.content.findLastIndex(\n (block) => block.type === \"tool_result\",\n )\n if (lastToolResultIndex >= 0) {\n message.content = [\n ...message.content.slice(0, lastToolResultIndex + 1),\n ...toSystemTextBlocks(addition),\n ...message.content.slice(lastToolResultIndex + 1),\n ]\n return\n }\n }\n\n message.content = [\n ...toSystemTextBlocks(addition),\n ...(typeof message.content === \"string\" ?\n [createTextBlock(message.content)]\n : message.content),\n ]\n}\n\nexport const normalizeSystemMessages = (\n payload: AnthropicMessagesPayload,\n): void => {\n if (\n !Array.isArray(payload.messages)\n || !payload.messages.some((msg) => msg.role === \"system\")\n ) {\n return\n }\n\n const normalizedMessages: Array<AnthropicMessage> = []\n let system = payload.system\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n const normalizedContent = normalizeSystemContentForMerge(message.content)\n const previousMessage = normalizedMessages.at(-1)\n if (previousMessage?.role === \"user\") {\n prependSystemContentToUserMessage(previousMessage, normalizedContent)\n } else if (!previousMessage) {\n system = mergeSystemPromptContent(system, normalizedContent)\n }\n continue\n }\n\n normalizedMessages.push(message)\n }\n\n payload.messages = normalizedMessages\n payload.system = system\n}\n\nconst isVersionAtLeast = (\n version: string,\n minimumMajor: number,\n minimumMinor: number,\n): boolean => {\n const [majorPart, minorPart = \"0\"] = version.split(\".\")\n const major = Number.parseInt(majorPart, 10)\n const minor = Number.parseInt(minorPart, 10)\n if (!Number.isInteger(major) || !Number.isInteger(minor)) {\n return false\n }\n\n return (\n major > minimumMajor || (major === minimumMajor && minor >= minimumMinor)\n )\n}\n\nconst shouldSummarizeThinkingDisplayForModel = (model: string): boolean => {\n const normalized = normalizeSdkModelId(model)\n return Boolean(normalized && isVersionAtLeast(normalized.version, 4, 7))\n}\n\ntype IndexedAttachment = {\n attachment: AnthropicAttachmentBlock\n order: number\n}\n\nconst getBlockCacheControl = (\n block: AnthropicMessageContentBlock | undefined,\n): AnthropicCacheControl | undefined => {\n if (!block || block.type === \"thinking\") {\n return undefined\n }\n\n const cacheControl = block.cache_control\n if (!cacheControl || typeof cacheControl !== \"object\") {\n return\n }\n\n return cacheControl\n}\n\nexport const getLastMessageContentCacheControl = (\n lastMessage: AnthropicInputMessage | undefined,\n): AnthropicCacheControl | undefined => {\n if (!lastMessage || !Array.isArray(lastMessage.content)) {\n return undefined\n }\n\n const cacheControl = getBlockCacheControl(lastMessage.content.at(-1))\n return cacheControl ? { ...cacheControl } : undefined\n}\n\n// Apply the original last message tail's cache_control to the rewritten tail. If\n// the original tail was not marked, fall back to a default ephemeral marker.\nexport const applyLastMessageCacheControl = (\n anthropicPayload: AnthropicMessagesPayload,\n lastMessageCacheControl: AnthropicCacheControl | undefined,\n): void => {\n const cacheControl = lastMessageCacheControl ?? {\n type: \"ephemeral\",\n }\n\n const lastMessage = anthropicPayload.messages.at(-1)\n if (!lastMessage || !Array.isArray(lastMessage.content)) {\n return\n }\n\n const lastBlock = lastMessage.content.at(-1)\n if (!lastBlock || lastBlock.type === \"thinking\" || lastBlock.cache_control) {\n return\n }\n\n lastBlock.cache_control = { ...cacheControl }\n}\n\nconst getCompactCandidateText = (message: AnthropicInputMessage): string => {\n if (message.role !== \"user\") {\n return \"\"\n }\n\n if (typeof message.content === \"string\") {\n return message.content\n }\n\n return message.content\n .filter((block): block is AnthropicTextBlock => block.type === \"text\")\n .map((block) =>\n block.text.startsWith(\"<system-reminder>\") ? \"\" : block.text,\n )\n .filter((text) => text.length > 0)\n .join(\"\\n\\n\")\n}\n\nconst isCompactMessage = (lastMessage: AnthropicInputMessage): boolean => {\n const text = getCompactCandidateText(lastMessage)\n if (!text) {\n return false\n }\n\n return (\n text.includes(compactTextOnlyGuard)\n && text.includes(compactSummaryPromptStart)\n && compactMessageSections.some((section) => text.includes(section))\n )\n}\n\nconst isCompactAutoContinueMessage = (\n lastMessage: AnthropicInputMessage,\n): boolean => {\n const text = getCompactCandidateText(lastMessage)\n return (\n Boolean(text)\n && compactAutoContinuePromptStarts.some((promptStart) =>\n text.startsWith(promptStart),\n )\n )\n}\n\nexport const getCompactType = (\n anthropicPayload: AnthropicMessagesPayload,\n): CompactType => {\n const lastMessage = anthropicPayload.messages.at(-1)\n if (lastMessage && isCompactMessage(lastMessage)) {\n return COMPACT_REQUEST\n }\n\n if (lastMessage && isCompactAutoContinueMessage(lastMessage)) {\n return COMPACT_AUTO_CONTINUE\n }\n\n const system = anthropicPayload.system\n if (typeof system === \"string\") {\n const hasCompactSystemPrompt = compactSystemPromptStarts.some(\n (promptStart) => system.startsWith(promptStart),\n )\n return hasCompactSystemPrompt ? COMPACT_REQUEST : 0\n }\n if (!Array.isArray(system)) return 0\n\n const hasCompactSystemPrompt = system.some(\n (msg) =>\n typeof msg.text === \"string\"\n && compactSystemPromptStarts.some((promptStart) =>\n msg.text.startsWith(promptStart),\n ),\n )\n if (hasCompactSystemPrompt) {\n return COMPACT_REQUEST\n }\n\n return 0\n}\n\nexport const isCompactRequest = (\n anthropicPayload: AnthropicMessagesPayload,\n): boolean => getCompactType(anthropicPayload) === COMPACT_REQUEST\n\nconst mergeContentWithText = (\n tr: AnthropicToolResultBlock,\n textBlock: AnthropicTextBlock,\n): AnthropicToolResultBlock => {\n if (typeof tr.content === \"string\") {\n return { ...tr, content: `${tr.content}\\n\\n${textBlock.text}` }\n }\n // Unable to merge, discard other text blocks, wait for the next round of re-request\n if (hasToolRef(tr)) {\n return tr\n }\n return {\n ...tr,\n content: [...tr.content, stripContentBlockCacheControl(textBlock)],\n }\n}\n\nconst mergeContentWithTexts = (\n tr: AnthropicToolResultBlock,\n textBlocks: Array<AnthropicTextBlock>,\n): AnthropicToolResultBlock => {\n if (typeof tr.content === \"string\") {\n const appendedTexts = textBlocks.map((tb) => tb.text).join(\"\\n\\n\")\n return { ...tr, content: `${tr.content}\\n\\n${appendedTexts}` }\n }\n // Unable to merge, discard other text blocks, wait for the next round of re-request\n if (hasToolRef(tr)) {\n return tr\n }\n return {\n ...tr,\n content: [...tr.content, ...textBlocks.map(stripContentBlockCacheControl)],\n }\n}\n\nconst mergeContentWithAttachments = (\n tr: AnthropicToolResultBlock,\n attachments: Array<AnthropicAttachmentBlock>,\n): AnthropicToolResultBlock => {\n const cleanAttachments = attachments.map(stripContentBlockCacheControl)\n\n if (typeof tr.content === \"string\") {\n return {\n ...tr,\n content: [{ type: \"text\", text: tr.content }, ...cleanAttachments],\n }\n }\n\n return {\n ...tr,\n content: [...tr.content, ...cleanAttachments],\n }\n}\n\nconst stripContentBlockCacheControl = <\n T extends AnthropicToolResultContentBlock,\n>(\n block: T,\n): T => {\n if (!Object.hasOwn(block, \"cache_control\")) {\n return block\n }\n\n const copy = { ...block }\n delete copy.cache_control\n return copy\n}\n\nconst isAttachmentBlock = (\n block: AnthropicUserContentBlock,\n): block is AnthropicAttachmentBlock => {\n return block.type === \"image\" || block.type === \"document\"\n}\n\nconst getMergeableToolResultIndices = (\n toolResults: Array<AnthropicToolResultBlock>,\n): Array<number> => {\n return toolResults.flatMap((block, index) =>\n block.is_error || hasToolRef(block) ? [] : [index],\n )\n}\n\nconst mergeAttachmentsIntoToolResults = (\n toolResults: Array<AnthropicToolResultBlock>,\n attachmentsByToolResultIndex: Map<number, Array<IndexedAttachment>>,\n): Array<AnthropicToolResultBlock> => {\n if (attachmentsByToolResultIndex.size === 0) {\n return toolResults\n }\n\n return toolResults.map((block, index) => {\n const matchedAttachments = attachmentsByToolResultIndex.get(index)\n if (!matchedAttachments) {\n return block\n }\n\n const orderedAttachments = [...matchedAttachments]\n .sort((left, right) => left.order - right.order)\n .map(({ attachment }) => attachment)\n\n return mergeContentWithAttachments(block, orderedAttachments)\n })\n}\n\nconst assignAttachmentsToToolResults = (\n target: Map<number, Array<IndexedAttachment>>,\n attachments: Array<IndexedAttachment>,\n options: {\n toolResultIndices: Array<number>\n fallbackToolResultIndices?: Array<number>\n },\n): void => {\n const { toolResultIndices } = options\n const fallbackToolResultIndices =\n options.fallbackToolResultIndices ?? toolResultIndices\n\n if (attachments.length === 0) {\n return\n }\n\n if (\n toolResultIndices.length > 0\n && toolResultIndices.length === attachments.length\n ) {\n for (const [index, toolResultIndex] of toolResultIndices.entries()) {\n const currentAttachments = target.get(toolResultIndex)\n if (currentAttachments) {\n currentAttachments.push(attachments[index])\n continue\n }\n\n target.set(toolResultIndex, [attachments[index]])\n }\n return\n }\n\n const lastToolResultIndex = fallbackToolResultIndices.at(-1)\n if (lastToolResultIndex === undefined) {\n return\n }\n\n const currentAttachments = target.get(lastToolResultIndex)\n if (currentAttachments) {\n currentAttachments.push(...attachments)\n return\n }\n\n target.set(lastToolResultIndex, [...attachments])\n}\n\nconst startsWithPdfFileRead = (\n toolResult: AnthropicToolResultBlock,\n): boolean => {\n if (typeof toolResult.content === \"string\") {\n return toolResult.content.startsWith(PDF_FILE_READ_PREFIX)\n }\n\n if (toolResult.content.some((block) => block.type === \"document\")) {\n return false\n }\n\n if (toolResult.content.length === 0) {\n return false\n }\n\n const firstBlock = toolResult.content[0]\n if (firstBlock.type !== \"text\") {\n return false\n }\n\n return firstBlock.text.startsWith(PDF_FILE_READ_PREFIX)\n}\n\nconst collectMergeableUserContent = (\n content: Array<AnthropicUserContentBlock>,\n): {\n toolResults: Array<AnthropicToolResultBlock>\n textBlocks: Array<AnthropicTextBlock>\n attachments: Array<IndexedAttachment>\n} | null => {\n const toolResults: Array<AnthropicToolResultBlock> = []\n const textBlocks: Array<AnthropicTextBlock> = []\n const attachments: Array<IndexedAttachment> = []\n\n for (const [order, block] of content.entries()) {\n if (block.type === \"tool_result\") {\n toolResults.push(block)\n continue\n }\n if (block.type === \"text\") {\n textBlocks.push(block)\n continue\n }\n if (isAttachmentBlock(block)) {\n attachments.push({ attachment: block, order })\n continue\n }\n\n return null\n }\n\n return {\n toolResults,\n textBlocks,\n attachments,\n }\n}\n\nconst mergeAttachmentsForToolResults = (\n toolResults: Array<AnthropicToolResultBlock>,\n attachments: Array<IndexedAttachment>,\n): Array<AnthropicToolResultBlock> => {\n if (attachments.length === 0) {\n return toolResults\n }\n\n const documentBlocks = attachments.filter(\n ({ attachment }) => attachment.type === \"document\",\n )\n const mergeableToolResultIndices = getMergeableToolResultIndices(toolResults)\n const pdfReadToolResultIndices = mergeableToolResultIndices.filter((index) =>\n startsWithPdfFileRead(toolResults[index]),\n )\n\n const attachmentsByToolResultIndex = new Map<\n number,\n Array<IndexedAttachment>\n >()\n let remainingAttachments = attachments\n let countMatchToolResultIndices = mergeableToolResultIndices\n\n // Match PDF read tool results and documents in order first, then leave any\n // unmatched documents to the generic fallback path below.\n if (documentBlocks.length > 0 && pdfReadToolResultIndices.length > 0) {\n const matchedDocumentCount = Math.min(\n pdfReadToolResultIndices.length,\n documentBlocks.length,\n )\n const matchedDocuments = documentBlocks.slice(0, matchedDocumentCount)\n const matchedDocumentOrders = new Set(\n matchedDocuments.map(({ order }) => order),\n )\n const matchedPdfToolResultIndices = pdfReadToolResultIndices.slice(\n 0,\n matchedDocumentCount,\n )\n const matchedPdfToolResultIndexSet = new Set(matchedPdfToolResultIndices)\n\n assignAttachmentsToToolResults(\n attachmentsByToolResultIndex,\n matchedDocuments,\n {\n toolResultIndices: matchedPdfToolResultIndices,\n },\n )\n countMatchToolResultIndices = mergeableToolResultIndices.filter(\n (index) => !matchedPdfToolResultIndexSet.has(index),\n )\n remainingAttachments = attachments.filter(\n ({ attachment, order }) =>\n attachment.type !== \"document\" || !matchedDocumentOrders.has(order),\n )\n }\n\n // Everything else keeps the existing count-match / last-tool-result fallback.\n assignAttachmentsToToolResults(\n attachmentsByToolResultIndex,\n remainingAttachments,\n {\n toolResultIndices: countMatchToolResultIndices,\n fallbackToolResultIndices: mergeableToolResultIndices,\n },\n )\n\n return mergeAttachmentsIntoToolResults(\n toolResults,\n attachmentsByToolResultIndex,\n )\n}\n\nconst mergeUserMessageContent = (\n content: Array<AnthropicUserContentBlock>,\n): Array<AnthropicUserContentBlock> | null => {\n const mergeableContent = collectMergeableUserContent(content)\n if (!mergeableContent) {\n return null\n }\n\n const { toolResults, textBlocks, attachments } = mergeableContent\n if (\n toolResults.length === 0\n || (textBlocks.length === 0 && attachments.length === 0)\n ) {\n return null\n }\n\n const mergedToolResults =\n textBlocks.length === 0 ?\n toolResults\n : mergeToolResult(toolResults, textBlocks)\n\n return mergeAttachmentsForToolResults(mergedToolResults, attachments)\n}\n\nconst mergeToolResult = (\n toolResults: Array<AnthropicToolResultBlock>,\n textBlocks: Array<AnthropicTextBlock>,\n): Array<AnthropicToolResultBlock> => {\n if (toolResults.length === textBlocks.length) {\n return toolResults.map((tr, i) => mergeContentWithText(tr, textBlocks[i]))\n }\n\n const lastIndex = toolResults.length - 1\n return toolResults.map((tr, i) =>\n i === lastIndex ? mergeContentWithTexts(tr, textBlocks) : tr,\n )\n}\n\nexport const stripToolReferenceTurnBoundary = (\n anthropicPayload: AnthropicMessagesPayload,\n): void => {\n for (const msg of anthropicPayload.messages) {\n if (msg.role !== \"user\" || !Array.isArray(msg.content)) continue\n\n const hasToolReference = msg.content.some(\n (block) => block.type === \"tool_result\" && hasToolRef(block),\n )\n if (!hasToolReference) continue\n\n msg.content = msg.content.filter(\n (block) =>\n block.type !== \"text\"\n || block.text.trim() !== TOOL_REFERENCE_TURN_BOUNDARY,\n )\n }\n}\n\nexport const mergeToolResultForClaude = (\n anthropicPayload: AnthropicMessagesPayload,\n options?: {\n skipLastMessage?: boolean\n },\n): void => {\n const lastMessageIndex = anthropicPayload.messages.length - 1\n\n for (const [index, msg] of anthropicPayload.messages.entries()) {\n if (options?.skipLastMessage && index === lastMessageIndex) continue\n\n if (msg.role !== \"user\" || !Array.isArray(msg.content)) continue\n\n const mergedContent = mergeUserMessageContent(msg.content)\n if (mergedContent) {\n msg.content = mergedContent\n }\n }\n}\n\n// align with vscode copilot claude agent tools\nexport const sanitizeIdeTools = (payload: AnthropicMessagesPayload): void => {\n if (!payload.tools || payload.tools.length === 0) {\n return\n }\n\n payload.tools = payload.tools.flatMap((tool) => {\n if (tool.name === IDE_EXECUTE_CODE_TOOL && !tool.defer_loading) {\n return []\n }\n\n if (tool.name === IDE_GET_DIAGNOSTICS_TOOL) {\n return [\n {\n ...tool,\n description: IDE_GET_DIAGNOSTICS_DESCRIPTION,\n },\n ]\n }\n\n return [tool]\n })\n}\n\nconst hasToolRef = (block: AnthropicToolResultBlock) => {\n return (\n Array.isArray(block.content)\n && block.content.some((c) => c.type === \"tool_reference\")\n )\n}\n\nconst stripUnsupportedCacheControl = (block: Record<string, unknown>): void => {\n const cacheControl = block.cache_control\n if (\n !cacheControl\n || typeof cacheControl !== \"object\"\n || Array.isArray(cacheControl)\n ) {\n return\n }\n\n const type = (cacheControl as { type?: unknown }).type\n if (typeof type === \"string\") {\n block.cache_control = { type }\n return\n }\n\n delete block.cache_control\n}\n\nconst stripTextBlockCacheControl = (block: unknown): void => {\n if (!block || typeof block !== \"object\" || Array.isArray(block)) {\n return\n }\n\n const record = block as Record<string, unknown>\n if (record.type !== \"text\") return\n\n stripUnsupportedCacheControl(record)\n}\n\nexport const stripCacheControl = (payload: AnthropicMessagesPayload): void => {\n if (Array.isArray(payload.system)) {\n for (const block of payload.system) {\n stripTextBlockCacheControl(block)\n }\n }\n\n for (const msg of payload.messages) {\n if (!Array.isArray(msg.content)) continue\n\n for (const block of msg.content) {\n stripTextBlockCacheControl(block)\n\n if (block.type === \"tool_result\" && Array.isArray(block.content)) {\n for (const nestedBlock of block.content) {\n stripTextBlockCacheControl(nestedBlock)\n }\n }\n }\n }\n}\n\n// Pre-request processing: filter thinking blocks for Claude models so only\n// valid thinking blocks are sent to the Copilot Messages API.\nconst filterAssistantThinkingBlocks = (\n payload: AnthropicMessagesPayload,\n): void => {\n for (const msg of payload.messages) {\n if (msg.role === \"assistant\" && Array.isArray(msg.content)) {\n msg.content = msg.content.filter((block) => {\n if (block.type !== \"thinking\") return true\n return (\n block.thinking\n && block.thinking !== \"Thinking...\"\n && block.signature\n && !block.signature.includes(\"@\")\n )\n })\n }\n }\n}\n\nexport const prepareMessagesApiPayload = (\n payload: AnthropicMessagesPayload,\n selectedModel?: Model,\n): void => {\n stripCacheControl(payload)\n filterAssistantThinkingBlocks(payload)\n\n const hasThinking = Boolean(payload.thinking)\n\n // https://platform.claude.com/docs/en/build-with-claude/extended-thinking#extended-thinking-with-tool-use\n // Using tool_choice: {\"type\": \"any\"} or tool_choice: {\"type\": \"tool\", \"name\": \"...\"} will result in an error because these options force tool use, which is incompatible with extended thinking.\n const toolChoice = payload.tool_choice\n const disableThink = toolChoice?.type === \"any\" || toolChoice?.type === \"tool\"\n\n if (selectedModel?.capabilities.supports.adaptive_thinking && !disableThink) {\n payload.thinking = {\n type: \"adaptive\",\n }\n // align with vscode copilot\n if (!hasThinking) {\n payload.thinking.display = \"summarized\"\n }\n if (shouldSummarizeThinkingDisplayForModel(payload.model)) {\n payload.thinking.display = \"summarized\"\n }\n let effort = getReasoningEffortForModel(payload.model)\n if (effort === \"none\" || effort === \"minimal\") {\n effort = \"low\"\n }\n const reasoningEffort = selectedModel.capabilities.supports.reasoning_effort\n if (reasoningEffort && !reasoningEffort.includes(effort)) {\n effort = reasoningEffort.at(-1) as \"low\" | \"medium\" | \"high\"\n }\n payload.output_config = {\n effort: effort,\n }\n }\n}\n","import type { ConsolaInstance } from \"consola\"\nimport type { Context } from \"hono\"\n\nimport type { AccountSelectionReason } from \"~/lib/accounts-manager\"\nimport type { AffinityKeySource } from \"~/lib/utils\"\nimport type { ChatCompletionsPayload } from \"~/services/copilot/create-chat-completions\"\nimport type { Model } from \"~/services/copilot/get-models\"\n\nimport { getAliasTargetSet } from \"~/lib/config\"\nimport { getRequestHistoryStore } from \"~/lib/request-history\"\nimport { getTokenCount } from \"~/lib/tokenizer\"\n\nimport type {\n AnthropicMessagesPayload,\n AnthropicResponse,\n} from \"./anthropic-types\"\nexport {\n getCompactType,\n isCompactRequest,\n mergeToolResultForClaude,\n stripCacheControl,\n} from \"./preprocess\"\n\nexport function mapOpenAIStopReasonToAnthropic(\n finishReason: \"stop\" | \"length\" | \"tool_calls\" | \"content_filter\" | null,\n): AnthropicResponse[\"stop_reason\"] {\n if (finishReason === null) {\n return null\n }\n const stopReasonMap = {\n stop: \"end_turn\",\n length: \"max_tokens\",\n tool_calls: \"tool_use\",\n content_filter: \"end_turn\",\n } as const\n return stopReasonMap[finishReason]\n}\n\nexport const estimateInputTokens = async (\n payload: ChatCompletionsPayload,\n selectedModel: Model,\n logger: Pick<ConsolaInstance, \"warn\">,\n): Promise<number | undefined> => {\n try {\n const tokenCount = await getTokenCount(payload, selectedModel)\n return tokenCount.input\n } catch (error) {\n logger.warn(\"Failed to estimate input tokens for message_start\", error)\n return undefined\n }\n}\n\ntype SelectionFailureReason = \"MODEL_NOT_SUPPORTED\" | \"NO_QUOTA\" | \"NO_ACCOUNTS\"\n\ntype SelectionFailure = {\n ok: false\n reason: SelectionFailureReason\n selectionReason?: AccountSelectionReason\n}\n\ntype SelectionFailureContext = {\n c: Context\n store: ReturnType<typeof getRequestHistoryStore>\n requestId: string\n startedAtMs: number\n method: string\n path: string\n streamRequested: boolean\n clientModel: string\n clientIp?: string\n clientIpSource?: string\n userAgent?: string\n userId?: string\n safetyIdentifier?: string\n promptCacheKey?: string\n initiator?: \"agent\" | \"user\"\n isSubagent?: boolean\n affinityKeyUsed?: string\n affinityKeySource?: AffinityKeySource\n selectionReason?: AccountSelectionReason\n responsesItemOwnerLookupKeys?: ReadonlyArray<string>\n selection: SelectionFailure\n}\n\nfunction stringifyOwnerKeys(keys?: ReadonlyArray<string>): string | undefined {\n return keys && keys.length > 0 ? JSON.stringify(keys) : undefined\n}\n\nexport const isWarmupProbeRequest = (\n payload: AnthropicMessagesPayload,\n): boolean => {\n const lastMsg = payload.messages.at(-1)\n if (!lastMsg || lastMsg.role !== \"user\" || !Array.isArray(lastMsg.content)) {\n return false\n }\n\n const lastBlock = lastMsg.content.at(-1)\n if (!lastBlock || lastBlock.type !== \"text\") {\n return false\n }\n\n const text = lastBlock.text.trim().toLowerCase()\n const isEphemeral = lastBlock.cache_control?.type === \"ephemeral\"\n if (!isEphemeral) return false\n\n if (text === \"warmup\") return true\n\n if (text === \"hello\") {\n const preludeBlocks = lastMsg.content.slice(0, -1)\n if (preludeBlocks.length === 0) return false\n\n return preludeBlocks.every(\n (block) =>\n block.type === \"text\"\n && block.text.trimStart().toLowerCase().startsWith(\"<system-reminder\"),\n )\n }\n\n return false\n}\n\nexport const handleSelectionFailure = (\n context: SelectionFailureContext,\n): Response => {\n const {\n c,\n store,\n requestId,\n startedAtMs,\n method,\n path,\n streamRequested,\n clientModel,\n clientIp,\n clientIpSource,\n userAgent,\n userId,\n safetyIdentifier,\n promptCacheKey,\n initiator,\n isSubagent,\n affinityKeyUsed,\n affinityKeySource,\n selectionReason,\n responsesItemOwnerLookupKeys,\n selection,\n } = context\n const finishedAtMs = Date.now()\n\n store.insert({\n requestId,\n startedAtMs,\n finishedAtMs,\n durationMs: finishedAtMs - startedAtMs,\n method,\n path,\n stream: streamRequested,\n clientModel,\n clientIp,\n clientIpSource,\n userAgent,\n userId,\n safetyIdentifier,\n promptCacheKey,\n initiator,\n isSubagent,\n affinityKeyUsed,\n affinityKeySource,\n responsesItemOwnerLookupKeysJson: stringifyOwnerKeys(\n responsesItemOwnerLookupKeys,\n ),\n httpStatus: selection.reason === \"MODEL_NOT_SUPPORTED\" ? 400 : 429,\n selectionReason: selectionReason ?? selection.selectionReason,\n selectionFailureReason: selection.reason,\n })\n\n if (selection.reason === \"MODEL_NOT_SUPPORTED\") {\n return c.json(\n {\n error: {\n message: `Model \"${clientModel}\" is not available for any configured account.`,\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n\n return c.json(\n {\n error: {\n message:\n \"All accounts have exhausted their quota. Please wait for quota refresh or add additional accounts.\",\n type: \"rate_limit_error\",\n },\n },\n 429,\n )\n}\n\nexport const maybeBlockOriginalModelName = (\n context: Omit<SelectionFailureContext, \"selection\">,\n): Response | null => {\n const blockedTargets = getAliasTargetSet()\n if (!blockedTargets.has(context.clientModel.toLowerCase())) {\n return null\n }\n\n return handleSelectionFailure({\n ...context,\n selection: { ok: false, reason: \"MODEL_NOT_SUPPORTED\" },\n })\n}\n","import type { ToolContentSupportType } from \"~/lib/config\"\nimport type { Model } from \"~/services/copilot/get-models\"\n\nimport { getAvailableModels } from \"~/lib/models\"\nimport {\n type ChatCompletionResponse,\n type ChatCompletionsPayload,\n type ContentPart,\n type Message,\n type TextPart,\n type Tool,\n type ToolCall,\n} from \"~/services/copilot/create-chat-completions\"\n\nimport {\n type AnthropicAssistantContentBlock,\n type AnthropicAssistantMessage,\n type AnthropicDocumentBlock,\n type AnthropicMessage,\n type AnthropicMessagesPayload,\n type AnthropicResponse,\n type AnthropicTextBlock,\n type AnthropicThinkingBlock,\n type AnthropicTool,\n type AnthropicToolResultContentBlock,\n type AnthropicToolResultBlock,\n type AnthropicToolUseBlock,\n type AnthropicUserContentBlock,\n type AnthropicUserMessage,\n} from \"./anthropic-types\"\nimport { mapOpenAIStopReasonToAnthropic } from \"./utils\"\n\n// Compatible with opencode, it will filter out blocks where the thinking text is empty, so we need add a default thinking text\nexport const THINKING_TEXT = \"Thinking...\"\nexport const RICH_TOOL_RESULT_MOVED_TEXT =\n \"Rich tool result content was moved to a user message because this upstream does not support it in tool messages.\"\nconst COPILOT_TOOL_CONTENT_SUPPORT_TYPE: Array<ToolContentSupportType> = [\n \"array\",\n \"image\",\n]\n\ninterface TranslationCapabilities {\n supportPdf: boolean\n toolContentSupportType: Array<ToolContentSupportType>\n}\n\ninterface ToolContentSupport {\n array: boolean\n image: boolean\n pdf: boolean\n}\n\ninterface ToolResultMessages {\n movedUserMessage?: Message\n toolMessage: Message\n}\n\ninterface TranslateToOpenAIOptions {\n supportPdf?: boolean\n toolContentSupportType?: Array<ToolContentSupportType>\n}\n\ntype MappableContentBlock =\n | AnthropicUserContentBlock\n | AnthropicAssistantContentBlock\n | AnthropicToolResultContentBlock\n\n// Payload translation\nexport function translateToOpenAI(\n payload: AnthropicMessagesPayload,\n options: TranslateToOpenAIOptions = {},\n): ChatCompletionsPayload {\n const modelId = payload.model\n const model = getAvailableModels().find((m) => m.id === modelId)\n const thinkingBudget = getThinkingBudget(payload, model)\n const capabilities = {\n supportPdf: options.supportPdf ?? false,\n toolContentSupportType:\n options.toolContentSupportType ?? COPILOT_TOOL_CONTENT_SUPPORT_TYPE,\n }\n return {\n model: modelId,\n messages: translateAnthropicMessagesToOpenAI(\n payload,\n modelId,\n capabilities,\n ),\n max_tokens: payload.max_tokens,\n stop: payload.stop_sequences,\n stream: payload.stream,\n temperature: payload.temperature,\n top_p: payload.top_p,\n user: payload.metadata?.user_id,\n tools: translateAnthropicToolsToOpenAI(payload.tools),\n tool_choice: translateAnthropicToolChoiceToOpenAI(payload.tool_choice),\n thinking_budget: thinkingBudget,\n }\n}\n\nfunction getThinkingBudget(\n payload: AnthropicMessagesPayload,\n model: Model | undefined,\n): number | undefined {\n const thinking = payload.thinking\n if (model && thinking) {\n const maxThinkingBudget = Math.min(\n model.capabilities.supports.max_thinking_budget ?? 0,\n (model.capabilities.limits.max_output_tokens ?? 0) - 1,\n )\n thinking.budget_tokens ??= maxThinkingBudget\n if (maxThinkingBudget > 0) {\n const budgetTokens = Math.min(thinking.budget_tokens, maxThinkingBudget)\n return Math.max(\n budgetTokens,\n model.capabilities.supports.min_thinking_budget ?? 1024,\n )\n }\n }\n return undefined\n}\n\nfunction translateAnthropicMessagesToOpenAI(\n payload: AnthropicMessagesPayload,\n modelId: string,\n capabilities: TranslationCapabilities,\n): Array<Message> {\n const systemMessages = handleSystemPrompt(payload.system)\n const otherMessages = (payload.messages as Array<AnthropicMessage>).flatMap(\n (message) =>\n message.role === \"user\" ?\n handleUserMessage(message, capabilities)\n : handleAssistantMessage(message, modelId, capabilities),\n )\n return [...systemMessages, ...otherMessages]\n}\n\nfunction handleSystemPrompt(\n system: string | Array<AnthropicTextBlock> | undefined,\n): Array<Message> {\n if (!system) {\n return []\n }\n\n if (typeof system === \"string\") {\n return [{ role: \"system\", content: system }]\n } else {\n const systemText = system\n .map((block) => {\n return block.text\n })\n .join(\"\\n\\n\")\n return [{ role: \"system\", content: systemText }]\n }\n}\n\nfunction handleUserMessage(\n message: AnthropicUserMessage,\n capabilities: TranslationCapabilities,\n): Array<Message> {\n const newMessages: Array<Message> = []\n\n if (Array.isArray(message.content)) {\n const toolResultBlocks = message.content.filter(\n (block): block is AnthropicToolResultBlock =>\n block.type === \"tool_result\",\n )\n const otherBlocks = message.content.filter(\n (block) => block.type !== \"tool_result\",\n )\n\n // Tool results must come first to maintain protocol: tool_use -> tool_result -> user\n const movedToolResultUserMessages: Array<Message> = []\n for (const block of toolResultBlocks) {\n const result = handleToolResultBlock(block, capabilities)\n newMessages.push(result.toolMessage)\n if (result.movedUserMessage) {\n movedToolResultUserMessages.push(result.movedUserMessage)\n }\n }\n newMessages.push(...movedToolResultUserMessages)\n\n if (otherBlocks.length > 0) {\n newMessages.push({\n role: \"user\",\n content: mapContent(otherBlocks, {\n supportPdf: capabilities.supportPdf,\n }),\n })\n }\n } else {\n newMessages.push({\n role: \"user\",\n content: mapContent(message.content),\n })\n }\n\n return newMessages\n}\n\nfunction handleToolResultBlock(\n block: AnthropicToolResultBlock,\n capabilities: TranslationCapabilities,\n): ToolResultMessages {\n if (typeof block.content === \"string\") {\n return {\n toolMessage: createToolMessage(block.tool_use_id, block.content),\n }\n }\n\n if (!Array.isArray(block.content)) {\n return {\n toolMessage: createToolMessage(block.tool_use_id, \"\"),\n }\n }\n\n const support = getToolContentSupport(capabilities)\n const hasImage = block.content.some((block) => block.type === \"image\")\n const hasDocument = block.content.some((block) => block.type === \"document\")\n const content = mapContent(block.content, {\n supportPdf: capabilities.supportPdf,\n })\n\n const hasPdfFile = hasDocument && capabilities.supportPdf\n const shouldMoveImageToUserMessage = hasImage && !support.image\n const shouldMovePdfToUserMessage = hasPdfFile && !support.pdf\n if (shouldMoveImageToUserMessage || shouldMovePdfToUserMessage) {\n return {\n movedUserMessage: createToolResultUserMessage(\n block,\n capabilities.supportPdf,\n ),\n toolMessage: createToolMessage(\n block.tool_use_id,\n getTextToolContent(content) || RICH_TOOL_RESULT_MOVED_TEXT,\n ),\n }\n }\n\n const hasRichContent = hasImage || hasPdfFile\n if (support.array || hasRichContent) {\n return {\n toolMessage: createToolMessage(block.tool_use_id, content),\n }\n }\n\n return {\n toolMessage: createToolMessage(\n block.tool_use_id,\n getTextToolContent(content),\n ),\n }\n}\n\nfunction getTextToolContent(content: Message[\"content\"]): string {\n if (!Array.isArray(content)) {\n return content ?? \"\"\n }\n\n return content\n .flatMap((part) =>\n part.type === \"text\" && part.text.length > 0 ? [part.text] : [],\n )\n .join(\"\\n\")\n}\n\nfunction getToolContentSupport(\n capabilities: TranslationCapabilities,\n): ToolContentSupport {\n return {\n array: capabilities.toolContentSupportType.includes(\"array\"),\n image: capabilities.toolContentSupportType.includes(\"image\"),\n pdf:\n capabilities.supportPdf\n && capabilities.toolContentSupportType.includes(\"pdf\"),\n }\n}\n\nfunction createToolMessage(\n toolCallId: string,\n content: Message[\"content\"],\n): Message {\n return {\n role: \"tool\",\n tool_call_id: toolCallId,\n content,\n }\n}\n\nfunction createToolResultUserMessage(\n block: AnthropicToolResultBlock,\n supportPdf: boolean,\n): Message {\n const prefix: TextPart = {\n type: \"text\",\n text: `Tool result for ${block.tool_use_id}:`,\n }\n const content = mapContent(block.content, {\n supportPdf,\n })\n if (Array.isArray(content)) {\n return {\n role: \"user\",\n content: [prefix, ...content],\n }\n }\n\n return {\n role: \"user\",\n content: [prefix, { type: \"text\", text: content ?? \"\" }],\n }\n}\n\nfunction handleAssistantMessage(\n message: AnthropicAssistantMessage,\n modelId: string,\n capabilities: TranslationCapabilities,\n): Array<Message> {\n if (!Array.isArray(message.content)) {\n return [\n {\n role: \"assistant\",\n content: mapContent(message.content),\n },\n ]\n }\n\n const toolUseBlocks = message.content.filter(\n (block): block is AnthropicToolUseBlock => block.type === \"tool_use\",\n )\n\n let thinkingBlocks = message.content.filter(\n (block): block is AnthropicThinkingBlock => block.type === \"thinking\",\n )\n\n if (modelId.startsWith(\"claude\")) {\n thinkingBlocks = thinkingBlocks.filter(\n (b) =>\n b.thinking\n && b.thinking !== THINKING_TEXT\n && b.signature\n // gpt signature has @ in it, so filter those out for claude models\n && !b.signature.includes(\"@\"),\n )\n }\n\n const thinkingContents = thinkingBlocks\n .filter((b) => b.thinking && b.thinking !== THINKING_TEXT)\n .map((b) => b.thinking)\n\n const allThinkingContent =\n thinkingContents.length > 0 ? thinkingContents.join(\"\\n\\n\") : undefined\n\n const signature = thinkingBlocks.find((b) => b.signature)?.signature\n\n return toolUseBlocks.length > 0 ?\n [\n {\n role: \"assistant\",\n content: mapContent(message.content, {\n supportPdf: capabilities.supportPdf,\n }),\n reasoning_text: allThinkingContent,\n reasoning_opaque: signature,\n tool_calls: toolUseBlocks.map((toolUse) => ({\n id: toolUse.id,\n type: \"function\",\n function: {\n name: toolUse.name,\n arguments: JSON.stringify(toolUse.input),\n },\n })),\n },\n ]\n : [\n {\n role: \"assistant\",\n content: mapContent(message.content, {\n supportPdf: capabilities.supportPdf,\n }),\n reasoning_text: allThinkingContent,\n reasoning_opaque: signature,\n },\n ]\n}\n\nfunction mapContent(\n content: string | Array<MappableContentBlock>,\n options: { supportPdf?: boolean } = {},\n): string | Array<ContentPart> | null {\n if (typeof content === \"string\") {\n return content\n }\n if (!Array.isArray(content)) {\n return null\n }\n\n const contentParts: Array<ContentPart> = []\n for (const block of content) {\n switch (block.type) {\n case \"text\": {\n contentParts.push({ type: \"text\", text: block.text })\n break\n }\n case \"image\": {\n contentParts.push({\n type: \"image_url\",\n image_url: {\n url: `data:${block.source.media_type};base64,${block.source.data}`,\n },\n })\n break\n }\n case \"document\": {\n contentParts.push(\n options.supportPdf ?\n createDocumentFilePart(block)\n : createDocumentTextPart(),\n )\n break\n }\n case \"tool_reference\": {\n contentParts.push({\n type: \"text\",\n text: `Tool ${block.tool_name} loaded`,\n })\n break\n }\n // No default\n }\n }\n if (contentParts.length === 0) {\n return \"\"\n }\n return contentParts\n}\n\nfunction createDocumentTextPart(): TextPart {\n return {\n type: \"text\",\n text: \"PDF/document content is not supported by this Chat Completions upstream. Use the available text extracted from the document.\",\n }\n}\n\nfunction createDocumentFilePart(block: AnthropicDocumentBlock): ContentPart {\n return {\n type: \"file\",\n file: {\n file_data: `data:${block.source.media_type};base64,${block.source.data}`,\n filename: block.title ?? \"document.pdf\",\n },\n }\n}\n\nfunction translateAnthropicToolsToOpenAI(\n anthropicTools: Array<AnthropicTool> | undefined,\n): Array<Tool> | undefined {\n if (!anthropicTools) {\n return undefined\n }\n return anthropicTools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: normalizeToolSchema(tool.input_schema),\n },\n }))\n}\n\n/**\n * Ensures `type: \"object\"` schema has a `properties` field.\n * OpenAI's API rejects object schemas without it.\n */\nexport const normalizeToolSchema = (\n schema: Record<string, unknown>,\n): Record<string, unknown> => {\n if (schema.type === \"object\" && !schema.properties) {\n return { ...schema, properties: {} }\n }\n return schema\n}\n\nfunction translateAnthropicToolChoiceToOpenAI(\n anthropicToolChoice: AnthropicMessagesPayload[\"tool_choice\"],\n): ChatCompletionsPayload[\"tool_choice\"] {\n if (!anthropicToolChoice) {\n return undefined\n }\n\n switch (anthropicToolChoice.type) {\n case \"auto\": {\n return \"auto\"\n }\n case \"any\": {\n return \"required\"\n }\n case \"tool\": {\n if (anthropicToolChoice.name) {\n return {\n type: \"function\",\n function: { name: anthropicToolChoice.name },\n }\n }\n return undefined\n }\n case \"none\": {\n return \"none\"\n }\n default: {\n return undefined\n }\n }\n}\n\n// Response translation\n\nexport function translateToAnthropic(\n response: ChatCompletionResponse,\n): AnthropicResponse {\n // Merge content from all choices\n const assistantContentBlocks: Array<AnthropicAssistantContentBlock> = []\n let stopReason = response.choices[0]?.finish_reason ?? null\n\n // Process all choices to extract text and tool use blocks\n for (const choice of response.choices) {\n const textBlocks = getAnthropicTextBlocks(choice.message.content)\n const thinkBlocks = getAnthropicThinkBlocks(\n getOpenAIReasoningText(choice.message),\n choice.message.reasoning_opaque,\n )\n const toolUseBlocks = getAnthropicToolUseBlocks(choice.message.tool_calls)\n\n assistantContentBlocks.push(...thinkBlocks, ...textBlocks, ...toolUseBlocks)\n\n // Use the finish_reason from the first choice, or prioritize tool_calls\n if (choice.finish_reason === \"tool_calls\" || stopReason === \"stop\") {\n stopReason = choice.finish_reason\n }\n }\n\n return {\n id: response.id,\n type: \"message\",\n role: \"assistant\",\n model: response.model,\n content: assistantContentBlocks,\n stop_reason: mapOpenAIStopReasonToAnthropic(stopReason),\n stop_sequence: null,\n usage: mapOpenAIChatCompletionUsage(response),\n }\n}\n\nfunction mapOpenAIChatCompletionUsage(\n response: ChatCompletionResponse,\n): AnthropicResponse[\"usage\"] {\n const promptDetails = response.usage?.prompt_tokens_details\n const promptTokens = response.usage?.prompt_tokens ?? 0\n const cachedTokens = promptDetails?.cached_tokens ?? 0\n const cacheCreationTokens = promptDetails?.cache_creation_input_tokens ?? 0\n const usage: AnthropicResponse[\"usage\"] = {\n input_tokens: Math.max(\n 0,\n promptTokens - cachedTokens - cacheCreationTokens,\n ),\n output_tokens: response.usage?.completion_tokens ?? 0,\n }\n\n if (promptDetails?.cache_creation_input_tokens !== undefined) {\n usage.cache_creation_input_tokens = cacheCreationTokens\n }\n if (promptDetails?.cached_tokens !== undefined) {\n usage.cache_read_input_tokens = cachedTokens\n }\n\n return usage\n}\n\nfunction getOpenAIReasoningText(message: {\n reasoning_content?: string | null\n reasoning_text?: string | null\n}): string | null | undefined {\n return message.reasoning_text ?? message.reasoning_content\n}\n\nfunction getAnthropicTextBlocks(\n messageContent: Message[\"content\"],\n): Array<AnthropicTextBlock> {\n if (typeof messageContent === \"string\" && messageContent.length > 0) {\n return [{ type: \"text\", text: messageContent }]\n }\n\n if (Array.isArray(messageContent)) {\n return messageContent\n .filter((part): part is TextPart => part.type === \"text\")\n .map((part) => ({ type: \"text\", text: part.text }))\n }\n\n return []\n}\n\nfunction getAnthropicThinkBlocks(\n reasoningText: string | null | undefined,\n reasoningOpaque: string | null | undefined,\n): Array<AnthropicThinkingBlock> {\n if (reasoningText && reasoningText.length > 0) {\n return [\n {\n type: \"thinking\",\n thinking: reasoningText,\n signature: reasoningOpaque || \"\",\n },\n ]\n }\n if (reasoningOpaque && reasoningOpaque.length > 0) {\n return [\n {\n type: \"thinking\",\n thinking: THINKING_TEXT, // Compatible with opencode, it will filter out blocks where the thinking text is empty, so we add a default thinking text here\n signature: reasoningOpaque,\n },\n ]\n }\n return []\n}\n\nfunction getAnthropicToolUseBlocks(\n toolCalls: Array<ToolCall> | undefined,\n): Array<AnthropicToolUseBlock> {\n if (!toolCalls) {\n return []\n }\n return toolCalls.map((toolCall) => ({\n type: \"tool_use\",\n id: toolCall.id,\n name: toolCall.function.name,\n input: JSON.parse(toolCall.function.arguments) as Record<string, unknown>,\n }))\n}\n","import type { ChatCompletionResponse } from \"~/services/copilot/create-chat-completions\"\n\nimport { translateToAnthropic } from \"~/routes/messages/non-stream-translation\"\n\nexport type TranslateForReplayInput = {\n upstreamEndpoint: string\n rawText: string\n rawKind: \"json\" | \"sse\" | \"text\"\n}\n\nexport function translateForReplay(input: TranslateForReplayInput): unknown {\n const { upstreamEndpoint, rawText, rawKind } = input\n\n // /chat/completions + json → translate OpenAI → Anthropic\n if (upstreamEndpoint.includes(\"/chat/completions\") && rawKind === \"json\") {\n const parsed = JSON.parse(rawText) as Partial<ChatCompletionResponse>\n if (!Array.isArray(parsed.choices)) {\n return parsed\n }\n return translateToAnthropic(parsed as ChatCompletionResponse)\n }\n\n // /chat/completions + sse → return raw (full SSE translation is complex, defer)\n if (upstreamEndpoint.includes(\"/chat/completions\") && rawKind === \"sse\") {\n return rawText\n }\n\n // /v1/messages → identity (raw IS anthropic format)\n if (upstreamEndpoint.includes(\"/v1/messages\")) {\n if (rawKind === \"json\") {\n return JSON.parse(rawText) as unknown\n }\n return rawText\n }\n\n // /responses → return raw (responses translation is complex, defer)\n if (upstreamEndpoint.includes(\"/responses\")) {\n return rawText\n }\n\n return null\n}\n","import { Hono, type Context } from \"hono\"\nimport { streamSSE } from \"hono/streaming\"\n\nimport type { AppConfig, DevModeConfig } from \"~/lib/config\"\nimport type { RequestLogRow } from \"~/lib/request-history\"\nimport type { OutboundCaptureRow } from \"~/lib/request-outbound\"\nimport type { AccountContext } from \"~/lib/types/account\"\n\nimport { accountsManager } from \"~/lib/accounts-manager\"\nimport { copilotHeaders } from \"~/lib/api-config\"\nimport { getConfig, mergeConfigWithDefaults } from \"~/lib/config\"\nimport { isDevModeEnabled } from \"~/lib/dev-mode\"\nimport { getRequestHistoryStore } from \"~/lib/request-history\"\nimport {\n getRedactedHeaderKeys,\n getRequestOutboundStore,\n} from \"~/lib/request-outbound\"\nimport { copilotFetch } from \"~/services/copilot/copilot-fetch\"\n\nimport { writeConfigFile } from \"./config-writer\"\nimport { translateForReplay } from \"./replay-translation\"\n\nexport const replayRoutes = new Hono()\n\nreplayRoutes.get(\"/dev-mode\", (c) => {\n const dev = getConfig().devMode ?? {\n enabled: false,\n capture4xx: false,\n capture5xx: false,\n captureOther: false,\n }\n return c.json({\n enabled: dev.enabled,\n capture4xx: dev.capture4xx,\n capture5xx: dev.capture5xx,\n captureOther: dev.captureOther,\n })\n})\n\nreplayRoutes.post(\"/dev-mode\", async (c) => {\n let payload: unknown\n try {\n payload = await c.req.json()\n } catch {\n return c.json(\n { error: { message: \"Body must be valid JSON\", type: \"bad_request\" } },\n 400,\n )\n }\n\n if (\n typeof payload !== \"object\"\n || payload === null\n || Array.isArray(payload)\n ) {\n return c.json(\n { error: { message: \"Body must be an object\", type: \"bad_request\" } },\n 400,\n )\n }\n\n const patch = payload as Partial<DevModeConfig>\n const current = getConfig().devMode ?? {\n enabled: false,\n capture4xx: false,\n capture5xx: false,\n captureOther: false,\n }\n const next: DevModeConfig = {\n enabled:\n typeof patch.enabled === \"boolean\" ? patch.enabled : current.enabled,\n capture4xx:\n typeof patch.capture4xx === \"boolean\" ?\n patch.capture4xx\n : current.capture4xx,\n capture5xx:\n typeof patch.capture5xx === \"boolean\" ?\n patch.capture5xx\n : current.capture5xx,\n captureOther:\n typeof patch.captureOther === \"boolean\" ?\n patch.captureOther\n : current.captureOther,\n }\n\n const config: AppConfig = { ...getConfig(), devMode: next }\n await writeConfigFile(config)\n mergeConfigWithDefaults()\n\n return c.json(next)\n})\n\nreplayRoutes.get(\"/requests/:requestId/outbound\", (c) => {\n const gate = requireDevMode(c)\n if (gate) return gate\n\n const requestId = c.req.param(\"requestId\")\n const blob = getRequestOutboundStore().getByRequestId(requestId)\n if (!blob) {\n return c.json(\n {\n error: {\n message: \"No outbound captured for this request\",\n type: \"not_found\",\n },\n },\n 404,\n )\n }\n\n const logRow = getRequestHistoryStore().getByRequestId(requestId)\n\n return c.json({\n request_id: blob.requestId,\n captured_at_ms: blob.capturedAtMs,\n http_status: blob.httpStatus,\n upstream_url: blob.upstreamUrl,\n upstream_method: blob.upstreamMethod,\n request_headers: blob.requestHeaders,\n request_body: blob.requestBody,\n request_body_kind: blob.requestBodyKind,\n response_status: blob.responseStatus,\n response_headers: blob.responseHeaders,\n response_body: blob.responseBody,\n response_body_kind: blob.responseBodyKind,\n redacted_header_keys: getRedactedHeaderKeys(blob.requestHeaders),\n original:\n logRow ?\n {\n path: logRow.path,\n upstream_endpoint: logRow.upstream_endpoint,\n upstream_model: logRow.upstream_model,\n account_id: logRow.account_id,\n client_model: logRow.client_model,\n }\n : null,\n })\n})\n\ntype ReplayPayload = {\n mode?: \"collect\" | \"live\"\n accountId: string\n headers?: Record<string, string>\n body?: unknown\n}\n\ntype ReplayError = {\n json: { error: { message: string; type: string } }\n status: number\n}\n\nfunction isReplayError(\n value: string | null | ReplayError,\n): value is ReplayError {\n return value !== null && typeof value === \"object\" && \"json\" in value\n}\n\nfunction resolveRequestBody(\n blob: OutboundCaptureRow,\n bodyOverride: unknown,\n): string | null | ReplayError {\n if (bodyOverride === undefined) {\n return blob.requestBody\n }\n\n if (blob.requestBodyKind === \"json\" && typeof bodyOverride === \"string\") {\n try {\n JSON.parse(bodyOverride)\n return bodyOverride\n } catch {\n return {\n json: {\n error: {\n message: \"body override is not valid JSON\",\n type: \"bad_request\",\n },\n },\n status: 400,\n }\n }\n }\n\n if (blob.requestBodyKind === \"json\") {\n return JSON.stringify(bodyOverride)\n }\n\n return typeof bodyOverride === \"string\" ? bodyOverride : (\n JSON.stringify(bodyOverride)\n )\n}\n\nfunction buildReplayHeaders(\n blob: OutboundCaptureRow,\n headerOverrides: Record<string, string> | undefined,\n account: AccountContext,\n): Record<string, string> {\n const base = { ...blob.requestHeaders }\n if (headerOverrides) {\n Object.assign(base, headerOverrides)\n }\n const cleaned = Object.fromEntries(\n Object.entries(base).filter(([, v]) => v !== \"***\"),\n )\n return { ...cleaned, ...copilotHeaders(account) }\n}\n\nfunction detectRawKind(contentType: string): \"json\" | \"sse\" | \"text\" {\n if (contentType.includes(\"text/event-stream\")) return \"sse\"\n if (contentType.includes(\"application/json\")) return \"json\"\n return \"text\"\n}\n\nfunction headersToRecord(headers: Headers): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [key, value] of headers.entries()) {\n out[key] = value\n }\n return out\n}\n\nfunction tryTranslate(\n upstreamEndpoint: string,\n rawText: string,\n rawKind: \"json\" | \"sse\" | \"text\",\n): unknown {\n try {\n return translateForReplay({ upstreamEndpoint, rawText, rawKind })\n } catch (err) {\n return { error: err instanceof Error ? err.message : \"Translation failed\" }\n }\n}\n\nreplayRoutes.post(\"/requests/:requestId/replay\", async (c) => {\n const gate = requireDevMode(c)\n if (gate) return gate\n\n const requestId = c.req.param(\"requestId\")\n const blob = getRequestOutboundStore().getByRequestId(requestId)\n if (!blob) {\n return c.json(\n {\n error: {\n message: \"No outbound captured for this request\",\n type: \"not_found\",\n },\n },\n 404,\n )\n }\n\n const logRow = getRequestHistoryStore().getByRequestId(requestId)\n if (!logRow) {\n return c.json(\n {\n error: {\n message: \"No request log found for this request\",\n type: \"not_found\",\n },\n },\n 404,\n )\n }\n\n let payload: ReplayPayload\n try {\n payload = await c.req.json()\n } catch {\n return c.json(\n { error: { message: \"Body must be valid JSON\", type: \"bad_request\" } },\n 400,\n )\n }\n\n return handleReplayRequest(c, { blob, logRow, payload })\n})\n\nasync function handleReplayRequest(\n c: Context,\n input: {\n blob: OutboundCaptureRow\n logRow: RequestLogRow\n payload: ReplayPayload\n },\n) {\n const { blob, logRow, payload } = input\n\n if (!payload.accountId || typeof payload.accountId !== \"string\") {\n return c.json(\n { error: { message: \"accountId is required\", type: \"bad_request\" } },\n 400,\n )\n }\n\n const account = accountsManager.getAccountContextById(payload.accountId)\n if (!account?.copilotToken) {\n return c.json(\n {\n error: {\n message: `Account \"${payload.accountId}\" not found or has no valid token`,\n type: \"bad_request\",\n },\n },\n 400,\n )\n }\n\n const bodyResult = resolveRequestBody(blob, payload.body)\n if (isReplayError(bodyResult)) {\n return c.json(bodyResult.json, bodyResult.status as 400)\n }\n\n const requestBody = bodyResult\n const mergedHeaders = buildReplayHeaders(blob, payload.headers, account)\n const mode = payload.mode ?? \"collect\"\n\n if (mode === \"live\") {\n const startMs = Date.now()\n let upstreamResponse: Response\n try {\n upstreamResponse = await fetchReplayUpstream({\n blob,\n headers: mergedHeaders,\n body: requestBody,\n })\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Upstream fetch failed\"\n return c.json({ error: { message, type: \"upstream_error\" } }, 502)\n }\n\n return streamAndRespond(c, {\n upstreamRes: upstreamResponse,\n logRow,\n startMs,\n })\n }\n\n return collectAndRespond(c, {\n blob,\n upstreamEndpoint: logRow.upstream_endpoint ?? \"\",\n headers: mergedHeaders,\n body: requestBody,\n })\n}\n\ntype ReplayUpstreamInput = {\n blob: OutboundCaptureRow\n headers: Record<string, string>\n body: string | null\n}\n\ntype CollectInput = ReplayUpstreamInput & {\n upstreamEndpoint: string\n}\n\ntype StreamInput = {\n upstreamRes: Response\n logRow: RequestLogRow | null\n startMs: number\n}\n\nasync function fetchReplayUpstream(\n input: ReplayUpstreamInput,\n): Promise<Response> {\n const { blob, headers, body } = input\n return copilotFetch(\n blob.upstreamUrl,\n { method: blob.upstreamMethod, headers, body },\n { callSite: \"replay\", capturable: false },\n )\n}\n\nasync function collectAndRespond(c: Context, input: CollectInput) {\n const { blob, upstreamEndpoint, headers, body } = input\n const startMs = Date.now()\n let upstreamResponse: Response\n try {\n upstreamResponse = await fetchReplayUpstream({ blob, headers, body })\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Upstream fetch failed\"\n return c.json({ error: { message, type: \"upstream_error\" } }, 502)\n }\n const durationMs = Date.now() - startMs\n\n const responseText = await upstreamResponse.text()\n const contentType = upstreamResponse.headers.get(\"content-type\") ?? \"\"\n const rawKind = detectRawKind(contentType)\n\n return c.json({\n status: upstreamResponse.status,\n statusText: upstreamResponse.statusText,\n headers: headersToRecord(upstreamResponse.headers),\n raw: { body: responseText, kind: rawKind },\n translated: tryTranslate(upstreamEndpoint, responseText, rawKind),\n durationMs,\n replayedAt: Date.now(),\n })\n}\n\nfunction streamAndRespond(c: Context, input: StreamInput): Response {\n const { upstreamRes, logRow, startMs } = input\n\n return streamSSE(c, async (sse) => {\n const responseHeaders = headersToRecord(upstreamRes.headers)\n\n await sse.writeSSE({\n event: \"upstream-start\",\n data: JSON.stringify({\n status: upstreamRes.status,\n statusText: upstreamRes.statusText,\n headers: responseHeaders,\n }),\n })\n\n const rawChunks: Array<string> = []\n\n if (upstreamRes.body) {\n const reader = (\n upstreamRes.body as ReadableStream<Uint8Array>\n ).getReader()\n const decoder = new TextDecoder()\n\n for (;;) {\n const readResult = await reader.read()\n if (readResult.done) break\n\n const chunk = decoder.decode(readResult.value, { stream: true })\n rawChunks.push(chunk)\n await sse.writeSSE({\n event: \"upstream-chunk\",\n data: JSON.stringify({ raw: chunk }),\n })\n }\n\n const trailing = decoder.decode()\n if (trailing) {\n rawChunks.push(trailing)\n await sse.writeSSE({\n event: \"upstream-chunk\",\n data: JSON.stringify({ raw: trailing }),\n })\n }\n }\n\n await sse.writeSSE({\n event: \"upstream-done\",\n data: JSON.stringify({ durationMs: Date.now() - startMs }),\n })\n\n if (logRow?.path === \"/v1/messages\") {\n const contentType = upstreamRes.headers.get(\"content-type\") ?? \"\"\n const rawText = rawChunks.join(\"\")\n const rawKind = detectRawKind(contentType)\n\n try {\n const translated = translateForReplay({\n upstreamEndpoint: logRow.upstream_endpoint ?? \"\",\n rawText,\n rawKind,\n })\n await sse.writeSSE({\n event: \"translated\",\n data: JSON.stringify(translated),\n })\n } catch (err) {\n await sse.writeSSE({\n event: \"translated\",\n data: JSON.stringify({ error: (err as Error).message }),\n })\n }\n }\n })\n}\n\nexport function requireDevMode(c: Context): Response | null {\n if (!isDevModeEnabled()) {\n return c.json(\n {\n error: {\n message: \"Developer mode disabled\",\n type: \"forbidden\",\n },\n },\n 403,\n )\n }\n return null\n}\n","/* eslint-disable max-lines */\nimport { Hono, type Context } from \"hono\"\n\nimport {\n DEFAULT_IDENTITY_ENTERPRISE_DOMAIN,\n getCurrentIdentityEnvironment,\n} from \"~/lib/account-client-identity\"\nimport { accountsManager } from \"~/lib/accounts-manager\"\nimport {\n getAccountClientIdentityByLoginAndApp,\n listAccountsFromRegistry,\n loadRegistry,\n removeAccountFromRegistry,\n removeAccountToken,\n saveRegistry,\n} from \"~/lib/accounts-registry\"\nimport {\n getConfig,\n getModelAliases,\n getModelAliasesInfo,\n getModelRefreshIntervalMs,\n isAccountAffinityEnabled,\n mergeConfigWithDefaults,\n PROVIDER_TYPE_ANTHROPIC,\n type AppConfig,\n type DevModeConfig,\n type LogLevel,\n type ModelConfig,\n type ProviderConfig,\n type QuotaRefreshConfig,\n} from \"~/lib/config\"\nimport { PATHS } from \"~/lib/paths\"\nimport { updateQuotaRefreshSchedulerFromConfig } from \"~/lib/quota-refresh-scheduler-runtime\"\nimport {\n getRequestHistoryStore,\n getStatsStore,\n type AccountStatsRow,\n} from \"~/lib/request-history\"\nimport { getRequestOutboundStore } from \"~/lib/request-outbound\"\nimport { applySharedSessionAffinityRetention } from \"~/lib/session-affinity-store\"\nimport { toLocalDateString } from \"~/lib/stats-store\"\nimport { isAccountType } from \"~/lib/types/account\"\n\nimport { authSessionManager } from \"./auth-sessions\"\nimport { writeConfigFile } from \"./config-writer\"\nimport { replayRoutes } from \"./replay\"\nconst ADMIN_TOKEN = process.env.ADMIN_TOKEN?.trim() || undefined\n\ntype AdminAccessDecision =\n | { ok: true }\n | {\n ok: false\n status: 401 | 403\n message: string\n errorType: \"unauthorized\" | \"forbidden\"\n }\n\ntype AdminAccessRequest = {\n req: {\n url: string\n header(name: string): string | undefined\n }\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n return (\n hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"::1\"\n )\n}\n\nfunction getBearerToken(value: string): string | undefined {\n const trimmed = value.trim()\n if (!trimmed.toLowerCase().startsWith(\"bearer \")) return undefined\n const token = trimmed.slice(\"bearer \".length).trim()\n return token || undefined\n}\n\nfunction getRequestAdminToken(c: AdminAccessRequest): string | undefined {\n const headerToken = c.req.header(\"x-admin-token\")?.trim()\n if (headerToken) return headerToken\n\n const bearer = c.req.header(\"authorization\")\n if (bearer) {\n return getBearerToken(bearer)\n }\n\n return undefined\n}\n\nfunction isSameOrigin(requestUrl: URL, originHeader: string): boolean {\n try {\n return new URL(originHeader).origin === requestUrl.origin\n } catch {\n return false\n }\n}\n\nfunction decideAdminAccess(c: AdminAccessRequest): AdminAccessDecision {\n const url = new URL(c.req.url, \"http://local\")\n\n const token = getRequestAdminToken(c)\n const tokenOk = Boolean(ADMIN_TOKEN) && token === ADMIN_TOKEN\n\n const origin = c.req.header(\"origin\")\n if (origin && !tokenOk && !isSameOrigin(url, origin)) {\n return {\n ok: false,\n status: 403,\n message: \"Cross-origin access to admin API is forbidden.\",\n errorType: \"forbidden\",\n }\n }\n\n if (isLoopbackHostname(url.hostname) || tokenOk) {\n return { ok: true }\n }\n\n if (ADMIN_TOKEN) {\n return {\n ok: false,\n status: 401,\n message:\n \"Admin API requires x-admin-token or Authorization: Bearer <token>.\",\n errorType: \"unauthorized\",\n }\n }\n\n return {\n ok: false,\n status: 403,\n message:\n \"Admin API is only available on localhost. Set ADMIN_TOKEN to enable remote access.\",\n errorType: \"forbidden\",\n }\n}\n\ntype AccountItem = {\n account_id: string\n account_type?: string\n runtime: {\n entitlement?: number\n remaining?: number\n unlimited?: boolean\n failed?: boolean\n failureReason?: string\n }\n stats?: {\n since_ms: number\n request_count?: number\n error_count?: number\n tokens_total?: number\n avg_duration_ms?: number\n last_request_at_ms?: number\n }\n}\n\nfunction parseFiniteNumber(value: string | null): number | undefined {\n if (!value) return undefined\n const n = Number(value)\n return Number.isFinite(n) ? n : undefined\n}\n\nfunction parseTriStateBool(value: string | null): boolean | undefined {\n if (value === \"1\") return true\n if (value === \"0\") return false\n return undefined\n}\n\ntype ReasoningEffort = \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\"\n\ntype ConfigErrorType = \"bad_request\" | \"internal_error\" | \"not_found\"\n\ntype ConfigErrorPayload = {\n message: string\n type: ConfigErrorType\n}\n\nconst CONFIG_KEYS = new Set<keyof AppConfig>([\n \"auth\",\n \"extraPrompts\",\n \"smallModel\",\n \"logLevel\",\n \"accountAffinity\",\n \"apiKey\",\n \"anthropicApiKey\",\n \"providers\",\n \"responsesApiContextManagementModels\",\n \"modelReasoningEfforts\",\n \"modelAliases\",\n \"allowOriginalModelNamesForAliases\",\n \"forceAgent\",\n \"compactUseSmallModel\",\n \"messageStartInputTokensFallback\",\n \"modelRefreshIntervalHours\",\n \"sessionAffinityRetentionDays\",\n \"useMessagesApi\",\n \"useResponsesApiWebSocket\",\n \"useResponsesApiWebSearch\",\n \"devMode\",\n \"quotaRefresh\",\n])\n\nconst REASONING_EFFORTS = new Set<ReasoningEffort>([\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n])\n\nconst LOG_LEVELS = new Set<LogLevel>([\"error\", \"warn\", \"info\", \"debug\"])\n\nconst BLOCKED_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"])\n\nfunction jsonError(\n c: Context,\n status: 400 | 404 | 500,\n error: ConfigErrorPayload,\n): Response {\n return c.json(\n {\n error,\n },\n status,\n )\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\ntype ParseFieldResult<T> = { clear: true } | { value: T } | { error: string }\n\ntype AuthConfig = NonNullable<AppConfig[\"auth\"]>\n\nfunction parseOptionalString(\n value: unknown,\n field: string,\n): ParseFieldResult<string> {\n if (value === null || value === undefined) return { clear: true }\n if (typeof value !== \"string\") return { error: `${field} must be a string` }\n\n const trimmed = value.trim()\n if (!trimmed) return { clear: true }\n\n return { value: trimmed }\n}\n\nfunction parseOptionalLogLevel(value: unknown): ParseFieldResult<LogLevel> {\n const parsed = parseOptionalString(value, \"logLevel\")\n if (\"error\" in parsed) return parsed\n if (\"clear\" in parsed) return parsed\n\n if (!LOG_LEVELS.has(parsed.value as LogLevel)) {\n return {\n error: `logLevel must be one of: ${[...LOG_LEVELS].join(\", \")}`,\n }\n }\n\n return { value: parsed.value as LogLevel }\n}\n\nfunction parseOptionalBoolean(\n value: unknown,\n field: string,\n): ParseFieldResult<boolean> {\n if (value === null || value === undefined) return { clear: true }\n if (typeof value !== \"boolean\") return { error: `${field} must be a boolean` }\n return { value }\n}\n\nfunction parseOptionalNonNegativeNumber(\n value: unknown,\n field: string,\n): ParseFieldResult<number> {\n if (value === null || value === undefined) return { clear: true }\n if (typeof value !== \"number\") return { error: `${field} must be a number` }\n if (!Number.isFinite(value) || value < 0) {\n return { error: `${field} must be a non-negative number` }\n }\n return { value }\n}\n\nfunction parseOptionalStringArray(\n value: unknown,\n field: string,\n): ParseFieldResult<Array<string>> {\n if (value === null || value === undefined) return { clear: true }\n if (!Array.isArray(value)) {\n return { error: `${field} must be an array of strings` }\n }\n\n const out: Array<string> = []\n for (const [index, entry] of value.entries()) {\n if (typeof entry !== \"string\") {\n return { error: `${field}[${index}] must be a string` }\n }\n const trimmed = entry.trim()\n if (!trimmed) {\n return { error: `${field}[${index}] must be a non-empty string` }\n }\n out.push(trimmed)\n }\n\n return { value: [...new Set(out)] }\n}\n\nfunction parseAuthConfig(value: unknown): ParseFieldResult<AuthConfig> {\n if (value === null || value === undefined) return { clear: true }\n if (!isPlainObject(value)) {\n return { error: \"auth must be an object\" }\n }\n\n for (const key of Object.keys(value)) {\n if (key !== \"apiKeys\") {\n return { error: `auth.${key} is not supported` }\n }\n }\n\n if (\n !(\"apiKeys\" in value)\n || value.apiKeys === null\n || value.apiKeys === undefined\n ) {\n return { value: { apiKeys: [] } }\n }\n\n if (!Array.isArray(value.apiKeys)) {\n return { error: \"auth.apiKeys must be an array of strings\" }\n }\n\n const normalizedApiKeys = value.apiKeys\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0)\n\n if (normalizedApiKeys.length !== value.apiKeys.length) {\n return { error: \"auth.apiKeys must contain non-empty strings only\" }\n }\n\n return { value: { apiKeys: [...new Set(normalizedApiKeys)] } }\n}\n\nfunction parseStringRecord(\n value: unknown,\n field: string,\n): ParseFieldResult<Record<string, string>> {\n if (value === null || value === undefined) return { clear: true }\n if (!isPlainObject(value)) {\n return { error: `${field} must be an object with string values` }\n }\n\n const record = Object.create(null) as Record<string, string>\n for (const [key, entry] of Object.entries(value)) {\n if (BLOCKED_KEYS.has(key)) {\n return { error: `${field}.${key} is not allowed` }\n }\n if (typeof entry !== \"string\") {\n return { error: `${field}.${key} must be a string` }\n }\n record[key] = entry\n }\n\n return { value: record }\n}\n\nconst PROVIDER_MODEL_CONFIG_FIELDS = [\"temperature\", \"topP\", \"topK\"] as const\n\ntype ProviderModelConfigField = (typeof PROVIDER_MODEL_CONFIG_FIELDS)[number]\n\nconst PROVIDER_MODEL_CONFIG_KEYS = new Set<ProviderModelConfigField>(\n PROVIDER_MODEL_CONFIG_FIELDS,\n)\n\nconst PROVIDER_CONFIG_FIELDS = [\n \"type\",\n \"enabled\",\n \"baseUrl\",\n \"apiKey\",\n \"authType\",\n \"models\",\n \"adjustInputTokens\",\n] as const\n\ntype ProviderConfigField = (typeof PROVIDER_CONFIG_FIELDS)[number]\n\ntype ProviderAuthTypeValue = NonNullable<ProviderConfig[\"authType\"]>\n\nconst PROVIDER_AUTH_TYPES = [\"authorization\", \"oauth2\", \"x-api-key\"] as const\n\nconst PROVIDER_CONFIG_KEYS = new Set<ProviderConfigField>(\n PROVIDER_CONFIG_FIELDS,\n)\n\nfunction isProviderAuthType(value: string): value is ProviderAuthTypeValue {\n return PROVIDER_AUTH_TYPES.includes(value as ProviderAuthTypeValue)\n}\n\nfunction validateAllowedObjectKeys(\n value: Record<string, unknown>,\n field: string,\n allowed: ReadonlySet<string>,\n): string | undefined {\n for (const key of Object.keys(value)) {\n if (!allowed.has(key)) {\n return `${field}.${key} is not supported`\n }\n }\n return undefined\n}\n\nfunction applyProviderModelTemperature(\n config: ModelConfig,\n value: Record<string, unknown>,\n field: string,\n): string | undefined {\n if (!Object.hasOwn(value, \"temperature\")) return undefined\n\n const parsed = parseOptionalNonNegativeNumber(\n value.temperature,\n `${field}.temperature`,\n )\n if (\"error\" in parsed) return parsed.error\n if (\"value\" in parsed) config.temperature = parsed.value\n return undefined\n}\n\nfunction applyProviderModelTopP(\n config: ModelConfig,\n value: Record<string, unknown>,\n field: string,\n): string | undefined {\n if (!Object.hasOwn(value, \"topP\")) return undefined\n\n const parsed = parseOptionalNonNegativeNumber(value.topP, `${field}.topP`)\n if (\"error\" in parsed) return parsed.error\n if (\"value\" in parsed) config.topP = parsed.value\n return undefined\n}\n\nfunction applyProviderModelTopK(\n config: ModelConfig,\n value: Record<string, unknown>,\n field: string,\n): string | undefined {\n if (!Object.hasOwn(value, \"topK\")) return undefined\n\n const parsed = parseOptionalNonNegativeNumber(value.topK, `${field}.topK`)\n if (\"error\" in parsed) return parsed.error\n if (\"value\" in parsed) config.topK = parsed.value\n return undefined\n}\n\nfunction parseProviderModelConfig(\n value: unknown,\n field: string,\n): ParseFieldResult<ModelConfig> {\n if (value === null || value === undefined) {\n return { error: `${field} must be an object` }\n }\n if (!isPlainObject(value)) {\n return { error: `${field} must be an object` }\n }\n\n const keyError = validateAllowedObjectKeys(\n value,\n field,\n PROVIDER_MODEL_CONFIG_KEYS,\n )\n if (keyError) return { error: keyError }\n\n const config: ModelConfig = {}\n\n const temperatureError = applyProviderModelTemperature(config, value, field)\n if (temperatureError) return { error: temperatureError }\n\n const topPError = applyProviderModelTopP(config, value, field)\n if (topPError) return { error: topPError }\n\n const topKError = applyProviderModelTopK(config, value, field)\n if (topKError) return { error: topKError }\n\n return { value: config }\n}\n\nfunction parseProviderModelsRecord(\n value: unknown,\n field: string,\n): ParseFieldResult<Record<string, ModelConfig>> {\n if (value === null || value === undefined) return { clear: true }\n if (!isPlainObject(value)) {\n return { error: `${field} must be an object` }\n }\n\n const record = Object.create(null) as Record<string, ModelConfig>\n\n for (const [rawModelId, rawModelConfig] of Object.entries(value)) {\n if (BLOCKED_KEYS.has(rawModelId)) {\n return { error: `${field}.${rawModelId} is not allowed` }\n }\n\n const modelId = rawModelId.trim()\n if (!modelId) {\n return { error: `${field} keys must be non-empty strings` }\n }\n if (rawModelId !== modelId) {\n return {\n error: `${field}.${rawModelId} must not include leading/trailing whitespace`,\n }\n }\n if (BLOCKED_KEYS.has(modelId)) {\n return { error: `${field}.${modelId} is not allowed` }\n }\n\n const parsed = parseProviderModelConfig(\n rawModelConfig,\n `${field}.${modelId}`,\n )\n if (\"error\" in parsed) return parsed\n if (\"clear\" in parsed) continue\n\n record[modelId] = parsed.value\n }\n\n return { value: record }\n}\n\nfunction applyProviderType(\n provider: ProviderConfig,\n value: Record<string, unknown>,\n field: string,\n): string | undefined {\n if (!Object.hasOwn(value, \"type\")) return undefined\n\n const parsed = parseOptionalString(value.type, `${field}.type`)\n if (\"error\" in parsed) return parsed.error\n if (\"value\" in parsed) {\n if (parsed.value !== PROVIDER_TYPE_ANTHROPIC) {\n return `${field}.type must be \"${PROVIDER_TYPE_ANTHROPIC}\"`\n }\n provider.type = PROVIDER_TYPE_ANTHROPIC\n }\n\n return undefined\n}\n\nfunction applyProviderEnabled(\n provider: ProviderConfig,\n value: Record<string, unknown>,\n field: string,\n): string | undefined {\n if (!Object.hasOwn(value, \"enabled\")) return undefined\n\n const parsed = parseOptionalBoolean(value.enabled, `${field}.enabled`)\n if (\"error\" in parsed) return parsed.error\n if (\"value\" in parsed) provider.enabled = parsed.value\n return undefined\n}\n\nfunction applyProviderBaseUrl(\n provider: ProviderConfig,\n value: Record<string, unknown>,\n field: string,\n): string | undefined {\n if (!Object.hasOwn(value, \"baseUrl\")) return undefined\n\n const parsed = parseOptionalString(value.baseUrl, `${field}.baseUrl`)\n if (\"error\" in parsed) return parsed.error\n if (\"value\" in parsed) provider.baseUrl = parsed.value\n return undefined\n}\n\nfunction applyProviderApiKey(\n provider: ProviderConfig,\n value: Record<string, unknown>,\n field: string,\n): string | undefined {\n if (!Object.hasOwn(value, \"apiKey\")) return undefined\n\n const parsed = parseOptionalString(value.apiKey, `${field}.apiKey`)\n if (\"error\" in parsed) return parsed.error\n if (\"value\" in parsed) provider.apiKey = parsed.value\n return undefined\n}\n\nfunction applyProviderAuthType(\n provider: ProviderConfig,\n value: Record<string, unknown>,\n field: string,\n): string | undefined {\n if (!Object.hasOwn(value, \"authType\")) return undefined\n\n const parsed = parseOptionalString(value.authType, `${field}.authType`)\n if (\"error\" in parsed) return parsed.error\n if (\"value\" in parsed) {\n if (!isProviderAuthType(parsed.value)) {\n return `${field}.authType must be one of: ${PROVIDER_AUTH_TYPES.map((item) => `\"${item}\"`).join(\", \")}`\n }\n provider.authType = parsed.value\n }\n return undefined\n}\n\nfunction applyProviderModels(\n provider: ProviderConfig,\n value: Record<string, unknown>,\n field: string,\n): string | undefined {\n if (!Object.hasOwn(value, \"models\")) return undefined\n\n const parsed = parseProviderModelsRecord(value.models, `${field}.models`)\n if (\"error\" in parsed) return parsed.error\n if (\"value\" in parsed) provider.models = parsed.value\n return undefined\n}\n\nfunction applyProviderAdjustInputTokens(\n provider: ProviderConfig,\n value: Record<string, unknown>,\n field: string,\n): string | undefined {\n if (!Object.hasOwn(value, \"adjustInputTokens\")) return undefined\n\n const parsed = parseOptionalBoolean(\n value.adjustInputTokens,\n `${field}.adjustInputTokens`,\n )\n if (\"error\" in parsed) return parsed.error\n if (\"value\" in parsed) provider.adjustInputTokens = parsed.value\n return undefined\n}\n\nfunction parseProviderConfig(\n value: unknown,\n field: string,\n): ParseFieldResult<ProviderConfig> {\n if (value === null || value === undefined) {\n return { error: `${field} must be an object` }\n }\n if (!isPlainObject(value)) {\n return { error: `${field} must be an object` }\n }\n\n const keyError = validateAllowedObjectKeys(value, field, PROVIDER_CONFIG_KEYS)\n if (keyError) return { error: keyError }\n\n const provider: ProviderConfig = {}\n\n const typeError = applyProviderType(provider, value, field)\n if (typeError) return { error: typeError }\n\n const enabledError = applyProviderEnabled(provider, value, field)\n if (enabledError) return { error: enabledError }\n\n const baseUrlError = applyProviderBaseUrl(provider, value, field)\n if (baseUrlError) return { error: baseUrlError }\n\n const apiKeyError = applyProviderApiKey(provider, value, field)\n if (apiKeyError) return { error: apiKeyError }\n\n const authTypeError = applyProviderAuthType(provider, value, field)\n if (authTypeError) return { error: authTypeError }\n\n const modelsError = applyProviderModels(provider, value, field)\n if (modelsError) return { error: modelsError }\n\n const adjustInputTokensError = applyProviderAdjustInputTokens(\n provider,\n value,\n field,\n )\n if (adjustInputTokensError) return { error: adjustInputTokensError }\n\n return { value: provider }\n}\n\nfunction parseProviders(\n value: unknown,\n): ParseFieldResult<Record<string, ProviderConfig>> {\n if (value === null || value === undefined) return { clear: true }\n if (!isPlainObject(value)) {\n return { error: \"providers must be an object\" }\n }\n\n const record = Object.create(null) as Record<string, ProviderConfig>\n const seenProviderNames = new Set<string>()\n\n for (const [rawProviderName, rawProviderConfig] of Object.entries(value)) {\n if (BLOCKED_KEYS.has(rawProviderName)) {\n return { error: `providers.${rawProviderName} is not allowed` }\n }\n\n const providerName = rawProviderName.trim()\n if (!providerName) {\n return { error: \"providers keys must be non-empty strings\" }\n }\n if (rawProviderName !== providerName) {\n return {\n error: `providers.${rawProviderName} must not include leading/trailing whitespace`,\n }\n }\n if (BLOCKED_KEYS.has(providerName)) {\n return { error: `providers.${providerName} is not allowed` }\n }\n\n const normalizedProviderName = providerName.toLowerCase()\n if (seenProviderNames.has(normalizedProviderName)) {\n return {\n error: `providers.${rawProviderName} conflicts with another provider`,\n }\n }\n seenProviderNames.add(normalizedProviderName)\n\n const parsed = parseProviderConfig(\n rawProviderConfig,\n `providers.${providerName}`,\n )\n if (\"error\" in parsed) return parsed\n if (\"clear\" in parsed) continue\n\n record[providerName] = parsed.value\n }\n\n return { value: record }\n}\n\nfunction parseReasoningRecord(\n value: unknown,\n): ParseFieldResult<Record<string, ReasoningEffort>> {\n if (value === null || value === undefined) return { clear: true }\n if (!isPlainObject(value)) {\n return { error: \"modelReasoningEfforts must be an object\" }\n }\n\n const record = Object.create(null) as Record<string, ReasoningEffort>\n for (const [model, effort] of Object.entries(value)) {\n if (BLOCKED_KEYS.has(model)) {\n return { error: `modelReasoningEfforts.${model} is not allowed` }\n }\n if (typeof effort !== \"string\") {\n return { error: `modelReasoningEfforts.${model} must be a string` }\n }\n if (!REASONING_EFFORTS.has(effort as ReasoningEffort)) {\n return {\n error: `modelReasoningEfforts.${model} must be one of ${[\n ...REASONING_EFFORTS,\n ].join(\", \")}`,\n }\n }\n record[model] = effort as ReasoningEffort\n }\n\n return { value: record }\n}\n\ntype ParsedModelAlias = {\n alias: string\n target: string\n allowOriginal?: boolean\n}\n\nfunction parseModelAliasEntry(\n rawAlias: string,\n rawTarget: unknown,\n): ParseFieldResult<ParsedModelAlias> {\n if (BLOCKED_KEYS.has(rawAlias)) {\n return { error: `modelAliases.${rawAlias} is not allowed` }\n }\n\n const alias = rawAlias.trim().toLowerCase()\n if (!alias) {\n return { error: \"modelAliases keys must be non-empty strings\" }\n }\n if (BLOCKED_KEYS.has(alias)) {\n return { error: `modelAliases.${alias} is not allowed` }\n }\n\n let target: string | undefined\n let allowOriginal: boolean | undefined\n\n if (typeof rawTarget === \"string\") {\n target = rawTarget.trim()\n } else if (isPlainObject(rawTarget)) {\n const rawTargetValue = rawTarget.target\n if (typeof rawTargetValue !== \"string\") {\n return { error: `modelAliases.${rawAlias}.target must be a string` }\n }\n target = rawTargetValue.trim()\n\n if (\"allowOriginal\" in rawTarget) {\n if (typeof rawTarget.allowOriginal !== \"boolean\") {\n return {\n error: `modelAliases.${rawAlias}.allowOriginal must be a boolean`,\n }\n }\n allowOriginal = rawTarget.allowOriginal\n }\n } else {\n return { error: `modelAliases.${rawAlias} must be a string or object` }\n }\n\n if (!target) {\n return { error: `modelAliases.${rawAlias} must be a non-empty string` }\n }\n if (alias === target.toLowerCase()) {\n return { error: `modelAliases.${rawAlias} cannot map to itself` }\n }\n\n return { value: { alias, target, allowOriginal } }\n}\n\nfunction parseModelAliases(\n value: unknown,\n): ParseFieldResult<\n Record<string, { target: string; allowOriginal?: boolean }>\n> {\n if (value === null || value === undefined) return { clear: true }\n if (!isPlainObject(value)) {\n return { error: \"modelAliases must be an object\" }\n }\n\n const record = Object.create(null) as Record<\n string,\n { target: string; allowOriginal?: boolean }\n >\n\n for (const [rawAlias, rawTarget] of Object.entries(value)) {\n const parsed = parseModelAliasEntry(rawAlias, rawTarget)\n if (\"error\" in parsed) return parsed\n if (\"clear\" in parsed) continue\n\n const { alias, target, allowOriginal } = parsed.value\n const existing = Object.hasOwn(record, alias) ? record[alias] : undefined\n if (\n existing\n && (existing.target !== target\n || existing.allowOriginal !== allowOriginal)\n ) {\n return { error: `modelAliases.${rawAlias} conflicts with ${alias}` }\n }\n\n record[alias] =\n allowOriginal === undefined ? { target } : { target, allowOriginal }\n }\n\n return { value: record }\n}\n\nfunction applyOptionalString(\n next: AppConfig,\n key: \"smallModel\" | \"apiKey\" | \"anthropicApiKey\",\n value: unknown,\n): string | undefined {\n const parsed = parseOptionalString(value, key)\n if (\"error\" in parsed) return parsed.error\n if (\"clear\" in parsed) {\n next[key] = undefined\n return undefined\n }\n next[key] = parsed.value\n return undefined\n}\n\nfunction applyAuthConfig(next: AppConfig, value: unknown): string | undefined {\n const parsed = parseAuthConfig(value)\n if (\"error\" in parsed) return parsed.error\n if (\"clear\" in parsed) {\n delete next.auth\n return undefined\n }\n\n next.auth = parsed.value\n return undefined\n}\n\nfunction applyLogLevel(next: AppConfig, value: unknown): string | undefined {\n const parsed = parseOptionalLogLevel(value)\n if (\"error\" in parsed) return parsed.error\n if (\"clear\" in parsed) {\n next.logLevel = undefined\n return undefined\n }\n\n next.logLevel = parsed.value\n return undefined\n}\n\nfunction applyOptionalBoolean(\n next: AppConfig,\n key:\n | \"accountAffinity\"\n | \"forceAgent\"\n | \"useMessagesApi\"\n | \"useResponsesApiWebSocket\"\n | \"useResponsesApiWebSearch\"\n | \"compactUseSmallModel\"\n | \"messageStartInputTokensFallback\"\n | \"allowOriginalModelNamesForAliases\",\n value: unknown,\n): string | undefined {\n const parsed = parseOptionalBoolean(value, key)\n if (\"error\" in parsed) return parsed.error\n if (\"clear\" in parsed) {\n next[key] = undefined\n return undefined\n }\n next[key] = parsed.value\n return undefined\n}\n\nfunction applyOptionalNumber(\n next: AppConfig,\n key: \"modelRefreshIntervalHours\" | \"sessionAffinityRetentionDays\",\n value: unknown,\n): string | undefined {\n const parsed = parseOptionalNonNegativeNumber(value, key)\n if (\"error\" in parsed) return parsed.error\n if (\"clear\" in parsed) {\n next[key] = undefined\n return undefined\n }\n next[key] = parsed.value\n return undefined\n}\n\nfunction applyExtraPrompts(\n next: AppConfig,\n value: unknown,\n): string | undefined {\n const parsed = parseStringRecord(value, \"extraPrompts\")\n if (\"error\" in parsed) return parsed.error\n if (\"clear\" in parsed) {\n delete next.extraPrompts\n return undefined\n }\n next.extraPrompts = parsed.value\n return undefined\n}\n\nfunction applyReasoningEfforts(\n next: AppConfig,\n value: unknown,\n): string | undefined {\n const parsed = parseReasoningRecord(value)\n if (\"error\" in parsed) return parsed.error\n if (\"clear\" in parsed) {\n delete next.modelReasoningEfforts\n return undefined\n }\n next.modelReasoningEfforts = parsed.value\n return undefined\n}\n\nfunction applyModelAliases(\n next: AppConfig,\n value: unknown,\n): string | undefined {\n const parsed = parseModelAliases(value)\n if (\"error\" in parsed) return parsed.error\n if (\"clear\" in parsed) {\n delete next.modelAliases\n return undefined\n }\n next.modelAliases = parsed.value\n return undefined\n}\n\nfunction applyResponsesApiContextManagementModels(\n next: AppConfig,\n value: unknown,\n): string | undefined {\n const parsed = parseOptionalStringArray(\n value,\n \"responsesApiContextManagementModels\",\n )\n if (\"error\" in parsed) return parsed.error\n if (\"clear\" in parsed) {\n delete next.responsesApiContextManagementModels\n return undefined\n }\n next.responsesApiContextManagementModels = parsed.value\n return undefined\n}\n\nfunction applyProvidersConfig(\n next: AppConfig,\n value: unknown,\n): string | undefined {\n const parsed = parseProviders(value)\n if (\"error\" in parsed) return parsed.error\n if (\"clear\" in parsed) {\n delete next.providers\n return undefined\n }\n next.providers = parsed.value\n return undefined\n}\n\nconst DEV_MODE_KEYS = new Set([\n \"enabled\",\n \"capture4xx\",\n \"capture5xx\",\n \"captureOther\",\n])\n\nfunction parseDevModeConfig(value: unknown): ParseFieldResult<DevModeConfig> {\n if (value === null || value === undefined) return { clear: true }\n if (!isPlainObject(value)) return { error: \"devMode must be an object\" }\n\n for (const key of Object.keys(value)) {\n if (!DEV_MODE_KEYS.has(key)) {\n return { error: `devMode.${key} is not supported` }\n }\n }\n\n for (const key of DEV_MODE_KEYS) {\n const v = value[key]\n if (v !== undefined && typeof v !== \"boolean\") {\n return { error: `devMode.${key} must be a boolean` }\n }\n }\n\n return {\n value: {\n enabled: value.enabled === true,\n capture4xx: value.capture4xx === true,\n capture5xx: value.capture5xx === true,\n captureOther: value.captureOther === true,\n },\n }\n}\n\nfunction applyDevModeConfig(\n next: AppConfig,\n value: unknown,\n): string | undefined {\n const parsed = parseDevModeConfig(value)\n if (\"error\" in parsed) return parsed.error\n if (\"clear\" in parsed) {\n next.devMode = {\n enabled: false,\n capture4xx: false,\n capture5xx: false,\n captureOther: false,\n }\n return undefined\n }\n next.devMode = parsed.value\n return undefined\n}\n\nconst QUOTA_REFRESH_KEYS = new Set([\n \"enabled\",\n \"intervalMinutes\",\n \"startupDelaySeconds\",\n \"staggerMinSeconds\",\n \"staggerMaxSeconds\",\n])\n\nfunction parseQuotaRefreshConfig(\n value: unknown,\n): ParseFieldResult<QuotaRefreshConfig> {\n if (value === null || value === undefined) return { clear: true }\n if (!isPlainObject(value)) return { error: \"quotaRefresh must be an object\" }\n\n for (const key of Object.keys(value)) {\n if (!QUOTA_REFRESH_KEYS.has(key)) {\n return { error: `quotaRefresh.${key} is not supported` }\n }\n }\n\n const out: QuotaRefreshConfig = {}\n\n if (Object.hasOwn(value, \"enabled\")) {\n const parsed = parseOptionalBoolean(value.enabled, \"quotaRefresh.enabled\")\n if (\"error\" in parsed) return parsed\n if (\"value\" in parsed) out.enabled = parsed.value\n }\n\n for (const key of [\n \"intervalMinutes\",\n \"startupDelaySeconds\",\n \"staggerMinSeconds\",\n \"staggerMaxSeconds\",\n ] as const) {\n if (!Object.hasOwn(value, key)) {\n continue\n }\n\n const parsed = parseOptionalNonNegativeNumber(\n value[key],\n `quotaRefresh.${key}`,\n )\n if (\"error\" in parsed) return parsed\n if (\"value\" in parsed) out[key] = parsed.value\n }\n\n return { value: out }\n}\n\nfunction applyQuotaRefreshConfig(\n next: AppConfig,\n value: unknown,\n): string | undefined {\n const parsed = parseQuotaRefreshConfig(value)\n if (\"error\" in parsed) return parsed.error\n if (\"clear\" in parsed) {\n delete next.quotaRefresh\n return undefined\n }\n next.quotaRefresh =\n next.quotaRefresh === undefined ?\n parsed.value\n : {\n ...next.quotaRefresh,\n ...parsed.value,\n }\n return undefined\n}\n\ntype ConfigPatchHandler = (\n next: AppConfig,\n value: unknown,\n) => string | undefined\n\nconst CONFIG_PATCH_HANDLERS: Partial<Record<string, ConfigPatchHandler>> = {\n auth: applyAuthConfig,\n extraPrompts: applyExtraPrompts,\n smallModel: (next, value) => applyOptionalString(next, \"smallModel\", value),\n logLevel: applyLogLevel,\n accountAffinity: (next, value) =>\n applyOptionalBoolean(next, \"accountAffinity\", value),\n apiKey: (next, value) => applyOptionalString(next, \"apiKey\", value),\n anthropicApiKey: (next, value) =>\n applyOptionalString(next, \"anthropicApiKey\", value),\n providers: applyProvidersConfig,\n responsesApiContextManagementModels: applyResponsesApiContextManagementModels,\n modelReasoningEfforts: applyReasoningEfforts,\n modelAliases: applyModelAliases,\n allowOriginalModelNamesForAliases: (next, value) =>\n applyOptionalBoolean(next, \"allowOriginalModelNamesForAliases\", value),\n forceAgent: (next, value) => applyOptionalBoolean(next, \"forceAgent\", value),\n compactUseSmallModel: (next, value) =>\n applyOptionalBoolean(next, \"compactUseSmallModel\", value),\n messageStartInputTokensFallback: (next, value) =>\n applyOptionalBoolean(next, \"messageStartInputTokensFallback\", value),\n modelRefreshIntervalHours: (next, value) =>\n applyOptionalNumber(next, \"modelRefreshIntervalHours\", value),\n sessionAffinityRetentionDays: (next, value) =>\n applyOptionalNumber(next, \"sessionAffinityRetentionDays\", value),\n useMessagesApi: (next, value) =>\n applyOptionalBoolean(next, \"useMessagesApi\", value),\n useResponsesApiWebSocket: (next, value) =>\n applyOptionalBoolean(next, \"useResponsesApiWebSocket\", value),\n useResponsesApiWebSearch: (next, value) =>\n applyOptionalBoolean(next, \"useResponsesApiWebSearch\", value),\n devMode: applyDevModeConfig,\n quotaRefresh: applyQuotaRefreshConfig,\n}\n\nfunction applyConfigPatch(\n base: AppConfig,\n input: Record<string, unknown>,\n): { config?: AppConfig; error?: string } {\n const next: AppConfig = { ...base }\n\n for (const [rawKey, value] of Object.entries(input)) {\n const key = rawKey as keyof AppConfig\n if (!CONFIG_KEYS.has(key)) {\n return { error: `Unknown config key: ${rawKey}` }\n }\n\n const handler = CONFIG_PATCH_HANDLERS[rawKey]\n if (!handler) {\n return { error: `Unsupported config key: ${rawKey}` }\n }\n\n const error = handler(next, value)\n if (error) return { error }\n }\n\n return { config: next }\n}\n\nexport const adminApiRoutes = new Hono()\n\nadminApiRoutes.use(\"*\", async (c, next) => {\n const decision = decideAdminAccess(c)\n if (!decision.ok) {\n return c.json(\n {\n error: {\n message: decision.message,\n type: decision.errorType,\n },\n },\n decision.status,\n )\n }\n\n await next()\n})\n\n// Start auth session cleanup timer\nauthSessionManager.start()\n\nadminApiRoutes.get(\"/meta\", (c) => {\n const store = getRequestHistoryStore()\n return c.json(store.meta())\n})\n\nadminApiRoutes.get(\"/config\", (c) => {\n try {\n const config = mergeConfigWithDefaults()\n return c.json({ ...config, _configPath: PATHS.CONFIG_PATH })\n } catch {\n return jsonError(c, 500, {\n message: \"Failed to load config.\",\n type: \"internal_error\",\n })\n }\n})\n\nadminApiRoutes.post(\"/config\", async (c) => {\n let payload: unknown\n try {\n payload = await c.req.json()\n } catch {\n return jsonError(c, 400, {\n message: \"Config payload must be valid JSON.\",\n type: \"bad_request\",\n })\n }\n\n if (!isPlainObject(payload)) {\n return jsonError(c, 400, {\n message: \"Config payload must be an object.\",\n type: \"bad_request\",\n })\n }\n\n const result = applyConfigPatch(getConfig(), payload)\n if (!result.config) {\n return jsonError(c, 400, {\n message: result.error ?? \"Invalid config payload.\",\n type: \"bad_request\",\n })\n }\n\n try {\n await writeConfigFile(result.config)\n const merged = mergeConfigWithDefaults()\n accountsManager.setAccountAffinityEnabled(isAccountAffinityEnabled())\n accountsManager.setModelsRefreshIntervalMs(getModelRefreshIntervalMs())\n updateQuotaRefreshSchedulerFromConfig()\n applySharedSessionAffinityRetention()\n return c.json({ ...merged, _configPath: PATHS.CONFIG_PATH })\n } catch {\n return jsonError(c, 500, {\n message: \"Failed to write config.\",\n type: \"internal_error\",\n })\n }\n})\n\nadminApiRoutes.get(\"/models\", (c) => {\n try {\n const accountModels = accountsManager.getFirstAccountModels()\n const items =\n accountModels?.data\n .map((model) => model.id)\n .filter(\n (id): id is string => typeof id === \"string\" && id.trim().length > 0,\n ) ?? []\n const aliasItems = Object.keys(getModelAliases())\n const uniqueItems = Array.from(new Set([...items, ...aliasItems])).sort()\n return c.json({ items: uniqueItems })\n } catch {\n return jsonError(c, 500, {\n message: \"Failed to load models.\",\n type: \"internal_error\",\n })\n }\n})\n\ntype AdminModelDetailsItem = {\n id: string\n name: string\n preview: boolean\n billing?: {\n is_premium?: boolean\n multiplier?: number\n }\n supported_endpoints?: Array<string>\n capabilities: {\n limits: {\n max_context_window_tokens?: number\n max_prompt_tokens?: number\n max_output_tokens?: number\n }\n supports: {\n tool_calls?: boolean\n parallel_tool_calls?: boolean\n structured_outputs?: boolean\n streaming?: boolean\n vision?: boolean\n }\n }\n aliases: Array<string>\n}\n\nfunction parseNonEmptyString(value: unknown): string | null {\n if (typeof value !== \"string\") return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction parseOptionalFiniteNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\") return undefined\n return Number.isFinite(value) ? value : undefined\n}\n\nfunction toBooleanOrUndefined(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined\n}\n\nfunction parseStringArray(value: unknown): Array<string> | undefined {\n if (!Array.isArray(value)) return undefined\n\n const out = value\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0)\n\n return out.length > 0 ? out : undefined\n}\n\nfunction parseBilling(value: unknown): AdminModelDetailsItem[\"billing\"] {\n if (!isPlainObject(value)) return undefined\n\n const multiplier = parseOptionalFiniteNumber(value.multiplier)\n const is_premium = toBooleanOrUndefined(value.is_premium)\n\n if (multiplier === undefined && is_premium === undefined) return undefined\n return { multiplier, is_premium }\n}\n\nfunction parseCapabilities(\n value: unknown,\n): AdminModelDetailsItem[\"capabilities\"] {\n if (!isPlainObject(value)) {\n return {\n limits: {},\n supports: {},\n }\n }\n\n const limitsRaw = isPlainObject(value.limits) ? value.limits : undefined\n const supportsRaw = isPlainObject(value.supports) ? value.supports : undefined\n\n return {\n limits: {\n max_context_window_tokens: parseOptionalFiniteNumber(\n limitsRaw?.max_context_window_tokens,\n ),\n max_prompt_tokens: parseOptionalFiniteNumber(\n limitsRaw?.max_prompt_tokens,\n ),\n max_output_tokens: parseOptionalFiniteNumber(\n limitsRaw?.max_output_tokens,\n ),\n },\n supports: {\n tool_calls: toBooleanOrUndefined(supportsRaw?.tool_calls),\n parallel_tool_calls: toBooleanOrUndefined(\n supportsRaw?.parallel_tool_calls,\n ),\n structured_outputs: toBooleanOrUndefined(supportsRaw?.structured_outputs),\n streaming: toBooleanOrUndefined(supportsRaw?.streaming),\n vision: toBooleanOrUndefined(supportsRaw?.vision),\n },\n }\n}\n\nfunction parseAdminModelDetailsItem(\n raw: unknown,\n aliasesByTarget: Map<string, Array<string>>,\n): AdminModelDetailsItem | null {\n if (!isPlainObject(raw)) return null\n\n const id = parseNonEmptyString(raw.id)\n if (!id) return null\n\n const name = parseNonEmptyString(raw.name) ?? id\n const preview = toBooleanOrUndefined(raw.preview) ?? false\n\n return {\n id,\n name,\n preview,\n billing: parseBilling(raw.billing),\n supported_endpoints: parseStringArray(raw.supported_endpoints),\n capabilities: parseCapabilities(raw.capabilities),\n aliases: aliasesByTarget.get(id.toLowerCase()) ?? [],\n }\n}\n\nadminApiRoutes.get(\"/models/details\", (c) => {\n try {\n const accountModels = accountsManager.getFirstAccountModels()\n const aliasInfo = getModelAliasesInfo()\n\n const aliasesByTarget = new Map<string, Array<string>>()\n for (const [alias, spec] of Object.entries(aliasInfo)) {\n const targetKey = spec.target.toLowerCase()\n const current = aliasesByTarget.get(targetKey)\n if (current) {\n current.push(alias)\n } else {\n aliasesByTarget.set(targetKey, [alias])\n }\n }\n\n for (const aliases of aliasesByTarget.values()) {\n aliases.sort()\n }\n\n const rawModels: Array<unknown> = []\n if (Array.isArray(accountModels?.data)) {\n rawModels.push(...(accountModels.data as Array<unknown>))\n }\n\n const itemsById = new Map<string, AdminModelDetailsItem>()\n for (const raw of rawModels) {\n const item = parseAdminModelDetailsItem(raw, aliasesByTarget)\n if (!item) continue\n if (itemsById.has(item.id)) continue\n itemsById.set(item.id, item)\n }\n\n const items = Array.from(itemsById.values()).sort((a, b) =>\n a.id.localeCompare(b.id),\n )\n\n return c.json({ items })\n } catch (error) {\n console.error(\"Failed to load model details.\", error)\n return jsonError(c, 500, {\n message: \"Failed to load model details.\",\n type: \"internal_error\",\n })\n }\n})\n\nadminApiRoutes.get(\"/accounts\", async (c) => {\n const url = new URL(c.req.url, \"http://local\")\n const sinceMs = Number(url.searchParams.get(\"since_ms\") ?? \"\")\n const includeStats = url.searchParams.get(\"include_stats\") !== \"0\"\n\n let since = Date.now() - 24 * 60 * 60 * 1000\n if (Number.isFinite(sinceMs) && sinceMs > 0) {\n since = sinceMs\n }\n\n const registry = await listAccountsFromRegistry().catch(() => [])\n const registryTypeById = new Map(registry.map((a) => [a.id, a.accountType]))\n\n const statuses = accountsManager.getAccountStatus()\n\n const store = getRequestHistoryStore()\n const statsByAccount: Record<string, AccountStatsRow | undefined> =\n includeStats ? store.getAccountStatsSince(since) : {}\n\n const items: Array<AccountItem> = statuses.map((s) => {\n const accountType = registryTypeById.get(s.id)\n const statsRow = includeStats ? statsByAccount[s.id] : undefined\n\n const stats =\n includeStats ?\n {\n since_ms: since,\n request_count: statsRow?.request_count,\n error_count: statsRow?.error_count,\n tokens_total: statsRow?.tokens_total,\n avg_duration_ms: statsRow?.avg_duration_ms,\n last_request_at_ms: statsRow?.last_request_at_ms,\n }\n : undefined\n\n return {\n account_id: s.id,\n account_type: accountType,\n runtime: {\n entitlement: s.entitlement,\n remaining: s.remaining,\n unlimited: s.unlimited,\n failed: s.failed,\n failureReason: s.failureReason,\n enabled: s.enabled,\n },\n stats,\n }\n })\n\n return c.json({ items })\n})\n\nadminApiRoutes.get(\"/requests\", (c) => {\n const url = new URL(c.req.url, \"http://local\")\n const p = url.searchParams\n\n const limit = parseFiniteNumber(p.get(\"limit\")) ?? 50\n const cursorId = parseFiniteNumber(p.get(\"cursor_id\"))\n\n const status = parseFiniteNumber(p.get(\"status\"))\n const hasError = parseTriStateBool(p.get(\"has_error\"))\n\n const fromMs = parseFiniteNumber(p.get(\"from_ms\"))\n const toMs = parseFiniteNumber(p.get(\"to_ms\"))\n\n const store = getRequestHistoryStore()\n const result = store.query({\n limit,\n cursorId,\n\n accountId: p.get(\"account_id\") || undefined,\n upstreamModel: p.get(\"upstream_model\") || undefined,\n clientModel: p.get(\"client_model\") || undefined,\n upstreamEndpoint: p.get(\"upstream_endpoint\") || undefined,\n path: p.get(\"path\") || undefined,\n\n status,\n hasError,\n fromMs,\n toMs,\n })\n\n const outboundIds = getRequestOutboundStore().hasOutboundForIds(\n result.items.map((i) => i.request_id),\n )\n const itemsWithOutbound = result.items.map((item) => ({\n ...item,\n has_outbound: outboundIds.has(item.request_id),\n }))\n\n return c.json({\n items: itemsWithOutbound,\n next_cursor_id: result.nextCursorId,\n has_more: result.hasMore,\n })\n})\n\nadminApiRoutes.get(\"/requests/:requestId\", (c) => {\n const requestId = c.req.param(\"requestId\")\n const store = getRequestHistoryStore()\n const item = store.getByRequestId(requestId)\n const hasOutbound =\n item !== null\n && getRequestOutboundStore().getByRequestId(requestId) !== null\n return c.json({ item, has_outbound: hasOutbound })\n})\n\nadminApiRoutes.post(\"/accounts/auth/start\", async (c) => {\n let payload: unknown\n try {\n payload = await c.req.json()\n } catch {\n return jsonError(c, 400, {\n message: \"Request body must be valid JSON.\",\n type: \"bad_request\",\n })\n }\n\n if (!isPlainObject(payload)) {\n return jsonError(c, 400, {\n message: \"Request body must be an object.\",\n type: \"bad_request\",\n })\n }\n\n const accountType = payload.accountType\n if (!isAccountType(accountType)) {\n return jsonError(c, 400, {\n message: \"accountType must be one of: individual, business, enterprise\",\n type: \"bad_request\",\n })\n }\n\n // Enterprise accounts may optionally provide a custom GHE/GHES domain.\n // When omitted, auth stays on the public github.com flow.\n const enterpriseDomainRaw = payload.enterpriseDomain\n let enterpriseDomain: string | undefined\n if (accountType === \"enterprise\" && typeof enterpriseDomainRaw === \"string\") {\n enterpriseDomain = enterpriseDomainRaw.trim() || undefined\n }\n\n try {\n const result = await authSessionManager.startAuth({\n accountType,\n enterpriseDomain,\n })\n return c.json(result)\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error)\n return jsonError(c, 500, {\n message: `Failed to start auth: ${msg}`,\n type: \"internal_error\",\n })\n }\n})\n\nadminApiRoutes.get(\"/accounts/auth/status/:sessionId\", (c) => {\n const sessionId = c.req.param(\"sessionId\")\n const status = authSessionManager.getStatus(sessionId)\n\n if (!status) {\n return jsonError(c, 404, {\n message: \"Session not found.\",\n type: \"not_found\",\n })\n }\n\n return c.json(status)\n})\n\nadminApiRoutes.post(\"/accounts/auth/cancel/:sessionId\", (c) => {\n const sessionId = c.req.param(\"sessionId\")\n const cancelled = authSessionManager.cancel(sessionId)\n\n if (!cancelled) {\n return jsonError(c, 404, {\n message: \"Session not found.\",\n type: \"not_found\",\n })\n }\n\n return c.json({ cancelled: true })\n})\n\nadminApiRoutes.patch(\"/accounts/:id\", async (c) => {\n const accountId = c.req.param(\"id\")\n\n let payload: unknown\n try {\n payload = await c.req.json()\n } catch {\n return jsonError(c, 400, {\n message: \"Invalid JSON body.\",\n type: \"bad_request\",\n })\n }\n\n if (\n typeof payload !== \"object\"\n || payload === null\n || Array.isArray(payload)\n || typeof (payload as Record<string, unknown>).enabled !== \"boolean\"\n ) {\n return jsonError(c, 400, {\n message: \"Request body must contain { enabled: boolean }.\",\n type: \"bad_request\",\n })\n }\n\n const enabled = (payload as Record<string, unknown>).enabled as boolean\n\n try {\n const registry = await loadRegistry()\n const entry = registry.accounts.find((a) => a.id === accountId)\n\n if (!entry) {\n return jsonError(c, 404, {\n message: \"Account not found.\",\n type: \"not_found\",\n })\n }\n\n entry.enabled = enabled\n await saveRegistry(registry)\n await accountsManager.reloadRegistryNow()\n\n return c.json({ success: true })\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error)\n return jsonError(c, 500, {\n message: `Failed to update account: ${msg}`,\n type: \"internal_error\",\n })\n }\n})\n\nadminApiRoutes.delete(\"/accounts/:id\", async (c) => {\n const accountId = c.req.param(\"id\")\n\n try {\n const accounts = await listAccountsFromRegistry()\n const exists = accounts.some((a) => a.id === accountId)\n\n if (!exists) {\n return jsonError(c, 404, {\n message: \"Account not found.\",\n type: \"not_found\",\n })\n }\n\n // Remove registry entry first (authoritative state), then token file.\n // If registry removal succeeds but token removal fails, the orphaned\n // token file is harmless and will be ignored on next startup.\n await removeAccountFromRegistry(accountId)\n try {\n await removeAccountToken(accountId)\n } catch (error) {\n console.error(\n `Account ${accountId} deleted but token cleanup failed.`,\n error,\n )\n }\n\n // Force immediate reload so the next GET /accounts reflects the deletion\n await accountsManager.reloadRegistryNow()\n\n return c.json({ deleted: true, accountId })\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error)\n return jsonError(c, 500, {\n message: `Failed to delete account: ${msg}`,\n type: \"internal_error\",\n })\n }\n})\n\nadminApiRoutes.post(\"/accounts/:id/reauth\", async (c) => {\n const accountId = c.req.param(\"id\")\n\n try {\n const accounts = await listAccountsFromRegistry()\n const account = accounts.find((a) => a.id === accountId)\n\n if (!account) {\n return jsonError(c, 404, {\n message: \"Account not found.\",\n type: \"not_found\",\n })\n }\n\n const { oauthApp } = getCurrentIdentityEnvironment()\n const clientIdentity = await getAccountClientIdentityByLoginAndApp(\n accountId,\n oauthApp,\n )\n\n // Use the stored enterprise domain if it's not the default \"public\"\n const resolvedEnterpriseDomain = clientIdentity?.enterpriseDomain\n let enterpriseDomain: string | undefined\n if (\n resolvedEnterpriseDomain\n && resolvedEnterpriseDomain !== DEFAULT_IDENTITY_ENTERPRISE_DOMAIN\n ) {\n enterpriseDomain = resolvedEnterpriseDomain\n }\n\n const result = await authSessionManager.startAuth({\n accountType: account.accountType,\n enterpriseDomain,\n reauthAccountId: accountId,\n })\n\n return c.json(result)\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error)\n return jsonError(c, 500, {\n message: `Failed to start reauth: ${msg}`,\n type: \"internal_error\",\n })\n }\n})\n\nadminApiRoutes.get(\"/stats/premium-daily\", (c) => {\n const url = new URL(c.req.url, \"http://local\")\n const p = url.searchParams\n\n const from = p.get(\"from\") || undefined\n const to = p.get(\"to\") || undefined\n const accountId = p.get(\"account_id\") || undefined\n const granularity = p.get(\"granularity\") === \"hour\" ? \"hour\" : \"day\"\n\n const now = new Date()\n const todayStr = toLocalDateString(now.getTime())\n\n const resolvedFrom =\n from\n || toLocalDateString(\n new Date(now.getFullYear(), now.getMonth(), now.getDate() - 6).getTime(),\n )\n const resolvedTo = to || todayStr\n\n // Parse YYYY-MM-DD as local time (not UTC)\n function parseLocalDate(dateStr: string): Date {\n const [y, m, d] = dateStr.split(\"-\").map(Number)\n return new Date(y, m - 1, d)\n }\n\n /** DST-safe end-of-day: next local midnight minus 1 ms. */\n function localDateEndMs(dateStr: string): number {\n const [y, m, d] = dateStr.split(\"-\").map(Number)\n return new Date(y, m - 1, d + 1).getTime() - 1\n }\n\n const statsStore = getStatsStore()\n if (!statsStore) {\n return c.json({\n daily: [],\n by_account: [],\n range: { from: resolvedFrom, to: resolvedTo, granularity },\n })\n }\n\n if (granularity === \"hour\") {\n // Prefer client-provided ms boundaries (browser local time)\n const clientFromMs = parseFiniteNumber(p.get(\"from_ms\"))\n const clientToMs = parseFiniteNumber(p.get(\"to_ms\"))\n\n let fromMs: number\n let toMs: number\n\n if (clientFromMs !== undefined && clientToMs !== undefined) {\n fromMs = clientFromMs\n toMs = clientToMs\n } else {\n // Fallback: DST-safe computation from date strings\n fromMs = parseLocalDate(resolvedFrom).getTime()\n toMs = localDateEndMs(resolvedTo)\n }\n\n // Keep raw-hour transport within a bounded range so the admin query stays predictable.\n if (toMs - fromMs > 35 * 24 * 60 * 60 * 1000) {\n return jsonError(c, 400, {\n message:\n \"Hourly granularity is only supported for ranges up to 35 days.\",\n type: \"bad_request\",\n })\n }\n\n const result = statsStore.getHourlyPremiumStats({\n fromMs,\n toMs,\n accountId,\n })\n return c.json({\n daily: result.daily,\n by_account: result.byAccount,\n range: { from: resolvedFrom, to: resolvedTo, granularity },\n })\n }\n\n const result = statsStore.getDailyPremiumStats({\n from: resolvedFrom,\n to: resolvedTo,\n accountId,\n })\n return c.json({\n daily: result.daily,\n by_account: result.byAccount,\n range: { from: resolvedFrom, to: resolvedTo, granularity },\n })\n})\n\nadminApiRoutes.route(\"/\", replayRoutes)\n","import { Hono } from \"hono\"\nimport { existsSync } from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport * as path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\nfunction resolveAdminDistDir(): string | null {\n // Prefer locating dist/admin relative to the compiled output (dist/*.js).\n const candidates = [\n fileURLToPath(new URL(\"./admin/\", import.meta.url)),\n // Fallback for local dev (src/routes/admin/route.ts -> ../../../dist/admin).\n fileURLToPath(new URL(\"../../../dist/admin/\", import.meta.url)),\n ]\n\n for (const dir of candidates) {\n if (existsSync(dir)) return dir\n }\n\n return null\n}\n\nfunction safeResolveFile(distDir: string, relPath: string): string | null {\n const normalized = relPath.startsWith(\"/\") ? relPath.slice(1) : relPath\n const full = path.resolve(distDir, normalized)\n const rel = path.relative(distDir, full)\n\n if (rel.startsWith(\"..\") || path.isAbsolute(rel)) return null\n return full\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"application/javascript; charset=utf-8\",\n \".css\": \"text/css; charset=utf-8\",\n \".svg\": \"image/svg+xml\",\n \".json\": \"application/json; charset=utf-8\",\n \".map\": \"application/json; charset=utf-8\",\n \".png\": \"image/png\",\n \".ico\": \"image/x-icon\",\n \".woff2\": \"font/woff2\",\n}\n\nfunction contentTypeFor(filePath: string): string | undefined {\n return CONTENT_TYPES[path.extname(filePath).toLowerCase()]\n}\n\nconst html = `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>copilot-api admin</title>\n <style>\n :root {\n --bg: #0b1020;\n --panel: #121a33;\n --text: #e6e9f2;\n --muted: #aab3d0;\n --border: #243055;\n --good: #28c37b;\n --bad: #ff5b5b;\n --warn: #ffb020;\n --mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,\n \"Liberation Mono\", \"Courier New\", monospace;\n --sans: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto,\n Helvetica, Arial, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n }\n * { box-sizing: border-box; }\n body {\n margin: 0;\n background: var(--bg);\n color: var(--text);\n font-family: var(--sans);\n }\n a { color: inherit; }\n header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 16px;\n border-bottom: 1px solid var(--border);\n background: linear-gradient(180deg, rgba(18,26,51,.9), rgba(11,16,32,.9));\n position: sticky;\n top: 0;\n z-index: 10;\n backdrop-filter: blur(6px);\n }\n header h1 {\n margin: 0;\n font-size: 14px;\n letter-spacing: .2px;\n font-weight: 650;\n }\n header nav {\n display: flex;\n gap: 10px;\n }\n header nav a {\n padding: 6px 10px;\n border: 1px solid var(--border);\n border-radius: 8px;\n text-decoration: none;\n color: var(--muted);\n }\n header nav a.active {\n color: var(--text);\n border-color: #3a4a7e;\n background: rgba(255,255,255,.04);\n }\n .header-right {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n .token-controls {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .token-controls input {\n min-width: 160px;\n }\n main {\n padding: 16px;\n max-width: 1200px;\n margin: 0 auto;\n }\n .panel {\n border: 1px solid var(--border);\n background: rgba(18,26,51,.65);\n border-radius: 12px;\n padding: 12px;\n margin-bottom: 16px;\n }\n .row {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n align-items: end;\n }\n label {\n display: flex;\n flex-direction: column;\n gap: 6px;\n font-size: 12px;\n color: var(--muted);\n }\n input, select {\n background: rgba(0,0,0,.18);\n color: var(--text);\n border: 1px solid var(--border);\n border-radius: 10px;\n padding: 8px 10px;\n min-width: 180px;\n outline: none;\n }\n button {\n background: rgba(255,255,255,.06);\n color: var(--text);\n border: 1px solid var(--border);\n border-radius: 10px;\n padding: 8px 10px;\n cursor: pointer;\n }\n button:hover { border-color: #3a4a7e; }\n table {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n }\n th, td {\n border-bottom: 1px solid rgba(36,48,85,.7);\n padding: 8px 8px;\n vertical-align: top;\n }\n th {\n text-align: left;\n color: var(--muted);\n font-weight: 600;\n }\n .mono { font-family: var(--mono); }\n .pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border: 1px solid var(--border);\n border-radius: 999px;\n color: var(--muted);\n }\n .pill.good { color: var(--good); border-color: rgba(40,195,123,.35); }\n .pill.bad { color: var(--bad); border-color: rgba(255,91,91,.35); }\n .pill.warn { color: var(--warn); border-color: rgba(255,176,32,.35); }\n .muted { color: var(--muted); }\n pre {\n margin: 0;\n padding: 10px;\n border: 1px solid var(--border);\n border-radius: 10px;\n background: rgba(0,0,0,.25);\n overflow: auto;\n font-size: 12px;\n }\n .split {\n display: grid;\n grid-template-columns: 1fr;\n gap: 12px;\n }\n @media (min-width: 960px) {\n .split { grid-template-columns: 1fr 1fr; }\n }\n </style>\n </head>\n <body>\n <header>\n <h1>copilot-api / admin</h1>\n <div class=\"header-right\">\n <nav>\n <a href=\"#/accounts\" data-nav=\"accounts\">Accounts</a>\n <a href=\"#/requests\" data-nav=\"requests\">Requests</a>\n </nav>\n <div class=\"token-controls\">\n <input id=\"adminToken\" type=\"password\" placeholder=\"x-admin-token\" />\n <button id=\"adminTokenSave\">Set</button>\n <button id=\"adminTokenClear\">Clear</button>\n <span id=\"adminTokenStatus\" class=\"muted\"></span>\n </div>\n </div>\n </header>\n\n <main id=\"app\"></main>\n\n <script type=\"module\">\n const app = document.getElementById('app')\n const navLinks = [...document.querySelectorAll('a[data-nav]')]\n\n const ADMIN_TOKEN_STORAGE_KEY = 'adminToken'\n\n function getAdminToken() {\n return sessionStorage.getItem(ADMIN_TOKEN_STORAGE_KEY) || ''\n }\n\n function setAdminToken(value) {\n const token = (value || '').trim()\n if (!token) sessionStorage.removeItem(ADMIN_TOKEN_STORAGE_KEY)\n else sessionStorage.setItem(ADMIN_TOKEN_STORAGE_KEY, token)\n }\n\n function refreshAdminTokenUi() {\n const el = document.getElementById('adminTokenStatus')\n if (!el) return\n el.textContent = getAdminToken() ? 'token set' : ''\n }\n\n function initAdminTokenControls() {\n const input = document.getElementById('adminToken')\n const saveBtn = document.getElementById('adminTokenSave')\n const clearBtn = document.getElementById('adminTokenClear')\n\n if (saveBtn && input) {\n saveBtn.addEventListener('click', () => {\n setAdminToken(input.value)\n input.value = ''\n refreshAdminTokenUi()\n })\n }\n\n if (clearBtn && input) {\n clearBtn.addEventListener('click', () => {\n setAdminToken('')\n input.value = ''\n refreshAdminTokenUi()\n })\n }\n\n refreshAdminTokenUi()\n }\n\n initAdminTokenControls()\n\n function setActiveNav(key) {\n for (const a of navLinks) {\n a.classList.toggle('active', a.dataset.nav === key)\n }\n }\n\n function fmtMs(ms) {\n if (ms == null) return ''\n return new Date(ms).toISOString()\n }\n\n function fmtNum(x) {\n if (x == null || Number.isNaN(Number(x))) return ''\n return String(x)\n }\n\n function pill(text, kind) {\n return '<span class=\"pill ' + (kind || '') + '\">' + escapeHtml(text) + '</span>'\n }\n\n function qs() {\n return new URLSearchParams(location.hash.includes('?') ? location.hash.split('?')[1] : '')\n }\n\n async function api(path) {\n const token = getAdminToken()\n const headers = token ? { 'x-admin-token': token } : {}\n const res = await fetch(path, { headers })\n if (!res.ok) {\n const txt = await res.text().catch(() => '')\n throw new Error('HTTP ' + res.status + ': ' + txt)\n }\n return await res.json()\n }\n\n async function renderAccounts() {\n setActiveNav('accounts')\n app.innerHTML = [\n '<div class=\"panel\">',\n ' <div class=\"row\">',\n ' <label>Stats window',\n ' <select id=\"since\">',\n ' <option value=\"86400000\">Last 24h</option>',\n ' <option value=\"604800000\">Last 7d</option>',\n ' </select>',\n ' </label>',\n ' <button id=\"refresh\">Refresh</button>',\n ' <span class=\"muted\" id=\"meta\"></span>',\n ' </div>',\n '</div>',\n '<div class=\"panel\">',\n ' <table>',\n ' <thead>',\n ' <tr>',\n ' <th>Account</th>',\n ' <th>Status</th>',\n ' <th>Remaining</th>',\n ' <th>Requests</th>',\n ' <th>Errors</th>',\n ' <th>Tokens</th>',\n ' <th>Avg ms</th>',\n ' <th>Last req</th>',\n ' </tr>',\n ' </thead>',\n ' <tbody id=\"rows\"></tbody>',\n ' </table>',\n '</div>',\n ].join('')\n\n const sinceEl = document.getElementById('since')\n const refresh = document.getElementById('refresh')\n const rowsEl = document.getElementById('rows')\n const metaEl = document.getElementById('meta')\n\n async function load() {\n rowsEl.innerHTML = '<tr><td colspan=\"8\" class=\"muted\">Loading...</td></tr>'\n const windowMs = Number(sinceEl.value)\n const sinceMs = Date.now() - windowMs\n const [accounts, meta] = await Promise.all([\n api('/api/admin/accounts?since_ms=' + sinceMs + '&include_stats=1'),\n api('/api/admin/meta'),\n ])\n\n metaEl.textContent = 'DB v' + meta.userVersion + ' · ' + meta.dbPath\n\n rowsEl.innerHTML = accounts.items.map((a) => {\n const failed = a.runtime?.failed\n const statusPill = failed ? pill('failed', 'bad') : pill('ok', 'good')\n const rem = a.runtime?.unlimited ? pill('unlimited', 'good') : fmtNum(a.runtime?.remaining)\n const stats = a.stats || {}\n const last = stats.last_request_at_ms ? fmtMs(stats.last_request_at_ms) : ''\n const accountId = a.account_id\n const failureReason = failed\n ? '<div class=\"muted\">' + escapeHtml(a.runtime?.failureReason || '') + '</div>'\n : ''\n\n return '<tr>'\n + '<td class=\"mono\"><a href=\"#/requests?account_id='\n + encodeURIComponent(accountId)\n + '\">' + escapeHtml(accountId) + '</a></td>'\n + '<td>' + statusPill + failureReason + '</td>'\n + '<td>' + rem + '</td>'\n + '<td>' + fmtNum(stats.request_count) + '</td>'\n + '<td>' + fmtNum(stats.error_count) + '</td>'\n + '<td>' + fmtNum(stats.tokens_total) + '</td>'\n + '<td>' + fmtNum(Math.round(stats.avg_duration_ms || 0)) + '</td>'\n + '<td class=\"mono\">' + last + '</td>'\n + '</tr>'\n }).join('')\n }\n\n refresh.addEventListener('click', () => load())\n await load()\n }\n\n function buildRequestsQuery(extra = {}) {\n const p = qs()\n const out = new URLSearchParams()\n\n const keys = [\n 'account_id','upstream_model','client_model','upstream_endpoint','path',\n 'status','has_error','from_ms','to_ms','limit','cursor_id'\n ]\n for (const k of keys) {\n const v = p.get(k)\n if (v != null && v !== '') out.set(k, v)\n }\n for (const [k, v] of Object.entries(extra)) {\n if (v == null || v === '') out.delete(k)\n else out.set(k, String(v))\n }\n return out\n }\n\n async function renderRequests() {\n setActiveNav('requests')\n app.innerHTML = [\n '<div class=\"panel\">',\n ' <div class=\"row\">',\n ' <label>Account',\n ' <input id=\"account_id\" placeholder=\"octocat\" />',\n ' </label>',\n ' <label>Upstream model',\n ' <input id=\"upstream_model\" placeholder=\"gpt-5\" />',\n ' </label>',\n ' <label>Endpoint',\n ' <input id=\"upstream_endpoint\" placeholder=\"/responses\" />',\n ' </label>',\n ' <label>Status',\n ' <input id=\"status\" placeholder=\"200\" />',\n ' </label>',\n ' <label>Has error',\n ' <select id=\"has_error\">',\n ' <option value=\"\">(any)</option>',\n ' <option value=\"1\">yes</option>',\n ' <option value=\"0\">no</option>',\n ' </select>',\n ' </label>',\n ' <label>From (ms)',\n ' <input id=\"from_ms\" placeholder=\"\" />',\n ' </label>',\n ' <label>To (ms)',\n ' <input id=\"to_ms\" placeholder=\"\" />',\n ' </label>',\n ' <button id=\"apply\">Apply</button>',\n ' <button id=\"more\">Load more</button>',\n ' </div>',\n '</div>',\n '<div class=\"panel\">',\n ' <table>',\n ' <thead>',\n ' <tr>',\n ' <th>Time</th>',\n ' <th>Path</th>',\n ' <th>Endpoint</th>',\n ' <th>Account</th>',\n ' <th>Model</th>',\n ' <th>Tokens</th>',\n ' <th>Cost</th>',\n ' <th>Quota</th>',\n ' <th>Dur</th>',\n ' <th>Status</th>',\n ' </tr>',\n ' </thead>',\n ' <tbody id=\"rows\"></tbody>',\n ' </table>',\n '</div>',\n ].join('')\n\n const rowsEl = document.getElementById('rows')\n const applyBtn = document.getElementById('apply')\n const moreBtn = document.getElementById('more')\n\n const fields = ['account_id','upstream_model','upstream_endpoint','status','has_error','from_ms','to_ms']\n for (const f of fields) {\n const el = document.getElementById(f)\n const v = qs().get(f) || ''\n el.value = v\n }\n\n let nextCursor = qs().get('cursor_id') || ''\n let loading = false\n\n function setHashFromForm(cursorId) {\n const out = new URLSearchParams()\n for (const f of fields) {\n const v = document.getElementById(f).value.trim()\n if (v) out.set(f, v)\n }\n out.set('limit', '50')\n if (cursorId) out.set('cursor_id', cursorId)\n location.hash = '#/requests?' + out.toString()\n }\n\n async function load(reset) {\n if (loading) return\n loading = true\n try {\n const q = buildRequestsQuery({ limit: 50, cursor_id: reset ? '' : nextCursor })\n const data = await api('/api/admin/requests?' + q.toString())\n\n if (reset) rowsEl.innerHTML = ''\n\n for (const r of data.items) {\n const status = r.http_status\n const statusP = status >= 400 ? pill(status, 'bad') : pill(status, 'good')\n const when = fmtMs(r.started_at_ms)\n const quota = r.premium_unlimited_after\n ? '∞'\n : (r.premium_remaining_after != null ? fmtNum(r.premium_remaining_after) : '')\n const dur = r.duration_ms != null ? fmtNum(r.duration_ms) : ''\n const acct = r.account_id || ''\n const model = r.upstream_model || ''\n const tokens = r.tokens_total != null ? fmtNum(r.tokens_total) : ''\n\n rowsEl.insertAdjacentHTML('beforeend',\n '<tr>'\n + '<td class=\"mono\">' + when + '</td>'\n + '<td class=\"mono\"><a href=\"#/request/' + encodeURIComponent(r.request_id) + '\">' + escapeHtml(r.path) + '</a></td>'\n + '<td class=\"mono\">' + escapeHtml(r.upstream_endpoint || '') + '</td>'\n + '<td class=\"mono\">' + escapeHtml(acct) + '</td>'\n + '<td class=\"mono\">' + escapeHtml(model) + '</td>'\n + '<td class=\"mono\">' + tokens + '</td>'\n + '<td class=\"mono\">' + (r.cost_units ?? '') + '</td>'\n + '<td class=\"mono\">' + quota + '</td>'\n + '<td class=\"mono\">' + dur + '</td>'\n + '<td>' + statusP + '</td>'\n + '</tr>'\n )\n }\n\n nextCursor = data.next_cursor_id || ''\n moreBtn.disabled = !data.has_more\n } catch (e) {\n rowsEl.innerHTML = '<tr><td colspan=\"10\" class=\"muted\">' + escapeHtml(String(e)) + '</td></tr>'\n } finally {\n loading = false\n }\n }\n\n applyBtn.addEventListener('click', () => setHashFromForm(''))\n moreBtn.addEventListener('click', () => load(false))\n\n await load(true)\n }\n\n async function renderRequestDetail(requestId) {\n setActiveNav('requests')\n app.innerHTML = '<div class=\"panel\"><div class=\"muted\">Loading...</div></div>'\n const data = await api('/api/admin/requests/' + encodeURIComponent(requestId))\n const r = data.item\n if (!r) {\n app.innerHTML = '<div class=\"panel\"><div class=\"muted\">Not found</div></div>'\n return\n }\n\n app.innerHTML = [\n '<div class=\"panel\">',\n ' <div class=\"row\">',\n ' <div class=\"mono\">request_id: ' + escapeHtml(r.request_id) + '</div>',\n ' <div class=\"mono\">status: ' + r.http_status + '</div>',\n ' <div class=\"mono\">dur_ms: ' + (r.duration_ms ?? '') + '</div>',\n ' <div class=\"mono\">ttfb_ms: ' + (r.ttfb_ms ?? '') + '</div>',\n ' </div>',\n '</div>',\n '',\n '<div class=\"split\">',\n ' <div class=\"panel\">',\n ' <h3 style=\"margin:0 0 8px 0; font-size: 13px;\">Summary</h3>',\n ' <table>',\n ' <tbody>',\n ' <tr><th>time</th><td class=\"mono\">' + fmtMs(r.started_at_ms) + '</td></tr>',\n ' <tr><th>path</th><td class=\"mono\">' + escapeHtml(r.path) + '</td></tr>',\n ' <tr><th>endpoint</th><td class=\"mono\">' + escapeHtml(r.upstream_endpoint || '') + '</td></tr>',\n ' <tr><th>account</th><td class=\"mono\">' + escapeHtml(r.account_id || '') + '</td></tr>',\n ' <tr><th>model</th><td class=\"mono\">' + escapeHtml(r.upstream_model || '') + '</td></tr>',\n ' <tr><th>client</th><td class=\"mono\">' + escapeHtml(r.client_ip || '') + ' ' + (r.user_agent ? '(' + escapeHtml(r.user_agent) + ')' : '') + '</td></tr>',\n ' <tr><th>tokens</th><td class=\"mono\">in=' + (r.tokens_input ?? '') + ' out=' + (r.tokens_output ?? '') + ' total=' + (r.tokens_total ?? '') + ' cached=' + (r.tokens_cached_input ?? '') + '</td></tr>',\n ' <tr><th>quota</th><td class=\"mono\">before=' + (r.premium_remaining_before ?? '') + ' after=' + (r.premium_remaining_after ?? '') + ' diff=' + (r.premium_remaining_diff ?? '') + '</td></tr>',\n ' </tbody>',\n ' </table>',\n ' </div>',\n '',\n ' <div class=\"panel\">',\n ' <h3 style=\"margin:0 0 8px 0; font-size: 13px;\">Raw</h3>',\n ' <pre class=\"mono\">' + escapeHtml(JSON.stringify(r, null, 2)) + '</pre>',\n ' </div>',\n '</div>',\n ].join('')\n }\n\n function escapeHtml(s) {\n return String(s)\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''')\n }\n\n function route() {\n const h = location.hash || '#/accounts'\n const [path] = h.slice(1).split('?')\n if (path === '/accounts') return renderAccounts()\n if (path === '/requests') return renderRequests()\n if (path.startsWith('/request/')) {\n const requestId = decodeURIComponent(path.slice('/request/'.length))\n return renderRequestDetail(requestId)\n }\n location.hash = '#/accounts'\n }\n\n window.addEventListener('hashchange', route)\n route()\n </script>\n </body>\n</html>\n`\n\nexport const adminRoutes = new Hono()\n\nadminRoutes.get(\"*\", async (c) => {\n // Optional rollback: serve legacy inlined admin UI.\n if (process.env.ADMIN_UI_LEGACY === \"1\") {\n return c.html(html)\n }\n\n const distDir = resolveAdminDistDir()\n if (!distDir) {\n return c.html(html)\n }\n\n const url = new URL(c.req.url)\n\n // Compute path relative to the mounted /admin prefix.\n let relPath = url.pathname\n if (relPath.startsWith(\"/admin\")) {\n relPath = relPath.slice(\"/admin\".length)\n if (relPath === \"\") relPath = \"/\"\n }\n\n const requested = relPath === \"/\" ? \"/index.html\" : relPath\n const filePath = safeResolveFile(distDir, requested)\n if (!filePath) {\n return c.html(html)\n }\n\n try {\n const fileBuf = await readFile(filePath)\n const data = new Uint8Array(\n fileBuf.buffer.slice(\n fileBuf.byteOffset,\n fileBuf.byteOffset + fileBuf.byteLength,\n ),\n )\n const headers: Record<string, string> = {}\n\n const contentType = contentTypeFor(filePath)\n if (contentType) headers[\"content-type\"] = contentType\n\n if (requested.startsWith(\"/assets/\")) {\n headers[\"cache-control\"] = \"public, max-age=31536000, immutable\"\n } else if (requested.endsWith(\".html\")) {\n headers[\"cache-control\"] = \"no-cache\"\n } else {\n headers[\"cache-control\"] = \"public, max-age=31536000\"\n }\n\n return c.body(data, 200, headers)\n } catch {\n // For non-asset paths (e.g. /admin/settings), fall back to index.html.\n if (!relPath.includes(\".\")) {\n const indexPath = safeResolveFile(distDir, \"/index.html\")\n if (indexPath) {\n try {\n const indexBuf = await readFile(indexPath)\n const indexData = new Uint8Array(\n indexBuf.buffer.slice(\n indexBuf.byteOffset,\n indexBuf.byteOffset + indexBuf.byteLength,\n ),\n )\n return c.body(indexData, 200, {\n \"content-type\": \"text/html; charset=utf-8\",\n \"cache-control\": \"no-cache\",\n })\n } catch {\n // ignore\n }\n }\n }\n\n return c.html(html)\n }\n})\n","import consola from \"consola\"\n\nimport { HTTPError } from \"./error\"\n\nexport const awaitApproval = async () => {\n const response = await consola.prompt(`Accept incoming request?`, {\n type: \"confirm\",\n })\n\n if (!response)\n throw new HTTPError(\n \"Request rejected\",\n Response.json({ message: \"Request rejected\" }, { status: 403 }),\n )\n}\n","import consola from \"consola\"\n\nimport type { AccountContext, AccountRuntime } from \"~/lib/types/account\"\n\nimport { HTTPError } from \"~/lib/error\"\n\nexport type ErrorDetails = {\n httpStatus: number\n errorName: string\n errorStatus: number | undefined\n errorMessage: string\n unauthorized: boolean\n ownershipMismatch: boolean\n}\n\nexport type ErrorObservability = ErrorDetails & {\n upstreamErrorMessageRaw?: string\n upstreamErrorMessageReadFailed?: boolean\n}\n\nexport function truncate(value: string, max: number = 2000): string {\n if (value.length <= max) return value\n return `${value.slice(0, max)}…`\n}\n\nexport function computeDiff(\n before?: number,\n after?: number,\n): number | undefined {\n if (typeof before !== \"number\" || typeof after !== \"number\") return undefined\n return after - before\n}\n\nexport function toAccountContext(account: AccountRuntime): AccountContext {\n return {\n accountLogin: account.accountLogin,\n githubToken: account.githubToken,\n copilotToken: account.copilotToken,\n ...(account.copilotApiUrl !== undefined ?\n { copilotApiUrl: account.copilotApiUrl }\n : {}),\n accountType: account.accountType,\n vsCodeVersion: account.vsCodeVersion,\n clientDeviceId: account.clientDeviceId,\n clientMachineId: account.clientMachineId,\n clientSessionId: account.clientSessionId,\n }\n}\n\nconst OWNERSHIP_MISMATCH_PATTERN = /does not belong to this connection/i\nconst UUID_PATTERN =\n /\\b[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\\b/gi\nconst OPAQUE_ID_PATTERN =\n /\\b(?:msg|resp|chatcmpl|out|toolu|call|item)_[\\w-]+\\b/g\nconst UPSTREAM_ERROR_MAX_LENGTH = 1000\nconst UPSTREAM_ERROR_READ_FAILED_SENTINEL = \"[upstream body read failed]\"\n\nfunction sanitizeUpstreamErrorMessage(value: string): string {\n return truncate(\n value\n .trim()\n .replaceAll(UUID_PATTERN, \"<uuid>\")\n .replaceAll(OPAQUE_ID_PATTERN, \"<opaque_id>\"),\n UPSTREAM_ERROR_MAX_LENGTH,\n )\n}\n\ntype UpstreamErrorBody = {\n message?: unknown\n code?: unknown\n error?: { message?: unknown; code?: unknown }\n}\n\nfunction readErrorField(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined\n}\n\nfunction formatUpstreamErrorBody(payload: unknown): string | undefined {\n if (typeof payload === \"string\") {\n const text = payload.trim()\n return text.length > 0 ? text : undefined\n }\n\n if (!payload || typeof payload !== \"object\") {\n return undefined\n }\n\n const root = payload as UpstreamErrorBody\n const message =\n readErrorField(root.error?.message) ?? readErrorField(root.message)\n const code = readErrorField(root.error?.code) ?? readErrorField(root.code)\n\n if (message && code) {\n return `${message} [code:${code}]`\n }\n\n return message ?? (code ? `[code:${code}]` : undefined)\n}\n\nasync function extractUpstreamErrorMessageRaw(error: unknown): Promise<{\n upstreamErrorMessageRaw?: string\n upstreamErrorMessageReadFailed: boolean\n}> {\n if (!(error instanceof HTTPError)) {\n return { upstreamErrorMessageReadFailed: false }\n }\n\n try {\n const bodyText = await error.response.clone().text()\n if (!bodyText) {\n return { upstreamErrorMessageReadFailed: false }\n }\n\n let candidate: string | undefined\n\n try {\n candidate = formatUpstreamErrorBody(JSON.parse(bodyText) as unknown)\n } catch {\n candidate = bodyText\n }\n\n if (!candidate) {\n return { upstreamErrorMessageReadFailed: false }\n }\n\n const sanitized = sanitizeUpstreamErrorMessage(candidate)\n return {\n upstreamErrorMessageRaw: sanitized.length > 0 ? sanitized : undefined,\n upstreamErrorMessageReadFailed: false,\n }\n } catch (readError) {\n consola.warn(\"Failed to read upstream HTTP error response body:\", {\n status: error.response.status,\n readError,\n })\n return { upstreamErrorMessageReadFailed: true }\n }\n}\n\nexport function extractErrorDetails(error: unknown): ErrorDetails {\n const errorName = error instanceof Error ? error.name : \"Error\"\n const errorMessage =\n error instanceof Error ? truncate(error.message) : truncate(String(error))\n\n const errorStatus =\n error instanceof HTTPError ? error.response.status : undefined\n const httpStatus = errorStatus ?? 500\n\n const unauthorized = errorStatus === 401\n const ownershipMismatch =\n unauthorized && OWNERSHIP_MISMATCH_PATTERN.test(errorMessage)\n\n return {\n httpStatus,\n errorName,\n errorStatus,\n errorMessage,\n unauthorized,\n ownershipMismatch,\n }\n}\n\nexport async function extractErrorObservability(\n error: unknown,\n): Promise<ErrorObservability> {\n const details = extractErrorDetails(error)\n const { upstreamErrorMessageRaw, upstreamErrorMessageReadFailed } =\n await extractUpstreamErrorMessageRaw(error)\n const observableUpstreamErrorMessageRaw =\n upstreamErrorMessageRaw\n ?? (upstreamErrorMessageReadFailed ?\n UPSTREAM_ERROR_READ_FAILED_SENTINEL\n : undefined)\n\n return {\n ...details,\n ownershipMismatch:\n details.ownershipMismatch\n || (details.unauthorized\n && OWNERSHIP_MISMATCH_PATTERN.test(upstreamErrorMessageRaw ?? \"\")),\n upstreamErrorMessageRaw: observableUpstreamErrorMessageRaw,\n upstreamErrorMessageReadFailed,\n }\n}\n\nexport function getUserVisibleErrorMessage(\n details: Pick<\n ErrorObservability,\n | \"errorMessage\"\n | \"upstreamErrorMessageRaw\"\n | \"upstreamErrorMessageReadFailed\"\n >,\n): string {\n if (details.upstreamErrorMessageReadFailed) {\n return details.errorMessage\n }\n\n return details.upstreamErrorMessageRaw ?? details.errorMessage\n}\n\n/**\n * Returns true when the 401 indicates a genuine auth/token failure\n * (not an ownership mismatch) and the account should be marked failed.\n */\nexport function shouldMarkAccountFailed(\n details: ErrorDetails & { upstreamErrorMessageReadFailed?: boolean },\n): boolean {\n return (\n details.unauthorized\n && !details.ownershipMismatch\n && details.upstreamErrorMessageReadFailed !== true\n )\n}\n","type CleanupHandler = () => void | Promise<void>\n\nconst cleanupHandlers = new Set<CleanupHandler>()\n\nlet cleanupPromise: Promise<void> | null = null\nlet cleanupState: \"idle\" | \"running\" | \"done\" = \"idle\"\nlet runtimeInitialized = false\n\nfunction initializeProcessCleanupRuntime(): void {\n if (runtimeInitialized) {\n return\n }\n\n runtimeInitialized = true\n\n process.once(\"beforeExit\", () => {\n void runProcessCleanups()\n })\n process.once(\"exit\", runProcessCleanupsSync)\n process.once(\"SIGINT\", () => {\n void shutdownProcess(0)\n })\n process.once(\"SIGTERM\", () => {\n void shutdownProcess(0)\n })\n}\n\nfunction runProcessCleanupsSync(): void {\n if (cleanupState !== \"idle\") {\n return\n }\n\n cleanupState = \"done\"\n for (const handler of Array.from(cleanupHandlers)) {\n try {\n void handler()\n } catch {\n // Ignore best-effort cleanup failures during process exit.\n }\n }\n}\n\nasync function runProcessCleanups(): Promise<void> {\n if (cleanupPromise) {\n return cleanupPromise\n }\n\n if (cleanupState === \"done\") {\n return\n }\n\n cleanupState = \"running\"\n cleanupPromise = (async () => {\n for (const handler of Array.from(cleanupHandlers)) {\n await handler()\n }\n cleanupState = \"done\"\n })()\n\n return cleanupPromise\n}\n\nasync function shutdownProcess(exitCode: number): Promise<void> {\n try {\n await runProcessCleanups()\n } finally {\n process.exit(exitCode)\n }\n}\n\nexport function registerProcessCleanup(handler: CleanupHandler): () => void {\n initializeProcessCleanupRuntime()\n cleanupHandlers.add(handler)\n\n return () => {\n cleanupHandlers.delete(handler)\n }\n}\n","import consola, { type ConsolaInstance } from \"consola\"\nimport fs from \"node:fs\"\nimport path from \"node:path\"\nimport util from \"node:util\"\n\nimport { getLogLevel, type LogLevel } from \"./config\"\nimport { PATHS } from \"./paths\"\nimport { registerProcessCleanup } from \"./process-cleanup\"\nimport { requestContext } from \"./request-context\"\n\nconst LOG_RETENTION_DAYS = 7\nconst LOG_RETENTION_MS = LOG_RETENTION_DAYS * 24 * 60 * 60 * 1000\nconst CLEANUP_INTERVAL_MS = 24 * 60 * 60 * 1000\nconst FLUSH_INTERVAL_MS = 1000\nconst MAX_BUFFER_SIZE = 100\n\nconst FILE_LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n}\n\n// Mutable so tests can override to a temp directory\nlet logDir = path.join(PATHS.APP_DIR, \"logs\")\n// Test-only logLevel override; undefined means use getLogLevel() from config\nlet testLogLevelOverride: LogLevel | undefined\n\nconst logStreams = new Map<string, fs.WriteStream>()\nconst logBuffers = new Map<string, Array<string>>()\n\nlet runtimeInitialized = false\nlet flushInterval: ReturnType<typeof setInterval> | undefined\nlet cleanupInterval: ReturnType<typeof setInterval> | undefined\n\nconst ensureLogDirectory = () => {\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true })\n }\n}\n\nconst cleanupOldLogs = () => {\n if (!fs.existsSync(logDir)) {\n return\n }\n\n const now = Date.now()\n\n for (const entry of fs.readdirSync(logDir)) {\n const filePath = path.join(logDir, entry)\n\n let stats: fs.Stats\n try {\n stats = fs.statSync(filePath)\n } catch {\n continue\n }\n\n if (!stats.isFile()) {\n continue\n }\n\n if (now - stats.mtimeMs > LOG_RETENTION_MS) {\n try {\n fs.rmSync(filePath)\n } catch {\n continue\n }\n }\n }\n}\n\nconst formatArgs = (args: Array<unknown>) =>\n args\n .map((arg) =>\n typeof arg === \"string\" ? arg : (\n util.inspect(arg, { depth: null, colors: false })\n ),\n )\n .join(\" \")\n\nconst sanitizeName = (name: string) => {\n const normalized = name\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, \"-\")\n .replaceAll(/^-+|-+$/g, \"\")\n\n return normalized === \"\" ? \"handler\" : normalized\n}\n\nconst getHandlerLogFilePath = (name: string, date: Date): string => {\n const dateKey = [\n date.getFullYear(),\n String(date.getMonth() + 1).padStart(2, \"0\"),\n String(date.getDate()).padStart(2, \"0\"),\n ].join(\"-\")\n return path.join(logDir, `${sanitizeName(name)}-${dateKey}.log`)\n}\n\nconst maybeUnref = (timer: ReturnType<typeof setInterval>) => {\n timer.unref()\n}\n\nconst flushBuffer = (filePath: string) => {\n const buffer = logBuffers.get(filePath)\n if (!buffer || buffer.length === 0) {\n return\n }\n\n const stream = getLogStream(filePath)\n const content = buffer.join(\"\\n\") + \"\\n\"\n stream.write(content, (error) => {\n if (error) {\n console.warn(\"Failed to write handler log\", error)\n }\n })\n\n logBuffers.set(filePath, [])\n}\n\nconst flushAllBuffers = () => {\n for (const filePath of logBuffers.keys()) {\n flushBuffer(filePath)\n }\n}\n\nconst cleanup = () => {\n if (flushInterval) {\n clearInterval(flushInterval)\n flushInterval = undefined\n }\n if (cleanupInterval) {\n clearInterval(cleanupInterval)\n cleanupInterval = undefined\n }\n\n flushAllBuffers()\n for (const stream of logStreams.values()) {\n stream.end()\n }\n logStreams.clear()\n logBuffers.clear()\n}\n\nconst initializeLoggerRuntime = () => {\n if (runtimeInitialized) {\n return\n }\n\n runtimeInitialized = true\n\n ensureLogDirectory()\n cleanupOldLogs()\n\n flushInterval = setInterval(flushAllBuffers, FLUSH_INTERVAL_MS)\n maybeUnref(flushInterval)\n\n cleanupInterval = setInterval(cleanupOldLogs, CLEANUP_INTERVAL_MS)\n maybeUnref(cleanupInterval)\n\n registerProcessCleanup(cleanup)\n}\n\nconst getLogStream = (filePath: string): fs.WriteStream => {\n initializeLoggerRuntime()\n\n let stream = logStreams.get(filePath)\n if (!stream || stream.destroyed) {\n stream = fs.createWriteStream(filePath, { flags: \"a\" })\n logStreams.set(filePath, stream)\n\n stream.on(\"error\", (error: unknown) => {\n console.warn(\"Log stream error\", error)\n logStreams.delete(filePath)\n })\n }\n return stream\n}\n\nconst appendLine = (filePath: string, line: string) => {\n let buffer = logBuffers.get(filePath)\n if (!buffer) {\n buffer = []\n logBuffers.set(filePath, buffer)\n }\n\n buffer.push(line)\n\n if (buffer.length >= MAX_BUFFER_SIZE) {\n flushBuffer(filePath)\n }\n}\n\nexport const normalizeLogTypeToLevel = (type: string | undefined): LogLevel => {\n switch (type) {\n case \"error\": {\n return \"error\"\n }\n case \"warn\": {\n return \"warn\"\n }\n case \"debug\": {\n return \"debug\"\n }\n default: {\n return \"info\"\n }\n }\n}\n\nexport const shouldWriteFileLog = (\n type: string | undefined,\n logLevel: LogLevel = resolveLogLevel(),\n): boolean => {\n const typeLevel = normalizeLogTypeToLevel(type)\n return FILE_LOG_LEVEL_PRIORITY[typeLevel] <= FILE_LOG_LEVEL_PRIORITY[logLevel]\n}\n\nconst resolveLogLevel = (): LogLevel => testLogLevelOverride ?? getLogLevel()\n\nconst isDebugFileLoggingEnabled = (): boolean => resolveLogLevel() === \"debug\"\n\nexport const resetLoggerRuntimeForTests = (\n overrideLogDir?: string,\n logLevelOverride?: LogLevel,\n): void => {\n if (flushInterval) {\n clearInterval(flushInterval)\n flushInterval = undefined\n }\n if (cleanupInterval) {\n clearInterval(cleanupInterval)\n cleanupInterval = undefined\n }\n\n for (const stream of logStreams.values()) {\n stream.destroy()\n }\n logStreams.clear()\n logBuffers.clear()\n\n runtimeInitialized = false\n logDir = overrideLogDir ?? path.join(PATHS.APP_DIR, \"logs\")\n testLogLevelOverride = logLevelOverride\n}\n\nexport const getBufferedLogLinesForTests = (name: string): Array<string> => {\n const prefix = `${sanitizeName(name)}-`\n\n for (const [filePath, lines] of logBuffers.entries()) {\n if (path.basename(filePath).startsWith(prefix)) {\n return [...lines]\n }\n }\n\n return []\n}\n\n/** @deprecated use resetLoggerRuntimeForTests / getBufferedLogLinesForTests */\nexport const __loggerTestUtils = {\n getBufferedHandlerLogLines: getBufferedLogLinesForTests,\n resetBufferedLogs(): void {\n logBuffers.clear()\n },\n}\n\ntype DebugLogger = Pick<ConsolaInstance, \"debug\">\n\nexport const debugLazy = (\n logger: DebugLogger,\n factory: () => [unknown, ...Array<unknown>],\n): void => {\n if (!isDebugFileLoggingEnabled()) {\n return\n }\n\n logger.debug(...factory())\n}\n\nexport const debugJson = (\n logger: DebugLogger,\n label: string,\n value: unknown,\n): void => {\n debugLazy(logger, () => [label, JSON.stringify(value)])\n}\n\nexport const debugJsonTail = (\n logger: DebugLogger,\n label: string,\n { value, tailLength = 400 }: { value: unknown; tailLength?: number },\n): void => {\n debugLazy(logger, () => [label, JSON.stringify(value).slice(-tailLength)])\n}\n\n// Consola level mapping: 0=error, 1=warn, 2=info/log/success, 3=verbose, 4=debug, 5=trace\n// Match the configured file log level so consola short-circuits irrelevant events before\n// they reach the reporter. \"info\" intentionally maps to 2 so info/log/success still pass.\nconst getConsolaLevel = (): number => {\n const logLevel = resolveLogLevel()\n\n switch (logLevel) {\n case \"error\": {\n return 0\n }\n case \"warn\": {\n return 1\n }\n case \"info\": {\n return 2\n }\n case \"debug\": {\n return 4\n }\n default: {\n const exhaustiveCheck: never = logLevel\n return exhaustiveCheck\n }\n }\n}\n\nexport const createHandlerLogger = (name: string): ConsolaInstance => {\n const instance = consola.withTag(name)\n\n Object.defineProperty(instance, \"level\", {\n get: getConsolaLevel,\n configurable: true,\n })\n\n instance.setReporters([])\n\n instance.addReporter({\n log(logObj) {\n const fileLogLevel = resolveLogLevel()\n if (!shouldWriteFileLog(logObj.type, fileLogLevel)) {\n return\n }\n\n initializeLoggerRuntime()\n\n const context = requestContext.getStore()\n const traceId = context?.traceId\n const date = logObj.date\n const timestamp = date.toLocaleString(\"sv-SE\", { hour12: false })\n const filePath = getHandlerLogFilePath(name, date)\n const message = formatArgs(logObj.args as Array<unknown>)\n const traceIdStr = traceId ? ` [${traceId}]` : \"\"\n const line = `[${timestamp}] [${logObj.type}] [${logObj.tag || name}]${traceIdStr}${\n message ? ` ${message}` : \"\"\n }`\n\n appendLine(filePath, line)\n },\n })\n\n return instance\n}\n","import consola from \"consola\"\n\nimport type { State } from \"./state\"\n\nimport { HTTPError } from \"./error\"\nimport { sleep } from \"./utils\"\n\nexport async function checkRateLimit(state: State) {\n if (state.rateLimitSeconds === undefined) return\n\n const now = Date.now()\n\n if (!state.lastRequestTimestamp) {\n state.lastRequestTimestamp = now\n return\n }\n\n const elapsedSeconds = (now - state.lastRequestTimestamp) / 1000\n\n if (elapsedSeconds > state.rateLimitSeconds) {\n state.lastRequestTimestamp = now\n return\n }\n\n const waitTimeSeconds = Math.ceil(state.rateLimitSeconds - elapsedSeconds)\n\n if (!state.rateLimitWait) {\n consola.warn(\n `Rate limit exceeded. Need to wait ${waitTimeSeconds} more seconds.`,\n )\n throw new HTTPError(\n \"Rate limit exceeded\",\n Response.json({ message: \"Rate limit exceeded\" }, { status: 429 }),\n )\n }\n\n const waitTimeMs = waitTimeSeconds * 1000\n consola.warn(\n `Rate limit reached. Waiting ${waitTimeSeconds} seconds before proceeding...`,\n )\n await sleep(waitTimeMs)\n // eslint-disable-next-line require-atomic-updates\n state.lastRequestTimestamp = now\n consola.info(\"Rate limit wait completed, proceeding with request\")\n return\n}\n","import type { Context } from \"hono\"\n\nimport { randomUUID } from \"node:crypto\"\n\nimport type {\n AccountSelectionReason,\n SelectAccountForRequestFailureReason,\n} from \"~/lib/accounts-manager\"\nimport type { AffinityKeySource } from \"~/lib/utils\"\n\nimport { getClientIpInfo, getRequestHistoryStore } from \"~/lib/request-history\"\nimport { flushPendingCapture } from \"~/services/copilot/copilot-fetch\"\n\nexport const CHAT_COMPLETIONS_ENDPOINT = \"/chat/completions\"\nexport const GPT_5_4_MODEL_ID = \"gpt-5.4\"\nexport const GPT_5_4_CHAT_COMPLETIONS_MESSAGE =\n \"Please use `/v1/responses` or `/v1/messages` API\"\n\nexport type RequestContext = {\n requestId: string\n startedAtMs: number\n\n method: string\n path: string\n\n clientIp?: string\n clientIpSource?: string\n userAgent?: string\n\n userId?: string\n safetyIdentifier?: string\n promptCacheKey?: string\n initiator?: \"agent\" | \"user\"\n upstreamRequestId?: string\n upstreamSessionId?: string\n\n affinityKeyUsed?: string\n affinityKeySource?: AffinityKeySource\n selectionReason?: AccountSelectionReason\n affinityHit?: boolean\n affinityCacheKey?: string\n}\n\nexport type ChatCompletionsHistoryStore = ReturnType<\n typeof getRequestHistoryStore\n>\n\ntype RequestLogInsert = Parameters<ChatCompletionsHistoryStore[\"insert\"]>[0]\n\nexport function buildRequestContext(c: Context): RequestContext {\n const requestId = randomUUID()\n const startedAtMs = Date.now()\n\n const method = c.req.raw.method\n const path = new URL(c.req.url, \"http://local\").pathname\n\n const { ip: clientIp, source: clientIpSource } = getClientIpInfo(c)\n const userAgent = c.req.header(\"user-agent\") ?? undefined\n\n return {\n requestId,\n startedAtMs,\n method,\n path,\n clientIp,\n clientIpSource,\n userAgent,\n }\n}\n\nexport function insertRequestLog(\n store: ChatCompletionsHistoryStore,\n request: RequestContext,\n record: Omit<\n RequestLogInsert,\n | \"requestId\"\n | \"startedAtMs\"\n | \"method\"\n | \"path\"\n | \"clientIp\"\n | \"clientIpSource\"\n | \"userAgent\"\n >,\n): void {\n store.insert({\n requestId: request.requestId,\n startedAtMs: request.startedAtMs,\n method: request.method,\n path: request.path,\n clientIp: request.clientIp,\n clientIpSource: request.clientIpSource,\n userAgent: request.userAgent,\n userId: request.userId,\n safetyIdentifier: request.safetyIdentifier,\n promptCacheKey: request.promptCacheKey,\n initiator: request.initiator,\n upstreamRequestId: request.upstreamRequestId,\n affinityKeyUsed: request.affinityKeyUsed,\n affinityKeySource: request.affinityKeySource,\n selectionReason: request.selectionReason,\n affinityHit: request.affinityHit,\n affinityCacheKey: request.affinityCacheKey,\n ...record,\n })\n void flushPendingCapture(request.requestId)\n}\n\nexport function recordUnsupportedChatCompletionsModel(\n store: ChatCompletionsHistoryStore,\n params: {\n request: RequestContext\n stream: boolean\n clientModel: string\n upstreamModel?: string\n accountId?: string\n accountType?: string\n costUnits?: number\n premiumRemainingBefore?: number\n premiumRemainingAfter?: number\n premiumUnlimitedBefore?: boolean\n premiumUnlimitedAfter?: boolean\n },\n): void {\n const {\n request,\n stream,\n clientModel,\n upstreamModel,\n accountId,\n accountType,\n costUnits,\n premiumRemainingBefore,\n premiumRemainingAfter,\n premiumUnlimitedBefore,\n premiumUnlimitedAfter,\n } = params\n const finishedAtMs = Date.now()\n let premiumRemainingDiff: number | undefined\n if (\n premiumRemainingBefore !== undefined\n && premiumRemainingAfter !== undefined\n ) {\n premiumRemainingDiff = premiumRemainingAfter - premiumRemainingBefore\n }\n\n insertRequestLog(store, request, {\n finishedAtMs,\n durationMs: finishedAtMs - request.startedAtMs,\n upstreamEndpoint: CHAT_COMPLETIONS_ENDPOINT,\n stream,\n accountId,\n accountType,\n costUnits,\n clientModel,\n upstreamModel,\n premiumRemainingBefore,\n premiumRemainingAfter,\n premiumRemainingDiff,\n premiumUnlimitedBefore,\n premiumUnlimitedAfter,\n httpStatus: 400,\n errorName: \"invalid_request_error\",\n errorMessage: GPT_5_4_CHAT_COMPLETIONS_MESSAGE,\n })\n}\n\nexport function unsupportedChatCompletionsModelResponse(c: Context) {\n return c.json(\n {\n error: {\n message: GPT_5_4_CHAT_COMPLETIONS_MESSAGE,\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n}\n\nfunction getSelectionFailureStatus(\n reason: SelectAccountForRequestFailureReason,\n): number {\n if (reason === \"MODEL_NOT_SUPPORTED\") return 400\n if (reason === \"NO_ACCOUNTS\") return 503\n return 429\n}\n\nexport function recordSelectionFailure(\n store: ChatCompletionsHistoryStore,\n params: {\n request: RequestContext\n stream: boolean\n clientModel: string\n reason: SelectAccountForRequestFailureReason\n },\n): void {\n const { request, stream, clientModel, reason } = params\n const finishedAtMs = Date.now()\n\n insertRequestLog(store, request, {\n finishedAtMs,\n durationMs: finishedAtMs - request.startedAtMs,\n upstreamEndpoint: CHAT_COMPLETIONS_ENDPOINT,\n stream,\n clientModel,\n httpStatus: getSelectionFailureStatus(reason),\n selectionFailureReason: reason,\n })\n}\n\nexport function selectionFailureResponse(\n c: Context,\n params: {\n clientModel: string\n reason: SelectAccountForRequestFailureReason\n },\n) {\n const { clientModel, reason } = params\n\n if (reason === \"MODEL_NOT_SUPPORTED\") {\n return c.json(\n {\n error: {\n message: `Model \"${clientModel}\" is not available for any configured account.`,\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n\n if (reason === \"NO_ACCOUNTS\") {\n return c.json(\n {\n error: {\n message:\n \"No enabled Copilot accounts are configured. Add or re-enable an account.\",\n type: \"service_unavailable_error\",\n },\n },\n 503,\n )\n }\n\n return c.json(\n {\n error: {\n message:\n \"All accounts have exhausted their quota. Please wait for quota refresh or add additional accounts.\",\n type: \"rate_limit_error\",\n },\n },\n 429,\n )\n}\n","import type { Context } from \"hono\"\n\nimport { streamSSE, type SSEMessage } from \"hono/streaming\"\n\nimport { accountsManager } from \"~/lib/accounts-manager\"\nimport { awaitApproval } from \"~/lib/approval\"\nimport { getAliasTargetSet, resolveModelAlias } from \"~/lib/config\"\nimport {\n computeDiff,\n extractErrorObservability,\n getUserVisibleErrorMessage,\n shouldMarkAccountFailed,\n toAccountContext,\n} from \"~/lib/handler-utils\"\nimport { createHandlerLogger, debugJson, debugJsonTail } from \"~/lib/logger\"\nimport { checkRateLimit } from \"~/lib/rate-limit\"\nimport {\n getRequestHistoryStore,\n normalizeChatCompletionsUsage,\n type NormalizedUsage,\n} from \"~/lib/request-history\"\nimport { state } from \"~/lib/state\"\nimport { getTokenCount } from \"~/lib/tokenizer\"\nimport {\n generateRequestIdFromPayload,\n getUUID,\n isNullish,\n parseUserIdMetadata,\n resolveAffinityKey,\n} from \"~/lib/utils\"\nimport {\n createChatCompletions,\n getChatInitiator,\n type ChatCompletionChunk,\n type ChatCompletionResponse,\n type ChatCompletionsPayload,\n} from \"~/services/copilot/create-chat-completions\"\n\nimport {\n buildRequestContext,\n CHAT_COMPLETIONS_ENDPOINT,\n GPT_5_4_MODEL_ID,\n insertRequestLog,\n recordSelectionFailure,\n recordUnsupportedChatCompletionsModel,\n selectionFailureResponse,\n type ChatCompletionsHistoryStore,\n type RequestContext,\n unsupportedChatCompletionsModelResponse,\n} from \"./support\"\n\nconst logger = createHandlerLogger(\"chat-completions-handler\")\n\nfunction buildChatCompletionCandidates(clientModel: string) {\n return [\n {\n modelId: clientModel,\n endpoint: CHAT_COMPLETIONS_ENDPOINT,\n },\n ]\n}\nfunction isUnsupportedChatCompletionsModel(modelId: string): boolean {\n return resolveModelAlias(modelId).toLowerCase() === GPT_5_4_MODEL_ID\n}\n\nfunction maybeRejectChatCompletionsClientModel(\n c: Context,\n store: Store,\n params: {\n request: RequestContext\n clientModel: string\n streamRequested: boolean\n },\n): Response | null {\n const { request, clientModel, streamRequested } = params\n\n if (isUnsupportedChatCompletionsModel(clientModel)) {\n recordUnsupportedChatCompletionsModel(store, {\n request,\n clientModel,\n stream: streamRequested,\n })\n return unsupportedChatCompletionsModelResponse(c)\n }\n\n if (getAliasTargetSet().has(clientModel.toLowerCase())) {\n recordSelectionFailure(store, {\n request,\n clientModel,\n stream: streamRequested,\n reason: \"MODEL_NOT_SUPPORTED\",\n })\n return selectionFailureResponse(c, {\n clientModel,\n reason: \"MODEL_NOT_SUPPORTED\",\n })\n }\n\n return null\n}\n\nexport async function handleCompletion(c: Context) {\n await checkRateLimit(state)\n const store = getRequestHistoryStore()\n const request = buildRequestContext(c)\n const payload = await c.req.json<ChatCompletionsPayload>()\n const clientModel = payload.model\n const streamRequested = Boolean(payload.stream)\n const initiator = getChatInitiator(payload.messages)\n const normalizedPromptCacheKey = applyChatRequestMetadata(\n request,\n payload,\n initiator,\n )\n\n const blockedResponse = maybeRejectChatCompletionsClientModel(c, store, {\n request,\n clientModel,\n streamRequested,\n })\n if (blockedResponse) {\n return blockedResponse\n }\n\n const selectionResult = await selectChatCompletionAccount({\n c,\n store,\n request,\n payload,\n clientModel,\n streamRequested,\n normalizedPromptCacheKey,\n })\n if (selectionResult instanceof Response) {\n return selectionResult\n }\n\n const { headerSessionId, selection, upstreamRequestId } = selectionResult\n const { account, reservation, selectedModel } = selection\n request.affinityHit = selection.affinityHit\n request.affinityCacheKey = selection.affinityCacheKey\n request.selectionReason = selection.selectionReason\n\n const premiumRemainingBefore = account.premiumRemaining\n const premiumUnlimitedBefore = account.unlimited\n\n if (selectedModel.id === GPT_5_4_MODEL_ID) {\n await accountsManager.finalizeQuota(account, reservation)\n recordUnsupportedChatCompletionsModel(store, {\n request,\n clientModel,\n stream: streamRequested,\n upstreamModel: selectedModel.id,\n accountId: account.id,\n accountType: account.accountType,\n costUnits: selection.costUnits,\n premiumRemainingBefore,\n premiumRemainingAfter: account.premiumRemaining,\n premiumUnlimitedBefore,\n premiumUnlimitedAfter: account.unlimited,\n })\n return unsupportedChatCompletionsModelResponse(c)\n }\n const upstreamPayload = { ...payload, model: selectedModel.id }\n\n await logTokenCountForRequest({ payload: upstreamPayload, selectedModel })\n\n if (state.manualApprove) await awaitApproval()\n\n const payloadWithMaxTokens = applyDefaultMaxTokens(\n upstreamPayload,\n selectedModel,\n )\n\n const accountCtx = toAccountContext(account)\n const upstreamSessionId = getUUID(\n normalizedPromptCacheKey ?? headerSessionId ?? upstreamRequestId,\n )\n request.upstreamRequestId = upstreamRequestId\n request.upstreamSessionId = upstreamSessionId\n\n if (streamRequested) {\n return handleStreamingRequest({\n c,\n store,\n request,\n payload: payloadWithMaxTokens,\n selection,\n accountCtx,\n clientModel,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n })\n }\n\n return handleNonStreamingRequest({\n c,\n store,\n request,\n payload: payloadWithMaxTokens,\n selection,\n accountCtx,\n clientModel,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n })\n}\n\ntype AccountSelection = Awaited<\n ReturnType<(typeof accountsManager)[\"selectAccountForRequest\"]>\n>\n\ntype AccountSelectionOk = Extract<AccountSelection, { ok: true }>\n\ntype Store = ChatCompletionsHistoryStore\n\ntype ChatCompletionsResult = Awaited<ReturnType<typeof createChatCompletions>>\n\ntype ChatCompletionsStream = Exclude<\n ChatCompletionsResult,\n ChatCompletionResponse\n>\n\ntype StreamSseStream = Parameters<Parameters<typeof streamSSE>[1]>[0]\n\nfunction applyChatRequestMetadata(\n request: RequestContext,\n payload: ChatCompletionsPayload,\n initiator: \"agent\" | \"user\",\n): string | undefined {\n const userId = payload.user ?? undefined\n const { safetyIdentifier, sessionId: promptCacheKey } =\n parseUserIdMetadata(userId)\n const normalizedPromptCacheKey = promptCacheKey ?? undefined\n\n request.userId = userId\n request.safetyIdentifier = safetyIdentifier ?? undefined\n request.promptCacheKey = normalizedPromptCacheKey\n request.initiator = initiator\n\n return normalizedPromptCacheKey\n}\n\nasync function writeChatCompletionsStreamError(\n stream: StreamSseStream,\n message: string,\n): Promise<void> {\n try {\n await stream.writeSSE({\n data: JSON.stringify({\n error: {\n message,\n type: \"error\",\n },\n }),\n })\n await stream.writeSSE({ data: \"[DONE]\" })\n } catch (streamError) {\n logger.warn(\n \"Failed to write chat completions stream error event:\",\n streamError,\n )\n }\n}\n\nasync function selectChatCompletionAccount(params: {\n c: Context\n store: Store\n request: RequestContext\n payload: ChatCompletionsPayload\n clientModel: string\n streamRequested: boolean\n normalizedPromptCacheKey: string | undefined\n}): Promise<\n | Response\n | {\n headerSessionId: string | null\n selection: AccountSelectionOk\n upstreamRequestId: string\n }\n> {\n const {\n c,\n store,\n request,\n payload,\n clientModel,\n streamRequested,\n normalizedPromptCacheKey,\n } = params\n\n debugJsonTail(logger, \"Request payload:\", { value: payload, tailLength: 400 })\n const upstreamRequestId = generateRequestIdFromPayload(\n payload,\n normalizedPromptCacheKey,\n )\n const headerSessionId = c.req.header(\"x-session-id\") ?? null\n const affinityKey = resolveAffinityKey({\n metadataSessionId: normalizedPromptCacheKey,\n headerSessionId,\n upstreamRequestId,\n })\n\n request.affinityKeyUsed = affinityKey.affinityKeyUsed\n request.affinityKeySource = affinityKey.affinityKeySource\n\n const selection = await accountsManager.selectAccountForRequest(\n buildChatCompletionCandidates(clientModel),\n {\n requestId: affinityKey.requestId,\n },\n )\n if (!selection.ok) {\n recordSelectionFailure(store, {\n request,\n clientModel,\n stream: streamRequested,\n reason: selection.reason,\n })\n return selectionFailureResponse(c, {\n clientModel,\n reason: selection.reason,\n })\n }\n\n return {\n headerSessionId,\n selection,\n upstreamRequestId,\n }\n}\n\nasync function logTokenCountForRequest(params: {\n payload: ChatCompletionsPayload\n selectedModel: AccountSelectionOk[\"selectedModel\"]\n}) {\n try {\n const tokenCount = await getTokenCount(params.payload, params.selectedModel)\n logger.info(\"Current token count:\", tokenCount)\n } catch (error) {\n logger.warn(\"Failed to calculate token count:\", error)\n }\n}\n\nfunction applyDefaultMaxTokens(\n payload: ChatCompletionsPayload,\n selectedModel: AccountSelectionOk[\"selectedModel\"],\n): ChatCompletionsPayload {\n if (!isNullish(payload.max_tokens)) {\n return payload\n }\n\n const updated = {\n ...payload,\n max_tokens: selectedModel.capabilities.limits.max_output_tokens,\n }\n\n debugJson(logger, \"Set max_tokens to:\", updated.max_tokens)\n\n return updated\n}\n\nasync function handleStreamingRequest(params: {\n c: Context\n store: Store\n request: RequestContext\n payload: ChatCompletionsPayload\n selection: AccountSelectionOk\n accountCtx: Parameters<typeof createChatCompletions>[1]\n clientModel: string\n premiumRemainingBefore: number | undefined\n premiumUnlimitedBefore: boolean | undefined\n}): Promise<Response> {\n const {\n c,\n store,\n request,\n payload,\n selection,\n accountCtx,\n clientModel,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n } = params\n\n let response: ChatCompletionsResult\n\n try {\n response = await createChatCompletions(payload, accountCtx, {\n upstreamRequestId: request.upstreamRequestId,\n sessionId: request.upstreamSessionId,\n requestId: request.requestId,\n })\n selection.confirmAffinity?.()\n } catch (error) {\n return handleUpstreamCreateError({\n store,\n request,\n selection,\n clientModel,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n error,\n })\n }\n\n // A defensive guard: stream requested, but upstream returned a non-stream response.\n if (isNonStreaming(response)) {\n return handleNonStreamingUpstreamResponse({\n c,\n store,\n request,\n selection,\n clientModel,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n response,\n })\n }\n\n logger.debug(\"Streaming response\")\n\n return streamSSE(c, (stream) =>\n streamChatCompletionsAndLog({\n stream,\n response,\n store,\n request,\n selection,\n clientModel,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n }),\n )\n}\n\nasync function handleUpstreamCreateError(params: {\n store: Store\n request: RequestContext\n selection: AccountSelectionOk\n clientModel: string\n premiumRemainingBefore: number | undefined\n premiumUnlimitedBefore: boolean | undefined\n error: unknown\n}): Promise<never> {\n const {\n store,\n request,\n selection,\n clientModel,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n error,\n } = params\n\n const { account, reservation, selectedModel, endpoint, costUnits } = selection\n\n const finishedAtMs = Date.now()\n const details = await extractErrorObservability(error)\n\n if (shouldMarkAccountFailed(details)) {\n accountsManager.markAccountFailed(account.id, \"Unauthorized (401)\")\n }\n\n await accountsManager.finalizeQuota(account, reservation)\n\n const premiumRemainingAfter = account.premiumRemaining\n const premiumUnlimitedAfter = account.unlimited\n\n insertRequestLog(store, request, {\n finishedAtMs,\n durationMs: finishedAtMs - request.startedAtMs,\n upstreamEndpoint: endpoint,\n stream: true,\n accountId: account.id,\n accountType: account.accountType,\n costUnits,\n clientModel,\n upstreamModel: selectedModel.id,\n premiumRemainingBefore,\n premiumRemainingAfter,\n premiumRemainingDiff: computeDiff(\n premiumRemainingBefore,\n premiumRemainingAfter,\n ),\n premiumUnlimitedBefore,\n premiumUnlimitedAfter,\n httpStatus: details.httpStatus,\n errorName: details.errorName,\n errorStatus: details.errorStatus,\n errorMessage: details.errorMessage,\n upstreamErrorMessageRaw: details.upstreamErrorMessageRaw,\n })\n\n throw error\n}\n\nasync function handleNonStreamingUpstreamResponse(params: {\n c: Context\n store: Store\n request: RequestContext\n selection: AccountSelectionOk\n clientModel: string\n premiumRemainingBefore: number | undefined\n premiumUnlimitedBefore: boolean | undefined\n response: ChatCompletionResponse\n}): Promise<Response> {\n const {\n c,\n store,\n request,\n selection,\n clientModel,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n response,\n } = params\n\n const { account, reservation, selectedModel, endpoint, costUnits } = selection\n\n let httpStatus = 200\n const usage: NormalizedUsage = normalizeChatCompletionsUsage(response.usage)\n let errorName: string | undefined\n let errorStatus: number | undefined\n let errorMessage: string | undefined\n let upstreamErrorMessageRaw: string | undefined\n\n const finishedAtMs = Date.now()\n\n try {\n debugJson(logger, \"Non-streaming response:\", response)\n return c.json(response)\n } catch (error) {\n const details = await extractErrorObservability(error)\n httpStatus = details.httpStatus\n errorName = details.errorName\n errorStatus = details.errorStatus\n errorMessage = details.errorMessage\n upstreamErrorMessageRaw = details.upstreamErrorMessageRaw\n\n throw error\n } finally {\n await accountsManager.finalizeQuota(account, reservation)\n\n const premiumRemainingAfter = account.premiumRemaining\n const premiumUnlimitedAfter = account.unlimited\n\n insertRequestLog(store, request, {\n finishedAtMs,\n durationMs: finishedAtMs - request.startedAtMs,\n upstreamEndpoint: endpoint,\n stream: false,\n accountId: account.id,\n accountType: account.accountType,\n costUnits,\n clientModel,\n upstreamModel: selectedModel.id,\n ...usage,\n premiumRemainingBefore,\n premiumRemainingAfter,\n premiumRemainingDiff: computeDiff(\n premiumRemainingBefore,\n premiumRemainingAfter,\n ),\n premiumUnlimitedBefore,\n premiumUnlimitedAfter,\n httpStatus,\n errorName,\n errorStatus,\n errorMessage,\n upstreamErrorMessageRaw,\n })\n }\n}\n\nasync function streamChatCompletionsAndLog(params: {\n stream: StreamSseStream\n response: ChatCompletionsStream\n store: Store\n request: RequestContext\n selection: AccountSelectionOk\n clientModel: string\n premiumRemainingBefore: number | undefined\n premiumUnlimitedBefore: boolean | undefined\n}): Promise<void> {\n const {\n stream,\n response,\n store,\n request,\n selection,\n clientModel,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n } = params\n\n const { account, reservation, selectedModel, endpoint, costUnits } = selection\n\n let ttfbMs: number | undefined\n let lastUsage: NormalizedUsage = {}\n let errorName: string | undefined\n let errorStatus: number | undefined\n let errorMessage: string | undefined\n let upstreamErrorMessageRaw: string | undefined\n\n try {\n for await (const rawChunk of response) {\n const chunk = rawChunk as SSEMessage\n\n if (ttfbMs === undefined) {\n ttfbMs = Date.now() - request.startedAtMs\n }\n\n const usage = await extractUsageFromChunk(chunk)\n if (usage) {\n lastUsage = usage\n }\n\n debugJson(logger, \"Streaming chunk:\", chunk)\n await stream.writeSSE(chunk)\n }\n } catch (error) {\n const details = await extractErrorObservability(error)\n errorName = details.errorName\n errorStatus = details.errorStatus\n errorMessage = details.errorMessage\n upstreamErrorMessageRaw = details.upstreamErrorMessageRaw\n\n logger.warn(\"Streaming error:\", error)\n\n if (shouldMarkAccountFailed(details)) {\n accountsManager.markAccountFailed(account.id, \"Unauthorized (401)\")\n }\n\n await writeChatCompletionsStreamError(\n stream,\n getUserVisibleErrorMessage(details),\n )\n } finally {\n const finishedAtMs = Date.now()\n\n await accountsManager.finalizeQuota(account, reservation)\n\n const premiumRemainingAfter = account.premiumRemaining\n const premiumUnlimitedAfter = account.unlimited\n\n insertRequestLog(store, request, {\n finishedAtMs,\n durationMs: finishedAtMs - request.startedAtMs,\n ttfbMs,\n upstreamEndpoint: endpoint,\n stream: true,\n accountId: account.id,\n accountType: account.accountType,\n costUnits,\n clientModel,\n upstreamModel: selectedModel.id,\n ...lastUsage,\n premiumRemainingBefore,\n premiumRemainingAfter,\n premiumRemainingDiff: computeDiff(\n premiumRemainingBefore,\n premiumRemainingAfter,\n ),\n premiumUnlimitedBefore,\n premiumUnlimitedAfter,\n httpStatus: errorStatus ?? (errorName ? 500 : 200),\n errorName,\n errorStatus,\n errorMessage,\n upstreamErrorMessageRaw,\n })\n }\n}\n\nasync function extractUsageFromChunk(\n chunk: SSEMessage,\n): Promise<NormalizedUsage | undefined> {\n let data: string | undefined\n\n try {\n data = typeof chunk.data === \"string\" ? chunk.data : await chunk.data\n } catch (error) {\n logger.warn(\"Failed to read chat completions usage chunk:\", error)\n return undefined\n }\n\n if (!data || data === \"[DONE]\") {\n return undefined\n }\n\n try {\n const parsed = JSON.parse(data) as ChatCompletionChunk\n if (!parsed.usage) return undefined\n return normalizeChatCompletionsUsage(parsed.usage)\n } catch (error) {\n logger.warn(\"Failed to parse chat completions usage chunk:\", {\n error,\n data,\n })\n return undefined\n }\n}\n\nasync function handleNonStreamingRequest(params: {\n c: Context\n store: Store\n request: RequestContext\n payload: ChatCompletionsPayload\n selection: AccountSelectionOk\n accountCtx: Parameters<typeof createChatCompletions>[1]\n clientModel: string\n premiumRemainingBefore: number | undefined\n premiumUnlimitedBefore: boolean | undefined\n}): Promise<Response> {\n const {\n c,\n store,\n request,\n payload,\n selection,\n accountCtx,\n clientModel,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n } = params\n\n const { account, reservation, selectedModel, endpoint, costUnits } = selection\n\n let httpStatus = 200\n let usage: NormalizedUsage = {}\n let errorName: string | undefined\n let errorStatus: number | undefined\n let errorMessage: string | undefined\n let upstreamErrorMessageRaw: string | undefined\n let finishedAtMs: number | undefined\n\n try {\n const response = await createChatCompletions(payload, accountCtx, {\n upstreamRequestId: request.upstreamRequestId,\n sessionId: request.upstreamSessionId,\n requestId: request.requestId,\n })\n if (!isNonStreaming(response)) {\n throw new Error(\"Upstream returned a stream unexpectedly\")\n }\n selection.confirmAffinity?.()\n finishedAtMs = Date.now()\n usage = normalizeChatCompletionsUsage(response.usage)\n\n debugJson(logger, \"Non-streaming response:\", response)\n return c.json(response)\n } catch (error) {\n finishedAtMs = Date.now()\n\n const details = await extractErrorObservability(error)\n httpStatus = details.httpStatus\n\n errorName = details.errorName\n errorStatus = details.errorStatus\n errorMessage = details.errorMessage\n upstreamErrorMessageRaw = details.upstreamErrorMessageRaw\n\n if (shouldMarkAccountFailed(details)) {\n accountsManager.markAccountFailed(account.id, \"Unauthorized (401)\")\n }\n\n throw error\n } finally {\n const finishedAtMsFinal = finishedAtMs ?? Date.now()\n\n await accountsManager.finalizeQuota(account, reservation)\n\n const premiumRemainingAfter = account.premiumRemaining\n const premiumUnlimitedAfter = account.unlimited\n\n insertRequestLog(store, request, {\n finishedAtMs: finishedAtMsFinal,\n durationMs: finishedAtMsFinal - request.startedAtMs,\n upstreamEndpoint: endpoint,\n stream: false,\n accountId: account.id,\n accountType: account.accountType,\n costUnits,\n clientModel,\n upstreamModel: selectedModel.id,\n ...usage,\n premiumRemainingBefore,\n premiumRemainingAfter,\n premiumRemainingDiff: computeDiff(\n premiumRemainingBefore,\n premiumRemainingAfter,\n ),\n premiumUnlimitedBefore,\n premiumUnlimitedAfter,\n httpStatus,\n errorName,\n errorStatus,\n errorMessage,\n upstreamErrorMessageRaw,\n })\n }\n}\n\nconst isNonStreaming = (\n response: Awaited<ReturnType<typeof createChatCompletions>>,\n): response is ChatCompletionResponse => Object.hasOwn(response, \"choices\")\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\n\nimport { handleCompletion } from \"./handler\"\n\nexport const completionRoutes = new Hono()\n\ncompletionRoutes.post(\"/\", async (c) => {\n try {\n return await handleCompletion(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import type { AccountContext } from \"~/lib/types/account\"\n\nimport { copilotHeaders, copilotBaseUrl } from \"~/lib/api-config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { captureOutboundHeadersSnapshot } from \"~/lib/request-context\"\nimport { accountFromState } from \"~/lib/state\"\n\nimport { copilotFetch } from \"./copilot-fetch\"\n\nexport const createEmbeddings = async (\n payload: EmbeddingRequest,\n account?: AccountContext,\n options?: {\n requestId?: string\n },\n) => {\n const ctx = account ?? accountFromState()\n if (!ctx.copilotToken) throw new Error(\"Copilot token not found\")\n\n const headers = copilotHeaders(ctx)\n captureOutboundHeadersSnapshot(headers)\n\n const response = await copilotFetch(\n `${copilotBaseUrl(ctx)}/embeddings`,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n },\n {\n requestId: options?.requestId,\n callSite: \"embeddings\",\n capturable: false,\n },\n )\n\n if (!response.ok) throw new HTTPError(\"Failed to create embeddings\", response)\n\n return (await response.json()) as EmbeddingResponse\n}\n\nexport interface EmbeddingRequest {\n input: string | Array<string>\n model: string\n}\n\nexport interface Embedding {\n object: string\n embedding: Array<number>\n index: number\n}\n\nexport interface EmbeddingResponse {\n object: string\n data: Array<Embedding>\n model: string\n usage: {\n prompt_tokens: number\n total_tokens: number\n }\n}\n","import { Hono, type Context } from \"hono\"\nimport { randomUUID } from \"node:crypto\"\n\nimport { accountsManager } from \"~/lib/accounts-manager\"\nimport { getAliasTargetSet } from \"~/lib/config\"\nimport { forwardError } from \"~/lib/error\"\nimport {\n computeDiff,\n extractErrorObservability,\n shouldMarkAccountFailed,\n toAccountContext,\n} from \"~/lib/handler-utils\"\nimport {\n getClientIpInfo,\n getRequestHistoryStore,\n normalizeEmbeddingsUsage,\n type NormalizedUsage,\n} from \"~/lib/request-history\"\nimport {\n createEmbeddings,\n type EmbeddingRequest,\n} from \"~/services/copilot/create-embeddings\"\n\nexport const embeddingRoutes = new Hono()\n\nconst EMBEDDINGS_ENDPOINT = \"/embeddings\"\n\ntype AccountSelection = Awaited<\n ReturnType<(typeof accountsManager)[\"selectAccountForRequest\"]>\n>\n\ntype AccountSelectionOk = Extract<AccountSelection, { ok: true }>\n\ntype AccountSelectionErr = Extract<AccountSelection, { ok: false }>\n\ntype RequestContext = {\n requestId: string\n startedAtMs: number\n\n method: string\n path: string\n\n clientIp?: string\n clientIpSource?: string\n userAgent?: string\n}\n\nembeddingRoutes.post(\"/\", async (c) => {\n try {\n const store = getRequestHistoryStore()\n\n const requestId = randomUUID()\n const startedAtMs = Date.now()\n\n const method = c.req.raw.method\n const path = new URL(c.req.url, \"http://local\").pathname\n\n const { ip: clientIp, source: clientIpSource } = getClientIpInfo(c)\n const userAgent = c.req.header(\"user-agent\") ?? undefined\n\n const ctx: RequestContext = {\n requestId,\n startedAtMs,\n method,\n path,\n clientIp,\n clientIpSource,\n userAgent,\n }\n\n const payload = await c.req.json<EmbeddingRequest>()\n const clientModel = payload.model\n\n const blockedTargets = getAliasTargetSet()\n if (blockedTargets.has(clientModel.toLowerCase())) {\n recordSelectionFailure(store, {\n ctx,\n clientModel,\n reason: \"MODEL_NOT_SUPPORTED\",\n })\n return selectionFailureResponse(c, clientModel, \"MODEL_NOT_SUPPORTED\")\n }\n\n const selection = await accountsManager.selectAccountForRequest([\n {\n modelId: clientModel,\n endpoint: EMBEDDINGS_ENDPOINT,\n },\n ])\n\n if (!selection.ok) {\n recordSelectionFailure(store, {\n ctx,\n clientModel,\n reason: selection.reason,\n })\n return selectionFailureResponse(c, clientModel, selection.reason)\n }\n\n const upstreamPayload = { ...payload, model: selection.selectedModel.id }\n\n return await runEmbeddingsWithAccount({\n c,\n store,\n ctx,\n payload: upstreamPayload,\n clientModel,\n selection,\n })\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n\nfunction recordSelectionFailure(\n store: ReturnType<typeof getRequestHistoryStore>,\n params: {\n ctx: RequestContext\n clientModel: string\n reason: AccountSelectionErr[\"reason\"]\n },\n): void {\n const { ctx, clientModel, reason } = params\n\n const finishedAtMs = Date.now()\n\n store.insert({\n requestId: ctx.requestId,\n startedAtMs: ctx.startedAtMs,\n finishedAtMs,\n durationMs: finishedAtMs - ctx.startedAtMs,\n method: ctx.method,\n path: ctx.path,\n upstreamEndpoint: EMBEDDINGS_ENDPOINT,\n stream: false,\n clientModel,\n clientIp: ctx.clientIp,\n clientIpSource: ctx.clientIpSource,\n userAgent: ctx.userAgent,\n httpStatus: reason === \"MODEL_NOT_SUPPORTED\" ? 400 : 429,\n selectionFailureReason: reason,\n })\n}\n\nfunction selectionFailureResponse(\n c: Context,\n clientModel: string,\n reason: AccountSelectionErr[\"reason\"],\n) {\n if (reason === \"MODEL_NOT_SUPPORTED\") {\n return c.json(\n {\n error: {\n message: `Model \"${clientModel}\" is not available for any configured account.`,\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n\n return c.json(\n {\n error: {\n message:\n \"All accounts have exhausted their quota. Please wait for quota refresh or add additional accounts.\",\n type: \"rate_limit_error\",\n },\n },\n 429,\n )\n}\n\nasync function runEmbeddingsWithAccount({\n c,\n store,\n ctx,\n payload,\n clientModel,\n selection,\n}: {\n c: Context\n store: ReturnType<typeof getRequestHistoryStore>\n ctx: RequestContext\n payload: EmbeddingRequest\n clientModel: string\n selection: AccountSelectionOk\n}) {\n const { account, reservation, selectedModel, endpoint, costUnits } = selection\n\n const premiumRemainingBefore = account.premiumRemaining\n const premiumUnlimitedBefore = account.unlimited\n\n let httpStatus = 200\n let usage: NormalizedUsage = {}\n let errorName: string | undefined\n let errorStatus: number | undefined\n let errorMessage: string | undefined\n let upstreamErrorMessageRaw: string | undefined\n\n let finishedAtMs: number | undefined\n\n try {\n const accountCtx = toAccountContext(account)\n\n const response = await createEmbeddings(payload, accountCtx, {\n requestId: ctx.requestId,\n })\n\n usage = normalizeEmbeddingsUsage(response.usage)\n\n finishedAtMs = Date.now()\n return c.json(response)\n } catch (error) {\n finishedAtMs = Date.now()\n\n const details = await extractErrorObservability(error)\n\n httpStatus = details.httpStatus\n errorName = details.errorName\n errorStatus = details.errorStatus\n errorMessage = details.errorMessage\n upstreamErrorMessageRaw = details.upstreamErrorMessageRaw\n\n if (shouldMarkAccountFailed(details)) {\n accountsManager.markAccountFailed(account.id, \"Unauthorized (401)\")\n }\n\n throw error\n } finally {\n const finishedAtMsFinal = finishedAtMs ?? Date.now()\n\n await accountsManager.finalizeQuota(account, reservation)\n\n const premiumRemainingAfter = account.premiumRemaining\n const premiumUnlimitedAfter = account.unlimited\n\n store.insert({\n requestId: ctx.requestId,\n startedAtMs: ctx.startedAtMs,\n finishedAtMs: finishedAtMsFinal,\n durationMs: finishedAtMsFinal - ctx.startedAtMs,\n method: ctx.method,\n path: ctx.path,\n upstreamEndpoint: endpoint,\n stream: false,\n accountId: account.id,\n accountType: account.accountType,\n costUnits,\n clientModel,\n upstreamModel: selectedModel.id,\n clientIp: ctx.clientIp,\n clientIpSource: ctx.clientIpSource,\n userAgent: ctx.userAgent,\n ...usage,\n premiumRemainingBefore,\n premiumRemainingAfter,\n premiumRemainingDiff: computeDiff(\n premiumRemainingBefore,\n premiumRemainingAfter,\n ),\n premiumUnlimitedBefore,\n premiumUnlimitedAfter,\n httpStatus,\n errorName,\n errorStatus,\n errorMessage,\n upstreamErrorMessageRaw,\n })\n }\n}\n","import type { Model } from \"~/services/copilot/get-models\"\n\nexport interface ProviderModelAlias {\n model: string\n provider: string\n}\n\nexport const parseProviderModelAlias = (\n model: string,\n): ProviderModelAlias | null => {\n const separatorIndex = model.indexOf(\"/\")\n if (separatorIndex <= 0 || separatorIndex === model.length - 1) {\n return null\n }\n\n const provider = model.slice(0, separatorIndex).trim()\n const providerModel = model.slice(separatorIndex + 1).trim()\n if (!provider || !providerModel) {\n return null\n }\n\n return {\n model: providerModel,\n provider,\n }\n}\n\nexport const resolveExistingProviderModelAlias = (\n model: string,\n resolveProvider: (provider: string) => unknown,\n): ProviderModelAlias | null => {\n const alias = parseProviderModelAlias(model)\n if (!alias) {\n return null\n }\n\n return resolveProvider(alias.provider) ? alias : null\n}\n\nexport const createFallbackModel = (modelId: string): Model => ({\n capabilities: {\n family: \"provider\",\n limits: {},\n object: \"model_capabilities\",\n supports: {},\n tokenizer: \"o200k_base\",\n type: \"chat\",\n },\n id: modelId,\n model_picker_enabled: false,\n name: modelId,\n object: \"model\",\n preview: false,\n vendor: \"provider\",\n version: \"unknown\",\n})\n","import type { Context, Env } from \"hono\"\n\nimport { getProviderConfig, type ResolvedProviderConfig } from \"~/lib/config\"\nimport { createHandlerLogger } from \"~/lib/logger\"\nimport { findEndpointModel } from \"~/lib/models\"\nimport { createFallbackModel } from \"~/lib/provider-model\"\nimport { getTokenCount } from \"~/lib/tokenizer\"\nimport { type AnthropicMessagesPayload } from \"~/routes/messages/anthropic-types\"\nimport { translateToOpenAI } from \"~/routes/messages/non-stream-translation\"\nimport { normalizeSystemMessages } from \"~/routes/messages/preprocess\"\n\nconst logger = createHandlerLogger(\"provider-count-tokens-handler\")\n\ntype ProviderConfigResolver = (\n provider: string,\n) => ResolvedProviderConfig | null\n\nconst resolveProviderConfig = (\n c: Context,\n provider: string,\n): ResolvedProviderConfig | null => {\n const resolver = c.get(\"providerConfigResolver\" as never) as\n | ProviderConfigResolver\n | undefined\n return (resolver ?? getProviderConfig)(provider)\n}\n\nexport async function handleProviderCountTokens(\n c: Context<Env, \"/:provider\">,\n): Promise<Response> {\n const provider = c.req.param(\"provider\")\n const payload = await c.req.json<AnthropicMessagesPayload>()\n return await handleProviderCountTokensForProvider(c, { payload, provider })\n}\n\nexport async function handleProviderCountTokensForProvider(\n c: Context,\n options: {\n payload: AnthropicMessagesPayload\n provider: string\n },\n): Promise<Response> {\n const { payload: anthropicPayload, provider } = options\n normalizeSystemMessages(anthropicPayload)\n const providerConfig = resolveProviderConfig(c, provider)\n if (!providerConfig) {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' not found or disabled`,\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n if (\n typeof anthropicPayload.model !== \"string\"\n || !Array.isArray(anthropicPayload.messages)\n ) {\n return c.json(\n {\n error: {\n message: \"Invalid Anthropic messages count_tokens payload\",\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n\n const modelId = anthropicPayload.model.trim()\n const modelConfig = providerConfig.models?.[modelId]\n const translationOptions =\n (\n providerConfig.type === \"openai-compatible\"\n || providerConfig.type === \"openai-responses\"\n ) ?\n {\n supportPdf: modelConfig?.supportPdf,\n toolContentSupportType: modelConfig?.toolContentSupportType ?? [],\n }\n : undefined\n\n try {\n const openAIPayload = translateToOpenAI(\n anthropicPayload,\n translationOptions,\n )\n const selectedModel =\n findEndpointModel(modelId) ?? createFallbackModel(modelId)\n\n const tokenCount = await getTokenCount(openAIPayload, selectedModel)\n const finalTokenCount = tokenCount.input + tokenCount.output\n\n logger.debug(\"provider.count_tokens.success\", {\n provider,\n model: anthropicPayload.model,\n input_tokens: finalTokenCount,\n })\n\n return c.json({\n input_tokens: finalTokenCount,\n })\n } catch (error) {\n logger.error(\"provider.count_tokens.error\", {\n provider,\n error,\n })\n return c.json(\n {\n error: {\n message: \"Failed to count provider tokens\",\n type: \"internal_server_error\",\n },\n },\n 500,\n )\n }\n}\n","import type { Context } from \"hono\"\n\nimport consola from \"consola\"\n\nimport {\n getAnthropicApiKey,\n getClaudeTokenMultiplier,\n getProviderConfig,\n resolveModelAlias,\n} from \"~/lib/config\"\nimport {\n createFallbackModel,\n resolveExistingProviderModelAlias,\n} from \"~/lib/provider-model\"\nimport { getTokenCount } from \"~/lib/tokenizer\"\nimport { handleProviderCountTokensForProvider } from \"~/routes/provider/messages/count-tokens-handler\"\nimport { type Model } from \"~/services/copilot/get-models\"\n\nimport { findEndpointModel } from \"../../lib/models\"\nimport { type AnthropicMessagesPayload } from \"./anthropic-types\"\nimport { translateToOpenAI } from \"./non-stream-translation\"\nimport { normalizeSystemMessages } from \"./preprocess\"\n\nconst getProviderConfigResolver = (c: Context): typeof getProviderConfig => {\n const resolver = c.get(\"providerConfigResolver\" as never) as\n | typeof getProviderConfig\n | undefined\n return resolver ?? getProviderConfig\n}\n\nexport const resolveCountTokensModel = (\n modelId: string,\n findModel: (sdkModelId: string) => Model | undefined = findEndpointModel,\n): { fallback: boolean; model: Model } => {\n const selectedModel = findModel(modelId)\n if (selectedModel) {\n return {\n fallback: false,\n model: selectedModel,\n }\n }\n\n return {\n fallback: true,\n model: createFallbackModel(modelId.trim()),\n }\n}\n\n/**\n * Forwards token counting to Anthropic's real /v1/messages/count_tokens endpoint.\n * Returns the result on success, or null to fall through to estimation.\n */\nasync function countTokensViaAnthropic(\n c: Context,\n payload: AnthropicMessagesPayload,\n): Promise<Response | null> {\n if (!payload.model.startsWith(\"claude\")) return null\n\n const apiKey = getAnthropicApiKey()\n if (!apiKey) return null\n\n // Copilot uses dotted names (claude-opus-4.6) but Anthropic requires dashes (claude-opus-4-6)\n const model = payload.model.replaceAll(\".\", \"-\")\n\n const res = await fetch(\n \"https://api.anthropic.com/v1/messages/count_tokens\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n \"anthropic-beta\": \"token-counting-2024-11-01\",\n },\n body: JSON.stringify({ ...payload, model }),\n },\n )\n\n if (!res.ok) {\n consola.warn(\n \"Anthropic count_tokens failed:\",\n res.status,\n await res.text().catch(() => \"\"),\n \"- falling back to estimation\",\n )\n return null\n }\n\n const result = (await res.json()) as { input_tokens: number }\n consola.info(\"Token count (Anthropic API):\", result.input_tokens)\n return c.json(result)\n}\n\n/**\n * Handles token counting for Anthropic messages.\n *\n * When an Anthropic API key is available (via config or ANTHROPIC_API_KEY env var)\n * and the model is a Claude model, forwards to Anthropic's free /v1/messages/count_tokens\n * endpoint for accurate counts. Otherwise falls back to GPT tokenizer estimation.\n */\nexport async function handleCountTokens(c: Context) {\n const anthropicPayload = await c.req.json<AnthropicMessagesPayload>()\n anthropicPayload.model = resolveModelAlias(anthropicPayload.model)\n normalizeSystemMessages(anthropicPayload)\n\n const providerModelAlias = resolveExistingProviderModelAlias(\n anthropicPayload.model,\n getProviderConfigResolver(c),\n )\n if (providerModelAlias) {\n anthropicPayload.model = providerModelAlias.model\n return await handleProviderCountTokensForProvider(c, {\n payload: anthropicPayload,\n provider: providerModelAlias.provider,\n })\n }\n\n // Try Anthropic's real endpoint first (Claude models only)\n const anthropicResult = await countTokensViaAnthropic(c, anthropicPayload)\n if (anthropicResult) return anthropicResult\n\n // Fallback: GPT tokenizer estimation (also used for non-Claude models)\n const anthropicBeta = c.req.header(\"anthropic-beta\")\n\n const openAIPayload = translateToOpenAI(anthropicPayload)\n\n const requestedModel = anthropicPayload.model\n const resolve = resolveCountTokensModel(requestedModel)\n\n const selectedModel = resolve.model\n anthropicPayload.model = selectedModel.id\n\n if (resolve.fallback) {\n consola.warn(\n `Model '${requestedModel}' not found, using o200k_base fallback tokenizer`,\n )\n }\n\n const tokenCount = await getTokenCount(openAIPayload, selectedModel)\n\n if (anthropicPayload.tools && anthropicPayload.tools.length > 0) {\n let addToolSystemPromptCount = false\n if (anthropicBeta) {\n const toolsLength = anthropicPayload.tools.length\n addToolSystemPromptCount = !anthropicPayload.tools.some(\n (tool) =>\n tool.name.startsWith(\"mcp__\")\n || (tool.name === \"Skill\" && toolsLength === 1),\n )\n }\n if (addToolSystemPromptCount) {\n if (anthropicPayload.model.startsWith(\"claude\")) {\n // https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/overview#pricing\n tokenCount.input = tokenCount.input + 346\n } else if (anthropicPayload.model.startsWith(\"grok\")) {\n tokenCount.input = tokenCount.input + 120\n }\n }\n }\n\n let finalTokenCount = tokenCount.input + tokenCount.output\n if (anthropicPayload.model.startsWith(\"claude\")) {\n finalTokenCount = Math.round(finalTokenCount * getClaudeTokenMultiplier())\n }\n\n consola.info(\"Token count:\", finalTokenCount)\n\n return c.json({\n input_tokens: finalTokenCount,\n })\n}\n","import consola from \"consola\"\nimport { events } from \"fetch-event-stream\"\nimport { createHash } from \"node:crypto\"\nimport { WebSocket } from \"undici\"\n\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type { AccountContext } from \"~/lib/types/account\"\n\nimport {\n copilotBaseUrl,\n copilotHeaders,\n copilotWebSocketHeaders,\n prepareForCompact,\n prepareInteractionHeaders,\n} from \"~/lib/api-config\"\nimport { COMPACT_REQUEST, type CompactType } from \"~/lib/compact\"\nimport {\n logCopilotQuotaSnapshots,\n logCopilotRateLimits,\n type CopilotQuotaSnapshot,\n} from \"~/lib/copilot-rate-limit\"\nimport { HTTPError } from \"~/lib/error\"\nimport { getProxyEnvDispatcher } from \"~/lib/proxy\"\nimport { captureOutboundHeadersSnapshot } from \"~/lib/request-context\"\nimport { resolveEffectiveInitiator } from \"~/lib/request-initiator\"\nimport { accountFromState } from \"~/lib/state\"\n\nimport { copilotFetch } from \"./copilot-fetch\"\nimport { closeResponsesBridge } from \"./responses-bridge-registry\"\n\nexport interface ResponsesPayload {\n model: string\n instructions?: string | null\n input?: string | Array<ResponseInputItem>\n tools?: Array<Tool> | null\n tool_choice?: ToolChoiceOptions | ToolChoiceFunction\n temperature?: number | null\n top_p?: number | null\n max_output_tokens?: number | null\n metadata?: Metadata | null\n stream?: boolean | null\n safety_identifier?: string | null\n prompt_cache_key?: string | null\n prompt_cache_retention?: \"in_memory\" | \"24h\" | null\n parallel_tool_calls?: boolean | null\n store?: boolean | null\n reasoning?: Reasoning | null\n context_management?: Array<ResponseContextManagementItem> | null\n include?: Array<ResponseIncludable>\n service_tier?: string | null // NOTE: Unsupported by GitHub Copilot\n [key: string]: unknown\n}\n\nexport type ToolChoiceOptions = \"none\" | \"auto\" | \"required\"\nexport type ToolSearchExecution = \"client\" | \"server\"\n\nexport interface ToolChoiceFunction {\n name: string\n type: \"function\"\n}\n\nexport type Tool =\n | FunctionTool\n | ToolSearchTool\n | NamespaceTool\n | Record<string, unknown>\n\nexport interface FunctionTool {\n name: string\n parameters: { [key: string]: unknown } | null\n strict: boolean | null\n type: \"function\"\n description?: string | null\n defer_loading?: boolean | null\n}\n\nexport interface ToolSearchTool {\n type: \"tool_search\"\n execution?: ToolSearchExecution | null\n description?: string | null\n parameters?: { [key: string]: unknown } | null\n}\n\nexport interface NamespaceTool {\n type: \"namespace\"\n name: string\n description?: string | null\n tools: Array<FunctionTool>\n}\n\nexport type ResponseIncludable =\n | \"file_search_call.results\"\n | \"message.input_image.image_url\"\n | \"computer_call_output.output.image_url\"\n | \"reasoning.encrypted_content\"\n | \"code_interpreter_call.outputs\"\n\nexport interface Reasoning {\n effort?: \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | null\n summary?: \"auto\" | \"concise\" | \"detailed\" | null\n}\n\nexport interface ResponseContextManagementCompactionItem {\n type: \"compaction\"\n compact_threshold: number\n}\n\nexport type ResponseContextManagementItem =\n ResponseContextManagementCompactionItem\n\nexport interface ResponseInputMessage {\n type?: \"message\"\n role: \"user\" | \"assistant\" | \"system\" | \"developer\"\n content?: string | Array<ResponseInputContent>\n status?: string\n phase?: \"commentary\" | \"final_answer\"\n}\n\nexport interface ResponseFunctionToolCallItem {\n type: \"function_call\"\n call_id: string\n name: string\n arguments: string\n status?: \"in_progress\" | \"completed\" | \"incomplete\"\n namespace?: string | null\n}\n\nexport interface ResponseFunctionCallOutputItem {\n type: \"function_call_output\"\n call_id: string\n output: string | Array<ResponseInputContent>\n status?: \"in_progress\" | \"completed\" | \"incomplete\"\n}\n\nexport interface ResponseToolSearchCallItem {\n type: \"tool_search_call\"\n call_id: string\n arguments: Record<string, unknown> | string\n execution?: ToolSearchExecution | null\n status?: \"in_progress\" | \"completed\" | \"incomplete\"\n}\n\nexport interface ResponseToolSearchOutputItem {\n type: \"tool_search_output\"\n call_id: string\n tools: Array<Tool>\n execution?: ToolSearchExecution | null\n status?: \"in_progress\" | \"completed\" | \"incomplete\"\n}\n\nexport interface ResponseInputReasoning {\n id?: string\n type: \"reasoning\"\n summary: Array<{\n type: \"summary_text\"\n text: string\n }>\n encrypted_content: string\n}\n\nexport interface ResponseInputCompaction {\n id: string\n type: \"compaction\"\n encrypted_content: string\n}\n\nexport type ResponseInputItem =\n | ResponseInputMessage\n | ResponseFunctionToolCallItem\n | ResponseFunctionCallOutputItem\n | ResponseToolSearchCallItem\n | ResponseToolSearchOutputItem\n | ResponseInputReasoning\n | ResponseInputCompaction\n | Record<string, unknown>\n\nexport type ResponseInputContent =\n | ResponseInputText\n | ResponseInputImage\n | ResponseInputFile\n | Record<string, unknown>\n\nexport interface ResponseInputText {\n type: \"input_text\" | \"output_text\"\n text: string\n}\n\nexport interface ResponseInputImage {\n type: \"input_image\"\n image_url?: string | null\n file_id?: string | null\n detail: \"low\" | \"high\" | \"auto\"\n}\n\nexport interface ResponseInputFile {\n type: \"input_file\"\n file_data?: string | null\n file_id?: string | null\n filename?: string | null\n}\n\nexport interface ResponsesResult {\n id: string\n object: \"response\"\n created_at: number\n model: string\n output: Array<ResponseOutputItem>\n output_text: string\n status: string\n usage?: ResponseUsage | null\n error: ResponseError | null\n incomplete_details: IncompleteDetails | null\n instructions: string | null\n metadata: Metadata | null\n parallel_tool_calls: boolean\n temperature: number | null\n tool_choice: unknown\n tools: Array<Tool>\n top_p: number | null\n}\n\nexport type Metadata = { [key: string]: string }\n\nexport interface IncompleteDetails {\n reason?: \"max_output_tokens\" | \"content_filter\"\n}\n\nexport interface ResponseError {\n message: string\n}\n\nexport type ResponseOutputItem =\n | ResponseOutputMessage\n | ResponseOutputReasoning\n | ResponseOutputFunctionCall\n | ResponseOutputToolSearchCall\n | ResponseOutputToolSearchOutput\n | ResponseOutputCompaction\n\nexport interface ResponseOutputMessage {\n id: string\n type: \"message\"\n role: \"assistant\"\n status: \"completed\" | \"in_progress\" | \"incomplete\"\n content?: Array<ResponseOutputContentBlock>\n}\n\nexport interface ResponseOutputReasoning {\n id: string\n type: \"reasoning\"\n summary?: Array<ResponseReasoningBlock>\n encrypted_content?: string\n status?: \"completed\" | \"in_progress\" | \"incomplete\"\n}\n\nexport interface ResponseReasoningBlock {\n type: string\n text?: string\n}\n\nexport interface ResponseOutputFunctionCall {\n id?: string\n type: \"function_call\"\n call_id: string\n name: string\n arguments: string\n status?: \"in_progress\" | \"completed\" | \"incomplete\"\n namespace?: string | null\n}\n\nexport interface ResponseOutputToolSearchCall {\n id?: string\n type: \"tool_search_call\"\n call_id: string\n arguments: Record<string, unknown> | string\n execution?: ToolSearchExecution | null\n status?: \"in_progress\" | \"completed\" | \"incomplete\"\n}\n\nexport interface ResponseOutputToolSearchOutput {\n id?: string\n type: \"tool_search_output\"\n call_id: string\n tools: Array<Tool>\n execution?: ToolSearchExecution | null\n status?: \"in_progress\" | \"completed\" | \"incomplete\"\n}\n\nexport interface ResponseOutputCompaction {\n id: string\n type: \"compaction\"\n encrypted_content: string\n}\n\nexport type ResponseOutputContentBlock =\n | ResponseOutputText\n | ResponseOutputRefusal\n | Record<string, unknown>\n\nexport interface ResponseOutputText {\n type: \"output_text\"\n text: string\n annotations: Array<unknown>\n}\n\nexport interface ResponseOutputRefusal {\n type: \"refusal\"\n refusal: string\n}\n\nexport interface ResponseUsage {\n input_tokens: number\n output_tokens?: number\n total_tokens: number\n input_tokens_details?: {\n cached_tokens: number\n }\n output_tokens_details?: {\n reasoning_tokens: number\n }\n}\n\nexport type ResponseStreamEvent =\n | ResponseCompletedEvent\n | ResponseIncompleteEvent\n | ResponseCreatedEvent\n | ResponseErrorEvent\n | ResponseFunctionCallArgumentsDeltaEvent\n | ResponseFunctionCallArgumentsDoneEvent\n | ResponseFailedEvent\n | ResponseOutputItemAddedEvent\n | ResponseOutputItemDoneEvent\n | ResponseReasoningSummaryTextDeltaEvent\n | ResponseReasoningSummaryTextDoneEvent\n | ResponseTextDeltaEvent\n | ResponseTextDoneEvent\n\nexport interface ResponseCompletedEvent {\n copilot_quota_snapshots?: Record<string, CopilotQuotaSnapshot>\n response: ResponsesResult\n sequence_number: number\n type: \"response.completed\"\n}\n\nexport interface ResponseIncompleteEvent {\n response: ResponsesResult\n sequence_number: number\n type: \"response.incomplete\"\n}\n\nexport interface ResponseCreatedEvent {\n response: ResponsesResult\n sequence_number: number\n type: \"response.created\"\n}\n\nexport interface ResponseErrorEvent {\n code: string | null\n message: string\n param: string | null\n sequence_number: number\n type: \"error\"\n}\n\nexport interface ResponseFunctionCallArgumentsDeltaEvent {\n delta: string\n item_id: string\n output_index: number\n sequence_number: number\n type: \"response.function_call_arguments.delta\"\n}\n\nexport interface ResponseFunctionCallArgumentsDoneEvent {\n arguments: string\n item_id: string\n name: string\n output_index: number\n sequence_number: number\n type: \"response.function_call_arguments.done\"\n}\n\nexport interface ResponseFailedEvent {\n response: ResponsesResult\n sequence_number: number\n type: \"response.failed\"\n}\n\nexport interface ResponseOutputItemAddedEvent {\n item: ResponseOutputItem\n output_index: number\n sequence_number: number\n type: \"response.output_item.added\"\n}\n\nexport interface ResponseOutputItemDoneEvent {\n item: ResponseOutputItem\n output_index: number\n sequence_number: number\n type: \"response.output_item.done\"\n}\n\nexport interface ResponseReasoningSummaryTextDeltaEvent {\n delta: string\n item_id: string\n output_index: number\n sequence_number: number\n summary_index: number\n type: \"response.reasoning_summary_text.delta\"\n}\n\nexport interface ResponseReasoningSummaryTextDoneEvent {\n item_id: string\n output_index: number\n sequence_number: number\n summary_index: number\n text: string\n type: \"response.reasoning_summary_text.done\"\n}\n\nexport interface ResponseTextDeltaEvent {\n content_index: number\n delta: string\n item_id: string\n output_index: number\n sequence_number: number\n type: \"response.output_text.delta\"\n}\n\nexport interface ResponseTextDoneEvent {\n content_index: number\n item_id: string\n output_index: number\n sequence_number: number\n text: string\n type: \"response.output_text.done\"\n}\n\nexport type ResponsesStream = ReturnType<typeof events>\nexport type CreateResponsesReturn = ResponsesResult | ResponsesStream\nexport type ResponsesTransport = \"http\" | \"websocket\"\n\ninterface ResponsesRequestOptions {\n vision: boolean\n initiator: \"agent\" | \"user\"\n upstreamRequestId?: string\n subagentMarker?: SubagentMarker | null\n sessionId?: string\n compactType?: CompactType\n requestId?: string\n fetchImpl?: typeof fetch\n transport?: ResponsesTransport\n bridgeId?: string\n}\n\nconst RESPONSES_WEBSOCKET_IDLE_TIMEOUT_MS = 60_000\n\nexport const createResponses = async (\n payload: ResponsesPayload,\n {\n vision,\n initiator,\n upstreamRequestId,\n subagentMarker,\n sessionId,\n compactType,\n requestId,\n fetchImpl,\n transport = \"http\",\n bridgeId,\n }: ResponsesRequestOptions,\n account?: AccountContext,\n): Promise<CreateResponsesReturn> => {\n const ctx = account ?? accountFromState()\n if (!ctx.copilotToken) throw new Error(\"Copilot token not found\")\n\n const isCompact = Boolean(compactType)\n const effectiveInitiator = resolveEffectiveInitiator(initiator, {\n isCompact,\n isSubagent: Boolean(subagentMarker),\n })\n\n const headers: Record<string, string> = {\n ...copilotHeaders(ctx, vision, upstreamRequestId),\n \"x-initiator\": effectiveInitiator,\n }\n\n prepareInteractionHeaders(sessionId, Boolean(subagentMarker), headers)\n prepareForCompact(headers, compactType)\n\n payload.service_tier = undefined\n captureOutboundHeadersSnapshot(headers)\n consola.log(`<-- model: ${payload.model}`)\n\n const effectiveTransport =\n compactType === COMPACT_REQUEST ? \"http\" : transport\n\n if (effectiveTransport === \"websocket\") {\n const websocketRequest = prepareResponsesWebSocketRequest(\n payload,\n headers,\n {\n copilotToken: ctx.copilotToken,\n requestId: requestId ?? upstreamRequestId ?? \"missing-request-id\",\n sessionId,\n subagentMarker,\n bridgeId,\n },\n )\n const stream = createPooledResponsesWebSocketStream(\n websocketRequest,\n copilotBaseUrl(ctx),\n )\n\n if (payload.stream) {\n return stream\n }\n\n return await consumeResponsesWebSocketStream(stream)\n }\n\n return await createHttpResponses(payload, headers, ctx, {\n fetchImpl,\n requestId,\n })\n}\n\nconst createHttpResponses = async (\n payload: ResponsesPayload,\n headers: Record<string, string>,\n account: AccountContext,\n options: {\n fetchImpl?: typeof fetch\n requestId?: string\n },\n): Promise<CreateResponsesReturn> => {\n const response = await copilotFetch(\n `${copilotBaseUrl(account)}/responses`,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n },\n {\n requestId: options.requestId,\n callSite: \"responses\",\n fetchImpl: options.fetchImpl,\n },\n )\n\n logCopilotRateLimits(response.headers)\n\n if (!response.ok) {\n consola.error(\"Failed to create responses\", response)\n throw new HTTPError(\"Failed to create responses\", response)\n }\n\n if (payload.stream) {\n return events(response)\n }\n\n return (await response.json()) as ResponsesResult\n}\n\ntype ResponsesWebSocketPayload = ResponsesPayload & {\n type: \"response.create\"\n initiator: \"agent\" | \"user\"\n}\n\ninterface ResponsesWebSocketRequest {\n headers: Record<string, string>\n poolKey: string\n payload: ResponsesWebSocketPayload\n bridgeId?: string\n}\n\ntype ResponsesWebSocketErrorEvent = Parameters<\n NonNullable<InstanceType<typeof WebSocket>[\"onerror\"]>\n>[0]\n\nexport const prepareResponsesWebSocketRequest = (\n payload: ResponsesPayload,\n preparedHeaders: Record<string, string>,\n options: {\n copilotToken?: string\n requestId: string\n sessionId?: string\n subagentMarker?: SubagentMarker | null\n bridgeId?: string\n },\n): ResponsesWebSocketRequest => {\n const initiator = getResponsesWebSocketInitiator(preparedHeaders)\n\n return {\n headers: copilotWebSocketHeaders(preparedHeaders),\n poolKey: buildResponsesWebSocketPoolKey(payload, options),\n payload: buildResponsesWebSocketPayload(payload, initiator),\n bridgeId: options.bridgeId,\n }\n}\n\nexport const buildResponsesWebSocketPoolKey = (\n payload: ResponsesPayload,\n {\n copilotToken,\n requestId,\n sessionId,\n subagentMarker,\n }: {\n copilotToken?: string\n requestId: string\n sessionId?: string\n subagentMarker?: SubagentMarker | null\n },\n): string => {\n const tokenFingerprint =\n copilotToken ?\n createHash(\"sha256\").update(copilotToken).digest(\"hex\").slice(0, 16)\n : \"missing-token\"\n const subagentKey =\n subagentMarker ?\n [\n subagentMarker.session_id,\n subagentMarker.agent_id,\n subagentMarker.agent_type,\n ].join(\":\")\n : \"main\"\n\n // Key the upstream websocket on the session, not the per-request id. Copilot\n // stores Responses conversation state (referenced by `previous_response_id`)\n // per upstream connection, so every turn of a session must reuse the same\n // socket. Codex derives a stable `prompt_cache_key` (its thread id) per\n // session, which upstream callers turn into `sessionId`. Fall back to\n // `requestId` when no session id is available (e.g. one-off HTTP callers).\n const connectionAffinityKey = sessionId ?? requestId\n\n return [tokenFingerprint, payload.model, connectionAffinityKey, subagentKey]\n .map(encodePoolKeyPart)\n .join(\"|\")\n}\n\nexport const getResponsesWebSocketInitiator = (\n preparedHeaders: Record<string, string>,\n): \"agent\" | \"user\" => {\n const initiator = getHeaderValue(preparedHeaders, \"x-initiator\")\n return initiator?.toLowerCase() === \"agent\" ? \"agent\" : \"user\"\n}\n\nconst createPooledResponsesWebSocketStream = (\n request: ResponsesWebSocketRequest,\n baseUrl: string,\n): ResponsesStream => runResponsesWebSocketRequest(request, baseUrl)\n\nexport const buildResponsesWebSocketPayload = (\n payload: ResponsesPayload,\n initiator: \"agent\" | \"user\",\n): ResponsesWebSocketPayload => {\n const websocketPayload: ResponsesWebSocketPayload = {\n ...payload,\n type: \"response.create\",\n initiator,\n }\n\n delete websocketPayload.stream\n delete websocketPayload[\"background\"]\n delete websocketPayload.service_tier\n\n return websocketPayload\n}\n\nexport const buildResponsesWebSocketUrl = (baseUrl: string): string => {\n const url = new URL(`${baseUrl.replace(/\\/+$/u, \"\")}/responses`)\n\n if (url.protocol === \"https:\") {\n url.protocol = \"wss:\"\n } else if (url.protocol === \"http:\") {\n url.protocol = \"ws:\"\n }\n\n return url.toString()\n}\n\nconst responsesWebSocketPool = new Map<string, ResponsesWebSocketEntry>()\nconst responsesWebSocketActiveRequests = new Map<string, number>()\n\ninterface ResponsesWebSocketEntry {\n closed: boolean\n idleTimer: ReturnType<typeof setTimeout> | null\n requestCount: number\n websocketPromise: Promise<InstanceType<typeof WebSocket>>\n // Bridge socket (WS #1) that originated this upstream connection, if any. When\n // this entry is dropped while no turn is in flight, we close that bridge socket\n // so Codex rebuilds a fresh full-context session instead of stalling on a stale\n // `previous_response_id`.\n bridgeId?: string\n}\n\ninterface ResponsesWebSocketRequestTarget {\n entry: ResponsesWebSocketEntry\n pooled: boolean\n}\n\nconst runResponsesWebSocketRequest = async function* (\n request: ResponsesWebSocketRequest,\n baseUrl: string,\n): ResponsesStream {\n const { entry, pooled } = getResponsesWebSocketRequestTarget(request, baseUrl)\n const release = acquireResponsesWebSocketEntry(request.poolKey, entry, pooled)\n\n try {\n const websocket = await getReadyResponsesWebSocket(\n request.poolKey,\n entry,\n pooled,\n )\n websocket.send(JSON.stringify(request.payload))\n\n for await (const data of createWebSocketMessageStream(websocket)) {\n const chunk = createResponsesWebSocketStreamChunk(data)\n yield chunk\n\n if (isTerminalResponsesStreamChunk(chunk)) {\n return\n }\n }\n\n removeResponsesWebSocketPoolEntry(request.poolKey, entry)\n throw new Error(\"Responses websocket ended without a terminal response\")\n } catch (error) {\n removeResponsesWebSocketPoolEntry(request.poolKey, entry)\n throw toError(error)\n } finally {\n release()\n }\n}\n\nconst getResponsesWebSocketRequestTarget = (\n request: ResponsesWebSocketRequest,\n baseUrl: string,\n): ResponsesWebSocketRequestTarget => {\n if (getResponsesWebSocketActiveRequestCount(request.poolKey) > 0) {\n return {\n entry: createResponsesWebSocketEntry(request, baseUrl),\n pooled: false,\n }\n }\n\n const existing = responsesWebSocketPool.get(request.poolKey)\n if (existing && !existing.closed) {\n clearResponsesWebSocketIdleTimer(existing)\n // A Codex client can reconnect for the same session (minting a fresh bridge,\n // hence a fresh bridgeId) before this pooled upstream entry is reaped. Rebind\n // the entry to the currently connected bridge so a later idle reap closes the\n // live WS #1, not the original now-unregistered one — otherwise the multi-turn\n // recovery would target a dead bridge and the next turn could still stall on a\n // stale `previous_response_id`.\n existing.bridgeId = request.bridgeId\n return {\n entry: existing,\n pooled: true,\n }\n }\n\n const entry = createResponsesWebSocketEntry(request, baseUrl)\n responsesWebSocketPool.set(request.poolKey, entry)\n return {\n entry,\n pooled: true,\n }\n}\n\nconst createResponsesWebSocketEntry = (\n request: ResponsesWebSocketRequest,\n baseUrl: string,\n): ResponsesWebSocketEntry => {\n const entry: ResponsesWebSocketEntry = {\n closed: false,\n idleTimer: null,\n requestCount: 0,\n websocketPromise: openResponsesWebSocket({\n headers: request.headers,\n url: buildResponsesWebSocketUrl(baseUrl),\n }),\n bridgeId: request.bridgeId,\n }\n\n entry.websocketPromise\n .then((websocket) => {\n websocket.addEventListener(\"close\", () => {\n maybeCloseResponsesBridgeForReapedEntry(request.poolKey, entry)\n removeResponsesWebSocketPoolEntry(request.poolKey, entry)\n })\n websocket.addEventListener(\"error\", () => {\n maybeCloseResponsesBridgeForReapedEntry(request.poolKey, entry)\n removeResponsesWebSocketPoolEntry(request.poolKey, entry)\n })\n })\n .catch(() => {\n removeResponsesWebSocketPoolEntry(request.poolKey, entry)\n })\n\n return entry\n}\n\n// Close the originating bridge socket (WS #1) when the upstream connection it was\n// keyed to is dropped while the session is idle, so Codex rebuilds a fresh\n// full-context request on its next turn instead of stalling ~5 minutes on a stale\n// `previous_response_id`.\n//\n// Gated to fire only for the live pooled entry (`responsesWebSocketPool` still\n// points at it) with no in-flight turn (`requestCount === 0`). This excludes:\n// - throwaway non-pooled entries (never in the pool map), whose normal teardown\n// would otherwise close the bridge after a concurrent turn, and\n// - mid-turn upstream drops (`requestCount > 0`), which the active request's\n// existing error path already surfaces to Codex.\nconst maybeCloseResponsesBridgeForReapedEntry = (\n poolKey: string,\n entry: ResponsesWebSocketEntry,\n): void => {\n if (\n entry.bridgeId === undefined\n || entry.requestCount > 0\n || responsesWebSocketPool.get(poolKey) !== entry\n ) {\n return\n }\n\n closeResponsesBridge(entry.bridgeId)\n}\n\nconst acquireResponsesWebSocketEntry = (\n poolKey: string,\n entry: ResponsesWebSocketEntry,\n pooled: boolean,\n): (() => void) => {\n clearResponsesWebSocketIdleTimer(entry)\n incrementResponsesWebSocketActiveRequestCount(poolKey)\n entry.requestCount += 1\n\n let released = false\n return () => {\n if (released) {\n return\n }\n\n released = true\n entry.requestCount -= 1\n\n decrementResponsesWebSocketActiveRequestCount(poolKey)\n if (entry.closed || entry.requestCount > 0) {\n return\n }\n\n if (pooled && responsesWebSocketPool.get(poolKey) === entry) {\n scheduleResponsesWebSocketIdleClose(poolKey, entry)\n return\n }\n\n removeResponsesWebSocketPoolEntry(poolKey, entry)\n }\n}\n\nconst getReadyResponsesWebSocket = async (\n poolKey: string,\n entry: ResponsesWebSocketEntry,\n pooled: boolean,\n): Promise<InstanceType<typeof WebSocket>> => {\n if (entry.closed) {\n throw new Error(\n \"Responses websocket became unavailable before the request started\",\n )\n }\n\n const websocket = await entry.websocketPromise\n if (\n entry.closed\n || (pooled && responsesWebSocketPool.get(poolKey) !== entry)\n ) {\n throw new Error(\n \"Responses websocket became unavailable before the request started\",\n )\n }\n\n if (websocket.readyState !== WebSocket.OPEN) {\n removeResponsesWebSocketPoolEntry(poolKey, entry)\n throw new Error(\n \"Responses websocket became unavailable before the request started\",\n )\n }\n\n return websocket\n}\n\nconst scheduleResponsesWebSocketIdleClose = (\n poolKey: string,\n entry: ResponsesWebSocketEntry,\n): void => {\n clearResponsesWebSocketIdleTimer(entry)\n entry.idleTimer = setTimeout(() => {\n maybeCloseResponsesBridgeForReapedEntry(poolKey, entry)\n removeResponsesWebSocketPoolEntry(poolKey, entry)\n }, RESPONSES_WEBSOCKET_IDLE_TIMEOUT_MS)\n unrefTimer(entry.idleTimer)\n}\n\nconst clearResponsesWebSocketIdleTimer = (\n entry: ResponsesWebSocketEntry,\n): void => {\n if (entry.idleTimer) {\n clearTimeout(entry.idleTimer)\n entry.idleTimer = null\n }\n}\n\nconst getResponsesWebSocketActiveRequestCount = (poolKey: string): number =>\n responsesWebSocketActiveRequests.get(poolKey) ?? 0\n\nconst incrementResponsesWebSocketActiveRequestCount = (\n poolKey: string,\n): void => {\n responsesWebSocketActiveRequests.set(\n poolKey,\n getResponsesWebSocketActiveRequestCount(poolKey) + 1,\n )\n}\n\nconst decrementResponsesWebSocketActiveRequestCount = (\n poolKey: string,\n): void => {\n const nextCount = getResponsesWebSocketActiveRequestCount(poolKey) - 1\n if (nextCount <= 0) {\n responsesWebSocketActiveRequests.delete(poolKey)\n return\n }\n\n responsesWebSocketActiveRequests.set(poolKey, nextCount)\n}\n\nconst removeResponsesWebSocketPoolEntry = (\n poolKey: string,\n entry: ResponsesWebSocketEntry,\n): void => {\n if (responsesWebSocketPool.get(poolKey) === entry) {\n responsesWebSocketPool.delete(poolKey)\n }\n\n if (entry.closed) {\n return\n }\n\n entry.closed = true\n clearResponsesWebSocketIdleTimer(entry)\n entry.websocketPromise.then(closeResponsesWebSocket).catch(() => {})\n}\n\nconst unrefTimer = (timer: ReturnType<typeof setTimeout>): void => {\n if (\n typeof timer === \"object\"\n && \"unref\" in timer\n && typeof timer.unref === \"function\"\n ) {\n timer.unref()\n }\n}\n\nconst createResponsesWebSocketError = (\n message: string,\n event?: Pick<ResponsesWebSocketErrorEvent, \"error\" | \"message\">,\n): Error => {\n const reason = event?.error ?? event?.message\n if (reason === undefined || reason === \"\") {\n return new Error(message)\n }\n\n const cause = toError(reason)\n return new Error(`${message}: ${cause.message}`, { cause })\n}\n\nconst openResponsesWebSocket = async ({\n headers,\n url,\n}: {\n headers: Record<string, string>\n url: string\n}): Promise<InstanceType<typeof WebSocket>> =>\n await new Promise((resolve, reject) => {\n const dispatcher = getProxyEnvDispatcher()\n const init = dispatcher ? { dispatcher, headers } : { headers }\n const websocket = new WebSocket(url, init)\n\n const cleanup = () => {\n websocket.removeEventListener(\"open\", onOpen)\n websocket.removeEventListener(\"error\", onError)\n }\n\n const onOpen = () => {\n cleanup()\n resolve(websocket)\n }\n\n const onError = (event: ResponsesWebSocketErrorEvent) => {\n cleanup()\n reject(\n createResponsesWebSocketError(\n \"Failed to create responses websocket\",\n event,\n ),\n )\n }\n\n websocket.addEventListener(\"open\", onOpen)\n websocket.addEventListener(\"error\", onError)\n })\n\nconst createWebSocketMessageStream = async function* (\n websocket: InstanceType<typeof WebSocket>,\n): AsyncIterable<string> {\n const queue: Array<Promise<string>> = []\n let closed = false\n let error: Error | null = null\n let notify: (() => void) | null = null\n\n const wake = () => {\n notify?.()\n notify = null\n }\n\n const onMessage = (event: { data: unknown }) => {\n queue.push(normalizeWebSocketMessageData(event.data))\n wake()\n }\n\n const onClose = () => {\n closed = true\n wake()\n }\n\n const onError = (event: ResponsesWebSocketErrorEvent) => {\n error = createResponsesWebSocketError(\n \"Responses websocket stream error\",\n event,\n )\n wake()\n }\n\n websocket.addEventListener(\"message\", onMessage)\n websocket.addEventListener(\"close\", onClose)\n websocket.addEventListener(\"error\", onError)\n\n try {\n while (true) {\n const item = queue.shift()\n if (item) {\n yield await item\n continue\n }\n\n if (error) {\n throw toError(error)\n }\n\n if (closed) {\n break\n }\n\n await new Promise<void>((resolve) => {\n notify = resolve\n })\n }\n } finally {\n websocket.removeEventListener(\"message\", onMessage)\n websocket.removeEventListener(\"close\", onClose)\n websocket.removeEventListener(\"error\", onError)\n }\n}\n\nconst normalizeWebSocketMessageData = async (\n data: unknown,\n): Promise<string> => {\n if (typeof data === \"string\") {\n return data\n }\n\n if (data instanceof ArrayBuffer) {\n return new TextDecoder().decode(data)\n }\n\n if (ArrayBuffer.isView(data)) {\n const view = data\n return new TextDecoder().decode(\n new Uint8Array(\n view.buffer as ArrayBuffer,\n view.byteOffset,\n view.byteLength,\n ),\n )\n }\n\n if (isTextReadable(data)) {\n return await data.text()\n }\n\n return String(data)\n}\n\nconst isTextReadable = (\n value: unknown,\n): value is { text: () => Promise<string> } => {\n if (!value || typeof value !== \"object\" || !(\"text\" in value)) {\n return false\n }\n\n return typeof (value as { text?: unknown }).text === \"function\"\n}\n\nconst toError = (value: unknown): Error => {\n if (value instanceof Error) {\n return value\n }\n\n return new Error(String(value))\n}\n\nconst getHeaderValue = (\n headers: Record<string, string>,\n headerName: string,\n): string | undefined => {\n const normalizedHeaderName = headerName.toLowerCase()\n const match = Object.entries(headers).find(\n ([key]) => key.toLowerCase() === normalizedHeaderName,\n )\n\n return match?.[1]\n}\n\nconst encodePoolKeyPart = (value: string): string => encodeURIComponent(value)\n\nconst createResponsesWebSocketStreamChunk = (\n data: string,\n): { data?: string; event?: string; id?: string } => {\n if (data === \"[DONE]\") {\n return { data }\n }\n\n try {\n const parsed = JSON.parse(data) as {\n copilot_quota_snapshots?: Record<string, CopilotQuotaSnapshot>\n id?: unknown\n type?: unknown\n }\n if (parsed.type === \"response.completed\") {\n logCopilotQuotaSnapshots(parsed.copilot_quota_snapshots)\n }\n return {\n data: JSON.stringify(parsed),\n event: typeof parsed.type === \"string\" ? parsed.type : undefined,\n id: typeof parsed.id === \"string\" ? parsed.id : undefined,\n }\n } catch {\n return { data }\n }\n}\n\nconst isTerminalResponsesStreamChunk = (chunk: { data?: string }): boolean => {\n if (!chunk.data || chunk.data === \"[DONE]\") {\n return false\n }\n\n try {\n const parsed = JSON.parse(chunk.data) as { type?: unknown }\n return (\n parsed.type === \"response.completed\"\n || parsed.type === \"response.failed\"\n || parsed.type === \"response.incomplete\"\n || parsed.type === \"error\"\n )\n } catch {\n return false\n }\n}\n\nconst consumeResponsesWebSocketStream = async (\n stream: ResponsesStream,\n): Promise<ResponsesResult> => {\n for await (const chunk of stream) {\n if (!chunk.data || chunk.data === \"[DONE]\") {\n continue\n }\n\n const event = JSON.parse(chunk.data) as ResponseStreamEvent\n if (event.type === \"error\") {\n throw new Error(event.message)\n }\n\n if (\n event.type === \"response.completed\"\n || event.type === \"response.failed\"\n || event.type === \"response.incomplete\"\n ) {\n return event.response\n }\n }\n\n throw new Error(\"Responses websocket ended without a terminal response\")\n}\n\nconst closeResponsesWebSocket = (\n websocket: InstanceType<typeof WebSocket>,\n): void => {\n if (\n websocket.readyState === WebSocket.CONNECTING\n || websocket.readyState === WebSocket.OPEN\n ) {\n websocket.close()\n }\n}\n","import consola from \"consola\"\n\nimport {\n BRIDGE_TOOL_SEARCH_NAME,\n formatToolSearchBridgeArguments,\n isBridgeToolSearchName,\n isDeferredToolName,\n listDeferredToolNames,\n normalizeToolSearchBridgeArguments,\n parseMcpToolSearchSentinel,\n selectDeferredToolsByNames,\n shouldEnableResponsesToolSearch,\n} from \"~/lib/tool-search\"\nimport { HTTPError } from \"~/lib/error\"\nimport {\n getExtraPromptForModel,\n getReasoningEffortForModel,\n} from \"~/lib/config\"\nimport { requestContext } from \"~/lib/request-context\"\nimport { parseUserIdMetadata } from \"~/lib/utils\"\nimport {\n type ResponsesPayload,\n type ResponseInputCompaction,\n type ResponseInputContent,\n type ResponseInputFile,\n type ResponseInputImage,\n type ResponseInputItem,\n type ResponseInputMessage,\n type ResponseInputReasoning,\n type ResponseInputText,\n type ResponsesResult,\n type ResponseOutputContentBlock,\n type ResponseOutputCompaction,\n type ResponseOutputFunctionCall,\n type ResponseOutputToolSearchCall,\n type ResponseOutputItem,\n type ResponseOutputReasoning,\n type ResponseReasoningBlock,\n type ResponseOutputRefusal,\n type ResponseOutputText,\n type ResponseFunctionToolCallItem,\n type ResponseFunctionCallOutputItem,\n type ResponseToolSearchCallItem,\n type ResponseToolSearchOutputItem,\n type Tool,\n type ToolChoiceFunction,\n type ToolChoiceOptions,\n} from \"~/services/copilot/create-responses\"\n\nimport {\n type AnthropicAssistantContentBlock,\n type AnthropicAssistantMessage,\n type AnthropicDocumentBlock,\n type AnthropicResponse,\n type AnthropicImageBlock,\n type AnthropicMessage,\n type AnthropicMessagesPayload,\n type AnthropicTextBlock,\n type AnthropicThinkingBlock,\n type AnthropicTool,\n type AnthropicToolResultContentBlock,\n type AnthropicToolResultBlock,\n type AnthropicToolUseBlock,\n type AnthropicUserContentBlock,\n type AnthropicUserMessage,\n} from \"./anthropic-types\"\nimport { normalizeToolSchema } from \"./non-stream-translation\"\n\nconst MESSAGE_TYPE = \"message\"\nconst COMPACTION_SIGNATURE_PREFIX = \"cm1#\"\nconst COMPACTION_SIGNATURE_SEPARATOR = \"@\"\n\nexport const THINKING_TEXT = \"Thinking...\"\n\ninterface ResponsesTranslationOptions {\n modelOverride?: string\n subagentAgentId?: string | null\n}\n\nconst buildPromptCacheKey = (\n basePromptCacheKey: string | null,\n subagentAgentId?: string | null,\n): string | null => {\n if (!basePromptCacheKey) {\n return null\n }\n\n const normalizedSubagentAgentId = subagentAgentId?.trim() || null\n if (!normalizedSubagentAgentId) {\n return basePromptCacheKey\n }\n\n return `${basePromptCacheKey}:agent:${normalizedSubagentAgentId}`\n}\n\nexport const translateAnthropicMessagesToResponsesPayload = (\n payload: AnthropicMessagesPayload,\n options: ResponsesTranslationOptions = {},\n): ResponsesPayload => {\n const model = options.modelOverride ?? payload.model\n const input: Array<ResponseInputItem> = []\n const applyPhase = shouldApplyPhase(payload.model)\n const toolSearchEnabled = shouldEnableResponsesToolSearch({\n model: payload.model,\n tools: payload.tools,\n })\n const translationState: TranslationState = {\n originalTools: payload.tools ?? [],\n toolSearchEnabled,\n toolUseNameById: new Map(),\n }\n\n for (const message of payload.messages as Array<AnthropicMessage>) {\n input.push(\n ...translateMessage(message, payload.model, applyPhase, translationState),\n )\n }\n\n const hasOriginalTools =\n Array.isArray(payload.tools) && payload.tools.length > 0\n const translatedTools = convertAnthropicTools(\n payload.tools,\n toolSearchEnabled,\n )\n const toolChoice = convertAnthropicToolChoice(\n payload.tool_choice,\n toolSearchEnabled,\n )\n\n // Remove safetyIdentifier to align with vscode copilot\n const { sessionId: metadataPromptCacheKey } = parseUserIdMetadata(\n payload.metadata?.user_id,\n )\n const requestStore = requestContext.getStore()\n const sessionAffinity = requestStore?.sessionAffinity?.trim() || null\n const promptCacheKey = buildPromptCacheKey(\n metadataPromptCacheKey ?? sessionAffinity,\n options.subagentAgentId,\n )\n\n const responsesPayload: ResponsesPayload = {\n model,\n input,\n instructions: translateSystemPrompt(payload.system, model),\n temperature: 1, // reasoning high temperature fixed to 1\n top_p: payload.top_p ?? null,\n max_output_tokens: Math.max(payload.max_tokens, 12800),\n tools: translatedTools,\n tool_choice: toolChoice,\n metadata: payload.metadata ? { ...payload.metadata } : null,\n //prompt_cache_retention: \"24h\", not work in gpt-5.4\n stream: payload.stream ?? null,\n store: false,\n parallel_tool_calls: true,\n reasoning: {\n effort: getReasoningEffortForModel(model),\n summary: \"auto\",\n },\n include: [\"reasoning.encrypted_content\"],\n }\n\n if (hasOriginalTools) {\n responsesPayload.prompt_cache_key = promptCacheKey\n }\n\n return responsesPayload\n}\n\ninterface TranslationState {\n originalTools: Array<AnthropicTool>\n toolSearchEnabled: boolean\n toolUseNameById: Map<string, string>\n}\n\ntype CompactionCarrier = {\n id: string\n encrypted_content: string\n}\n\nexport const encodeCompactionCarrierSignature = (\n compaction: CompactionCarrier,\n): string => {\n return `${COMPACTION_SIGNATURE_PREFIX}${compaction.encrypted_content}${COMPACTION_SIGNATURE_SEPARATOR}${compaction.id}`\n}\n\nexport const decodeCompactionCarrierSignature = (\n signature: string,\n): CompactionCarrier | undefined => {\n if (signature.startsWith(COMPACTION_SIGNATURE_PREFIX)) {\n const raw = signature.slice(COMPACTION_SIGNATURE_PREFIX.length)\n const separatorIndex = raw.indexOf(COMPACTION_SIGNATURE_SEPARATOR)\n\n if (separatorIndex <= 0 || separatorIndex === raw.length - 1) {\n return undefined\n }\n\n const encrypted_content = raw.slice(0, separatorIndex)\n const id = raw.slice(separatorIndex + 1)\n\n if (!encrypted_content) {\n return undefined\n }\n\n return {\n id,\n encrypted_content,\n }\n }\n\n return undefined\n}\n\nconst translateMessage = (\n message: AnthropicMessage,\n model: string,\n applyPhase: boolean,\n state: TranslationState,\n): Array<ResponseInputItem> => {\n if (message.role === \"user\") {\n return translateUserMessage(message, state)\n }\n\n return translateAssistantMessage(message, model, applyPhase, state)\n}\n\nconst translateUserMessage = (\n message: AnthropicUserMessage,\n state: TranslationState,\n): Array<ResponseInputItem> => {\n if (typeof message.content === \"string\") {\n return [createMessage(\"user\", message.content)]\n }\n\n if (!Array.isArray(message.content)) {\n return []\n }\n\n const items: Array<ResponseInputItem> = []\n const pendingContent: Array<ResponseInputContent> = []\n\n for (const block of message.content) {\n if (block.type === \"tool_result\") {\n flushPendingContent(pendingContent, items, { role: \"user\" })\n items.push(createToolCallOutput(block, state))\n continue\n }\n\n const converted = translateUserContentBlock(block)\n if (converted.length > 0) {\n pendingContent.push(...converted)\n }\n }\n\n flushPendingContent(pendingContent, items, { role: \"user\" })\n\n return items\n}\n\nconst translateAssistantMessage = (\n message: AnthropicAssistantMessage,\n model: string,\n applyPhase: boolean,\n state: TranslationState,\n): Array<ResponseInputItem> => {\n const assistantPhase = resolveAssistantPhase(\n model,\n message.content,\n applyPhase,\n )\n\n if (typeof message.content === \"string\") {\n return [createMessage(\"assistant\", message.content, assistantPhase)]\n }\n\n if (!Array.isArray(message.content)) {\n return []\n }\n\n const items: Array<ResponseInputItem> = []\n const pendingContent: Array<ResponseInputContent> = []\n\n for (const block of message.content) {\n if (block.type === \"tool_use\") {\n state.toolUseNameById.set(block.id, block.name)\n flushPendingContent(pendingContent, items, {\n role: \"assistant\",\n phase: assistantPhase,\n })\n items.push(createToolCall(block, state))\n continue\n }\n\n if (block.type === \"thinking\" && block.signature) {\n const compactionContent = createCompactionContent(block)\n if (compactionContent) {\n flushPendingContent(pendingContent, items, {\n role: \"assistant\",\n phase: assistantPhase,\n })\n items.push(compactionContent)\n continue\n }\n\n if (block.signature.includes(\"@\")) {\n flushPendingContent(pendingContent, items, {\n role: \"assistant\",\n phase: assistantPhase,\n })\n items.push(createReasoningContent(block))\n continue\n }\n }\n\n const converted = translateAssistantContentBlock(block)\n if (converted) {\n pendingContent.push(converted)\n }\n }\n\n flushPendingContent(pendingContent, items, {\n role: \"assistant\",\n phase: assistantPhase,\n })\n\n return items\n}\n\nconst translateUserContentBlock = (\n block: AnthropicUserContentBlock,\n): Array<ResponseInputContent> => {\n switch (block.type) {\n case \"text\": {\n return [createTextContent(block.text)]\n }\n case \"image\": {\n return [createImageContent(block)]\n }\n case \"document\": {\n return [createFileContent(block)]\n }\n default: {\n return []\n }\n }\n}\n\nconst translateAssistantContentBlock = (\n block: AnthropicAssistantContentBlock,\n): ResponseInputContent | undefined => {\n switch (block.type) {\n case \"text\": {\n return createOutPutTextContent(block.text)\n }\n default: {\n return undefined\n }\n }\n}\n\nconst flushPendingContent = (\n pendingContent: Array<ResponseInputContent>,\n target: Array<ResponseInputItem>,\n message: Pick<ResponseInputMessage, \"role\" | \"phase\">,\n) => {\n if (pendingContent.length === 0) {\n return\n }\n\n const messageContent = [...pendingContent]\n\n target.push(createMessage(message.role, messageContent, message.phase))\n pendingContent.length = 0\n}\n\nconst createMessage = (\n role: ResponseInputMessage[\"role\"],\n content: string | Array<ResponseInputContent>,\n phase?: ResponseInputMessage[\"phase\"],\n): ResponseInputMessage => ({\n type: MESSAGE_TYPE,\n role,\n content,\n ...(role === \"assistant\" && phase ? { phase } : {}),\n})\n\nconst resolveAssistantPhase = (\n _model: string,\n content: AnthropicAssistantMessage[\"content\"],\n applyPhase: boolean,\n): ResponseInputMessage[\"phase\"] | undefined => {\n if (!applyPhase) {\n return undefined\n }\n\n if (typeof content === \"string\") {\n return \"final_answer\"\n }\n\n if (!Array.isArray(content)) {\n return undefined\n }\n\n const hasText = content.some((block) => block.type === \"text\")\n if (!hasText) {\n return undefined\n }\n\n const hasToolUse = content.some((block) => block.type === \"tool_use\")\n return hasToolUse ? \"commentary\" : \"final_answer\"\n}\n\nconst shouldApplyPhase = (model: string): boolean => {\n const extraPrompt = getExtraPromptForModel(model)\n return extraPrompt.includes(\"## Intermediary updates\")\n}\n\nconst createTextContent = (text: string): ResponseInputText => ({\n type: \"input_text\",\n text,\n})\n\nconst createOutPutTextContent = (text: string): ResponseInputText => ({\n type: \"output_text\",\n text,\n})\n\nconst createImageContent = (\n block: AnthropicImageBlock,\n): ResponseInputImage => ({\n type: \"input_image\",\n image_url: `data:${block.source.media_type};base64,${block.source.data}`,\n detail: \"auto\",\n})\n\nconst createFileContent = (\n block: AnthropicDocumentBlock,\n): ResponseInputFile => ({\n type: \"input_file\",\n file_data: `data:${block.source.media_type};base64,${block.source.data}`,\n filename: block.title ?? \"document.pdf\",\n})\n\nconst createReasoningContent = (\n block: AnthropicThinkingBlock,\n): ResponseInputReasoning => {\n // align with vscode-copilot-chat extractThinkingData, should add id, otherwise it will cause miss cache occasionally —— the usage input cached tokens to be 0\n // https://github.com/microsoft/vscode-copilot-chat/blob/main/src/platform/endpoint/node/responsesApi.ts#L162\n // when use in codex cli, reasoning id is empty, so it will cause miss cache occasionally\n const { encryptedContent, id } = parseReasoningSignature(block.signature)\n const thinking = block.thinking === THINKING_TEXT ? \"\" : block.thinking\n return {\n id,\n type: \"reasoning\",\n summary: thinking ? [{ type: \"summary_text\", text: thinking }] : [],\n encrypted_content: encryptedContent,\n }\n}\n\nconst createCompactionContent = (\n block: AnthropicThinkingBlock,\n): ResponseInputCompaction | undefined => {\n const compaction = decodeCompactionCarrierSignature(block.signature)\n if (!compaction) {\n return undefined\n }\n\n return {\n id: compaction.id,\n type: \"compaction\",\n encrypted_content: compaction.encrypted_content,\n }\n}\n\nconst parseReasoningSignature = (\n signature: string,\n): { encryptedContent: string; id: string } => {\n const splitIndex = signature.lastIndexOf(\"@\")\n\n if (splitIndex <= 0 || splitIndex === signature.length - 1) {\n return { encryptedContent: signature, id: \"\" }\n }\n\n return {\n encryptedContent: signature.slice(0, splitIndex),\n id: signature.slice(splitIndex + 1),\n }\n}\n\nconst createFunctionToolCall = (\n block: AnthropicToolUseBlock,\n state: TranslationState,\n): ResponseFunctionToolCallItem => ({\n type: \"function_call\",\n call_id: block.id,\n name: block.name,\n arguments: JSON.stringify(block.input),\n status: \"completed\",\n ...(state.toolSearchEnabled && isDeferredToolName(block.name) ?\n { namespace: block.name }\n : {}),\n})\n\nconst createToolSearchCall = (\n block: AnthropicToolUseBlock,\n): ResponseToolSearchCallItem => ({\n type: \"tool_search_call\",\n call_id: block.id,\n arguments: normalizeToolSearchBridgeArguments(block.input),\n execution: \"client\",\n status: \"completed\",\n})\n\nconst createToolCall = (\n block: AnthropicToolUseBlock,\n state: TranslationState,\n): ResponseFunctionToolCallItem | ResponseToolSearchCallItem => {\n if (state.toolSearchEnabled && isBridgeToolSearchName(block.name)) {\n return createToolSearchCall(block)\n }\n\n return createFunctionToolCall(block, state)\n}\n\nconst createFunctionCallOutput = (\n block: AnthropicToolResultBlock,\n): ResponseFunctionCallOutputItem => ({\n type: \"function_call_output\",\n call_id: block.tool_use_id,\n output: convertToolResultContent(block.content),\n status: block.is_error ? \"incomplete\" : \"completed\",\n})\n\nconst createToolCallOutput = (\n block: AnthropicToolResultBlock,\n state: TranslationState,\n): ResponseFunctionCallOutputItem | ResponseToolSearchOutputItem => {\n const toolUseName = state.toolUseNameById.get(block.tool_use_id)\n if (state.toolSearchEnabled && isBridgeToolSearchName(toolUseName ?? \"\")) {\n return createToolSearchOutput(block, state.originalTools)\n }\n\n return createFunctionCallOutput(block)\n}\n\nconst createToolSearchOutput = (\n block: AnthropicToolResultBlock,\n originalTools: Array<AnthropicTool>,\n): ResponseToolSearchOutputItem => {\n const referencedToolNames = resolveToolSearchReferencedToolNames(\n block.content,\n originalTools,\n )\n\n return {\n type: \"tool_search_output\",\n call_id: block.tool_use_id,\n tools: referencedToolNames.map((toolName) =>\n convertDeferredToolToNamespace(\n resolveDeferredTool(toolName, originalTools),\n ),\n ),\n execution: \"client\",\n status: block.is_error ? \"incomplete\" : \"completed\",\n }\n}\n\nconst resolveToolSearchReferencedToolNames = (\n content: string | Array<AnthropicToolResultContentBlock>,\n originalTools: Array<AnthropicTool>,\n): Array<string> => {\n const explicitReferences = extractToolReferenceNames(content)\n if (explicitReferences.length > 0) {\n return uniqueToolNames(explicitReferences)\n }\n\n const sentinel = extractMcpToolSearchSentinel(content)\n if (sentinel) {\n return selectDeferredToolsByNames(sentinel.names, originalTools).map(\n (tool) => tool.name,\n )\n }\n\n return []\n}\n\nconst extractToolReferenceNames = (\n content: string | Array<AnthropicToolResultContentBlock>,\n): Array<string> => {\n if (!Array.isArray(content)) {\n return []\n }\n\n return content.flatMap((block) =>\n block.type === \"tool_reference\" ? [block.tool_name] : [],\n )\n}\n\nconst extractMcpToolSearchSentinel = (\n content: string | Array<AnthropicToolResultContentBlock>,\n) => {\n if (typeof content === \"string\") {\n return parseMcpToolSearchSentinel(content)\n }\n\n for (const block of content) {\n if (block.type !== \"text\") {\n continue\n }\n\n const sentinel = parseMcpToolSearchSentinel(block.text)\n if (sentinel) {\n return sentinel\n }\n }\n\n return null\n}\n\nconst resolveDeferredTool = (\n toolName: string,\n originalTools: Array<AnthropicTool>,\n): AnthropicTool => {\n const tool = originalTools.find((candidate) => candidate.name === toolName)\n if (tool && isDeferredToolName(tool.name)) {\n return tool\n }\n\n throw createInvalidRequestError(\n `Tool reference '${toolName}' has no corresponding deferred tool definition`,\n )\n}\n\nconst uniqueToolNames = (toolNames: Array<string>): Array<string> => [\n ...new Set(toolNames),\n]\n\nconst createInvalidRequestError = (message: string): HTTPError =>\n new HTTPError(\n message,\n new Response(\n JSON.stringify({\n error: {\n message,\n type: \"invalid_request_error\",\n },\n }),\n {\n status: 400,\n headers: { \"content-type\": \"application/json\" },\n },\n ),\n )\n\nconst translateSystemPrompt = (\n system: string | Array<AnthropicTextBlock> | undefined,\n model: string,\n): string | null => {\n if (!system) {\n return null\n }\n\n const extraPrompt = getExtraPromptForModel(model)\n\n if (typeof system === \"string\") {\n return system + extraPrompt\n }\n\n const text = system\n .map((block, index) => {\n if (index === 0) {\n return block.text + \"\\n\\n\" + extraPrompt + \"\\n\\n\"\n }\n return block.text\n })\n .join(\" \")\n return text.length > 0 ? text : null\n}\n\nconst convertAnthropicTools = (\n tools: Array<AnthropicTool> | undefined,\n toolSearchEnabled: boolean,\n): Array<Tool> | null => {\n if (!tools || tools.length === 0) {\n return null\n }\n\n const converted: Array<Tool> = []\n let addedToolSearch = false\n const searchableToolNames =\n toolSearchEnabled ? listDeferredToolNames(tools) : []\n\n for (const tool of tools) {\n if (isBridgeToolSearchName(tool.name)) {\n if (toolSearchEnabled && !addedToolSearch) {\n converted.push(createResponsesToolSearchDefinition(searchableToolNames))\n addedToolSearch = true\n }\n continue\n }\n\n if (toolSearchEnabled && isDeferredToolName(tool.name)) {\n converted.push(convertDeferredToolToNamespace(tool))\n continue\n }\n\n converted.push(convertToolToFunction(tool))\n }\n\n return converted\n}\n\nconst createResponsesToolSearchDefinition = (\n searchableToolNames: Array<string>,\n): Tool => ({\n type: \"tool_search\",\n execution: \"client\",\n description:\n \"Load deferred tools by exact name before using them. Return only the searchable tool names you need for the next step.\",\n parameters: {\n type: \"object\",\n properties: {\n names: {\n type: \"array\",\n description: \"Exact deferred tool names to load.\",\n items: {\n type: \"string\",\n enum: searchableToolNames,\n },\n minItems: 1,\n },\n },\n required: [\"names\"],\n additionalProperties: false,\n },\n})\n\nconst convertToolToFunction = (tool: AnthropicTool): Tool => ({\n type: \"function\",\n name: tool.name,\n parameters: normalizeToolSchema(tool.input_schema),\n strict: false,\n ...(tool.description ? { description: tool.description } : {}),\n})\n\nconst convertDeferredToolToNamespace = (tool: AnthropicTool): Tool => ({\n type: \"namespace\",\n name: tool.name,\n ...(tool.description ? { description: tool.description } : {}),\n tools: [\n {\n type: \"function\",\n name: tool.name,\n parameters: normalizeToolSchema(tool.input_schema),\n strict: false,\n defer_loading: true,\n ...(tool.description ? { description: tool.description } : {}),\n },\n ],\n})\n\nconst convertAnthropicToolChoice = (\n choice: AnthropicMessagesPayload[\"tool_choice\"],\n toolSearchEnabled: boolean,\n): ToolChoiceOptions | ToolChoiceFunction => {\n if (!choice) {\n return \"auto\"\n }\n\n switch (choice.type) {\n case \"auto\": {\n return \"auto\"\n }\n case \"any\": {\n return \"required\"\n }\n case \"tool\": {\n if (\n toolSearchEnabled\n && choice.name\n && isBridgeToolSearchName(choice.name)\n ) {\n return \"auto\"\n }\n return choice.name ? { type: \"function\", name: choice.name } : \"auto\"\n }\n case \"none\": {\n return \"none\"\n }\n default: {\n return \"auto\"\n }\n }\n}\n\ninterface ResponsesToAnthropicOptions {\n toolSearchName?: string\n hasToolCall?: boolean\n}\n\nexport const translateResponsesResultToAnthropic = (\n response: ResponsesResult,\n options?: ResponsesToAnthropicOptions,\n): AnthropicResponse => {\n const contentBlocks = mapOutputToAnthropicContent(response.output, options)\n const usage = mapResponsesUsage(response)\n let anthropicContent = fallbackContentBlocks(response.output_text)\n if (contentBlocks.length > 0) {\n anthropicContent = contentBlocks\n }\n\n const stopReason = mapResponsesStopReason(response, options)\n\n return {\n id: response.id,\n type: \"message\",\n role: \"assistant\",\n content: anthropicContent,\n model: response.model,\n stop_reason: stopReason,\n stop_sequence: null,\n usage,\n }\n}\n\nconst mapOutputToAnthropicContent = (\n output: Array<ResponseOutputItem>,\n options?: ResponsesToAnthropicOptions,\n): Array<AnthropicAssistantContentBlock> => {\n const contentBlocks: Array<AnthropicAssistantContentBlock> = []\n if (!output) {\n output = []\n }\n for (const item of output) {\n switch (item.type) {\n case \"reasoning\": {\n const thinkingText = extractReasoningText(item)\n if (thinkingText.length > 0) {\n contentBlocks.push({\n type: \"thinking\",\n thinking: thinkingText,\n signature: (item.encrypted_content ?? \"\") + \"@\" + item.id,\n })\n }\n break\n }\n case \"function_call\": {\n const toolUseBlock = createToolUseContentBlock(item)\n if (toolUseBlock) {\n contentBlocks.push(toolUseBlock)\n }\n break\n }\n case \"tool_search_call\": {\n const toolUseBlock = createToolSearchUseContentBlock(\n item,\n options?.toolSearchName,\n )\n if (toolUseBlock) {\n contentBlocks.push(toolUseBlock)\n }\n break\n }\n case \"tool_search_output\": {\n break\n }\n case \"message\": {\n const combinedText = combineMessageTextContent(item.content)\n if (combinedText.length > 0) {\n contentBlocks.push({ type: \"text\", text: combinedText })\n }\n break\n }\n case \"compaction\": {\n const compactionBlock = createCompactionThinkingBlock(item)\n if (compactionBlock) {\n contentBlocks.push(compactionBlock)\n }\n break\n }\n default: {\n // Future compatibility for unrecognized output item types.\n const combinedText = combineMessageTextContent(\n (item as { content?: Array<ResponseOutputContentBlock> }).content,\n )\n if (combinedText.length > 0) {\n contentBlocks.push({ type: \"text\", text: combinedText })\n }\n }\n }\n }\n\n return contentBlocks\n}\n\nconst combineMessageTextContent = (\n content: Array<ResponseOutputContentBlock> | undefined,\n): string => {\n if (!Array.isArray(content)) {\n return \"\"\n }\n\n let aggregated = \"\"\n\n for (const block of content) {\n if (isResponseOutputText(block)) {\n aggregated += block.text\n continue\n }\n\n if (isResponseOutputRefusal(block)) {\n aggregated += block.refusal\n continue\n }\n\n if (typeof (block as { text?: unknown }).text === \"string\") {\n aggregated += (block as { text: string }).text\n continue\n }\n\n if (typeof (block as { reasoning?: unknown }).reasoning === \"string\") {\n aggregated += (block as { reasoning: string }).reasoning\n continue\n }\n }\n\n return aggregated\n}\n\nconst extractReasoningText = (item: ResponseOutputReasoning): string => {\n const segments: Array<string> = []\n\n const collectFromBlocks = (blocks?: Array<ResponseReasoningBlock>) => {\n if (!Array.isArray(blocks)) {\n return\n }\n\n for (const block of blocks) {\n if (typeof block.text === \"string\") {\n segments.push(block.text)\n continue\n }\n }\n }\n\n // Compatible with opencode, it will filter out blocks where the thinking text is empty, so we add a default thinking text here\n if (!item.summary || item.summary.length === 0) {\n return THINKING_TEXT\n }\n\n collectFromBlocks(item.summary)\n\n return segments.join(\"\").trim()\n}\n\nconst createToolUseContentBlock = (\n call: ResponseOutputFunctionCall,\n): AnthropicToolUseBlock | null => {\n const toolId = call.call_id\n const toolName = resolveToolUseName(call)\n if (!toolName || !toolId) {\n return null\n }\n\n const input = parseFunctionCallArguments(call.arguments)\n\n return {\n type: \"tool_use\",\n id: toolId,\n name: toolName,\n input,\n }\n}\n\nconst createToolSearchUseContentBlock = (\n call: ResponseOutputToolSearchCall,\n toolSearchName = BRIDGE_TOOL_SEARCH_NAME,\n): AnthropicToolUseBlock | null => {\n const toolId = call.call_id\n if (!toolId) {\n return null\n }\n\n return {\n type: \"tool_use\",\n id: toolId,\n name: toolSearchName,\n input: parseToolSearchArguments(call.arguments),\n }\n}\n\nexport const resolveToolUseName = (\n call: Pick<ResponseOutputFunctionCall, \"name\" | \"namespace\">,\n): string => {\n if (typeof call.namespace === \"string\" && call.namespace.length > 0) {\n return call.namespace\n }\n\n return call.name\n}\n\nconst createCompactionThinkingBlock = (\n item: ResponseOutputCompaction,\n): AnthropicAssistantContentBlock | null => {\n if (!item.id || !item.encrypted_content) {\n return null\n }\n\n return {\n type: \"thinking\",\n thinking: THINKING_TEXT,\n signature: encodeCompactionCarrierSignature({\n id: item.id,\n encrypted_content: item.encrypted_content,\n }),\n }\n}\n\nconst parseFunctionCallArguments = (\n rawArguments: string,\n): Record<string, unknown> => {\n if (typeof rawArguments !== \"string\" || rawArguments.trim().length === 0) {\n return {}\n }\n\n try {\n const parsed: unknown = JSON.parse(rawArguments)\n\n if (Array.isArray(parsed)) {\n return { arguments: parsed }\n }\n\n if (parsed && typeof parsed === \"object\") {\n return parsed as Record<string, unknown>\n }\n } catch (error) {\n consola.warn(\"Failed to parse function call arguments\", {\n error,\n rawArguments,\n })\n }\n\n return { raw_arguments: rawArguments }\n}\n\nconst parseToolSearchArguments = (\n argumentsValue: Record<string, unknown> | string,\n): Record<string, unknown> => {\n return formatToolSearchBridgeArguments(argumentsValue)\n}\n\nconst fallbackContentBlocks = (\n outputText: string,\n): Array<AnthropicAssistantContentBlock> => {\n if (!outputText) {\n return []\n }\n\n return [\n {\n type: \"text\",\n text: outputText,\n },\n ]\n}\n\nconst mapResponsesStopReason = (\n response: ResponsesResult,\n options?: ResponsesToAnthropicOptions,\n): AnthropicResponse[\"stop_reason\"] => {\n const { status, incomplete_details: incompleteDetails } = response\n\n if (status === \"completed\") {\n if (!response.output || response.output.length === 0) {\n return options?.hasToolCall ? \"tool_use\" : \"end_turn\"\n }\n\n if (\n response.output.some(\n (item) =>\n item.type === \"function_call\" || item.type === \"tool_search_call\",\n )\n ) {\n return \"tool_use\"\n }\n return \"end_turn\"\n }\n\n if (status === \"incomplete\") {\n if (incompleteDetails?.reason === \"max_output_tokens\") {\n return \"max_tokens\"\n }\n if (incompleteDetails?.reason === \"content_filter\") {\n return \"end_turn\"\n }\n }\n\n return null\n}\n\nconst mapResponsesUsage = (\n response: ResponsesResult,\n): AnthropicResponse[\"usage\"] => {\n const inputTokens = response.usage?.input_tokens ?? 0\n const outputTokens = response.usage?.output_tokens ?? 0\n const inputCachedTokens = response.usage?.input_tokens_details?.cached_tokens\n\n return {\n input_tokens: inputTokens - (inputCachedTokens ?? 0),\n output_tokens: outputTokens,\n ...(response.usage?.input_tokens_details?.cached_tokens !== undefined && {\n cache_read_input_tokens:\n response.usage.input_tokens_details.cached_tokens,\n }),\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null\n\nconst isResponseOutputText = (\n block: ResponseOutputContentBlock,\n): block is ResponseOutputText =>\n isRecord(block)\n && \"type\" in block\n && (block as { type?: unknown }).type === \"output_text\"\n\nconst isResponseOutputRefusal = (\n block: ResponseOutputContentBlock,\n): block is ResponseOutputRefusal =>\n isRecord(block)\n && \"type\" in block\n && (block as { type?: unknown }).type === \"refusal\"\n\nconst convertToolResultContent = (\n content: string | Array<AnthropicToolResultContentBlock>,\n): string | Array<ResponseInputContent> => {\n if (typeof content === \"string\") {\n return content\n }\n\n if (Array.isArray(content)) {\n const result: Array<ResponseInputContent> = []\n for (const block of content) {\n switch (block.type) {\n case \"text\": {\n result.push(createTextContent(block.text))\n break\n }\n case \"image\": {\n result.push(createImageContent(block))\n break\n }\n case \"document\": {\n result.push(createFileContent(block))\n break\n }\n case \"tool_reference\": {\n result.push(createTextContent(`Tool ${block.tool_name} loaded`))\n break\n }\n default: {\n break\n }\n }\n }\n return result\n }\n\n return \"\"\n}\n","import { createHash } from \"node:crypto\"\n\nimport type {\n ResponseOutputItem,\n ResponseStreamEvent,\n ResponsesResult,\n} from \"~/services/copilot/create-responses\"\n\nimport type { AnthropicMessagesPayload } from \"./anthropic-types\"\n\nimport { decodeCompactionCarrierSignature } from \"./responses-translation\"\n\ntype OwnershipKeyKind = \"id\" | \"encrypted_content\"\n\ntype OwnerBearingOutputItem = Extract<\n ResponseOutputItem,\n { type: \"reasoning\" | \"compaction\" }\n>\n\nexport function buildResponsesItemOwnershipKey(\n kind: OwnershipKeyKind,\n value: string,\n): string {\n const digest = createHash(\"sha256\").update(value).digest(\"hex\")\n return `responses-item-owner:${kind}:${digest}`\n}\n\nexport function extractAnthropicResponsesItemOwnerKeys(\n payload: AnthropicMessagesPayload,\n): Array<string> {\n const keys: Array<string> = []\n\n for (const message of payload.messages) {\n if (message.role !== \"assistant\" || !Array.isArray(message.content)) {\n continue\n }\n\n for (const block of message.content) {\n if (block.type !== \"thinking\" || !block.signature) {\n continue\n }\n\n addSignatureOwnerKeys(keys, block.signature)\n }\n }\n\n return unique(keys)\n}\n\nexport function extractResponsesResultOwnerKeys(\n result: Pick<ResponsesResult, \"output\">,\n): Array<string> {\n const keys: Array<string> = []\n\n for (const item of result.output) {\n addOutputItemOwnerKeys(keys, item)\n }\n\n return unique(keys)\n}\n\nexport function extractResponsesStreamEventOwnerKeys(\n event: ResponseStreamEvent,\n): Array<string> {\n if (event.type === \"response.output_item.done\") {\n const keys: Array<string> = []\n addOutputItemOwnerKeys(keys, event.item)\n return unique(keys)\n }\n\n if (\n event.type === \"response.completed\"\n || event.type === \"response.incomplete\"\n ) {\n return extractResponsesResultOwnerKeys(event.response)\n }\n\n return []\n}\n\nfunction addSignatureOwnerKeys(keys: Array<string>, signature: string): void {\n if (signature.startsWith(\"cm1#\")) {\n const compaction = decodeCompactionCarrierSignature(signature)\n if (compaction) {\n addRawOwnerKeys(keys, compaction.id, compaction.encrypted_content)\n }\n return\n }\n\n const reasoning = parseReasoningSignature(signature)\n if (!reasoning) {\n return\n }\n\n addRawOwnerKeys(keys, reasoning.id, reasoning.encryptedContent)\n}\n\nfunction parseReasoningSignature(\n signature: string,\n): { encryptedContent: string; id: string } | undefined {\n const splitIndex = signature.lastIndexOf(\"@\")\n if (splitIndex <= 0 || splitIndex === signature.length - 1) {\n return undefined\n }\n\n return {\n encryptedContent: signature.slice(0, splitIndex),\n id: signature.slice(splitIndex + 1),\n }\n}\n\nfunction addOutputItemOwnerKeys(\n keys: Array<string>,\n item: ResponseOutputItem,\n): void {\n if (!isOwnerBearingOutputItem(item)) {\n return\n }\n\n addRawOwnerKeys(keys, item.id, item.encrypted_content)\n}\n\nfunction isOwnerBearingOutputItem(\n item: ResponseOutputItem,\n): item is OwnerBearingOutputItem {\n return item.type === \"reasoning\" || item.type === \"compaction\"\n}\n\nfunction addRawOwnerKeys(\n keys: Array<string>,\n id: string | undefined,\n encryptedContent: string | undefined,\n): void {\n if (id) {\n keys.push(buildResponsesItemOwnershipKey(\"id\", id))\n }\n if (encryptedContent) {\n keys.push(\n buildResponsesItemOwnershipKey(\"encrypted_content\", encryptedContent),\n )\n }\n}\n\nfunction unique(values: Array<string>): Array<string> {\n return [...new Set(values)]\n}\n","import {\n type ChatCompletionChunk,\n type Choice,\n type Delta,\n} from \"~/services/copilot/create-chat-completions\"\n\nimport {\n type AnthropicMessageDeltaEvent,\n type AnthropicStreamEventData,\n type AnthropicStreamState,\n} from \"./anthropic-types\"\nimport { THINKING_TEXT } from \"./non-stream-translation\"\nimport { mapOpenAIStopReasonToAnthropic } from \"./utils\"\n\nfunction isToolBlockOpen(state: AnthropicStreamState): boolean {\n if (!state.contentBlockOpen) {\n return false\n }\n // Check if the current block index corresponds to any known tool call\n return Object.values(state.toolCalls).some(\n (tc) => tc.anthropicBlockIndex === state.contentBlockIndex,\n )\n}\n\nexport function translateChunkToAnthropicEvents(\n chunk: ChatCompletionChunk,\n state: AnthropicStreamState,\n): Array<AnthropicStreamEventData> {\n const events: Array<AnthropicStreamEventData> = []\n\n if (chunk.choices.length === 0) {\n completePendingMessage(state, events, chunk)\n return events\n }\n\n const choice = chunk.choices[0]\n const { delta } = choice\n\n handleMessageStart(state, events, chunk)\n\n handleThinkingText(delta, state, events)\n\n handleContent(delta, state, events)\n\n handleToolCalls(delta, state, events)\n\n handleFinish(choice, state, { events, chunk })\n\n return events\n}\n\nexport function flushPendingAnthropicStreamEvents(\n state: AnthropicStreamState,\n): Array<AnthropicStreamEventData> {\n const events: Array<AnthropicStreamEventData> = []\n completePendingMessage(state, events)\n return events\n}\n\nfunction completePendingMessage(\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n chunk?: ChatCompletionChunk,\n): void {\n if (!state.pendingMessageDelta) {\n return\n }\n\n if (chunk?.usage) {\n state.pendingMessageDelta.usage = getAnthropicUsageFromOpenAIChunk(\n chunk,\n state,\n )\n }\n\n events.push(state.pendingMessageDelta, {\n type: \"message_stop\",\n })\n state.pendingMessageDelta = undefined\n}\n\nfunction handleFinish(\n choice: Choice,\n state: AnthropicStreamState,\n context: {\n events: Array<AnthropicStreamEventData>\n chunk: ChatCompletionChunk\n },\n) {\n const { events, chunk } = context\n if (choice.finish_reason && choice.finish_reason.length > 0) {\n if (state.contentBlockOpen) {\n const toolBlockOpen = isToolBlockOpen(state)\n context.events.push({\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n })\n state.contentBlockOpen = false\n state.contentBlockIndex++\n if (!toolBlockOpen) {\n handleReasoningOpaque(choice.delta, events, state)\n }\n }\n\n flushDeferredContent(state, events)\n\n state.pendingMessageDelta = {\n type: \"message_delta\",\n delta: {\n stop_reason: mapOpenAIStopReasonToAnthropic(choice.finish_reason),\n stop_sequence: null,\n },\n usage: getAnthropicUsageFromOpenAIChunk(chunk, state),\n }\n if (chunk.usage) {\n completePendingMessage(state, events, chunk)\n }\n }\n}\n\nfunction getAnthropicUsageFromOpenAIChunk(\n chunk: ChatCompletionChunk,\n state?: AnthropicStreamState,\n): NonNullable<AnthropicMessageDeltaEvent[\"usage\"]> {\n const { cacheCreationTokens, inputTokens, cacheReadTokens } =\n getOpenAIChunkUsageTokens(chunk, state)\n\n return {\n input_tokens: inputTokens,\n output_tokens: chunk.usage?.completion_tokens ?? 0,\n ...(chunk.usage?.prompt_tokens_details?.cache_creation_input_tokens\n !== undefined && {\n cache_creation_input_tokens: cacheCreationTokens,\n }),\n ...(cacheReadTokens !== undefined && {\n cache_read_input_tokens: cacheReadTokens,\n }),\n }\n}\n\nfunction getOpenAIChunkUsageTokens(\n chunk: ChatCompletionChunk,\n state?: AnthropicStreamState,\n): {\n cacheCreationTokens: number\n cachedTokens: number\n inputTokens: number\n cacheReadTokens?: number\n} {\n const promptTokens = chunk.usage?.prompt_tokens\n const cachedTokens = chunk.usage?.prompt_tokens_details?.cached_tokens ?? 0\n const cacheCreationTokens =\n chunk.usage?.prompt_tokens_details?.cache_creation_input_tokens ?? 0\n if (promptTokens !== undefined) {\n return {\n cacheCreationTokens,\n cachedTokens,\n inputTokens: Math.max(\n 0,\n promptTokens - cachedTokens - cacheCreationTokens,\n ),\n cacheReadTokens: chunk.usage?.prompt_tokens_details?.cached_tokens,\n }\n }\n\n const historicalInputTokens = state?.historicalInputTokens\n const historicalOutputTokens = state?.historicalOutputTokens ?? 0\n const historicalTotalTokens =\n historicalInputTokens !== undefined ?\n historicalInputTokens + historicalOutputTokens\n : undefined\n\n return {\n cacheCreationTokens,\n cachedTokens,\n inputTokens: historicalTotalTokens ?? state?.estimatedInputTokens ?? 0,\n cacheReadTokens: state?.historicalCachedInputTokens,\n }\n}\n\nfunction handleToolCalls(\n delta: Delta,\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n) {\n if (delta.tool_calls && delta.tool_calls.length > 0) {\n closeThinkingBlockIfOpen(state, events)\n\n handleReasoningOpaqueInToolCalls(state, events, delta)\n\n for (const toolCall of delta.tool_calls) {\n if (toolCall.id && toolCall.function?.name) {\n // New tool call starting.\n if (state.contentBlockOpen) {\n // Close any previously open block.\n events.push({\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n })\n state.contentBlockIndex++\n state.contentBlockOpen = false\n }\n\n const anthropicBlockIndex = state.contentBlockIndex\n state.toolCalls[toolCall.index] = {\n id: toolCall.id,\n name: toolCall.function.name,\n anthropicBlockIndex,\n }\n\n events.push({\n type: \"content_block_start\",\n index: anthropicBlockIndex,\n content_block: {\n type: \"tool_use\",\n id: toolCall.id,\n name: toolCall.function.name,\n input: {},\n },\n })\n state.contentBlockOpen = true\n }\n\n if (toolCall.function?.arguments) {\n const toolCallInfo = state.toolCalls[toolCall.index]\n // Tool call can still be empty\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (toolCallInfo) {\n events.push({\n type: \"content_block_delta\",\n index: toolCallInfo.anthropicBlockIndex,\n delta: {\n type: \"input_json_delta\",\n partial_json: toolCall.function.arguments,\n },\n })\n }\n }\n }\n }\n}\n\nfunction handleReasoningOpaqueInToolCalls(\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n delta: Delta,\n) {\n if (state.contentBlockOpen && !isToolBlockOpen(state)) {\n events.push({\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n })\n state.contentBlockIndex++\n state.contentBlockOpen = false\n }\n handleReasoningOpaque(delta, events, state)\n}\n\nfunction handleContent(\n delta: Delta,\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n) {\n if (delta.content && delta.content.length > 0) {\n closeThinkingBlockIfOpen(state, events)\n\n if (isToolBlockOpen(state) || hasToolCallDelta(delta)) {\n state.deferredContent = `${state.deferredContent ?? \"\"}${delta.content}`\n return\n }\n\n if (!state.contentBlockOpen) {\n events.push({\n type: \"content_block_start\",\n index: state.contentBlockIndex,\n content_block: {\n type: \"text\",\n text: \"\",\n },\n })\n state.contentBlockOpen = true\n }\n\n events.push({\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"text_delta\",\n text: delta.content,\n },\n })\n }\n\n // handle for claude model\n if (\n delta.content === \"\"\n && delta.reasoning_opaque\n && delta.reasoning_opaque.length > 0\n && state.thinkingBlockOpen\n ) {\n events.push(\n {\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"signature_delta\",\n signature: delta.reasoning_opaque,\n },\n },\n {\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n },\n )\n state.contentBlockIndex++\n state.thinkingBlockOpen = false\n }\n}\n\nfunction hasToolCallDelta(delta: Delta): boolean {\n return Boolean(delta.tool_calls && delta.tool_calls.length > 0)\n}\n\nfunction flushDeferredContent(\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n): void {\n if (!state.deferredContent) {\n return\n }\n\n if (!state.contentBlockOpen) {\n events.push({\n type: \"content_block_start\",\n index: state.contentBlockIndex,\n content_block: {\n type: \"text\",\n text: \"\",\n },\n })\n state.contentBlockOpen = true\n }\n\n events.push(\n {\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"text_delta\",\n text: state.deferredContent,\n },\n },\n {\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n },\n )\n state.deferredContent = undefined\n state.contentBlockOpen = false\n state.contentBlockIndex++\n}\n\nfunction handleMessageStart(\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n chunk: ChatCompletionChunk,\n) {\n if (!state.messageStartSent) {\n const { cacheCreationTokens, inputTokens, cacheReadTokens } =\n getOpenAIChunkUsageTokens(chunk, state)\n\n events.push({\n type: \"message_start\",\n message: {\n id: chunk.id,\n type: \"message\",\n role: \"assistant\",\n content: [],\n model: chunk.model,\n stop_reason: null,\n stop_sequence: null,\n usage: {\n input_tokens: inputTokens,\n output_tokens: 0, // Will be updated in message_delta when finished\n ...(chunk.usage?.prompt_tokens_details?.cache_creation_input_tokens\n !== undefined && {\n cache_creation_input_tokens: cacheCreationTokens,\n }),\n ...(cacheReadTokens !== undefined && {\n cache_read_input_tokens: cacheReadTokens,\n }),\n },\n },\n })\n state.messageStartSent = true\n }\n}\n\nfunction handleReasoningOpaque(\n delta: Delta,\n events: Array<AnthropicStreamEventData>,\n state: AnthropicStreamState,\n) {\n if (delta.reasoning_opaque && delta.reasoning_opaque.length > 0) {\n events.push(\n {\n type: \"content_block_start\",\n index: state.contentBlockIndex,\n content_block: {\n type: \"thinking\",\n thinking: \"\",\n },\n },\n {\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: THINKING_TEXT, // Compatible with opencode, it will filter out blocks where the thinking text is empty, so we add a default thinking text here\n },\n },\n {\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"signature_delta\",\n signature: delta.reasoning_opaque,\n },\n },\n {\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n },\n )\n state.contentBlockIndex++\n }\n}\n\nfunction handleThinkingText(\n delta: Delta,\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n) {\n const reasoningText = delta.reasoning_text ?? delta.reasoning_content\n if (reasoningText && reasoningText.length > 0) {\n // compatible with copilot API returning content->reasoning_text->reasoning_opaque in different deltas\n // this is an extremely abnormal situation, probably a server-side bug\n // only occurs in the claude model, with a very low probability of occurrence\n if (state.contentBlockOpen) {\n delta.content = reasoningText\n delta.reasoning_text = undefined\n delta.reasoning_content = undefined\n return\n }\n\n if (!state.thinkingBlockOpen) {\n events.push({\n type: \"content_block_start\",\n index: state.contentBlockIndex,\n content_block: {\n type: \"thinking\",\n thinking: \"\",\n },\n })\n state.thinkingBlockOpen = true\n }\n\n events.push({\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: reasoningText,\n },\n })\n }\n}\n\nfunction closeThinkingBlockIfOpen(\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n): void {\n if (state.thinkingBlockOpen) {\n events.push(\n {\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"signature_delta\",\n signature: \"\",\n },\n },\n {\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n },\n )\n state.contentBlockIndex++\n state.thinkingBlockOpen = false\n }\n}\n\nexport function translateErrorToAnthropicErrorEvent(): AnthropicStreamEventData {\n return {\n type: \"error\",\n error: {\n type: \"api_error\",\n message: \"An unexpected error occurred during streaming.\",\n },\n }\n}\n","import type { ResolvedProviderConfig } from \"~/lib/config\"\nimport type { AnthropicMessagesPayload } from \"~/routes/messages/anthropic-types\"\nimport type { ChatCompletionsPayload } from \"~/services/copilot/create-chat-completions\"\nimport type { ResponsesPayload } from \"~/services/copilot/create-responses\"\n\nconst SHARED_FORWARDABLE_HEADERS = [\"accept\", \"user-agent\"] as const\n\nconst ANTHROPIC_FORWARDABLE_HEADERS = [\n \"anthropic-version\",\n \"anthropic-beta\",\n] as const\n\nconst STRIPPED_RESPONSE_HEADERS = [\n \"connection\",\n \"content-encoding\",\n \"content-length\",\n \"keep-alive\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n \"transfer-encoding\",\n \"upgrade\",\n] as const\n\nexport function buildProviderUpstreamHeaders(\n providerConfig: ResolvedProviderConfig,\n requestHeaders: Headers,\n): Record<string, string> {\n const authHeaders: Record<string, string> = {}\n if (providerConfig.authType === \"x-api-key\") {\n authHeaders[\"x-api-key\"] = providerConfig.apiKey\n } else {\n authHeaders.authorization = `Bearer ${providerConfig.apiKey}`\n }\n\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n ...authHeaders,\n }\n\n for (const headerName of SHARED_FORWARDABLE_HEADERS) {\n const headerValue = requestHeaders.get(headerName)\n if (headerValue) {\n headers[headerName] = headerValue\n }\n }\n\n if (providerConfig.type !== \"anthropic\") {\n return headers\n }\n\n for (const headerName of ANTHROPIC_FORWARDABLE_HEADERS) {\n const headerValue = requestHeaders.get(headerName)\n if (headerValue) {\n headers[headerName] = headerValue\n }\n }\n\n return headers\n}\n\nexport function createProviderProxyResponse(\n upstreamResponse: Response,\n body?: ReadableStream<Uint8Array> | null,\n): Response {\n const headers = new Headers(upstreamResponse.headers)\n\n for (const headerName of STRIPPED_RESPONSE_HEADERS) {\n headers.delete(headerName)\n }\n\n return new Response(body ?? upstreamResponse.body, {\n headers,\n status: upstreamResponse.status,\n statusText: upstreamResponse.statusText,\n })\n}\n\nexport async function forwardProviderMessages(\n providerConfig: ResolvedProviderConfig,\n payload: AnthropicMessagesPayload,\n requestHeaders: Headers,\n fetchImpl: typeof fetch = fetch,\n): Promise<Response> {\n return await fetchImpl(`${providerConfig.baseUrl}/v1/messages`, {\n method: \"POST\",\n headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),\n body: JSON.stringify(payload),\n })\n}\n\nexport async function forwardProviderChatCompletions(\n providerConfig: ResolvedProviderConfig,\n payload: ChatCompletionsPayload,\n requestHeaders: Headers,\n fetchImpl: typeof fetch = fetch,\n): Promise<Response> {\n return await fetchImpl(`${providerConfig.baseUrl}/v1/chat/completions`, {\n method: \"POST\",\n headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),\n body: JSON.stringify(payload),\n })\n}\n\nexport async function forwardProviderResponses(\n providerConfig: ResolvedProviderConfig,\n payload: ResponsesPayload,\n requestHeaders: Headers,\n): Promise<Response> {\n return await fetch(`${providerConfig.baseUrl}/v1/responses`, {\n method: \"POST\",\n headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),\n body: JSON.stringify(payload),\n })\n}\n\nexport async function forwardProviderModels(\n providerConfig: ResolvedProviderConfig,\n requestHeaders: Headers,\n fetchImpl: typeof fetch = fetch,\n): Promise<Response> {\n return await fetchImpl(`${providerConfig.baseUrl}/v1/models`, {\n method: \"GET\",\n headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),\n })\n}\n","import type { Context, Env } from \"hono\"\n\nimport { events } from \"fetch-event-stream\"\nimport { streamSSE } from \"hono/streaming\"\n\nimport type {\n AnthropicMessagesPayload,\n AnthropicResponse,\n AnthropicStreamEventData,\n AnthropicStreamState,\n} from \"~/routes/messages/anthropic-types\"\nimport type {\n ChatCompletionChunk,\n ChatCompletionResponse,\n ChatCompletionsPayload,\n ContentPart,\n Message,\n} from \"~/services/copilot/create-chat-completions\"\n\nimport {\n getProviderConfig,\n type ModelConfig,\n type ResolvedProviderConfig,\n} from \"~/lib/config\"\nimport { HTTPError } from \"~/lib/error\"\nimport {\n extractErrorObservability,\n getUserVisibleErrorMessage,\n} from \"~/lib/handler-utils\"\nimport { createHandlerLogger, debugJson, debugLazy } from \"~/lib/logger\"\nimport {\n translateToAnthropic,\n translateToOpenAI,\n} from \"~/routes/messages/non-stream-translation\"\nimport {\n flushPendingAnthropicStreamEvents,\n translateChunkToAnthropicEvents,\n} from \"~/routes/messages/stream-translation\"\nimport {\n forwardProviderChatCompletions,\n forwardProviderMessages,\n} from \"~/services/providers/provider-proxy\"\n\nconst logger = createHandlerLogger(\"provider-messages-handler\")\n\ntype ProviderConfigResolver = (\n provider: string,\n) => ResolvedProviderConfig | null\n\nconst getProviderFetch = (c: Context): typeof fetch =>\n (c.get(\"providerFetch\" as never) as typeof fetch | undefined) ?? fetch\n\nconst resolveProviderConfig = (\n c: Context,\n provider: string,\n): ResolvedProviderConfig | null => {\n const resolver = c.get(\"providerConfigResolver\" as never) as\n | ProviderConfigResolver\n | undefined\n return (resolver ?? getProviderConfig)(provider)\n}\n\nconst OPENAI_COMPATIBLE_CONTEXT_CACHE_MARKER_LIMIT = 4\nconst OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL = {\n type: \"ephemeral\",\n} as const\nconst OPENAI_COMPATIBLE_CONTEXT_CACHE_ROLES = new Set<Message[\"role\"]>([\n \"system\",\n \"user\",\n \"assistant\",\n \"tool\",\n])\n\nexport type UsageTokens = {\n inputTokens?: number\n outputTokens?: number\n cacheCreationInputTokens?: number\n cacheReadInputTokens?: number\n}\n\nexport type ProviderStreamError = {\n errorMessage: string\n errorName: string\n errorStatus?: number\n httpStatus: number\n upstreamErrorMessageRaw?: string\n}\n\nexport type ProviderMessagesInstrumentation = {\n onComplete?: (usage: UsageTokens) => void\n onError?: (error: ProviderStreamError) => void\n}\n\nconst writeProviderStreamError = async (\n stream: Parameters<Parameters<typeof streamSSE>[1]>[0],\n message: string,\n): Promise<void> => {\n try {\n await stream.writeSSE({\n event: \"error\",\n data: JSON.stringify({\n error: {\n message,\n type: \"api_error\",\n },\n type: \"error\",\n }),\n })\n } catch (error) {\n logger.warn(\"Failed to write provider stream error event\", error)\n }\n}\n\nexport async function handleProviderMessages(\n c: Context<Env, \"/:provider\">,\n): Promise<Response> {\n const provider = c.req.param(\"provider\")\n const payload = await c.req.json<AnthropicMessagesPayload>()\n return await handleProviderMessagesForProvider(c, { payload, provider })\n}\n\nexport async function handleProviderMessagesForProvider(\n c: Context,\n options: {\n instrumentation?: ProviderMessagesInstrumentation\n payload: AnthropicMessagesPayload\n provider: string\n },\n): Promise<Response> {\n const { instrumentation, payload, provider } = options\n const providerConfig = resolveProviderConfig(c, provider)\n if (!providerConfig) {\n const message = `Provider '${provider}' not found or disabled`\n instrumentation?.onError?.({\n errorMessage: message,\n errorName: \"ProviderNotFoundError\",\n errorStatus: 404,\n httpStatus: 404,\n })\n return c.json(\n {\n error: {\n message,\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n try {\n const modelConfig = providerConfig.models?.[payload.model]\n applyModelDefaults(payload, modelConfig)\n\n debugJson(logger, \"provider.messages.request\", { payload, provider })\n\n if (providerConfig.type === \"openai-compatible\") {\n return await handleOpenAICompatibleProviderMessages(c, {\n instrumentation,\n modelConfig,\n payload,\n provider,\n providerConfig,\n })\n }\n\n applyMissingExtraBody(payload as unknown as Record<string, unknown>, {\n extraBody: modelConfig?.extraBody,\n })\n\n const upstreamResponse = await forwardProviderMessages(\n providerConfig,\n payload,\n c.req.raw.headers,\n getProviderFetch(c),\n )\n\n if (!upstreamResponse.ok) {\n logger.error(\"Failed to create responses\", upstreamResponse)\n throw new HTTPError(\"Failed to create responses\", upstreamResponse)\n }\n\n const contentType = upstreamResponse.headers.get(\"content-type\") ?? \"\"\n const isStreamingResponse =\n Boolean(payload.stream) && contentType.includes(\"text/event-stream\")\n\n if (isStreamingResponse) {\n return streamProviderMessages({\n c,\n instrumentation,\n payload,\n provider,\n providerConfig,\n upstreamResponse,\n })\n }\n\n const jsonBody = (await upstreamResponse.json()) as AnthropicResponse\n return respondProviderMessagesJson(c, {\n body: jsonBody,\n instrumentation,\n payload,\n provider,\n providerConfig,\n })\n } catch (error) {\n logger.error(\"provider.messages.error\", {\n provider,\n error,\n })\n throw error\n }\n}\n\nconst applyModelDefaults = (\n payload: AnthropicMessagesPayload,\n modelConfig: ModelConfig | undefined,\n): void => {\n payload.temperature ??= modelConfig?.temperature\n payload.top_p ??= modelConfig?.topP\n payload.top_k ??= modelConfig?.topK\n}\n\nconst applyMissingExtraBody = (\n payload: Record<string, unknown>,\n options: { extraBody: Record<string, unknown> | undefined },\n): void => {\n for (const [key, value] of Object.entries(options.extraBody ?? {})) {\n if (!Object.hasOwn(payload, key)) {\n payload[key] = value\n }\n }\n}\n\nconst getRequestThinkingBudget = (\n payload: AnthropicMessagesPayload,\n): number | undefined => {\n const budget = payload.thinking?.budget_tokens\n if (typeof budget !== \"number\" || !Number.isFinite(budget)) {\n return undefined\n }\n return budget\n}\n\nconst applyOpenAICompatibleThinkingBudget = (\n payload: ChatCompletionsPayload,\n source: AnthropicMessagesPayload,\n): void => {\n const thinkingBudget = getRequestThinkingBudget(source)\n if (thinkingBudget !== undefined) {\n payload.thinking_budget = thinkingBudget\n return\n }\n\n if (payload.thinking_budget === undefined) {\n delete payload.thinking_budget\n }\n}\n\nconst applyOpenAICompatibleExtraBodyThinkingBudget = (\n payload: ChatCompletionsPayload,\n options: { extraBody: Record<string, unknown> | undefined },\n): void => {\n const { extraBody } = options\n if (!extraBody || !Object.hasOwn(extraBody, \"thinking_budget\")) {\n return\n }\n\n const rawPayload = payload as Record<string, unknown>\n rawPayload.thinking_budget = extraBody.thinking_budget\n}\n\nconst handleOpenAICompatibleProviderMessages = async (\n c: Context,\n options: {\n instrumentation?: ProviderMessagesInstrumentation\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n provider: string\n providerConfig: ResolvedProviderConfig\n },\n): Promise<Response> => {\n const { instrumentation, modelConfig, payload, provider, providerConfig } =\n options\n const openAIPayload = createOpenAICompatiblePayload(payload, modelConfig)\n debugJson(logger, \"provider.messages.openai_compatible.request\", {\n payload: openAIPayload,\n provider,\n })\n\n const upstreamResponse = await forwardProviderChatCompletions(\n providerConfig,\n openAIPayload,\n c.req.raw.headers,\n getProviderFetch(c),\n )\n\n if (!upstreamResponse.ok) {\n logger.error(\n \"Failed to create openai-compatible responses\",\n upstreamResponse,\n )\n throw new HTTPError(\n \"Failed to create openai-compatible responses\",\n upstreamResponse,\n )\n }\n\n const contentType = upstreamResponse.headers.get(\"content-type\") ?? \"\"\n const isStreamingResponse =\n Boolean(openAIPayload.stream) && contentType.includes(\"text/event-stream\")\n\n if (isStreamingResponse) {\n return streamOpenAICompatibleProviderMessages({\n c,\n instrumentation,\n payload,\n provider,\n upstreamResponse,\n })\n }\n\n const jsonBody = (await upstreamResponse.json()) as ChatCompletionResponse\n return respondOpenAICompatibleProviderMessagesJson(c, {\n body: jsonBody,\n instrumentation,\n payload,\n provider,\n })\n}\n\nconst createOpenAICompatiblePayload = (\n payload: AnthropicMessagesPayload,\n modelConfig: ModelConfig | undefined,\n): ChatCompletionsPayload => {\n const openAIPayload = translateToOpenAI(payload, {\n supportPdf: modelConfig?.supportPdf,\n toolContentSupportType: modelConfig?.toolContentSupportType ?? [],\n })\n applyOpenAICompatibleThinkingBudget(openAIPayload, payload)\n\n if (payload.top_k !== undefined) {\n openAIPayload.top_k = payload.top_k\n }\n\n if (openAIPayload.stream) {\n openAIPayload.stream_options = {\n include_usage: true,\n }\n }\n\n normalizeOpenAICompatibleReasoningContent(openAIPayload)\n\n applyOpenAICompatibleRequestOverrides(openAIPayload, {\n extraBody: modelConfig?.extraBody,\n source: payload as unknown as Record<string, unknown>,\n })\n\n applyMissingExtraBody(openAIPayload, {\n extraBody: modelConfig?.extraBody,\n })\n\n applyOpenAICompatibleExtraBodyThinkingBudget(openAIPayload, {\n extraBody: modelConfig?.extraBody,\n })\n\n if (!Object.hasOwn(openAIPayload, \"parallel_tool_calls\")) {\n openAIPayload.parallel_tool_calls = true\n }\n\n if (modelConfig?.contextCache !== false) {\n applyOpenAICompatibleContextCache(openAIPayload)\n }\n\n return openAIPayload\n}\n\nconst normalizeOpenAICompatibleReasoningContent = (\n payload: ChatCompletionsPayload,\n): void => {\n for (const message of payload.messages) {\n if (message.role !== \"assistant\") {\n continue\n }\n\n if (\n message.reasoning_content === undefined\n && message.reasoning_text !== undefined\n ) {\n message.reasoning_content = message.reasoning_text\n }\n\n delete message.reasoning_text\n delete message.reasoning_opaque\n }\n}\n\nconst applyOpenAICompatibleRequestOverrides = (\n payload: ChatCompletionsPayload,\n options: {\n extraBody: Record<string, unknown> | undefined\n source: Record<string, unknown>\n },\n): void => {\n const allowedKeys = new Set(Object.keys(options.extraBody ?? {}))\n for (const key of allowedKeys) {\n if (Object.hasOwn(options.source, key)) {\n payload[key] = options.source[key]\n }\n }\n}\n\nconst applyOpenAICompatibleContextCache = (\n payload: ChatCompletionsPayload,\n): void => {\n const messageIndexes = selectContextCacheMessageIndexes(payload.messages)\n for (const messageIndex of messageIndexes) {\n applyContextCacheControl(payload.messages[messageIndex])\n }\n}\n\nconst selectContextCacheMessageIndexes = (\n messages: Array<Message>,\n): Array<number> => {\n const cacheableIndexes = messages.flatMap((message, index) =>\n isContextCacheMarkerEligible(message) ? [index] : [],\n )\n const systemIndexes = cacheableIndexes\n .filter((index) => messages[index]?.role === \"system\")\n .slice(0, 2)\n const finalIndexes = cacheableIndexes\n .filter((index) => messages[index]?.role !== \"system\")\n .slice(-2)\n return uniqueIndexes([...systemIndexes, ...finalIndexes]).sort(\n (a, b) => a - b,\n )\n}\n\nconst uniqueIndexes = (indexes: Array<number>): Array<number> =>\n [...new Set(indexes)].slice(0, OPENAI_COMPATIBLE_CONTEXT_CACHE_MARKER_LIMIT)\n\nconst isContextCacheMarkerEligible = (message: Message): boolean => {\n if (!OPENAI_COMPATIBLE_CONTEXT_CACHE_ROLES.has(message.role)) {\n return false\n }\n\n if (typeof message.content === \"string\") {\n return message.content.length > 0\n }\n\n return Array.isArray(message.content) && message.content.length > 0\n}\n\nconst applyContextCacheControl = (message: Message | undefined): void => {\n if (!message) {\n return\n }\n\n if (typeof message.content === \"string\") {\n message.content = [\n {\n type: \"text\",\n text: message.content,\n cache_control: { ...OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL },\n },\n ]\n return\n }\n\n if (!Array.isArray(message.content)) {\n return\n }\n\n const lastPart = message.content.at(-1)\n if (!lastPart) {\n return\n }\n setContextCacheControl(lastPart)\n}\n\nconst setContextCacheControl = (part: ContentPart): void => {\n part.cache_control = { ...OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL }\n}\n\nconst streamProviderMessages = ({\n c,\n instrumentation,\n providerConfig,\n upstreamResponse,\n}: {\n c: Context\n instrumentation?: ProviderMessagesInstrumentation\n payload: AnthropicMessagesPayload\n provider: string\n providerConfig: ResolvedProviderConfig\n upstreamResponse: Response\n}): Response => {\n logger.debug(\"provider.messages.streaming\")\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n\n try {\n let completed = false\n for await (const chunk of events(upstreamResponse)) {\n logger.debug(\"provider.messages.raw_stream_event:\", chunk.data)\n const eventName = chunk.event\n if (eventName === \"ping\") {\n await stream.writeSSE({ event: \"ping\", data: '{\"type\":\"ping\"}' })\n continue\n }\n\n let data = chunk.data\n if (!data) {\n continue\n }\n\n if (chunk.data === \"[DONE]\") {\n completed = true\n break\n }\n\n const parsed = parseProviderStreamEvent(data, providerConfig)\n usage = mergeAnthropicUsage(usage, parsed.usage)\n data = parsed.data\n\n await stream.writeSSE({\n event: eventName,\n data,\n })\n\n if (parsed.error || eventName === \"error\") {\n instrumentation?.onError?.(\n parsed.error ?? {\n errorMessage: data,\n errorName: \"ProviderStreamError\",\n httpStatus: 500,\n },\n )\n return\n }\n completed ||= parsed.done\n }\n\n if (!completed) {\n throw new Error(\"Provider messages stream ended before completion\")\n }\n instrumentation?.onComplete?.(usage)\n } catch (error) {\n const details = await extractErrorObservability(error)\n logger.warn(\"provider.messages.streaming.error\", error)\n instrumentation?.onError?.(details)\n await writeProviderStreamError(\n stream,\n getUserVisibleErrorMessage(details),\n )\n }\n })\n}\n\nconst streamOpenAICompatibleProviderMessages = ({\n c,\n instrumentation,\n upstreamResponse,\n}: {\n c: Context\n instrumentation?: ProviderMessagesInstrumentation\n payload: AnthropicMessagesPayload\n provider: string\n upstreamResponse: Response\n}): Response => {\n logger.debug(\"provider.messages.openai_compatible.streaming\")\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n const streamState: AnthropicStreamState = {\n messageStartSent: false,\n contentBlockIndex: 0,\n contentBlockOpen: false,\n toolCalls: {},\n thinkingBlockOpen: false,\n }\n\n try {\n let completed = false\n for await (const chunk of events(upstreamResponse)) {\n logger.debug(\n \"provider.messages.openai_compatible.raw_stream_event:\",\n chunk.data,\n )\n const eventName = chunk.event\n if (eventName === \"ping\") {\n await stream.writeSSE({ event: \"ping\", data: '{\"type\":\"ping\"}' })\n continue\n }\n\n if (!chunk.data) {\n continue\n }\n if (chunk.data === \"[DONE]\") {\n completed = true\n break\n }\n\n const parsed = parseOpenAICompatibleStreamChunk(chunk.data)\n\n if (parsed.usage) {\n usage = normalizeOpenAIUsage(parsed.usage)\n }\n\n const events = translateChunkToAnthropicEvents(parsed, streamState)\n for (const event of events) {\n const eventData = JSON.stringify(event)\n debugLazy(logger, () => [\n \"provider.messages.openai_compatible.translated_event:\",\n eventData,\n ])\n await stream.writeSSE({\n event: event.type,\n data: eventData,\n })\n completed ||= event.type === \"message_stop\"\n }\n }\n\n for (const event of flushPendingAnthropicStreamEvents(streamState)) {\n const eventData = JSON.stringify(event)\n debugLazy(logger, () => [\n \"provider.messages.openai_compatible.translated_event:\",\n eventData,\n ])\n await stream.writeSSE({\n event: event.type,\n data: eventData,\n })\n completed ||= event.type === \"message_stop\"\n }\n\n if (!completed) {\n throw new Error(\n \"OpenAI-compatible provider messages stream ended before completion\",\n )\n }\n instrumentation?.onComplete?.(usage)\n } catch (error) {\n const details = await extractErrorObservability(error)\n logger.warn(\"provider.messages.openai_compatible.streaming.error\", error)\n instrumentation?.onError?.(details)\n await writeProviderStreamError(\n stream,\n getUserVisibleErrorMessage(details),\n )\n }\n })\n}\n\nconst parseOpenAICompatibleStreamChunk = (\n data: string,\n): ChatCompletionChunk => {\n let parsed: ChatCompletionChunk & { error?: unknown }\n try {\n parsed = JSON.parse(data) as ChatCompletionChunk & { error?: unknown }\n } catch (error) {\n logger.error(\"provider.messages.openai_compatible.parse_chunk_error\", {\n data,\n error,\n })\n throw new Error(\"Failed to parse OpenAI-compatible stream chunk\", {\n cause: error,\n })\n }\n\n const streamErrorMessage = getOpenAICompatibleStreamErrorMessage(parsed.error)\n if (streamErrorMessage) {\n throw new Error(streamErrorMessage)\n }\n\n return parsed\n}\n\nconst getOpenAICompatibleStreamErrorMessage = (\n error: unknown,\n): string | null => {\n if (typeof error === \"string\") {\n return error\n }\n if (!error || typeof error !== \"object\") {\n return null\n }\n\n const message = (error as { message?: unknown }).message\n return typeof message === \"string\" ? message : JSON.stringify(error)\n}\n\nconst parseProviderStreamEvent = (\n data: string,\n providerConfig: ResolvedProviderConfig,\n): {\n data: string\n done: boolean\n error?: ProviderStreamError\n model?: string\n usage: UsageTokens\n} => {\n try {\n const parsed = JSON.parse(data) as AnthropicStreamEventData\n if (parsed.type === \"message_start\") {\n adjustInputTokens(providerConfig, parsed.message.usage)\n return {\n data: JSON.stringify(parsed),\n done: false,\n model: parsed.message.model,\n usage: normalizeAnthropicUsage(parsed.message.usage),\n }\n }\n if (parsed.type === \"message_delta\") {\n adjustInputTokens(providerConfig, parsed.usage)\n return {\n data: JSON.stringify(parsed),\n done: false,\n usage: normalizeAnthropicUsage(parsed.usage),\n }\n }\n if (parsed.type === \"message_stop\") {\n return { data: JSON.stringify(parsed), done: true, usage: {} }\n }\n if (parsed.type === \"error\") {\n return {\n data: JSON.stringify(parsed),\n done: false,\n error: {\n errorMessage: parsed.error.message,\n errorName: parsed.error.type,\n httpStatus: 500,\n },\n usage: {},\n }\n }\n return { data: JSON.stringify(parsed), done: false, usage: {} }\n } catch (error) {\n logger.error(\"provider.messages.streaming.adjust_tokens_error\", {\n error,\n originalData: data,\n })\n throw new Error(\"Failed to parse provider messages stream event\", {\n cause: error,\n })\n }\n}\n\nconst respondProviderMessagesJson = (\n c: Context,\n options: {\n body: AnthropicResponse\n instrumentation?: ProviderMessagesInstrumentation\n payload: AnthropicMessagesPayload\n provider: string\n providerConfig: ResolvedProviderConfig\n },\n): Response => {\n const { body, instrumentation, providerConfig } = options\n adjustInputTokens(providerConfig, body.usage)\n\n debugJson(logger, \"provider.messages.no_stream result:\", body)\n const response = c.json(body)\n instrumentation?.onComplete?.(normalizeAnthropicUsage(body.usage))\n return response\n}\n\nconst respondOpenAICompatibleProviderMessagesJson = (\n c: Context,\n options: {\n body: ChatCompletionResponse\n instrumentation?: ProviderMessagesInstrumentation\n payload: AnthropicMessagesPayload\n provider: string\n },\n): Response => {\n const { body, instrumentation } = options\n const anthropicResponse = translateToAnthropic(body)\n debugJson(\n logger,\n \"provider.messages.openai_compatible.no_stream result:\",\n anthropicResponse,\n )\n const response = c.json(anthropicResponse)\n instrumentation?.onComplete?.(normalizeOpenAIUsage(body.usage))\n return response\n}\n\nconst normalizeOpenAIUsage = (\n usage: ChatCompletionResponse[\"usage\"] | ChatCompletionChunk[\"usage\"],\n): UsageTokens => {\n const cacheCreationInputTokens =\n usage?.prompt_tokens_details?.cache_creation_input_tokens\n const cacheReadInputTokens = usage?.prompt_tokens_details?.cached_tokens\n const inputTokens =\n usage?.prompt_tokens === undefined ?\n undefined\n : Math.max(\n 0,\n usage.prompt_tokens\n - (cacheCreationInputTokens ?? 0)\n - (cacheReadInputTokens ?? 0),\n )\n\n return {\n inputTokens,\n outputTokens: usage?.completion_tokens,\n cacheCreationInputTokens,\n cacheReadInputTokens,\n }\n}\n\nconst normalizeAnthropicUsage = (\n usage?: AnthropicResponse[\"usage\"] | AnthropicMessageUsage,\n): UsageTokens => ({\n inputTokens: usage?.input_tokens,\n outputTokens: usage?.output_tokens,\n cacheCreationInputTokens: usage?.cache_creation_input_tokens,\n cacheReadInputTokens: usage?.cache_read_input_tokens,\n})\n\nconst mergeAnthropicUsage = (\n current: UsageTokens,\n next: UsageTokens,\n): UsageTokens => ({\n inputTokens: next.inputTokens ?? current.inputTokens,\n outputTokens: next.outputTokens ?? current.outputTokens,\n cacheCreationInputTokens:\n next.cacheCreationInputTokens ?? current.cacheCreationInputTokens,\n cacheReadInputTokens:\n next.cacheReadInputTokens ?? current.cacheReadInputTokens,\n})\n\ntype AnthropicMessageUsage = {\n input_tokens?: number\n output_tokens?: number\n cache_read_input_tokens?: number\n cache_creation_input_tokens?: number\n}\n\nconst adjustInputTokens = (\n providerConfig: ResolvedProviderConfig,\n usage?: {\n input_tokens?: number\n cache_read_input_tokens?: number\n cache_creation_input_tokens?: number\n },\n): void => {\n if (!providerConfig.adjustInputTokens || !usage) {\n return\n }\n const adjustedInput = Math.max(\n 0,\n (usage.input_tokens ?? 0)\n - (usage.cache_read_input_tokens ?? 0)\n - (usage.cache_creation_input_tokens ?? 0),\n )\n usage.input_tokens = adjustedInput\n debugJson(logger, \"provider.messages.adjusted_usage:\", usage)\n}\n","import {\n BRIDGE_TOOL_SEARCH_NAME,\n formatToolSearchBridgeArguments,\n} from \"~/lib/tool-search\"\nimport {\n type ResponseCompletedEvent,\n type ResponseCreatedEvent,\n type ResponseErrorEvent,\n type ResponseFailedEvent,\n type ResponseFunctionCallArgumentsDeltaEvent,\n type ResponseFunctionCallArgumentsDoneEvent,\n type ResponseIncompleteEvent,\n type ResponseOutputItemAddedEvent,\n type ResponseOutputItemDoneEvent,\n type ResponseReasoningSummaryTextDeltaEvent,\n type ResponseReasoningSummaryTextDoneEvent,\n type ResponsesResult,\n type ResponseStreamEvent,\n type ResponseTextDeltaEvent,\n type ResponseTextDoneEvent,\n} from \"~/services/copilot/create-responses\"\n\nimport { type AnthropicStreamEventData } from \"./anthropic-types\"\nimport {\n THINKING_TEXT,\n encodeCompactionCarrierSignature,\n resolveToolUseName,\n translateResponsesResultToAnthropic,\n} from \"./responses-translation\"\n\nconst MAX_CONSECUTIVE_FUNCTION_CALL_WHITESPACE = 20\n\nclass FunctionCallArgumentsValidationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"FunctionCallArgumentsValidationError\"\n }\n}\n\nconst updateWhitespaceRunState = (\n previousCount: number,\n chunk: string,\n): {\n nextCount: number\n exceeded: boolean\n} => {\n let count = previousCount\n\n for (const char of chunk) {\n if (char === \"\\r\" || char === \"\\n\" || char === \"\\t\") {\n count += 1\n if (count > MAX_CONSECUTIVE_FUNCTION_CALL_WHITESPACE) {\n return { nextCount: count, exceeded: true }\n }\n continue\n }\n\n if (char !== \" \") {\n count = 0\n }\n }\n\n return { nextCount: count, exceeded: false }\n}\n\nexport interface ResponsesStreamState {\n messageStartSent: boolean\n messageCompleted: boolean\n nextContentBlockIndex: number\n blockIndexByKey: Map<string, number>\n openBlocks: Set<number>\n blockHasDelta: Set<number>\n functionCallStateByOutputIndex: Map<number, FunctionCallStreamState>\n responseStatus?: string\n estimatedInputTokens?: number\n historicalInputTokens?: number\n historicalOutputTokens?: number\n historicalCachedInputTokens?: number\n toolSearchName: string\n hasToolCall: boolean\n}\n\ntype FunctionCallStreamState = {\n blockIndex: number\n toolCallId: string\n name: string\n consecutiveWhitespaceCount: number\n}\n\nexport const createResponsesStreamState = (options?: {\n toolSearchName?: string\n}): ResponsesStreamState => ({\n messageStartSent: false,\n messageCompleted: false,\n nextContentBlockIndex: 0,\n blockIndexByKey: new Map(),\n openBlocks: new Set(),\n blockHasDelta: new Set(),\n functionCallStateByOutputIndex: new Map(),\n toolSearchName: options?.toolSearchName ?? BRIDGE_TOOL_SEARCH_NAME,\n hasToolCall: false,\n})\n\nexport const translateResponsesStreamEvent = (\n rawEvent: ResponseStreamEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const eventType = rawEvent.type\n switch (eventType) {\n case \"response.created\": {\n return handleResponseCreated(rawEvent, state)\n }\n\n case \"response.output_item.added\": {\n return handleOutputItemAdded(rawEvent, state)\n }\n\n case \"response.reasoning_summary_text.delta\": {\n return handleReasoningSummaryTextDelta(rawEvent, state)\n }\n\n case \"response.output_text.delta\": {\n return handleOutputTextDelta(rawEvent, state)\n }\n\n case \"response.reasoning_summary_text.done\": {\n return handleReasoningSummaryTextDone(rawEvent, state)\n }\n\n case \"response.output_text.done\": {\n return handleOutputTextDone(rawEvent, state)\n }\n case \"response.output_item.done\": {\n return handleOutputItemDone(rawEvent, state)\n }\n\n case \"response.function_call_arguments.delta\": {\n return handleFunctionCallArgumentsDelta(rawEvent, state)\n }\n\n case \"response.function_call_arguments.done\": {\n return handleFunctionCallArgumentsDone(rawEvent, state)\n }\n\n case \"response.completed\":\n case \"response.incomplete\": {\n return handleResponseCompleted(rawEvent, state)\n }\n\n case \"response.failed\": {\n return handleResponseFailed(rawEvent, state)\n }\n\n case \"error\": {\n return handleErrorEvent(rawEvent, state)\n }\n\n default: {\n return []\n }\n }\n}\n\n// Helper handlers to keep translateResponsesStreamEvent concise\nconst handleResponseCreated = (\n rawEvent: ResponseCreatedEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n return messageStart(state, rawEvent.response)\n}\n\nconst handleOutputItemAdded = (\n rawEvent: ResponseOutputItemAddedEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const functionCallDetails = extractFunctionCallDetails(rawEvent, state)\n if (!functionCallDetails) {\n return events\n }\n\n const { outputIndex, toolCallId, name, initialArguments } =\n functionCallDetails\n const blockIndex = openFunctionCallBlock(state, {\n outputIndex,\n toolCallId,\n name,\n events,\n })\n\n if (initialArguments !== undefined && initialArguments.length > 0) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"input_json_delta\",\n partial_json: initialArguments,\n },\n })\n state.blockHasDelta.add(blockIndex)\n }\n\n return events\n}\n\nconst handleOutputItemDone = (\n rawEvent: ResponseOutputItemDoneEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const item = rawEvent.item\n const itemType = item.type\n const outputIndex = rawEvent.output_index\n\n if (itemType === \"tool_search_call\") {\n const blockIndex = openFunctionCallBlock(state, {\n outputIndex,\n toolCallId: item.call_id,\n name: state.toolSearchName,\n events,\n })\n const finalArguments = stringifyToolSearchArguments(item.arguments)\n\n if (!state.blockHasDelta.has(blockIndex) && finalArguments) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"input_json_delta\",\n partial_json: finalArguments,\n },\n })\n state.blockHasDelta.add(blockIndex)\n }\n\n state.functionCallStateByOutputIndex.delete(outputIndex)\n return events\n }\n\n if (itemType === \"compaction\") {\n if (!item.id || !item.encrypted_content) {\n return events\n }\n\n const blockIndex = openThinkingBlockIfNeeded(state, outputIndex, events)\n\n if (!state.blockHasDelta.has(blockIndex)) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: THINKING_TEXT,\n },\n })\n }\n\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"signature_delta\",\n signature: encodeCompactionCarrierSignature({\n id: item.id,\n encrypted_content: item.encrypted_content,\n }),\n },\n })\n state.blockHasDelta.add(blockIndex)\n return events\n }\n\n if (itemType !== \"reasoning\") {\n return events\n }\n\n const blockIndex = openThinkingBlockIfNeeded(state, outputIndex, events)\n const signature = (item.encrypted_content ?? \"\") + \"@\" + item.id\n if (signature) {\n // Compatible with opencode, it will filter out blocks where the thinking text is empty, so we add a default thinking text here\n if (!item.summary || item.summary.length === 0) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: THINKING_TEXT,\n },\n })\n }\n\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"signature_delta\",\n signature,\n },\n })\n state.blockHasDelta.add(blockIndex)\n }\n\n return events\n}\n\nconst handleFunctionCallArgumentsDelta = (\n rawEvent: ResponseFunctionCallArgumentsDeltaEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const outputIndex = rawEvent.output_index\n const deltaText = rawEvent.delta\n\n if (!deltaText) {\n return events\n }\n\n const blockIndex = openFunctionCallBlock(state, {\n outputIndex,\n events,\n })\n\n const functionCallState =\n state.functionCallStateByOutputIndex.get(outputIndex)\n if (!functionCallState) {\n return handleFunctionCallArgumentsValidationError(\n new FunctionCallArgumentsValidationError(\n \"Received function call arguments delta without an open tool call block.\",\n ),\n state,\n events,\n )\n }\n\n // fix: copolit function call returning infinite line breaks until max_tokens limit\n // \"arguments\": \"{\\\"path\\\":\\\"xxx\\\",\\\"pattern\\\":\\\"**/*.ts\\\",\\\"} }? Wait extra braces. Need correct. I should run? Wait overcame. Need proper JSON with pattern \\\"\\n\\n\\n\\n\\n\\n\\n\\n...\n const { nextCount, exceeded } = updateWhitespaceRunState(\n functionCallState.consecutiveWhitespaceCount,\n deltaText,\n )\n if (exceeded) {\n return handleFunctionCallArgumentsValidationError(\n new FunctionCallArgumentsValidationError(\n \"Received function call arguments delta containing more than 20 consecutive whitespace characters.\",\n ),\n state,\n events,\n )\n }\n functionCallState.consecutiveWhitespaceCount = nextCount\n\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"input_json_delta\",\n partial_json: deltaText,\n },\n })\n state.blockHasDelta.add(blockIndex)\n\n return events\n}\n\nconst handleFunctionCallArgumentsDone = (\n rawEvent: ResponseFunctionCallArgumentsDoneEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const outputIndex = rawEvent.output_index\n const blockIndex = openFunctionCallBlock(state, {\n outputIndex,\n events,\n })\n\n const finalArguments =\n typeof rawEvent.arguments === \"string\" ? rawEvent.arguments : undefined\n\n if (!state.blockHasDelta.has(blockIndex) && finalArguments) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"input_json_delta\",\n partial_json: finalArguments,\n },\n })\n state.blockHasDelta.add(blockIndex)\n }\n\n state.functionCallStateByOutputIndex.delete(outputIndex)\n return events\n}\n\nconst handleOutputTextDelta = (\n rawEvent: ResponseTextDeltaEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const outputIndex = rawEvent.output_index\n const contentIndex = rawEvent.content_index\n const deltaText = rawEvent.delta\n\n if (!deltaText) {\n return events\n }\n\n const blockIndex = openTextBlockIfNeeded(state, {\n outputIndex,\n contentIndex,\n events,\n })\n\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"text_delta\",\n text: deltaText,\n },\n })\n state.blockHasDelta.add(blockIndex)\n\n return events\n}\n\nconst handleReasoningSummaryTextDelta = (\n rawEvent: ResponseReasoningSummaryTextDeltaEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const outputIndex = rawEvent.output_index\n const deltaText = rawEvent.delta\n const events = new Array<AnthropicStreamEventData>()\n const blockIndex = openThinkingBlockIfNeeded(state, outputIndex, events)\n\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: deltaText,\n },\n })\n state.blockHasDelta.add(blockIndex)\n\n return events\n}\n\nconst handleReasoningSummaryTextDone = (\n rawEvent: ResponseReasoningSummaryTextDoneEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const outputIndex = rawEvent.output_index\n const text = rawEvent.text\n const events = new Array<AnthropicStreamEventData>()\n const blockIndex = openThinkingBlockIfNeeded(state, outputIndex, events)\n\n if (text && !state.blockHasDelta.has(blockIndex)) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: text,\n },\n })\n }\n\n return events\n}\n\nconst handleOutputTextDone = (\n rawEvent: ResponseTextDoneEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const outputIndex = rawEvent.output_index\n const contentIndex = rawEvent.content_index\n const text = rawEvent.text\n\n const blockIndex = openTextBlockIfNeeded(state, {\n outputIndex,\n contentIndex,\n events,\n })\n\n if (text && !state.blockHasDelta.has(blockIndex)) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"text_delta\",\n text,\n },\n })\n }\n\n return events\n}\n\nconst handleResponseCompleted = (\n rawEvent: ResponseCompletedEvent | ResponseIncompleteEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const response = rawEvent.response\n const events = new Array<AnthropicStreamEventData>()\n\n closeAllOpenBlocks(state, events)\n state.responseStatus = response.status\n const anthropic = translateResponsesResultToAnthropic(response, {\n hasToolCall: state.hasToolCall,\n toolSearchName: state.toolSearchName,\n })\n events.push(\n {\n type: \"message_delta\",\n delta: {\n stop_reason: anthropic.stop_reason,\n stop_sequence: anthropic.stop_sequence,\n },\n usage: anthropic.usage,\n },\n { type: \"message_stop\" },\n )\n state.messageCompleted = true\n return events\n}\n\nconst handleResponseFailed = (\n rawEvent: ResponseFailedEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const response = rawEvent.response\n const events = new Array<AnthropicStreamEventData>()\n closeAllOpenBlocks(state, events)\n state.responseStatus = response.status\n\n const message =\n response.error?.message ?? \"The response failed due to an unknown error.\"\n\n events.push(buildErrorEvent(message))\n state.messageCompleted = true\n\n return events\n}\n\nconst handleErrorEvent = (\n rawEvent: ResponseErrorEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const message =\n typeof rawEvent.message === \"string\" ?\n rawEvent.message\n : \"An unexpected error occurred during streaming.\"\n\n state.messageCompleted = true\n return [buildErrorEvent(message)]\n}\n\nconst handleFunctionCallArgumentsValidationError = (\n error: FunctionCallArgumentsValidationError,\n state: ResponsesStreamState,\n events: Array<AnthropicStreamEventData> = [],\n): Array<AnthropicStreamEventData> => {\n const reason = error.message\n\n closeAllOpenBlocks(state, events)\n state.messageCompleted = true\n\n events.push(buildErrorEvent(reason))\n\n return events\n}\n\nconst messageStart = (\n state: ResponsesStreamState,\n response: ResponsesResult,\n): Array<AnthropicStreamEventData> => {\n state.messageStartSent = true\n const inputCachedTokens = response.usage?.input_tokens_details?.cached_tokens\n const upstreamInputTokens = response.usage?.input_tokens\n const historicalInputTokens = state.historicalInputTokens\n const historicalOutputTokens = state.historicalOutputTokens ?? 0\n const historicalTotalTokens =\n historicalInputTokens !== undefined ?\n historicalInputTokens + historicalOutputTokens\n : undefined\n const inputTokens =\n upstreamInputTokens !== undefined ?\n upstreamInputTokens - (inputCachedTokens ?? 0)\n : (historicalTotalTokens ?? state.estimatedInputTokens ?? 0)\n const cacheReadTokens =\n upstreamInputTokens !== undefined ?\n (inputCachedTokens ?? 0)\n : (state.historicalCachedInputTokens ?? 0)\n return [\n {\n type: \"message_start\",\n message: {\n id: response.id,\n type: \"message\",\n role: \"assistant\",\n content: [],\n model: response.model,\n stop_reason: null,\n stop_sequence: null,\n usage: {\n input_tokens: inputTokens,\n output_tokens: 0,\n cache_read_input_tokens: cacheReadTokens,\n },\n },\n },\n ]\n}\n\nconst openTextBlockIfNeeded = (\n state: ResponsesStreamState,\n params: {\n outputIndex: number\n contentIndex: number\n events: Array<AnthropicStreamEventData>\n },\n): number => {\n const { outputIndex, contentIndex, events } = params\n const key = getBlockKey(outputIndex, contentIndex)\n let blockIndex = state.blockIndexByKey.get(key)\n\n if (blockIndex === undefined) {\n blockIndex = state.nextContentBlockIndex\n state.nextContentBlockIndex += 1\n state.blockIndexByKey.set(key, blockIndex)\n }\n\n if (!state.openBlocks.has(blockIndex)) {\n closeOpenBlocks(state, events)\n events.push({\n type: \"content_block_start\",\n index: blockIndex,\n content_block: {\n type: \"text\",\n text: \"\",\n },\n })\n state.openBlocks.add(blockIndex)\n }\n\n return blockIndex\n}\n\nconst openThinkingBlockIfNeeded = (\n state: ResponsesStreamState,\n outputIndex: number,\n events: Array<AnthropicStreamEventData>,\n): number => {\n //thinking blocks has multiple summary_index, should combine into one block\n const summaryIndex = 0\n const key = getBlockKey(outputIndex, summaryIndex)\n let blockIndex = state.blockIndexByKey.get(key)\n\n if (blockIndex === undefined) {\n blockIndex = state.nextContentBlockIndex\n state.nextContentBlockIndex += 1\n state.blockIndexByKey.set(key, blockIndex)\n }\n\n if (!state.openBlocks.has(blockIndex)) {\n closeOpenBlocks(state, events)\n events.push({\n type: \"content_block_start\",\n index: blockIndex,\n content_block: {\n type: \"thinking\",\n thinking: \"\",\n },\n })\n state.openBlocks.add(blockIndex)\n }\n\n return blockIndex\n}\n\nconst closeBlockIfOpen = (\n state: ResponsesStreamState,\n blockIndex: number,\n events: Array<AnthropicStreamEventData>,\n) => {\n if (!state.openBlocks.has(blockIndex)) {\n return\n }\n\n events.push({ type: \"content_block_stop\", index: blockIndex })\n state.openBlocks.delete(blockIndex)\n state.blockHasDelta.delete(blockIndex)\n}\n\nconst closeOpenBlocks = (\n state: ResponsesStreamState,\n events: Array<AnthropicStreamEventData>,\n) => {\n for (const blockIndex of state.openBlocks) {\n closeBlockIfOpen(state, blockIndex, events)\n }\n}\n\nconst closeAllOpenBlocks = (\n state: ResponsesStreamState,\n events: Array<AnthropicStreamEventData>,\n) => {\n closeOpenBlocks(state, events)\n\n state.functionCallStateByOutputIndex.clear()\n}\n\nexport const buildErrorEvent = (message: string): AnthropicStreamEventData => ({\n type: \"error\",\n error: {\n type: \"api_error\",\n message,\n },\n})\n\nconst getBlockKey = (outputIndex: number, contentIndex: number): string =>\n `${outputIndex}:${contentIndex}`\n\nconst openFunctionCallBlock = (\n state: ResponsesStreamState,\n params: {\n outputIndex: number\n toolCallId?: string\n name?: string\n events: Array<AnthropicStreamEventData>\n },\n): number => {\n const { outputIndex, toolCallId, name, events } = params\n\n state.hasToolCall = true\n\n let functionCallState = state.functionCallStateByOutputIndex.get(outputIndex)\n\n if (!functionCallState) {\n const blockIndex = state.nextContentBlockIndex\n state.nextContentBlockIndex += 1\n\n const resolvedToolCallId = toolCallId ?? `tool_call_${blockIndex}`\n const resolvedName = name ?? \"function\"\n\n functionCallState = {\n blockIndex,\n toolCallId: resolvedToolCallId,\n name: resolvedName,\n consecutiveWhitespaceCount: 0,\n }\n\n state.functionCallStateByOutputIndex.set(outputIndex, functionCallState)\n }\n\n const { blockIndex } = functionCallState\n\n if (!state.openBlocks.has(blockIndex)) {\n closeOpenBlocks(state, events)\n events.push({\n type: \"content_block_start\",\n index: blockIndex,\n content_block: {\n type: \"tool_use\",\n id: functionCallState.toolCallId,\n name: functionCallState.name,\n input: {},\n },\n })\n state.openBlocks.add(blockIndex)\n }\n\n return blockIndex\n}\n\ntype FunctionCallDetails = {\n outputIndex: number\n toolCallId: string\n name: string\n initialArguments?: string\n}\n\nconst extractFunctionCallDetails = (\n rawEvent: ResponseOutputItemAddedEvent,\n state: ResponsesStreamState,\n): FunctionCallDetails | undefined => {\n const item = rawEvent.item\n const itemType = item.type\n if (itemType === \"tool_search_call\") {\n const outputIndex = rawEvent.output_index\n const toolCallId = item.call_id\n const name = state.toolSearchName\n return {\n outputIndex,\n toolCallId,\n name,\n initialArguments: \"\",\n }\n }\n\n if (itemType !== \"function_call\") {\n return undefined\n }\n\n const outputIndex = rawEvent.output_index\n const toolCallId = item.call_id\n const name = resolveToolUseName(item)\n const initialArguments = item.arguments\n return {\n outputIndex,\n toolCallId,\n name,\n initialArguments,\n }\n}\n\nconst stringifyToolSearchArguments = (\n argumentsValue: Record<string, unknown> | string,\n): string | undefined => {\n try {\n return JSON.stringify(formatToolSearchBridgeArguments(argumentsValue))\n } catch {\n return undefined\n }\n}\n","import type {\n ResponseContextManagementCompactionItem,\n ResponseFunctionCallOutputItem,\n ResponseInputContent,\n ResponseInputImage,\n ResponseInputItem,\n ResponseInputMessage,\n ResponsesPayload,\n ResponsesTransport,\n} from \"~/services/copilot/create-responses\"\n\nimport { COMPACT_REQUEST, type CompactType } from \"~/lib/compact\"\nimport {\n isForceAgentEnabled,\n isResponsesApiContextManagementEnabled as isConfiguredResponsesApiContextManagementEnabled,\n isResponsesApiWebSocketEnabled as isConfiguredResponsesApiWebSocketEnabled,\n} from \"~/lib/config\"\n\nexport const RESPONSES_ENDPOINT = \"/responses\"\nexport const RESPONSES_WS_ENDPOINT = \"ws:/responses\"\nexport const DEFAULT_RESPONSES_COMPACT_THRESHOLD_RATIO = 0.9\n\nexport const responsesUtilsDependencies = {\n isResponsesApiContextManagementEnabled:\n isConfiguredResponsesApiContextManagementEnabled,\n isResponsesApiWebSocketEnabled: isConfiguredResponsesApiWebSocketEnabled,\n}\n\nexport const getResponsesRequestOptions = (\n payload: ResponsesPayload,\n): { vision: boolean; initiator: \"agent\" | \"user\" } => {\n const vision = hasVisionInput(payload)\n const initiator = hasAgentInitiator(payload) ? \"agent\" : \"user\"\n\n return { vision, initiator }\n}\n\nexport const getResponsesTransportForModel = (\n selectedModel:\n | {\n supported_endpoints?: Array<string>\n }\n | undefined,\n options: {\n compactType?: CompactType\n } = {},\n): ResponsesTransport | null => {\n const supportedEndpoints = selectedModel?.supported_endpoints ?? []\n const useWebSocket =\n responsesUtilsDependencies.isResponsesApiWebSocketEnabled()\n\n if (\n options.compactType !== COMPACT_REQUEST\n && useWebSocket\n && supportedEndpoints.includes(RESPONSES_WS_ENDPOINT)\n ) {\n return \"websocket\"\n }\n\n if (supportedEndpoints.includes(RESPONSES_ENDPOINT)) {\n return \"http\"\n }\n\n return null\n}\n\nexport const hasAgentInitiator = (payload: ResponsesPayload): boolean => {\n const items = getPayloadItems(payload)\n\n if (isForceAgentEnabled()) {\n // forceAgent mode: check if ANY item has assistant role\n return items.some((item) => isAgentRole(item))\n }\n\n // Default mode: only check the last item\n const lastItem = items.at(-1)\n if (!lastItem) {\n return false\n }\n return isAgentRole(lastItem)\n}\n\n// Helper function: check if a single item has agent role\nconst isAgentRole = (item: ResponseInputItem): boolean => {\n if (!(\"role\" in item) || !item.role) {\n return true // No role means agent (preserve original logic)\n }\n const role = typeof item.role === \"string\" ? item.role.toLowerCase() : \"\"\n return role === \"assistant\"\n}\n\nexport const hasVisionInput = (payload: ResponsesPayload): boolean => {\n const values = getPayloadItems(payload)\n return values.some((item) => containsVisionContent(item))\n}\n\nconst DATA_URL_PREFIX = \"data:\"\n// Static 96x32 PNG reading \"Image too large / Redacted\".\nconst REDACTED_IMAGE_PLACEHOLDER_DATA_URL =\n \"data:image/png;base64,\"\n + [\n \"iVBORw0KGgoAAAANSUhEUgAAAGAAAAAgCAMAAADaHo1mAAADAFBMVEX///8fKTfR1dsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAACae8QWAAAAvElEQVR42u1WixKAIAhj/f9Hdz2BXJiVed3pVSYtpgwsGSo3GaRq6wSd4F8EyIJx\",\n \"ydSUAMB8il51sHT2fiVQu8czguQwXWAyFvswIJhmoS9gmzYlcFiHj1aAgzcJVgCyguYhAhNZmMhYQZs1EJnnIAqKiuHjSrZT\",\n \"ucSQ4s8JkKDDIYr3IuR8vEWgqroKP9b1bYKk2wfgeVmqATQLXdXamsXdEKkz3QXEEeTTuWWImMhW6qci94/+hwSVf99HqVoD\",\n \"OAuj2SEAAAAASUVORK5CYII=\",\n ].join(\"\")\n\nexport const sanitizeOversizedInputImages = (\n payload: ResponsesPayload,\n maxPromptImageSize?: number,\n): number => {\n const limit =\n typeof maxPromptImageSize === \"number\" && maxPromptImageSize > 0 ?\n maxPromptImageSize\n : undefined\n\n if (limit === undefined || !Array.isArray(payload.input)) {\n return 0\n }\n\n return sanitizeInputImages(\n payload.input,\n (image) => image.decodedBytes > limit,\n )\n}\n\nexport const sanitizeAllInputImages = (payload: ResponsesPayload): number => {\n if (!Array.isArray(payload.input)) {\n return 0\n }\n\n return sanitizeInputImages(payload.input, () => true)\n}\n\ninterface InputImageDataUrl {\n decodedBytes: number\n record: ResponseInputImage\n}\n\nconst sanitizeInputImages = (\n input: Array<ResponseInputItem>,\n shouldReplace: (image: InputImageDataUrl) => boolean,\n): number => {\n let count = 0\n for (const image of collectInputImageDataUrls(input)) {\n if (!shouldReplace(image)) {\n continue\n }\n\n replaceInputImageWithPlaceholder(image)\n count += 1\n }\n\n return count\n}\n\nconst collectInputImageDataUrls = (\n input: Array<ResponseInputItem>,\n images: Array<InputImageDataUrl> = [],\n): Array<InputImageDataUrl> => {\n for (const item of input) {\n collectInputItemImageDataUrls(item, images)\n }\n\n return images\n}\n\nconst collectInputItemImageDataUrls = (\n item: ResponseInputItem,\n images: Array<InputImageDataUrl>,\n): void => {\n if (isResponseInputMessage(item)) {\n collectContentImageDataUrls(item.content, images)\n } else if (isResponseFunctionCallOutputItem(item)) {\n collectContentImageDataUrls(item.output, images)\n }\n}\n\nconst collectContentImageDataUrls = (\n content: string | Array<ResponseInputContent> | undefined,\n images: Array<InputImageDataUrl>,\n): void => {\n if (!Array.isArray(content)) {\n return\n }\n\n for (const block of content) {\n const image = getInputImageDataUrl(block)\n if (image) {\n images.push(image)\n }\n }\n}\n\nconst getInputImageDataUrl = (\n content: ResponseInputContent,\n): InputImageDataUrl | null => {\n if (!isResponseInputImage(content) || typeof content.image_url !== \"string\") {\n return null\n }\n\n const imageUrl = content.image_url\n if (!imageUrl.startsWith(DATA_URL_PREFIX)) {\n return null\n }\n\n const decodedBytes = estimateDataUrlByteLength(imageUrl)\n\n return {\n decodedBytes,\n record: content,\n }\n}\n\nconst estimateDataUrlByteLength = (value: string): number => {\n return Math.max(0, Math.floor((value.length * 3) / 4))\n}\n\nconst replaceInputImageWithPlaceholder = (image: InputImageDataUrl): void => {\n image.record.type = \"input_image\"\n image.record.image_url = REDACTED_IMAGE_PLACEHOLDER_DATA_URL\n image.record.detail = \"low\"\n delete image.record.file_id\n}\n\nconst isResponseInputMessage = (\n item: ResponseInputItem,\n): item is ResponseInputMessage => {\n return (\n typeof item === \"object\"\n && item !== null\n && \"role\" in item\n && typeof item.role === \"string\"\n )\n}\n\nconst isResponseFunctionCallOutputItem = (\n item: ResponseInputItem,\n): item is ResponseFunctionCallOutputItem => {\n return (\n typeof item === \"object\"\n && item !== null\n && \"type\" in item\n && item.type === \"function_call_output\"\n )\n}\n\nconst isResponseInputImage = (\n content: ResponseInputContent,\n): content is ResponseInputImage => {\n return (\n typeof content === \"object\"\n && content !== null\n && \"type\" in content\n && content.type === \"input_image\"\n )\n}\n\nexport const resolveResponsesCompactThreshold = (\n maxPromptTokens?: number,\n compactThresholdRatio = DEFAULT_RESPONSES_COMPACT_THRESHOLD_RATIO,\n): number => {\n if (typeof maxPromptTokens === \"number\" && maxPromptTokens > 0) {\n return Math.floor(maxPromptTokens * compactThresholdRatio)\n }\n\n return 200_000 * compactThresholdRatio\n}\n\nconst createCompactionContextManagement = (\n compactThreshold: number,\n): Array<ResponseContextManagementCompactionItem> => [\n {\n type: \"compaction\",\n compact_threshold: compactThreshold,\n },\n]\n\nexport const applyResponsesApiContextManagement = (\n payload: ResponsesPayload,\n maxPromptTokens?: number,\n compactThresholdRatio = DEFAULT_RESPONSES_COMPACT_THRESHOLD_RATIO,\n): void => {\n if (payload.context_management !== undefined) {\n return\n }\n\n if (!responsesUtilsDependencies.isResponsesApiContextManagementEnabled()) {\n return\n }\n\n payload.context_management = createCompactionContextManagement(\n resolveResponsesCompactThreshold(maxPromptTokens, compactThresholdRatio),\n )\n}\n\nexport const compactInputByLatestCompaction = (\n payload: ResponsesPayload,\n): void => {\n if (!Array.isArray(payload.input) || payload.input.length === 0) {\n return\n }\n\n const latestCompactionMessageIndex = getLatestCompactionMessageIndex(\n payload.input,\n )\n\n if (latestCompactionMessageIndex === undefined) {\n return\n }\n\n payload.input = payload.input.slice(latestCompactionMessageIndex)\n}\n\nconst getLatestCompactionMessageIndex = (\n input: Array<ResponseInputItem>,\n): number | undefined => {\n for (let index = input.length - 1; index >= 0; index -= 1) {\n if (isCompactionInputItem(input[index])) {\n return index\n }\n }\n\n return undefined\n}\n\nconst isCompactionInputItem = (value: ResponseInputItem): boolean => {\n return (\n \"type\" in value\n && typeof value.type === \"string\"\n && value.type === \"compaction\"\n )\n}\n\nconst getPayloadItems = (\n payload: ResponsesPayload,\n): Array<ResponseInputItem> => {\n const result: Array<ResponseInputItem> = []\n\n const { input } = payload\n\n if (Array.isArray(input)) {\n result.push(...input)\n }\n\n return result\n}\n\nexport const removeWebSearchTool = (payload: ResponsesPayload): void => {\n if (!Array.isArray(payload.tools) || payload.tools.length === 0) return\n\n payload.tools = payload.tools.filter((t) => {\n return t.type !== \"web_search\"\n })\n}\n\ntype StreamChunk = {\n id?: string\n event?: string\n data?: string\n}\n\nexport function getStreamChunkFields(chunk: unknown): StreamChunk {\n const c = chunk as StreamChunk\n return {\n id: c.id,\n event: c.event,\n data: c.data,\n }\n}\n\nexport const isAsyncIterable = <T>(value: unknown): value is AsyncIterable<T> =>\n Boolean(value)\n && typeof (value as AsyncIterable<T>)[Symbol.asyncIterator] === \"function\"\n\nconst containsVisionContent = (value: unknown): boolean => {\n if (!value) return false\n\n if (Array.isArray(value)) {\n return value.some((entry) => containsVisionContent(entry))\n }\n\n if (typeof value !== \"object\") {\n return false\n }\n\n const record = value as Record<string, unknown>\n const type =\n typeof record.type === \"string\" ? record.type.toLowerCase() : undefined\n\n if (type === \"input_image\") {\n return true\n }\n\n if (Array.isArray(record.content)) {\n return record.content.some((entry) => containsVisionContent(entry))\n }\n\n return false\n}\n","import consola from \"consola\"\nimport { events } from \"fetch-event-stream\"\n\nimport type { CompactType } from \"~/lib/compact\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type { AccountContext } from \"~/lib/types/account\"\nimport type {\n AnthropicMessagesPayload,\n AnthropicResponse,\n} from \"~/routes/messages/anthropic-types\"\n\nimport {\n copilotBaseUrl,\n copilotHeaders,\n prepareForCompact,\n prepareInteractionHeaders,\n prepareMessageProxyHeaders,\n} from \"~/lib/api-config\"\nimport { isForceAgentEnabled } from \"~/lib/config\"\nimport { logCopilotRateLimits } from \"~/lib/copilot-rate-limit\"\nimport { HTTPError } from \"~/lib/error\"\nimport { captureOutboundHeadersSnapshot } from \"~/lib/request-context\"\nimport { resolveEffectiveInitiator } from \"~/lib/request-initiator\"\nimport { accountFromState } from \"~/lib/state\"\nimport { parseUserIdMetadata } from \"~/lib/utils\"\n\nimport { copilotFetch } from \"./copilot-fetch\"\n\nconst isAgentMessage = (\n msg: AnthropicMessagesPayload[\"messages\"][number],\n): boolean => {\n if (msg.role === \"assistant\") return true\n\n // user message with content that is entirely tool_result blocks\n // is semantically agent-driven (tool call response)\n if (Array.isArray(msg.content)) {\n const allToolResults = msg.content.every(\n (block) => block.type === \"tool_result\",\n )\n if (allToolResults && msg.content.length > 0) return true\n }\n\n return false\n}\n\nexport const getMessagesInitiator = (\n payload: AnthropicMessagesPayload,\n): \"agent\" | \"user\" => {\n if (isForceAgentEnabled()) {\n return payload.messages.some((msg) => isAgentMessage(msg)) ?\n \"agent\"\n : \"user\"\n }\n\n const lastMessage = payload.messages.at(-1)\n if (!lastMessage || lastMessage.role !== \"user\") {\n return \"agent\"\n }\n\n if (!Array.isArray(lastMessage.content)) {\n return \"user\"\n }\n\n const hasNonToolResult = lastMessage.content.some(\n (block) => block.type !== \"tool_result\",\n )\n return hasNonToolResult ? \"user\" : \"agent\"\n}\n\nexport type MessagesStream = ReturnType<typeof events>\nexport type CreateMessagesReturn = AnthropicResponse | MessagesStream\n\nconst INTERLEAVED_THINKING_BETA = \"interleaved-thinking-2025-05-14\"\nconst ADVANCED_TOOL_USE_BETA = \"advanced-tool-use-2025-11-20\"\nconst allowedAnthropicBetas = new Set([\n INTERLEAVED_THINKING_BETA,\n \"context-management-2025-06-27\",\n ADVANCED_TOOL_USE_BETA,\n])\n\nconst TOOL_SEARCH_SUPPORTED_MODELS = [\n \"claude-sonnet-4.5\",\n \"claude-sonnet-4.6\",\n \"claude-opus-4.5\",\n \"claude-opus-4.6\",\n] as const\n\nconst modelSupportsToolSearch = (modelId: string): boolean => {\n return TOOL_SEARCH_SUPPORTED_MODELS.some((prefix) =>\n modelId.toLowerCase().startsWith(prefix),\n )\n}\n\nconst buildAnthropicBetaHeader = (\n anthropicBetaHeader: string | undefined,\n thinking: AnthropicMessagesPayload[\"thinking\"],\n model: string,\n): string | undefined => {\n const isAdaptiveThinking = thinking?.type === \"adaptive\"\n\n if (anthropicBetaHeader) {\n const filteredBeta = anthropicBetaHeader\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0)\n .filter((item) => allowedAnthropicBetas.has(item))\n .filter(\n (item) => !isAdaptiveThinking || item !== INTERLEAVED_THINKING_BETA,\n )\n\n // in vscode copilot extension, advanced-tool-use is enabled by default\n // align header with vscode copilot extension\n\n // remove this append once GitHub Copilot extension sends ADVANCED_TOOL_USE_BETA by default\n const copilotHeaderSet =\n modelSupportsToolSearch(model) ? [ADVANCED_TOOL_USE_BETA] : []\n const headerSet = new Set([...copilotHeaderSet, ...filteredBeta])\n const uniqueFilteredBetas = [...headerSet]\n\n if (uniqueFilteredBetas.length > 0) {\n return uniqueFilteredBetas.join(\",\")\n }\n\n return undefined\n }\n\n if (thinking?.budget_tokens && !isAdaptiveThinking) {\n return INTERLEAVED_THINKING_BETA\n }\n\n return undefined\n}\n\nconst hasVisionInput = (payload: AnthropicMessagesPayload): boolean =>\n payload.messages.some(\n (message) =>\n Array.isArray(message.content)\n && message.content.some(\n (block) =>\n block.type === \"image\"\n || (block.type === \"tool_result\"\n && Array.isArray(block.content)\n && block.content.some((inner) => inner.type === \"image\")),\n ),\n )\n\nconst shouldUseMessageProxyHeaders = (\n payload: AnthropicMessagesPayload,\n): boolean => {\n const { safetyIdentifier, sessionId } = parseUserIdMetadata(\n payload.metadata?.user_id,\n )\n\n return Boolean(safetyIdentifier && sessionId)\n}\n\nconst buildMessagesHeaders = ({\n ctx,\n enableVision,\n initiator,\n options,\n payload,\n}: {\n ctx: AccountContext\n enableVision: boolean\n initiator: \"agent\" | \"user\"\n options:\n | {\n anthropicBetaHeader?: string\n upstreamRequestId?: string\n initiator?: \"agent\" | \"user\"\n subagentMarker?: SubagentMarker | null\n sessionId?: string\n compactType?: CompactType\n requestId?: string\n }\n | undefined\n payload: AnthropicMessagesPayload\n}): Record<string, string> => {\n const isCompact = Boolean(options?.compactType)\n const effectiveInitiator = resolveEffectiveInitiator(initiator, {\n isCompact,\n isSubagent: Boolean(options?.subagentMarker),\n })\n\n const headers: Record<string, string> = {\n ...copilotHeaders(ctx, enableVision, options?.upstreamRequestId),\n \"x-initiator\": effectiveInitiator,\n }\n\n prepareInteractionHeaders(\n options?.sessionId,\n Boolean(options?.subagentMarker),\n headers,\n )\n\n prepareForCompact(headers, options?.compactType)\n\n // claude-opus-4.8 is excluded: Copilot's upstream WAF returns a generic\n // \"Access to this endpoint is forbidden\" 403 whenever a request carries\n // the Claude-Code-style user-agent without a `copilot-integration-id`\n // header. The exact same header set is accepted on claude-opus-4.7, so\n // the gate is a model-id rollout gap on Copilot's side. Skipping the\n // rewrite for 4.8 keeps the default Copilot identity\n // (copilot-integration-id: vscode-chat + GitHubCopilotChat UA +\n // conversation-agent intent) in place; that path is 200. Remove this\n // skip once Copilot's upstream accepts the Claude-Code identity on 4.8.\n // Probed 2026-05-29.\n if (\n shouldUseMessageProxyHeaders(payload)\n && payload.model !== \"claude-opus-4.8\"\n ) {\n prepareMessageProxyHeaders(headers)\n }\n\n const anthropicBeta = buildAnthropicBetaHeader(\n options?.anthropicBetaHeader,\n payload.thinking,\n payload.model,\n )\n if (anthropicBeta) {\n headers[\"anthropic-beta\"] = anthropicBeta\n }\n\n return headers\n}\n\nexport const createMessages = async (\n payload: AnthropicMessagesPayload,\n account?: AccountContext,\n options?: {\n anthropicBetaHeader?: string\n upstreamRequestId?: string\n initiator?: \"agent\" | \"user\"\n subagentMarker?: SubagentMarker | null\n sessionId?: string\n compactType?: CompactType\n requestId?: string\n fetchImpl?: typeof fetch\n },\n): Promise<CreateMessagesReturn> => {\n const ctx = account ?? accountFromState()\n if (!ctx.copilotToken) throw new Error(\"Copilot token not found\")\n\n const enableVision = hasVisionInput(payload)\n const initiator = options?.initiator ?? getMessagesInitiator(payload)\n const headers = buildMessagesHeaders({\n ctx,\n enableVision,\n initiator,\n options,\n payload,\n })\n\n captureOutboundHeadersSnapshot(headers)\n\n const response = await copilotFetch(\n `${copilotBaseUrl(ctx)}/v1/messages`,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n },\n {\n requestId: options?.requestId,\n callSite: \"messages\",\n fetchImpl: options?.fetchImpl,\n },\n )\n\n logCopilotRateLimits(response.headers)\n\n if (!response.ok) {\n consola.error(\"Failed to create messages\", response)\n throw new HTTPError(\"Failed to create messages\", response)\n }\n\n if (payload.stream) {\n return events(response)\n }\n\n return (await response.json()) as AnthropicResponse\n}\n","export const subagentMarkerPrefix = \"__SUBAGENT_MARKER__\"\n\nexport interface SubagentMarker {\n session_id: string\n agent_id: string\n agent_type: string\n}\n","import { subagentMarkerPrefix, type SubagentMarker } from \"~/lib/subagent\"\n\nimport type { AnthropicMessagesPayload } from \"./anthropic-types\"\n\nconst subagentStartContextPrefix = \"SubagentStart hook additional context:\"\nconst REMINDER_RE = /<system-reminder>([\\s\\S]*?)<\\/system-reminder>/g\n\nexport type SubagentMarkerInspection =\n | { kind: \"none\"; marker: null }\n | { kind: \"invalid\"; marker: null }\n | { kind: \"valid\"; marker: SubagentMarker }\n\nconst NONE_INSPECTION: SubagentMarkerInspection = {\n kind: \"none\",\n marker: null,\n}\n\nconst INVALID_INSPECTION: SubagentMarkerInspection = {\n kind: \"invalid\",\n marker: null,\n}\n\nconst isSubagentMarker = (value: unknown): value is SubagentMarker => {\n if (!value || typeof value !== \"object\") {\n return false\n }\n\n const candidate = value as Record<string, unknown>\n return (\n typeof candidate.session_id === \"string\"\n && typeof candidate.agent_id === \"string\"\n && typeof candidate.agent_type === \"string\"\n && candidate.session_id.trim().length > 0\n && candidate.agent_id.trim().length > 0\n && candidate.agent_type.trim().length > 0\n )\n}\n\nexport const inspectSubagentMarkerFromFirstUser = (\n payload: AnthropicMessagesPayload,\n): SubagentMarkerInspection => {\n const firstUserMessage = payload.messages.find(\n (msg) => msg.role === \"user\" && Array.isArray(msg.content),\n )\n if (!firstUserMessage || !Array.isArray(firstUserMessage.content)) {\n return NONE_INSPECTION\n }\n\n let sawInvalidMarker = false\n\n for (const block of firstUserMessage.content) {\n if (block.type !== \"text\") {\n continue\n }\n\n const inspection = inspectSubagentMarkerFromSystemReminder(block.text)\n if (inspection.kind === \"valid\") {\n return inspection\n }\n\n if (inspection.kind === \"invalid\") {\n sawInvalidMarker = true\n }\n }\n\n return sawInvalidMarker ? INVALID_INSPECTION : NONE_INSPECTION\n}\n\nexport const parseSubagentMarkerFromFirstUser = (\n payload: AnthropicMessagesPayload,\n): SubagentMarker | null => {\n const inspection = inspectSubagentMarkerFromFirstUser(payload)\n return inspection.kind === \"valid\" ? inspection.marker : null\n}\n\nconst extractMarkerPayloadFromReminderLine = (line: string): string | null => {\n const trimmedLine = line.trim()\n if (!trimmedLine) {\n return null\n }\n\n let markerLine = trimmedLine\n\n if (markerLine.startsWith(subagentStartContextPrefix)) {\n markerLine = markerLine.slice(subagentStartContextPrefix.length).trimStart()\n }\n\n if (!markerLine.startsWith(subagentMarkerPrefix)) {\n return null\n }\n\n return markerLine.slice(subagentMarkerPrefix.length).trimStart()\n}\n\nconst inspectSubagentMarkerFromSystemReminder = (\n text: string,\n): SubagentMarkerInspection => {\n let sawInvalidMarker = false\n\n for (const [, content] of text.matchAll(REMINDER_RE)) {\n const lines = content.split(/\\r?\\n/)\n\n for (const line of lines) {\n const markerPayload = extractMarkerPayloadFromReminderLine(line)\n if (markerPayload === null) {\n continue\n }\n\n if (!markerPayload.startsWith(\"{\")) {\n sawInvalidMarker = true\n continue\n }\n\n const json = extractBalancedJson(markerPayload)\n if (!json) {\n sawInvalidMarker = true\n continue\n }\n\n try {\n const parsed: unknown = JSON.parse(json)\n if (!isSubagentMarker(parsed)) {\n sawInvalidMarker = true\n continue\n }\n return {\n kind: \"valid\",\n marker: parsed,\n }\n } catch {\n sawInvalidMarker = true\n }\n }\n }\n\n return sawInvalidMarker ? INVALID_INSPECTION : NONE_INSPECTION\n}\n\n/** Extract the first balanced `{...}` object from text that starts with `{`. */\nconst extractBalancedJson = (text: string): string | null => {\n let depth = 0\n let inString = false\n let escaped = false\n\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index]\n\n if (inString) {\n if (escaped) {\n escaped = false\n continue\n }\n\n if (char === \"\\\\\") {\n escaped = true\n continue\n }\n\n if (char === '\"') {\n inString = false\n }\n\n continue\n }\n\n if (char === '\"') {\n inString = true\n continue\n }\n\n if (char === \"{\") {\n depth += 1\n continue\n }\n\n if (char === \"}\") {\n depth -= 1\n if (depth === 0) return text.slice(0, index + 1)\n }\n }\n\n return null\n}\n","/* eslint-disable max-lines */\nimport type { Context } from \"hono\"\n\nimport { streamSSE } from \"hono/streaming\"\nimport { randomUUID } from \"node:crypto\"\n\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type { AccountRuntime } from \"~/lib/types/account\"\nimport type { Model } from \"~/services/copilot/get-models\"\n\nimport {\n accountsManager,\n type AccountSelectionReason,\n} from \"~/lib/accounts-manager\"\nimport { awaitApproval } from \"~/lib/approval\"\nimport { COMPACT_REQUEST, type CompactType } from \"~/lib/compact\"\nimport {\n getProviderConfig,\n getSmallModel,\n isMessageStartInputTokensFallbackEnabled,\n isMessagesApiEnabled,\n resolveModelAlias,\n shouldCompactUseSmallModel,\n} from \"~/lib/config\"\nimport {\n computeDiff,\n extractErrorObservability,\n getUserVisibleErrorMessage,\n shouldMarkAccountFailed,\n toAccountContext,\n} from \"~/lib/handler-utils\"\nimport { createHandlerLogger, debugJson } from \"~/lib/logger\"\nimport { findEndpointModel } from \"~/lib/models\"\nimport { resolveExistingProviderModelAlias } from \"~/lib/provider-model\"\nimport { checkRateLimit } from \"~/lib/rate-limit\"\nimport {\n extractResponsesUsageFromResult,\n extractResponsesUsageFromStreamEvent,\n getClientIpInfo,\n getRequestHistoryStore,\n normalizeChatCompletionsUsage,\n normalizeMessagesUsage,\n type NormalizedUsage,\n} from \"~/lib/request-history\"\nimport { resolveEffectiveInitiator } from \"~/lib/request-initiator\"\nimport { state } from \"~/lib/state\"\nimport {\n type AffinityKeySource,\n generateRequestIdFromPayload,\n getRootSessionId,\n normalizeStableSessionId,\n parseUserIdMetadata,\n resolveAffinityKey,\n} from \"~/lib/utils\"\nimport {\n extractAnthropicResponsesItemOwnerKeys,\n extractResponsesResultOwnerKeys,\n extractResponsesStreamEventOwnerKeys,\n} from \"~/routes/messages/responses-item-ownership\"\nimport {\n handleProviderMessagesForProvider,\n type ProviderMessagesInstrumentation,\n type ProviderStreamError,\n type UsageTokens,\n} from \"~/routes/provider/messages/handler\"\nimport {\n buildErrorEvent,\n createResponsesStreamState,\n translateResponsesStreamEvent,\n} from \"~/routes/messages/responses-stream-translation\"\nimport {\n translateAnthropicMessagesToResponsesPayload,\n translateResponsesResultToAnthropic,\n} from \"~/routes/messages/responses-translation\"\nimport {\n applyResponsesApiContextManagement,\n compactInputByLatestCompaction,\n getResponsesRequestOptions,\n getResponsesTransportForModel,\n} from \"~/routes/responses/utils\"\nimport { flushPendingCapture } from \"~/services/copilot/copilot-fetch\"\nimport {\n createChatCompletions,\n getChatInitiator,\n type ChatCompletionChunk,\n type ChatCompletionResponse,\n type ChatCompletionsPayload,\n} from \"~/services/copilot/create-chat-completions\"\nimport {\n createMessages,\n getMessagesInitiator,\n} from \"~/services/copilot/create-messages\"\nimport {\n createResponses,\n type ResponsesResult,\n type ResponseStreamEvent,\n} from \"~/services/copilot/create-responses\"\n\nimport {\n type AnthropicMessagesPayload,\n type AnthropicResponse,\n type AnthropicStreamEventData,\n type AnthropicStreamState,\n} from \"./anthropic-types\"\nimport {\n translateToAnthropic,\n translateToOpenAI,\n} from \"./non-stream-translation\"\nimport {\n applyLastMessageCacheControl,\n getCompactType,\n getLastMessageContentCacheControl,\n mergeToolResultForClaude,\n normalizeSystemMessages,\n prepareMessagesApiPayload,\n sanitizeIdeTools,\n stripToolReferenceTurnBoundary,\n} from \"./preprocess\"\nimport { translateChunkToAnthropicEvents } from \"./stream-translation\"\nimport { inspectSubagentMarkerFromFirstUser } from \"./subagent-marker\"\nimport {\n estimateInputTokens,\n handleSelectionFailure,\n isWarmupProbeRequest,\n maybeBlockOriginalModelName,\n} from \"./utils\"\n\nconst logger = createHandlerLogger(\"messages-handler\")\n\nconst CHAT_COMPLETIONS_ENDPOINT = \"/chat/completions\"\nconst RESPONSES_ENDPOINT = \"/responses\"\nconst MESSAGES_ENDPOINT = \"/v1/messages\"\n\nconst getProviderConfigResolver = (c: Context): typeof getProviderConfig => {\n const resolver = c.get(\"providerConfigResolver\" as never) as\n | typeof getProviderConfig\n | undefined\n return resolver ?? getProviderConfig\n}\n\nconst resolveProviderTargetModelAlias = (\n model: string,\n providerConfigResolver: typeof getProviderConfig,\n) => {\n const targetModel = resolveModelAlias(model)\n if (targetModel === model) {\n return null\n }\n\n return resolveExistingProviderModelAlias(targetModel, providerConfigResolver)\n}\n\ntype AccountSelection = Awaited<\n ReturnType<(typeof accountsManager)[\"selectAccountForRequest\"]>\n>\ntype AccountSelectionOk = Extract<AccountSelection, { ok: true }>\n\ntype InstrumentationContext = {\n store: ReturnType<typeof getRequestHistoryStore>\n requestId: string\n startedAtMs: number\n\n method: string\n path: string\n\n clientIp?: string\n clientIpSource?: string\n userAgent?: string\n\n userId?: string\n safetyIdentifier?: string\n promptCacheKey?: string\n initiator?: \"agent\" | \"user\"\n isSubagent?: boolean\n upstreamRequestId?: string\n\n /** Call after upstream success to persist affinity mapping. */\n confirmAffinity?: () => void\n /** Call after upstream success to persist ownership mapping. */\n confirmOwnership?: () => void\n\n affinityHit?: boolean\n affinityCacheKey?: string\n\n affinityKeyUsed?: string\n affinityKeySource?: AffinityKeySource\n selectionReason?: AccountSelectionReason\n responsesItemOwnerLookupKeys?: ReadonlyArray<string>\n responsesItemOwnerRecordedKeys?: ReadonlyArray<string>\n\n clientModel: string\n\n account: AccountRuntime\n reservation: AccountSelectionOk[\"reservation\"]\n upstreamModel: string\n upstreamEndpoint: string\n costUnits: number\n\n premiumRemainingBefore?: number\n premiumUnlimitedBefore?: boolean\n}\n\nfunction normalizeProviderAliasUsage(usage: UsageTokens): NormalizedUsage {\n const tokensInput =\n usage.inputTokens === undefined ? undefined : Math.max(0, usage.inputTokens)\n const tokensCachedInput = usage.cacheReadInputTokens\n const tokensTotal =\n usage.inputTokens === undefined && usage.outputTokens === undefined ?\n undefined\n : (tokensInput ?? 0)\n + (usage.outputTokens ?? 0)\n + (usage.cacheCreationInputTokens ?? 0)\n + (tokensCachedInput ?? 0)\n\n return {\n tokensCachedInput,\n tokensInput,\n tokensOutput: usage.outputTokens,\n tokensTotal,\n usageJson: JSON.stringify({\n input_tokens: usage.inputTokens,\n output_tokens: usage.outputTokens,\n cache_creation_input_tokens: usage.cacheCreationInputTokens,\n cache_read_input_tokens: usage.cacheReadInputTokens,\n }),\n }\n}\n\nasync function handleProviderAliasCompletion(\n c: Context,\n options: {\n payload: AnthropicMessagesPayload\n provider: string\n providerModel: string\n },\n): Promise<Response> {\n const { payload, provider, providerModel } = options\n const requestId = randomUUID()\n const startedAtMs = Date.now()\n const method = c.req.raw.method\n const path = new URL(c.req.url, \"http://local\").pathname\n const { ip: clientIp, source: clientIpSource } = getClientIpInfo(c)\n const userAgent = c.req.header(\"user-agent\") ?? undefined\n const streamRequested = Boolean(payload.stream)\n const originalModel = payload.model\n const rawUserId = payload.metadata?.user_id\n const userId = typeof rawUserId === \"string\" ? rawUserId : undefined\n const { safetyIdentifier, sessionId: promptCacheKey } =\n parseUserIdMetadata(userId)\n const markerInspection = inspectSubagentMarkerFromFirstUser(payload)\n const isSubagent = markerInspection.kind === \"valid\"\n\n let requestRecorded = false\n const insertProviderAliasLog = (\n record: Omit<\n RequestLogInsert,\n | \"requestId\"\n | \"startedAtMs\"\n | \"method\"\n | \"path\"\n | \"clientIp\"\n | \"clientIpSource\"\n | \"userAgent\"\n | \"userId\"\n | \"safetyIdentifier\"\n | \"promptCacheKey\"\n | \"isSubagent\"\n | \"clientModel\"\n | \"upstreamEndpoint\"\n | \"stream\"\n | \"upstreamModel\"\n >,\n ): void => {\n if (requestRecorded) {\n logger.warn(\"provider alias request already recorded\", { requestId })\n return\n }\n requestRecorded = true\n const finishedAtMs = Date.now()\n getRequestHistoryStore().insert({\n requestId,\n startedAtMs,\n finishedAtMs,\n durationMs: finishedAtMs - startedAtMs,\n method,\n path,\n clientIp,\n clientIpSource,\n userAgent,\n userId,\n safetyIdentifier: safetyIdentifier ?? undefined,\n promptCacheKey: promptCacheKey ?? undefined,\n isSubagent,\n clientModel: originalModel,\n upstreamEndpoint: `/providers/${provider}/messages`,\n stream: streamRequested,\n upstreamModel: providerModel,\n ...record,\n })\n }\n const instrumentation: ProviderMessagesInstrumentation = {\n onComplete: (usage: UsageTokens) => {\n insertProviderAliasLog({\n ...normalizeProviderAliasUsage(usage),\n httpStatus: 200,\n })\n },\n onError: (error: ProviderStreamError) => {\n insertProviderAliasLog({\n httpStatus: error.httpStatus,\n errorName: error.errorName,\n errorStatus: error.errorStatus,\n errorMessage: error.errorMessage,\n upstreamErrorMessageRaw: error.upstreamErrorMessageRaw,\n })\n },\n }\n\n payload.model = providerModel\n\n try {\n return await handleProviderMessagesForProvider(c, {\n instrumentation,\n payload,\n provider,\n })\n } catch (error) {\n const observableError = await extractErrorObservability(error)\n instrumentation.onError?.(observableError)\n throw error\n }\n}\n\n// eslint-disable-next-line max-lines-per-function, complexity\nexport async function handleCompletion(c: Context) {\n const anthropicPayload = await c.req.json<AnthropicMessagesPayload>()\n const providerConfigResolver = getProviderConfigResolver(c)\n const providerModelAlias = resolveExistingProviderModelAlias(\n anthropicPayload.model,\n providerConfigResolver,\n )\n const providerTargetModelAlias =\n providerModelAlias\n ?? resolveProviderTargetModelAlias(\n anthropicPayload.model,\n providerConfigResolver,\n )\n if (providerTargetModelAlias) {\n return await handleProviderAliasCompletion(c, {\n payload: anthropicPayload,\n provider: providerTargetModelAlias.provider,\n providerModel: providerTargetModelAlias.model,\n })\n }\n\n await checkRateLimit(state)\n const store = getRequestHistoryStore()\n const requestId = randomUUID()\n const startedAtMs = Date.now()\n const method = c.req.raw.method\n const path = new URL(c.req.url, \"http://local\").pathname\n const { ip: clientIp, source: clientIpSource } = getClientIpInfo(c)\n const userAgent = c.req.header(\"user-agent\") ?? undefined\n normalizeSystemMessages(anthropicPayload)\n sanitizeIdeTools(anthropicPayload)\n debugJson(logger, \"Anthropic request payload:\", anthropicPayload)\n\n const markerInspection = inspectSubagentMarkerFromFirstUser(anthropicPayload)\n const subagentMarker =\n markerInspection.kind === \"valid\" ? markerInspection.marker : null\n const isSubagentRequest = subagentMarker !== null\n const invalidSubagentMarkerSelectionReason:\n | AccountSelectionReason\n | undefined =\n markerInspection.kind === \"invalid\" ?\n \"subagent_marker_invalid_fallback\"\n : undefined\n if (subagentMarker) {\n debugJson(logger, \"Detected Subagent marker:\", subagentMarker)\n }\n\n const sessionId = getRootSessionId(anthropicPayload, c)\n logger.debug(\"Extracted session ID:\", sessionId)\n\n const ownershipLookupSessionId =\n markerInspection.kind === \"valid\" ?\n normalizeStableSessionId(markerInspection.marker.session_id)\n : undefined\n const ownershipWriteSessionId =\n markerInspection.kind === \"none\" ? sessionId : undefined\n\n const anthropicBeta = c.req.header(\"anthropic-beta\")\n const compactType = getCompactType(anthropicPayload)\n const isCompact = compactType !== 0\n const originalRequestModel = anthropicPayload.model\n\n // Fix warmup probe: force small model for Claude Code warmup requests (CLAUDE_CODE_SUBAGENT_MODEL also works).\n if (anthropicBeta && isWarmupProbeRequest(anthropicPayload)) {\n anthropicPayload.model = getSmallModel()\n }\n\n if (compactType !== 0) {\n logger.debug(\"Compact request type:\", compactType)\n }\n\n const lastMessageCacheControl = getLastMessageContentCacheControl(\n anthropicPayload.messages.at(-1),\n )\n\n if (compactType === COMPACT_REQUEST && shouldCompactUseSmallModel()) {\n anthropicPayload.model = getSmallModel()\n }\n\n if (compactType === 0) {\n stripToolReferenceTurnBoundary(anthropicPayload)\n\n // Merge tool_result and text blocks into tool_result to avoid consuming premium requests\n // (caused by skill invocations, edit hooks, plan or to do reminders)\n // e.g. {\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"content\":\"Launching skill: xxx\"},{\"type\":\"text\",\"text\":\"xxx\"}]}\n // not only for claude, but also for opencode\n mergeToolResultForClaude(anthropicPayload)\n }\n\n applyLastMessageCacheControl(anthropicPayload, lastMessageCacheControl)\n\n const upstreamRequestId = generateRequestIdFromPayload(\n anthropicPayload,\n sessionId,\n )\n logger.debug(\"Generated request ID:\", upstreamRequestId)\n\n const clientModel = anthropicPayload.model\n anthropicPayload.model = resolveModelAlias(anthropicPayload.model)\n const routingModel = anthropicPayload.model\n const streamRequested = Boolean(anthropicPayload.stream)\n const rawUserId = anthropicPayload.metadata?.user_id\n const userId = typeof rawUserId === \"string\" ? rawUserId : undefined\n const { safetyIdentifier, sessionId: promptCacheKey } =\n parseUserIdMetadata(userId)\n const normalizedSafetyIdentifier = safetyIdentifier ?? undefined\n const normalizedPromptCacheKey = promptCacheKey ?? undefined\n const openAIPayload = translateToOpenAI(anthropicPayload)\n const fallbackInitiator = resolveEffectiveInitiator(\n getChatInitiator(openAIPayload.messages),\n {\n isCompact,\n isSubagent: isSubagentRequest,\n },\n )\n\n const blockedResponse = maybeBlockOriginalModelName({\n c,\n store,\n requestId,\n startedAtMs,\n method,\n path,\n streamRequested,\n clientModel,\n clientIp,\n clientIpSource,\n userAgent,\n userId,\n safetyIdentifier: normalizedSafetyIdentifier,\n promptCacheKey: normalizedPromptCacheKey,\n initiator: fallbackInitiator,\n isSubagent: isSubagentRequest,\n selectionReason: invalidSubagentMarkerSelectionReason,\n })\n if (blockedResponse) return blockedResponse\n\n const endpointModel = findEndpointModel(routingModel)\n const resolvedClientModel = endpointModel?.id ?? routingModel\n const affinityModelId =\n routingModel !== originalRequestModel ?\n (findEndpointModel(originalRequestModel)?.id ?? originalRequestModel)\n : undefined\n const useMessagesApi = isMessagesApiEnabled()\n\n const candidates: Array<{ modelId: string; endpoint: string }> = []\n if (useMessagesApi) {\n candidates.push({\n modelId: resolvedClientModel,\n endpoint: MESSAGES_ENDPOINT,\n })\n }\n candidates.push(\n {\n modelId: resolvedClientModel,\n endpoint: RESPONSES_ENDPOINT,\n },\n {\n modelId: endpointModel?.id ?? openAIPayload.model,\n endpoint: CHAT_COMPLETIONS_ENDPOINT,\n },\n )\n\n const headerSessionId = c.req.header(\"x-session-id\") ?? null\n const affinityKey = resolveAffinityKey({\n metadataSessionId: promptCacheKey,\n headerSessionId,\n upstreamRequestId,\n })\n const responsesItemOwnershipKeys =\n extractAnthropicResponsesItemOwnerKeys(anthropicPayload)\n\n const selection = await accountsManager.selectAccountForRequest(candidates, {\n requestId: affinityKey.requestId,\n affinityModelId,\n ownershipLookupSessionId,\n ownershipWriteSessionId,\n responsesItemOwnershipKeys,\n })\n const selectionReason =\n invalidSubagentMarkerSelectionReason ?? selection.selectionReason\n if (!selection.ok) {\n return handleSelectionFailure({\n c,\n store,\n requestId,\n startedAtMs,\n method,\n path,\n streamRequested,\n clientModel,\n clientIp,\n clientIpSource,\n userAgent,\n userId,\n safetyIdentifier: normalizedSafetyIdentifier,\n promptCacheKey: normalizedPromptCacheKey,\n initiator: fallbackInitiator,\n isSubagent: isSubagentRequest,\n affinityKeyUsed: affinityKey.affinityKeyUsed,\n affinityKeySource: affinityKey.affinityKeySource,\n selectionReason,\n responsesItemOwnerLookupKeys: responsesItemOwnershipKeys,\n selection,\n })\n }\n const { account, reservation, selectedModel, endpoint, costUnits } = selection\n openAIPayload.model = selectedModel.id\n anthropicPayload.model = selectedModel.id\n const premiumRemainingBefore = account.premiumRemaining\n const premiumUnlimitedBefore = account.unlimited\n if (state.manualApprove) {\n await awaitApproval()\n }\n const instr: InstrumentationContext = {\n store,\n requestId,\n startedAtMs,\n method,\n path,\n clientIp,\n clientIpSource,\n userAgent,\n userId,\n safetyIdentifier: normalizedSafetyIdentifier,\n promptCacheKey: normalizedPromptCacheKey,\n isSubagent: isSubagentRequest,\n clientModel,\n account,\n reservation,\n upstreamEndpoint: endpoint,\n upstreamModel: selectedModel.id,\n costUnits,\n upstreamRequestId,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n confirmAffinity: selection.confirmAffinity,\n confirmOwnership: selection.confirmOwnership,\n affinityHit: selection.affinityHit,\n affinityCacheKey: selection.affinityCacheKey,\n affinityKeyUsed: affinityKey.affinityKeyUsed,\n affinityKeySource: affinityKey.affinityKeySource,\n selectionReason,\n responsesItemOwnerLookupKeys: responsesItemOwnershipKeys,\n }\n if (endpoint === MESSAGES_ENDPOINT) {\n return await handleWithMessagesApi({\n c,\n anthropicPayload,\n anthropicBetaHeader: anthropicBeta ?? undefined,\n subagentMarker,\n sessionId,\n instr,\n selectedModel,\n compactType,\n })\n }\n if (endpoint === RESPONSES_ENDPOINT) {\n return await handleWithResponsesApi({\n c,\n anthropicPayload,\n openAIPayload,\n subagentMarker,\n sessionId,\n selectedModel,\n instr,\n compactType,\n })\n }\n\n return await handleWithChatCompletions({\n c,\n openAIPayload,\n subagentMarker,\n sessionId,\n selectedModel,\n instr,\n compactType,\n })\n}\n\nconst handleWithChatCompletions = async (params: {\n c: Context\n openAIPayload: ChatCompletionsPayload\n subagentMarker?: SubagentMarker | null\n sessionId?: string\n selectedModel: Model\n instr: InstrumentationContext\n compactType?: CompactType\n}): Promise<Response> => {\n const {\n c,\n openAIPayload,\n subagentMarker,\n sessionId,\n selectedModel,\n instr,\n compactType,\n } = params\n debugJson(logger, \"Translated OpenAI request payload:\", openAIPayload)\n\n const ctx = toAccountContext(instr.account)\n const initiator = getChatInitiator(openAIPayload.messages)\n const isCompact = compactType !== 0\n const effectiveInitiator = resolveEffectiveInitiator(initiator, {\n isCompact,\n isSubagent: Boolean(subagentMarker),\n })\n\n instr.initiator = effectiveInitiator\n\n let response: ChatCompletionsResult\n\n try {\n response = await createChatCompletions(openAIPayload, ctx, {\n upstreamRequestId: instr.upstreamRequestId,\n initiator: effectiveInitiator,\n subagentMarker,\n sessionId,\n compactType,\n requestId: instr.requestId,\n })\n instr.confirmAffinity?.()\n instr.confirmOwnership?.()\n } catch (error) {\n return await handleChatCompletionsCreateError({\n error,\n instr,\n stream: Boolean(openAIPayload.stream),\n })\n }\n\n if (isNonStreaming(response)) {\n return handleChatCompletionsNonStreaming({\n c,\n response,\n instr,\n })\n }\n\n logger.debug(\"Streaming response from Copilot\")\n\n const fallbackEnabled = isMessageStartInputTokensFallbackEnabled()\n\n const estimatedInputTokens =\n fallbackEnabled ?\n await estimateInputTokens(openAIPayload, selectedModel, logger)\n : undefined\n\n const historicalUsage =\n fallbackEnabled && instr.promptCacheKey && instr.safetyIdentifier ?\n instr.store.getLastCompletedUsageBySession({\n promptCacheKey: instr.promptCacheKey,\n safetyIdentifier: instr.safetyIdentifier,\n clientModel: instr.clientModel,\n })\n : null\n\n return streamSSE(c, (stream) =>\n streamChatCompletionsAndLog({\n stream,\n response,\n instr,\n estimatedInputTokens,\n historicalUsage: historicalUsage ?? undefined,\n }),\n )\n}\n\nconst handleWithResponsesApi = async (params: {\n c: Context\n anthropicPayload: AnthropicMessagesPayload\n openAIPayload: ChatCompletionsPayload\n subagentMarker?: SubagentMarker | null\n sessionId?: string\n selectedModel: Model\n instr: InstrumentationContext\n compactType?: CompactType\n}): Promise<Response> => {\n const {\n c,\n anthropicPayload,\n openAIPayload,\n subagentMarker,\n sessionId,\n selectedModel,\n instr,\n compactType,\n } = params\n const responsesPayload = translateAnthropicMessagesToResponsesPayload(\n anthropicPayload,\n {\n modelOverride: selectedModel.id,\n subagentAgentId: subagentMarker?.agent_id,\n },\n )\n\n applyResponsesApiContextManagement(\n responsesPayload,\n selectedModel.capabilities.limits.max_prompt_tokens,\n )\n compactInputByLatestCompaction(responsesPayload)\n\n debugJson(logger, \"Translated Responses payload:\", responsesPayload)\n\n const { vision, initiator } = getResponsesRequestOptions(responsesPayload)\n const transport =\n getResponsesTransportForModel(selectedModel, { compactType }) ?? \"http\"\n const isCompact = compactType !== 0\n const effectiveInitiator = resolveEffectiveInitiator(initiator, {\n isCompact,\n isSubagent: Boolean(subagentMarker),\n })\n const ctx = toAccountContext(instr.account)\n\n instr.initiator = effectiveInitiator\n\n let response: Awaited<ReturnType<typeof createResponses>>\n\n try {\n response = await createResponses(\n responsesPayload,\n {\n vision,\n initiator: effectiveInitiator,\n upstreamRequestId: instr.upstreamRequestId,\n subagentMarker,\n sessionId,\n compactType,\n requestId: instr.requestId,\n transport,\n },\n ctx,\n )\n instr.confirmAffinity?.()\n instr.confirmOwnership?.()\n } catch (error) {\n return await handleResponsesCreateError({\n error,\n instr,\n stream: Boolean(responsesPayload.stream),\n })\n }\n\n if (responsesPayload.stream && isAsyncIterable(response)) {\n logger.debug(\"Streaming response from Copilot (Responses API)\")\n\n const fallbackEnabled = isMessageStartInputTokensFallbackEnabled()\n\n const estimatedInputTokens =\n fallbackEnabled ?\n await estimateInputTokens(openAIPayload, selectedModel, logger)\n : undefined\n\n const historicalUsage =\n fallbackEnabled && instr.promptCacheKey && instr.safetyIdentifier ?\n instr.store.getLastCompletedUsageBySession({\n promptCacheKey: instr.promptCacheKey,\n safetyIdentifier: instr.safetyIdentifier,\n clientModel: instr.clientModel,\n })\n : null\n\n return streamSSE(c, (stream) =>\n streamResponsesAndLog({\n stream,\n response,\n instr,\n estimatedInputTokens,\n historicalUsage: historicalUsage ?? undefined,\n }),\n )\n }\n\n return handleResponsesNonStreaming({\n c,\n result: response as ResponsesResult,\n instr,\n })\n}\n\ntype Store = ReturnType<typeof getRequestHistoryStore>\n\ntype RequestLogInsert = Parameters<Store[\"insert\"]>[0]\n\ntype StreamSseStream = Parameters<Parameters<typeof streamSSE>[1]>[0]\n\ntype ChatCompletionsResult = Awaited<ReturnType<typeof createChatCompletions>>\n\ntype ChatCompletionsStream = Exclude<\n ChatCompletionsResult,\n ChatCompletionResponse\n>\n\ntype MessagesResult = Awaited<ReturnType<typeof createMessages>>\n\nfunction stringifyOwnerKeys(keys?: ReadonlyArray<string>): string | undefined {\n return keys && keys.length > 0 ? JSON.stringify(keys) : undefined\n}\n\nfunction insertRequestLog(\n instr: InstrumentationContext,\n record: Omit<\n RequestLogInsert,\n | \"requestId\"\n | \"startedAtMs\"\n | \"method\"\n | \"path\"\n | \"clientIp\"\n | \"clientIpSource\"\n | \"userAgent\"\n | \"clientModel\"\n | \"upstreamEndpoint\"\n | \"accountId\"\n | \"accountType\"\n | \"costUnits\"\n | \"upstreamModel\"\n | \"premiumRemainingBefore\"\n | \"premiumUnlimitedBefore\"\n | \"affinityKeyUsed\"\n | \"affinityKeySource\"\n | \"selectionReason\"\n >,\n): void {\n const {\n store,\n requestId,\n startedAtMs,\n method,\n path,\n clientIp,\n clientIpSource,\n userAgent,\n clientModel,\n account,\n upstreamEndpoint,\n upstreamModel,\n costUnits,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n } = instr\n\n store.insert({\n requestId,\n startedAtMs,\n method,\n path,\n clientIp,\n clientIpSource,\n userAgent,\n userId: instr.userId,\n safetyIdentifier: instr.safetyIdentifier,\n promptCacheKey: instr.promptCacheKey,\n initiator: instr.initiator,\n isSubagent: instr.isSubagent,\n upstreamRequestId: instr.upstreamRequestId,\n affinityHit: instr.affinityHit,\n affinityCacheKey: instr.affinityCacheKey,\n affinityKeyUsed: instr.affinityKeyUsed,\n affinityKeySource: instr.affinityKeySource,\n selectionReason: instr.selectionReason,\n clientModel,\n upstreamEndpoint,\n accountId: account.id,\n accountType: account.accountType,\n costUnits,\n upstreamModel,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n ...record,\n responsesItemOwnerLookupKeysJson: stringifyOwnerKeys(\n instr.responsesItemOwnerLookupKeys,\n ),\n responsesItemOwnerRecordedKeysJson: stringifyOwnerKeys(\n instr.responsesItemOwnerRecordedKeys,\n ),\n })\n void flushPendingCapture(requestId)\n}\n\nasync function finalizeQuotaAndGetPremiumSnapshot(\n instr: InstrumentationContext,\n): Promise<{\n premiumRemainingAfter: number | undefined\n premiumUnlimitedAfter: boolean | undefined\n premiumRemainingDiff: number | undefined\n}> {\n await accountsManager.finalizeQuota(instr.account, instr.reservation)\n\n const premiumRemainingAfter = instr.account.premiumRemaining\n const premiumUnlimitedAfter = instr.account.unlimited\n\n return {\n premiumRemainingAfter,\n premiumUnlimitedAfter,\n premiumRemainingDiff: computeDiff(\n instr.premiumRemainingBefore,\n premiumRemainingAfter,\n ),\n }\n}\n\nasync function handleChatCompletionsCreateError(params: {\n error: unknown\n instr: InstrumentationContext\n stream: boolean\n}): Promise<never> {\n const { error, instr, stream } = params\n\n const finishedAtMs = Date.now()\n const details = await extractErrorObservability(error)\n\n if (shouldMarkAccountFailed(details)) {\n accountsManager.markAccountFailed(instr.account.id, \"Unauthorized (401)\")\n }\n\n const { premiumRemainingAfter, premiumUnlimitedAfter, premiumRemainingDiff } =\n await finalizeQuotaAndGetPremiumSnapshot(instr)\n\n insertRequestLog(instr, {\n finishedAtMs,\n durationMs: finishedAtMs - instr.startedAtMs,\n stream,\n premiumRemainingAfter,\n premiumUnlimitedAfter,\n premiumRemainingDiff,\n httpStatus: details.httpStatus,\n errorName: details.errorName,\n errorStatus: details.errorStatus,\n errorMessage: details.errorMessage,\n upstreamErrorMessageRaw: details.upstreamErrorMessageRaw,\n })\n\n throw error\n}\n\nasync function handleChatCompletionsNonStreaming(params: {\n c: Context\n response: ChatCompletionResponse\n instr: InstrumentationContext\n}): Promise<Response> {\n const { c, response, instr } = params\n\n let httpStatus = 200\n const usage: NormalizedUsage = normalizeChatCompletionsUsage(response.usage)\n\n let errorName: string | undefined\n let errorStatus: number | undefined\n let errorMessage: string | undefined\n let upstreamErrorMessageRaw: string | undefined\n\n const finishedAtMs = Date.now()\n\n try {\n logger.debug(\n \"Non-streaming response from Copilot:\",\n JSON.stringify(response),\n )\n\n const anthropicResponse = translateToAnthropic(response)\n debugJson(logger, \"Translated Anthropic response:\", anthropicResponse)\n\n return c.json(anthropicResponse)\n } catch (error) {\n const details = await extractErrorObservability(error)\n\n httpStatus = details.httpStatus\n\n errorName = details.errorName\n errorStatus = details.errorStatus\n errorMessage = details.errorMessage\n upstreamErrorMessageRaw = details.upstreamErrorMessageRaw\n\n if (shouldMarkAccountFailed(details)) {\n accountsManager.markAccountFailed(instr.account.id, \"Unauthorized (401)\")\n }\n\n throw error\n } finally {\n const {\n premiumRemainingAfter,\n premiumUnlimitedAfter,\n premiumRemainingDiff,\n } = await finalizeQuotaAndGetPremiumSnapshot(instr)\n\n insertRequestLog(instr, {\n finishedAtMs,\n durationMs: finishedAtMs - instr.startedAtMs,\n stream: false,\n ...usage,\n premiumRemainingAfter,\n premiumUnlimitedAfter,\n premiumRemainingDiff,\n httpStatus,\n errorName,\n errorStatus,\n errorMessage,\n upstreamErrorMessageRaw,\n })\n }\n}\n\nasync function streamChatCompletionsAndLog(params: {\n stream: StreamSseStream\n response: ChatCompletionsStream\n instr: InstrumentationContext\n estimatedInputTokens?: number\n historicalUsage?: NormalizedUsage\n}): Promise<void> {\n const { stream, response, instr, estimatedInputTokens, historicalUsage } =\n params\n\n let ttfbMs: number | undefined\n let lastUsage: NormalizedUsage = {}\n\n let errorName: string | undefined\n let errorStatus: number | undefined\n let errorMessage: string | undefined\n let upstreamErrorMessageRaw: string | undefined\n\n const streamState: AnthropicStreamState = {\n messageStartSent: false,\n contentBlockIndex: 0,\n contentBlockOpen: false,\n toolCalls: {},\n thinkingBlockOpen: false,\n estimatedInputTokens,\n historicalInputTokens: historicalUsage?.tokensInput,\n historicalOutputTokens: historicalUsage?.tokensOutput,\n historicalCachedInputTokens: historicalUsage?.tokensCachedInput,\n }\n\n try {\n for await (const rawEvent of response) {\n if (ttfbMs === undefined) {\n ttfbMs = Date.now() - instr.startedAtMs\n }\n\n logger.debug(\"Copilot raw stream event:\", JSON.stringify(rawEvent))\n\n const { data: rawData } = rawEvent as {\n data?: string | Promise<string>\n }\n const data = typeof rawData === \"string\" ? rawData : await rawData\n\n if (data === \"[DONE]\") {\n break\n }\n\n if (!data) {\n continue\n }\n\n const chunk = JSON.parse(data) as ChatCompletionChunk\n if (chunk.usage) {\n lastUsage = normalizeChatCompletionsUsage(chunk.usage)\n }\n\n const events = translateChunkToAnthropicEvents(chunk, streamState)\n for (const event of events) {\n logger.debug(\"Translated Anthropic event:\", JSON.stringify(event))\n\n await stream.writeSSE({\n event: event.type,\n data: JSON.stringify(event),\n })\n }\n }\n } catch (error) {\n const details = await extractErrorObservability(error)\n\n errorName = details.errorName\n errorStatus = details.errorStatus\n errorMessage = details.errorMessage\n upstreamErrorMessageRaw = details.upstreamErrorMessageRaw\n\n logger.warn(\"Streaming error:\", error)\n\n if (shouldMarkAccountFailed(details)) {\n accountsManager.markAccountFailed(instr.account.id, \"Unauthorized (401)\")\n }\n\n await writeAnthropicStreamError(stream, getUserVisibleErrorMessage(details))\n } finally {\n const finishedAtMs = Date.now()\n\n const {\n premiumRemainingAfter,\n premiumUnlimitedAfter,\n premiumRemainingDiff,\n } = await finalizeQuotaAndGetPremiumSnapshot(instr)\n\n insertRequestLog(instr, {\n finishedAtMs,\n durationMs: finishedAtMs - instr.startedAtMs,\n ttfbMs,\n stream: true,\n ...lastUsage,\n premiumRemainingAfter,\n premiumUnlimitedAfter,\n premiumRemainingDiff,\n httpStatus: errorStatus ?? (errorName ? 500 : 200),\n errorName,\n errorStatus,\n errorMessage,\n upstreamErrorMessageRaw,\n })\n }\n}\n\nfunction invalidateAffinityOnOwnershipMismatch(\n ownershipMismatch: boolean,\n instr: Pick<InstrumentationContext, \"affinityHit\" | \"affinityCacheKey\">,\n): void {\n if (ownershipMismatch && instr.affinityHit && instr.affinityCacheKey) {\n accountsManager.invalidateAffinity(instr.affinityCacheKey)\n }\n}\n\nasync function handleResponsesCreateError(params: {\n error: unknown\n instr: InstrumentationContext\n stream: boolean\n}): Promise<never> {\n const { error, instr, stream } = params\n\n const finishedAtMs = Date.now()\n const details = await extractErrorObservability(error)\n\n invalidateAffinityOnOwnershipMismatch(details.ownershipMismatch, instr)\n\n if (shouldMarkAccountFailed(details)) {\n accountsManager.markAccountFailed(instr.account.id, \"Unauthorized (401)\")\n }\n\n const { premiumRemainingAfter, premiumUnlimitedAfter, premiumRemainingDiff } =\n await finalizeQuotaAndGetPremiumSnapshot(instr)\n\n insertRequestLog(instr, {\n finishedAtMs,\n durationMs: finishedAtMs - instr.startedAtMs,\n stream,\n premiumRemainingAfter,\n premiumUnlimitedAfter,\n premiumRemainingDiff,\n httpStatus: details.httpStatus,\n errorName: details.errorName,\n errorStatus: details.errorStatus,\n errorMessage: details.errorMessage,\n upstreamErrorMessageRaw: details.upstreamErrorMessageRaw,\n })\n\n throw error\n}\n\nasync function handleResponsesNonStreaming(params: {\n c: Context\n result: ResponsesResult\n instr: InstrumentationContext\n}): Promise<Response> {\n const { c, result, instr } = params\n\n let httpStatus = 200\n let usage: NormalizedUsage = {}\n\n let errorName: string | undefined\n let errorStatus: number | undefined\n let errorMessage: string | undefined\n let upstreamErrorMessageRaw: string | undefined\n\n const finishedAtMs = Date.now()\n\n try {\n usage = extractResponsesUsageFromResult(result)\n const responseOwnerKeys = extractResponsesResultOwnerKeys(result)\n instr.responsesItemOwnerRecordedKeys = responseOwnerKeys\n\n logger.debug(\n \"Non-streaming Responses result:\",\n JSON.stringify(result).slice(-400),\n )\n\n const anthropicResponse = translateResponsesResultToAnthropic(result)\n debugJson(logger, \"Translated Anthropic response:\", anthropicResponse)\n\n const response = c.json(anthropicResponse)\n if (result.status === \"completed\") {\n accountsManager.recordResponsesItemOwnership(\n responseOwnerKeys,\n instr.account.id,\n )\n }\n\n return response\n } catch (error) {\n const details = await extractErrorObservability(error)\n\n httpStatus = details.httpStatus\n\n errorName = details.errorName\n errorStatus = details.errorStatus\n errorMessage = details.errorMessage\n upstreamErrorMessageRaw = details.upstreamErrorMessageRaw\n\n if (shouldMarkAccountFailed(details)) {\n accountsManager.markAccountFailed(instr.account.id, \"Unauthorized (401)\")\n }\n\n throw error\n } finally {\n const {\n premiumRemainingAfter,\n premiumUnlimitedAfter,\n premiumRemainingDiff,\n } = await finalizeQuotaAndGetPremiumSnapshot(instr)\n\n insertRequestLog(instr, {\n finishedAtMs,\n durationMs: finishedAtMs - instr.startedAtMs,\n stream: false,\n ...usage,\n premiumRemainingAfter,\n premiumUnlimitedAfter,\n premiumRemainingDiff,\n httpStatus,\n errorName,\n errorStatus,\n errorMessage,\n upstreamErrorMessageRaw,\n })\n }\n}\n\nasync function ensureResponsesStreamCompleted(params: {\n stream: StreamSseStream\n streamState: ReturnType<typeof createResponsesStreamState>\n setStreamError: (name: string, message: string) => void\n}): Promise<void> {\n const { stream, streamState, setStreamError } = params\n\n if (streamState.messageCompleted) {\n return\n }\n\n logger.warn(\"Responses stream ended without completion; sending error event\")\n\n const msg = \"Responses stream ended without completion\"\n const errorEvent = buildErrorEvent(msg)\n\n setStreamError(\"StreamIncomplete\", msg)\n\n await stream.writeSSE({\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n })\n}\n\nasync function writeAnthropicStreamError(\n stream: StreamSseStream,\n message: string,\n): Promise<void> {\n try {\n const errorEvent = buildErrorEvent(message)\n await stream.writeSSE({\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n })\n } catch (streamError) {\n logger.warn(\"Failed to write Anthropic stream error event:\", streamError)\n }\n}\n\nfunction collectResponsesStreamOwnerKeys(\n event: ResponseStreamEvent,\n responseOwnerKeys: Set<string>,\n): void {\n for (const key of extractResponsesStreamEventOwnerKeys(event)) {\n responseOwnerKeys.add(key)\n }\n}\n\nfunction createResponsesStreamStateWithUsage(params: {\n estimatedInputTokens?: number\n historicalUsage?: NormalizedUsage\n}): ReturnType<typeof createResponsesStreamState> {\n const streamState = createResponsesStreamState()\n streamState.estimatedInputTokens = params.estimatedInputTokens\n streamState.historicalInputTokens = params.historicalUsage?.tokensInput\n streamState.historicalOutputTokens = params.historicalUsage?.tokensOutput\n streamState.historicalCachedInputTokens =\n params.historicalUsage?.tokensCachedInput\n return streamState\n}\n\nfunction recordStreamOwnerKeys(\n streamState: ReturnType<typeof createResponsesStreamState>,\n responseOwnerKeys: Set<string>,\n instr: InstrumentationContext,\n): void {\n if (!streamState.messageCompleted) {\n return\n }\n\n const ownerKeys = [...responseOwnerKeys]\n instr.responsesItemOwnerRecordedKeys = ownerKeys\n if (streamState.responseStatus === \"completed\") {\n accountsManager.recordResponsesItemOwnership(ownerKeys, instr.account.id)\n }\n}\n\nfunction getResponsesStreamEventError(event: ResponseStreamEvent):\n | {\n errorName: string\n errorStatus: number\n errorMessage: string\n upstreamErrorMessageRaw: string\n }\n | undefined {\n if (event.type === \"response.failed\") {\n const message =\n event.response.error?.message ?? \"Responses stream failed upstream.\"\n return {\n errorName: \"ResponsesStreamFailed\",\n errorStatus: 502,\n errorMessage: message,\n upstreamErrorMessageRaw: message,\n }\n }\n\n if (event.type === \"error\") {\n const message = event.message || \"Responses stream returned an error.\"\n return {\n errorName: \"ResponsesStreamError\",\n errorStatus: 502,\n errorMessage: message,\n upstreamErrorMessageRaw: message,\n }\n }\n\n return undefined\n}\n\nasync function writeTranslatedAnthropicStreamEvents(\n stream: StreamSseStream,\n events: Array<AnthropicStreamEventData>,\n): Promise<void> {\n for (const event of events) {\n const eventData = JSON.stringify(event)\n logger.debug(\"Translated Anthropic event:\", eventData)\n await stream.writeSSE({\n event: event.type,\n data: eventData,\n })\n }\n}\n\nasync function streamResponsesAndLog(params: {\n stream: StreamSseStream\n response: AsyncIterable<unknown>\n instr: InstrumentationContext\n estimatedInputTokens?: number\n historicalUsage?: NormalizedUsage\n}): Promise<void> {\n const { stream, response, instr } = params\n\n let ttfbMs: number | undefined\n let lastUsage: NormalizedUsage = {}\n\n let errorName: string | undefined\n let errorStatus: number | undefined\n let errorMessage: string | undefined\n let upstreamErrorMessageRaw: string | undefined\n\n const streamState = createResponsesStreamStateWithUsage(params)\n const responseOwnerKeys = new Set<string>()\n\n try {\n for await (const chunk of response) {\n if (ttfbMs === undefined) {\n ttfbMs = Date.now() - instr.startedAtMs\n }\n\n const eventName = (chunk as { event?: string }).event\n if (eventName === \"ping\") {\n await stream.writeSSE({ event: \"ping\", data: '{\"type\":\"ping\"}' })\n continue\n }\n\n const data = (chunk as { data?: string }).data\n if (!data) {\n continue\n }\n\n logger.debug(\"Responses raw stream event:\", data)\n\n const parsed = JSON.parse(data) as ResponseStreamEvent\n const streamEventError = getResponsesStreamEventError(parsed)\n if (streamEventError) {\n errorName = streamEventError.errorName\n errorStatus = streamEventError.errorStatus\n errorMessage = streamEventError.errorMessage\n upstreamErrorMessageRaw = streamEventError.upstreamErrorMessageRaw\n }\n\n collectResponsesStreamOwnerKeys(parsed, responseOwnerKeys)\n const u = extractResponsesUsageFromStreamEvent(parsed)\n if (u.usageJson) {\n lastUsage = u\n }\n\n const events = translateResponsesStreamEvent(parsed, streamState)\n await writeTranslatedAnthropicStreamEvents(stream, events)\n\n if (streamState.messageCompleted) {\n logger.debug(\"Message completed, ending stream\")\n break\n }\n }\n\n await ensureResponsesStreamCompleted({\n stream,\n streamState,\n setStreamError: (name, message) => {\n errorName = name\n errorMessage = message\n },\n })\n\n recordStreamOwnerKeys(streamState, responseOwnerKeys, instr)\n } catch (error) {\n const details = await extractErrorObservability(error)\n\n errorName = details.errorName\n errorStatus = details.errorStatus\n errorMessage = details.errorMessage\n upstreamErrorMessageRaw = details.upstreamErrorMessageRaw\n\n logger.warn(\"Streaming error:\", error)\n\n invalidateAffinityOnOwnershipMismatch(details.ownershipMismatch, instr)\n\n if (shouldMarkAccountFailed(details)) {\n accountsManager.markAccountFailed(instr.account.id, \"Unauthorized (401)\")\n }\n\n await writeAnthropicStreamError(stream, getUserVisibleErrorMessage(details))\n } finally {\n const finishedAtMs = Date.now()\n\n const {\n premiumRemainingAfter,\n premiumUnlimitedAfter,\n premiumRemainingDiff,\n } = await finalizeQuotaAndGetPremiumSnapshot(instr)\n\n insertRequestLog(instr, {\n finishedAtMs,\n durationMs: finishedAtMs - instr.startedAtMs,\n ttfbMs,\n stream: true,\n ...lastUsage,\n premiumRemainingAfter,\n premiumUnlimitedAfter,\n premiumRemainingDiff,\n httpStatus: errorStatus ?? (errorName ? 500 : 200),\n errorName,\n errorStatus,\n errorMessage,\n upstreamErrorMessageRaw,\n })\n }\n}\n\nasync function handleMessagesCreateError(params: {\n error: unknown\n instr: InstrumentationContext\n stream: boolean\n}): Promise<never> {\n const { error, instr, stream } = params\n\n const finishedAtMs = Date.now()\n const details = await extractErrorObservability(error)\n\n if (shouldMarkAccountFailed(details)) {\n accountsManager.markAccountFailed(instr.account.id, \"Unauthorized (401)\")\n }\n\n const { premiumRemainingAfter, premiumUnlimitedAfter, premiumRemainingDiff } =\n await finalizeQuotaAndGetPremiumSnapshot(instr)\n\n insertRequestLog(instr, {\n finishedAtMs,\n durationMs: finishedAtMs - instr.startedAtMs,\n stream,\n premiumRemainingAfter,\n premiumUnlimitedAfter,\n premiumRemainingDiff,\n httpStatus: details.httpStatus,\n errorName: details.errorName,\n errorStatus: details.errorStatus,\n errorMessage: details.errorMessage,\n upstreamErrorMessageRaw: details.upstreamErrorMessageRaw,\n })\n\n throw error\n}\n\nasync function handleMessagesNonStreaming(params: {\n c: Context\n response: AnthropicResponse\n instr: InstrumentationContext\n}): Promise<Response> {\n const { c, response, instr } = params\n\n let httpStatus = 200\n const usage = normalizeMessagesUsage(response.usage)\n\n let errorName: string | undefined\n let errorStatus: number | undefined\n let errorMessage: string | undefined\n let upstreamErrorMessageRaw: string | undefined\n\n const finishedAtMs = Date.now()\n\n try {\n logger.debug(\n \"Non-streaming Messages result:\",\n JSON.stringify(response).slice(-400),\n )\n return c.json(response)\n } catch (error) {\n const details = await extractErrorObservability(error)\n\n httpStatus = details.httpStatus\n errorName = details.errorName\n errorStatus = details.errorStatus\n errorMessage = details.errorMessage\n upstreamErrorMessageRaw = details.upstreamErrorMessageRaw\n\n if (shouldMarkAccountFailed(details)) {\n accountsManager.markAccountFailed(instr.account.id, \"Unauthorized (401)\")\n }\n\n throw error\n } finally {\n const {\n premiumRemainingAfter,\n premiumUnlimitedAfter,\n premiumRemainingDiff,\n } = await finalizeQuotaAndGetPremiumSnapshot(instr)\n\n insertRequestLog(instr, {\n finishedAtMs,\n durationMs: finishedAtMs - instr.startedAtMs,\n stream: false,\n ...usage,\n premiumRemainingAfter,\n premiumUnlimitedAfter,\n premiumRemainingDiff,\n httpStatus,\n errorName,\n errorStatus,\n errorMessage,\n upstreamErrorMessageRaw,\n })\n }\n}\n\nconst parseMessagesStreamUsage = (data: string): NormalizedUsage | null => {\n if (!data || data === \"[DONE]\") return null\n\n try {\n const parsed = JSON.parse(data) as AnthropicStreamEventData\n if (parsed.type === \"error\") {\n throw new Error(parsed.error.message)\n }\n if (parsed.type !== \"message_delta\" || !parsed.usage) {\n return null\n }\n\n return normalizeMessagesUsage(parsed.usage)\n } catch (error) {\n logger.warn(\"Failed to parse messages stream event\", error)\n throw new Error(\"Failed to parse messages stream event\", { cause: error })\n }\n}\n\nasync function streamMessagesAndLog(params: {\n stream: StreamSseStream\n response: AsyncIterable<unknown>\n instr: InstrumentationContext\n}): Promise<void> {\n const { stream, response, instr } = params\n\n let ttfbMs: number | undefined\n let lastUsage: NormalizedUsage = {}\n\n let errorName: string | undefined\n let errorStatus: number | undefined\n let errorMessage: string | undefined\n let upstreamErrorMessageRaw: string | undefined\n\n try {\n for await (const rawEvent of response) {\n if (ttfbMs === undefined) {\n ttfbMs = Date.now() - instr.startedAtMs\n }\n\n const eventNameRaw = (rawEvent as { event?: string }).event\n const eventName =\n typeof eventNameRaw === \"string\" && eventNameRaw.length > 0 ?\n eventNameRaw\n : \"message\"\n const data = (rawEvent as { data?: string }).data ?? \"\"\n logger.debug(\"Messages raw stream event:\", data)\n\n const usage = parseMessagesStreamUsage(data)\n if (usage) {\n lastUsage = usage\n }\n\n await stream.writeSSE({\n event: eventName,\n data,\n })\n }\n } catch (error) {\n const details = await extractErrorObservability(error)\n\n errorName = details.errorName\n errorStatus = details.errorStatus\n errorMessage = details.errorMessage\n upstreamErrorMessageRaw = details.upstreamErrorMessageRaw\n\n logger.warn(\"Streaming error:\", error)\n\n if (shouldMarkAccountFailed(details)) {\n accountsManager.markAccountFailed(instr.account.id, \"Unauthorized (401)\")\n }\n\n await writeAnthropicStreamError(stream, getUserVisibleErrorMessage(details))\n } finally {\n const finishedAtMs = Date.now()\n\n const {\n premiumRemainingAfter,\n premiumUnlimitedAfter,\n premiumRemainingDiff,\n } = await finalizeQuotaAndGetPremiumSnapshot(instr)\n\n insertRequestLog(instr, {\n finishedAtMs,\n durationMs: finishedAtMs - instr.startedAtMs,\n ttfbMs,\n stream: true,\n ...lastUsage,\n premiumRemainingAfter,\n premiumUnlimitedAfter,\n premiumRemainingDiff,\n httpStatus: errorStatus ?? (errorName ? 500 : 200),\n errorName,\n errorStatus,\n errorMessage,\n upstreamErrorMessageRaw,\n })\n }\n}\n\nconst handleWithMessagesApi = async (params: {\n c: Context\n anthropicPayload: AnthropicMessagesPayload\n anthropicBetaHeader?: string\n subagentMarker?: SubagentMarker | null\n sessionId?: string\n instr: InstrumentationContext\n selectedModel: Model\n compactType?: CompactType\n}): Promise<Response> => {\n const {\n c,\n anthropicPayload,\n anthropicBetaHeader,\n subagentMarker,\n sessionId,\n instr,\n selectedModel,\n compactType,\n } = params\n\n prepareMessagesApiPayload(anthropicPayload, selectedModel)\n\n debugJson(logger, \"Translated Messages payload:\", anthropicPayload)\n\n const ctx = toAccountContext(instr.account)\n const initiator = getMessagesInitiator(anthropicPayload)\n const isCompact = compactType !== 0\n const effectiveInitiator = resolveEffectiveInitiator(initiator, {\n isCompact,\n isSubagent: Boolean(subagentMarker),\n })\n\n instr.initiator = effectiveInitiator\n\n let response: MessagesResult\n\n try {\n response = await createMessages(anthropicPayload, ctx, {\n anthropicBetaHeader,\n upstreamRequestId: instr.upstreamRequestId,\n initiator: effectiveInitiator,\n subagentMarker,\n sessionId,\n compactType,\n requestId: instr.requestId,\n })\n instr.confirmAffinity?.()\n instr.confirmOwnership?.()\n } catch (error) {\n return await handleMessagesCreateError({\n error,\n instr,\n stream: Boolean(anthropicPayload.stream),\n })\n }\n\n if (isAsyncIterable(response)) {\n logger.debug(\"Streaming response from Copilot (Messages API)\")\n return streamSSE(c, (stream) =>\n streamMessagesAndLog({\n stream,\n response,\n instr,\n }),\n )\n }\n\n return handleMessagesNonStreaming({\n c,\n response,\n instr,\n })\n}\n\nconst isNonStreaming = (\n response: Awaited<ReturnType<typeof createChatCompletions>>,\n): response is ChatCompletionResponse => Object.hasOwn(response, \"choices\")\n\nconst isAsyncIterable = <T>(value: unknown): value is AsyncIterable<T> =>\n Boolean(value)\n && typeof (value as AsyncIterable<T>)[Symbol.asyncIterator] === \"function\"\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\n\nimport { handleCountTokens } from \"./count-tokens-handler\"\nimport { handleCompletion } from \"./handler\"\n\nexport const messageRoutes = new Hono()\n\nmessageRoutes.post(\"/\", async (c) => {\n try {\n return await handleCompletion(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n\nmessageRoutes.post(\"/count_tokens\", async (c) => {\n try {\n return await handleCountTokens(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import { Hono } from \"hono\"\n\nimport { getAliasTargetSet, getModelAliases } from \"~/lib/config\"\nimport { forwardError } from \"~/lib/error\"\nimport { getAvailableModels } from \"~/lib/models\"\n\nexport const modelRoutes = new Hono()\n\nmodelRoutes.get(\"/\", async (c) => {\n try {\n const blockedTargets = getAliasTargetSet()\n const models = getAvailableModels()\n .filter((model) => !blockedTargets.has(model.id.toLowerCase()))\n .map((model) => {\n const is1m =\n model.capabilities.limits?.max_context_window_tokens === 1_000_000\n return {\n id: is1m ? `${model.id}[1m]` : model.id,\n object: \"model\",\n type: \"model\",\n created: 0,\n created_at: new Date(0).toISOString(),\n owned_by: model.vendor,\n display_name: model.name,\n }\n })\n\n const aliasItems = Object.keys(getModelAliases())\n const aliasModels = aliasItems.map((alias) => ({\n id: alias,\n object: \"model\",\n type: \"model\",\n created: 0,\n created_at: new Date(0).toISOString(),\n owned_by: \"alias\",\n display_name: alias,\n }))\n\n const merged = new Map<string, (typeof models)[number]>()\n for (const model of models) {\n merged.set(model.id, model)\n }\n for (const model of aliasModels) {\n if (!merged.has(model.id)) {\n merged.set(model.id, model)\n }\n }\n\n return c.json({\n object: \"list\",\n data: Array.from(merged.values()),\n has_more: false,\n })\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\n\nimport { handleProviderCountTokens } from \"./count-tokens-handler\"\nimport { handleProviderMessages } from \"./handler\"\n\nexport const providerMessageRoutes = new Hono()\n\nproviderMessageRoutes.post(\"/\", async (c) => {\n try {\n return await handleProviderMessages(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n\nproviderMessageRoutes.post(\"/count_tokens\", async (c) => {\n try {\n return await handleProviderCountTokens(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import type { Model, ModelsResponse } from \"~/services/copilot/get-models\"\n\ninterface CodexModelDefinition {\n contextWindow: number\n id: string\n input: Array<\"text\" | \"image\">\n maxTokens: number\n name: string\n}\n\nconst CODEX_MODELS: Array<CodexModelDefinition> = [\n {\n contextWindow: 100_000,\n id: \"gpt-5.3-codex-spark\",\n input: [\"text\"],\n maxTokens: 32_000,\n name: \"GPT-5.3 Codex Spark\",\n },\n {\n contextWindow: 400_000,\n id: \"gpt-5.4\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-5.4\",\n },\n {\n contextWindow: 400_000,\n id: \"gpt-5.4-mini\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-5.4 mini\",\n },\n {\n contextWindow: 272_000,\n id: \"gpt-5.5\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-5.5\",\n },\n]\n\nfunction normalizeCodexModel(model: CodexModelDefinition): Model {\n const supportsVision = model.input.includes(\"image\")\n\n return {\n capabilities: {\n family: \"gpt\",\n limits: {\n max_context_window_tokens: model.contextWindow,\n max_output_tokens: model.maxTokens,\n max_prompt_tokens: model.contextWindow,\n },\n object: \"model_capabilities\",\n supports: {\n adaptive_thinking: true,\n parallel_tool_calls: true,\n reasoning_effort: [\"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"],\n streaming: true,\n tool_calls: true,\n vision: supportsVision,\n },\n tokenizer: \"o200k_base\",\n type: \"chat\",\n },\n id: model.id,\n model_picker_enabled: true,\n name: model.name,\n object: \"model\",\n preview: false,\n supported_endpoints: [\"/v1/messages\", \"/v1/responses\"],\n vendor: \"openai\",\n version: \"chatgpt-codex\",\n }\n}\n\nexport function getModels(): ModelsResponse {\n return {\n object: \"list\",\n data: CODEX_MODELS.map((model) => normalizeCodexModel(model)),\n }\n}\n","import { type Context, Hono } from \"hono\"\n\nimport { getProviderConfig, type ResolvedProviderConfig } from \"~/lib/config\"\nimport { forwardError } from \"~/lib/error\"\nimport { createHandlerLogger } from \"~/lib/logger\"\nimport { getModels as getCodexModels } from \"~/services/codex/get-models\"\nimport {\n createProviderProxyResponse,\n forwardProviderModels,\n} from \"~/services/providers/provider-proxy\"\n\nconst logger = createHandlerLogger(\"provider-models-handler\")\n\ntype ProviderConfigResolver = (\n provider: string,\n) => ResolvedProviderConfig | null\n\nconst getProviderFetch = (c: Context): typeof fetch =>\n (c.get(\"providerFetch\" as never) as typeof fetch | undefined) ?? fetch\n\nconst resolveProviderConfig = (\n c: Context,\n provider: string,\n): ResolvedProviderConfig | null => {\n const resolver = c.get(\"providerConfigResolver\" as never) as\n | ProviderConfigResolver\n | undefined\n return (resolver ?? getProviderConfig)(provider)\n}\n\nexport const providerModelRoutes = new Hono()\n\nproviderModelRoutes.get(\"/\", async (c) => {\n const provider = c.req.param(\"provider\") ?? \"\"\n\n try {\n const providerConfig = resolveProviderConfig(c, provider)\n if (!providerConfig) {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' not found or disabled`,\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n if (providerConfig.name === \"codex\") {\n const models = getCodexModels()\n return c.json({\n object: \"list\",\n data: models.data,\n has_more: false,\n })\n }\n\n const upstreamResponse = await forwardProviderModels(\n providerConfig,\n c.req.raw.headers,\n getProviderFetch(c),\n )\n\n logger.debug(\"provider.models.response\", {\n provider,\n statusCode: upstreamResponse.status,\n })\n\n return createProviderProxyResponse(upstreamResponse)\n } catch (error) {\n logger.error(\"provider.models.error\", {\n provider,\n error,\n })\n return await forwardError(c, error)\n }\n})\n","/**\n * Stream ID Synchronization for @ai-sdk/openai compatibility\n *\n * Problem: GitHub Copilot's Responses API returns different IDs for the same\n * item in 'added' vs 'done' events. This breaks @ai-sdk/openai which expects\n * consistent IDs across the stream lifecycle.\n *\n * Errors without this fix:\n * - \"activeReasoningPart.summaryParts\" undefined\n * - \"text part not found\"\n *\n * Use case: OpenCode (AI coding assistant) using Codex models (gpt-5.2-codex)\n * via @ai-sdk/openai provider requires the Responses API endpoint.\n */\n\nimport type {\n ResponseOutputItemAddedEvent,\n ResponseOutputItemDoneEvent,\n ResponseStreamEvent,\n} from \"~/services/copilot/create-responses\"\n\ninterface StreamIdTracker {\n outputItems: Map<number, string>\n}\n\nexport const createStreamIdTracker = (): StreamIdTracker => ({\n outputItems: new Map(),\n})\n\nexport const fixStreamIds = (\n data: string,\n event: string | undefined,\n tracker: StreamIdTracker,\n): string => {\n if (!data) return data\n const parsed = JSON.parse(data) as ResponseStreamEvent\n switch (event) {\n case \"response.output_item.added\": {\n return handleOutputItemAdded(\n parsed as ResponseOutputItemAddedEvent,\n tracker,\n )\n }\n case \"response.output_item.done\": {\n return handleOutputItemDone(\n parsed as ResponseOutputItemDoneEvent,\n tracker,\n )\n }\n default: {\n return handleItemId(parsed, tracker)\n }\n }\n}\n\nconst handleOutputItemAdded = (\n parsed: ResponseOutputItemAddedEvent,\n tracker: StreamIdTracker,\n): string => {\n if (!parsed.item.id) {\n let randomSuffix = \"\"\n while (randomSuffix.length < 16) {\n randomSuffix += Math.random().toString(36).slice(2)\n }\n parsed.item.id = `oi_${parsed.output_index}_${randomSuffix.slice(0, 16)}`\n }\n\n const outputIndex = parsed.output_index\n tracker.outputItems.set(outputIndex, parsed.item.id)\n return JSON.stringify(parsed)\n}\n\nconst handleOutputItemDone = (\n parsed: ResponseOutputItemDoneEvent,\n tracker: StreamIdTracker,\n): string => {\n const outputIndex = parsed.output_index\n const originalId = tracker.outputItems.get(outputIndex)\n if (originalId) {\n parsed.item.id = originalId\n }\n return JSON.stringify(parsed)\n}\n\nconst handleItemId = (\n parsed: ResponseStreamEvent & { output_index?: number; item_id?: string },\n tracker: StreamIdTracker,\n): string => {\n const outputIndex = parsed.output_index\n if (outputIndex !== undefined) {\n const itemId = tracker.outputItems.get(outputIndex)\n if (itemId) {\n parsed.item_id = itemId\n }\n }\n return JSON.stringify(parsed)\n}\n","import type { Context } from \"hono\"\n\nimport { streamSSE } from \"hono/streaming\"\nimport { randomUUID } from \"node:crypto\"\n\nimport {\n accountsManager,\n type AccountSelectionReason,\n} from \"~/lib/accounts-manager\"\nimport { awaitApproval } from \"~/lib/approval\"\nimport { getAliasTargetSet, isResponsesApiWebSearchEnabled } from \"~/lib/config\"\nimport {\n computeDiff,\n extractErrorObservability,\n getUserVisibleErrorMessage,\n shouldMarkAccountFailed,\n toAccountContext,\n} from \"~/lib/handler-utils\"\nimport { createHandlerLogger, debugJson, debugJsonTail } from \"~/lib/logger\"\nimport { checkRateLimit } from \"~/lib/rate-limit\"\nimport {\n extractResponsesUsageFromResult,\n extractResponsesUsageFromStreamEvent,\n getClientIpInfo,\n getRequestHistoryStore,\n type NormalizedUsage,\n} from \"~/lib/request-history\"\nimport { state } from \"~/lib/state\"\nimport {\n generateRequestIdFromPayload,\n getUUID,\n parseUserIdMetadata,\n resolveAffinityKey,\n type AffinityKeySource,\n} from \"~/lib/utils\"\nimport { flushPendingCapture } from \"~/services/copilot/copilot-fetch\"\nimport {\n createResponses,\n type ResponsesPayload,\n type ResponsesResult,\n type ResponsesTransport,\n type ResponseErrorEvent,\n type ResponseStreamEvent,\n} from \"~/services/copilot/create-responses\"\n\nimport { createStreamIdTracker, fixStreamIds } from \"./stream-id-sync\"\nimport {\n applyResponsesApiContextManagement,\n compactInputByLatestCompaction,\n getResponsesRequestOptions,\n getResponsesTransportForModel,\n getStreamChunkFields,\n isAsyncIterable,\n removeWebSearchTool,\n} from \"./utils\"\n\nconst logger = createHandlerLogger(\"responses-handler\")\n\nconst RESPONSES_ENDPOINT = \"/responses\"\n\n// eslint-disable-next-line max-lines-per-function\nexport const handleResponses = async (c: Context) => {\n await checkRateLimit(state)\n\n const store = getRequestHistoryStore()\n const request = buildRequestContext(c)\n\n const payload = await c.req.json<ResponsesPayload>()\n const clientModel = payload.model\n debugJson(logger, \"Responses request payload:\", payload)\n\n if (!isResponsesApiWebSearchEnabled()) {\n removeWebSearchTool(payload)\n }\n compactInputByLatestCompaction(payload)\n\n const streamRequested = Boolean(payload.stream)\n const { initiator: initialInitiator } = getResponsesRequestOptions(payload)\n const userId = (payload.metadata as { user_id?: string } | null | undefined)\n ?.user_id\n const requestBodyPromptCacheKey =\n typeof payload.prompt_cache_key === \"string\" ?\n payload.prompt_cache_key\n : null\n const { safetyIdentifier, sessionId: metadataSessionId } =\n parseUserIdMetadata(userId)\n const normalizedSafetyIdentifier = safetyIdentifier ?? undefined\n const normalizedPromptCacheKey =\n requestBodyPromptCacheKey ?? metadataSessionId ?? undefined\n\n request.userId = userId\n request.safetyIdentifier = normalizedSafetyIdentifier\n request.promptCacheKey = normalizedPromptCacheKey\n request.initiator = initialInitiator\n\n const blockedTargets = getAliasTargetSet()\n if (blockedTargets.has(clientModel.toLowerCase())) {\n recordSelectionFailure(store, {\n request,\n stream: streamRequested,\n clientModel,\n reason: \"MODEL_NOT_SUPPORTED\",\n })\n\n return selectionFailureResponse(c, {\n reason: \"MODEL_NOT_SUPPORTED\",\n message:\n \"This model is only available via an alias. Please use the alias model name.\",\n })\n }\n\n const upstreamRequestId = generateRequestIdFromPayload(\n { messages: payload.input },\n normalizedPromptCacheKey,\n )\n\n const headerSessionId = c.req.header(\"x-session-id\") ?? null\n const affinityKey = resolveAffinityKey({\n promptCacheKey: requestBodyPromptCacheKey,\n metadataSessionId,\n headerSessionId,\n upstreamRequestId,\n })\n request.affinityKeyUsed = affinityKey.affinityKeyUsed\n request.affinityKeySource = affinityKey.affinityKeySource\n\n const selection = await accountsManager.selectAccountForRequest(\n [\n {\n modelId: clientModel,\n endpoint: RESPONSES_ENDPOINT,\n },\n ],\n {\n requestId: affinityKey.requestId,\n },\n )\n\n if (!selection.ok) {\n recordSelectionFailure(store, {\n request,\n stream: streamRequested,\n clientModel,\n reason: selection.reason,\n })\n\n return selectionFailureResponse(c, {\n reason: selection.reason,\n })\n }\n\n const { account, selectedModel } = selection\n\n request.affinityHit = selection.affinityHit\n request.affinityCacheKey = selection.affinityCacheKey\n request.selectionReason = selection.selectionReason\n\n const upstreamPayload = { ...payload, model: selectedModel.id }\n removeUnsupportedTools(upstreamPayload)\n applyResponsesApiContextManagement(\n upstreamPayload,\n selectedModel.capabilities.limits.max_prompt_tokens,\n )\n compactInputByLatestCompaction(upstreamPayload)\n\n const premiumRemainingBefore = account.premiumRemaining\n const premiumUnlimitedBefore = account.unlimited\n\n const transport = getResponsesTransportForModel(selectedModel) ?? \"http\"\n const { vision, initiator } = getResponsesRequestOptions(upstreamPayload)\n request.initiator = initiator\n if (state.manualApprove) await awaitApproval()\n\n const accountCtx = toAccountContext(account)\n const upstreamSessionId = getUUID(\n normalizedPromptCacheKey ?? headerSessionId ?? upstreamRequestId,\n )\n request.upstreamRequestId = upstreamRequestId\n request.upstreamSessionId = upstreamSessionId\n\n // Set by the Responses websocket bridge (src/routes/responses/websocket.ts) so\n // the upstream pool can close the originating bridge socket when its GitHub\n // connection is reaped while idle. Absent for plain HTTP callers.\n const bridgeId = c.req.header(\"x-responses-bridge-id\") ?? undefined\n\n if (streamRequested) {\n return handleStreamingResponses({\n c,\n store,\n request,\n payload: upstreamPayload,\n selection,\n clientModel,\n accountCtx,\n vision,\n initiator,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n transport,\n bridgeId,\n })\n }\n\n return handleNonStreamingResponses({\n c,\n store,\n request,\n payload: upstreamPayload,\n selection,\n clientModel,\n accountCtx,\n vision,\n initiator,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n transport,\n bridgeId,\n })\n}\n\ntype AccountSelection = Awaited<\n ReturnType<(typeof accountsManager)[\"selectAccountForRequest\"]>\n>\n\ntype AccountSelectionOk = Extract<AccountSelection, { ok: true }>\n\ntype AccountSelectionErr = Extract<AccountSelection, { ok: false }>\n\ntype RequestContext = {\n requestId: string\n startedAtMs: number\n\n method: string\n path: string\n\n clientIp?: string\n clientIpSource?: string\n userAgent?: string\n\n userId?: string\n safetyIdentifier?: string\n promptCacheKey?: string\n initiator?: \"agent\" | \"user\"\n upstreamRequestId?: string\n upstreamSessionId?: string\n\n affinityKeyUsed?: string\n affinityKeySource?: AffinityKeySource\n selectionReason?: AccountSelectionReason\n affinityHit?: boolean\n affinityCacheKey?: string\n}\n\ntype Store = ReturnType<typeof getRequestHistoryStore>\n\ntype RequestLogInsert = Parameters<Store[\"insert\"]>[0]\n\ntype ObservedErrorState = {\n httpStatus: number\n errorName?: string\n errorStatus?: number\n errorMessage?: string\n upstreamErrorMessageRaw?: string\n}\n\ntype StreamSseStream = Parameters<Parameters<typeof streamSSE>[1]>[0]\n\nasync function observeRequestError(\n accountId: string,\n error: unknown,\n affinity?: { affinityHit?: boolean; affinityCacheKey?: string },\n): Promise<ObservedErrorState> {\n const details = await extractErrorObservability(error)\n\n if (\n details.ownershipMismatch\n && affinity?.affinityHit\n && affinity.affinityCacheKey\n ) {\n accountsManager.invalidateAffinity(affinity.affinityCacheKey)\n }\n\n if (shouldMarkAccountFailed(details)) {\n accountsManager.markAccountFailed(accountId, \"Unauthorized (401)\")\n }\n\n return {\n httpStatus: details.httpStatus,\n errorName: details.errorName,\n errorStatus: details.errorStatus,\n errorMessage: details.errorMessage,\n upstreamErrorMessageRaw: details.upstreamErrorMessageRaw,\n }\n}\n\nfunction buildResponsesStreamError(message: string): ResponseErrorEvent {\n return {\n type: \"error\",\n code: null,\n message,\n param: null,\n sequence_number: 0,\n }\n}\n\nasync function writeResponsesStreamError(\n stream: StreamSseStream,\n message: string,\n): Promise<void> {\n try {\n const errorEvent = buildResponsesStreamError(message)\n await stream.writeSSE({\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n })\n } catch (streamError) {\n logger.warn(\"Failed to write Responses stream error event:\", streamError)\n }\n}\n\nfunction buildRequestContext(c: Context): RequestContext {\n const requestId = randomUUID()\n const startedAtMs = Date.now()\n\n const method = c.req.raw.method\n const path = new URL(c.req.url, \"http://local\").pathname\n\n const { ip: clientIp, source: clientIpSource } = getClientIpInfo(c)\n const userAgent = c.req.header(\"user-agent\") ?? undefined\n\n return {\n requestId,\n startedAtMs,\n method,\n path,\n clientIp,\n clientIpSource,\n userAgent,\n }\n}\n\nfunction insertRequestLog(\n store: Store,\n request: RequestContext,\n record: Omit<\n RequestLogInsert,\n | \"requestId\"\n | \"startedAtMs\"\n | \"method\"\n | \"path\"\n | \"clientIp\"\n | \"clientIpSource\"\n | \"userAgent\"\n >,\n): void {\n store.insert({\n requestId: request.requestId,\n startedAtMs: request.startedAtMs,\n method: request.method,\n path: request.path,\n clientIp: request.clientIp,\n clientIpSource: request.clientIpSource,\n userAgent: request.userAgent,\n userId: request.userId,\n safetyIdentifier: request.safetyIdentifier,\n promptCacheKey: request.promptCacheKey,\n initiator: request.initiator,\n upstreamRequestId: request.upstreamRequestId,\n affinityKeyUsed: request.affinityKeyUsed,\n affinityKeySource: request.affinityKeySource,\n selectionReason: request.selectionReason,\n affinityHit: request.affinityHit,\n affinityCacheKey: request.affinityCacheKey,\n ...record,\n })\n void flushPendingCapture(request.requestId)\n}\n\nfunction recordSelectionFailure(\n store: Store,\n params: {\n request: RequestContext\n stream: boolean\n clientModel: string\n reason: AccountSelectionErr[\"reason\"]\n },\n): void {\n const { request, stream, clientModel, reason } = params\n\n const finishedAtMs = Date.now()\n\n insertRequestLog(store, request, {\n finishedAtMs,\n durationMs: finishedAtMs - request.startedAtMs,\n upstreamEndpoint: RESPONSES_ENDPOINT,\n stream,\n clientModel,\n httpStatus: reason === \"MODEL_NOT_SUPPORTED\" ? 400 : 429,\n selectionFailureReason: reason,\n })\n}\n\nfunction selectionFailureResponse(\n c: Context,\n params: {\n reason: AccountSelectionErr[\"reason\"]\n message?: string\n },\n) {\n const { reason, message } = params\n\n if (reason === \"MODEL_NOT_SUPPORTED\") {\n return c.json(\n {\n error: {\n message:\n message\n ?? \"This model does not support the responses endpoint. Please choose a different model.\",\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n\n return c.json(\n {\n error: {\n message:\n \"All accounts have exhausted their quota. Please wait for quota refresh or add additional accounts.\",\n type: \"rate_limit_error\",\n },\n },\n 429,\n )\n}\n\nfunction extractUsageFromChunkData(\n data: string | undefined,\n): NormalizedUsage | undefined {\n if (!data) return undefined\n\n try {\n const event = JSON.parse(data) as ResponseStreamEvent\n const usage = extractResponsesUsageFromStreamEvent(event)\n return usage.usageJson ? usage : undefined\n } catch {\n return undefined\n }\n}\n\nasync function handleStreamingResponses(params: {\n c: Context\n store: Store\n request: RequestContext\n payload: ResponsesPayload\n selection: AccountSelectionOk\n clientModel: string\n accountCtx: Parameters<typeof createResponses>[2]\n vision: boolean\n initiator: \"agent\" | \"user\"\n premiumRemainingBefore: number | undefined\n premiumUnlimitedBefore: boolean | undefined\n transport: ResponsesTransport\n bridgeId: string | undefined\n}): Promise<Response> {\n const {\n c,\n store,\n request,\n payload,\n selection,\n clientModel,\n accountCtx,\n vision,\n initiator,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n transport,\n bridgeId,\n } = params\n\n let response: Awaited<ReturnType<typeof createResponses>>\n\n try {\n response = await createResponses(\n payload,\n {\n vision,\n initiator,\n upstreamRequestId: request.upstreamRequestId,\n sessionId: request.upstreamSessionId,\n requestId: request.requestId,\n transport,\n bridgeId,\n },\n accountCtx,\n )\n selection.confirmAffinity?.()\n } catch (error) {\n return handleUpstreamCreateError({\n store,\n request,\n selection,\n clientModel,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n error,\n })\n }\n\n if (isAsyncIterable(response)) {\n logger.debug(\"Forwarding native Responses stream\")\n\n return streamSSE(c, (stream) =>\n streamResponsesAndLog({\n stream,\n response,\n store,\n request,\n selection,\n clientModel,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n }),\n )\n }\n\n return handleNonStreamingUpstreamResult({\n c,\n store,\n request,\n selection,\n clientModel,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n result: response,\n })\n}\n\nasync function handleUpstreamCreateError(params: {\n store: Store\n request: RequestContext\n selection: AccountSelectionOk\n clientModel: string\n premiumRemainingBefore: number | undefined\n premiumUnlimitedBefore: boolean | undefined\n error: unknown\n}): Promise<never> {\n const {\n store,\n request,\n selection,\n clientModel,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n error,\n } = params\n\n const { account, reservation, selectedModel, endpoint, costUnits } = selection\n\n const finishedAtMs = Date.now()\n const details = await extractErrorObservability(error)\n\n if (\n details.ownershipMismatch\n && request.affinityHit\n && request.affinityCacheKey\n ) {\n accountsManager.invalidateAffinity(request.affinityCacheKey)\n }\n\n if (shouldMarkAccountFailed(details)) {\n accountsManager.markAccountFailed(account.id, \"Unauthorized (401)\")\n }\n\n await accountsManager.finalizeQuota(account, reservation)\n\n const premiumRemainingAfter = account.premiumRemaining\n const premiumUnlimitedAfter = account.unlimited\n\n insertRequestLog(store, request, {\n finishedAtMs,\n durationMs: finishedAtMs - request.startedAtMs,\n upstreamEndpoint: endpoint,\n stream: true,\n accountId: account.id,\n accountType: account.accountType,\n costUnits,\n clientModel,\n upstreamModel: selectedModel.id,\n premiumRemainingBefore,\n premiumRemainingAfter,\n premiumRemainingDiff: computeDiff(\n premiumRemainingBefore,\n premiumRemainingAfter,\n ),\n premiumUnlimitedBefore,\n premiumUnlimitedAfter,\n httpStatus: details.httpStatus,\n errorName: details.errorName,\n errorStatus: details.errorStatus,\n errorMessage: details.errorMessage,\n upstreamErrorMessageRaw: details.upstreamErrorMessageRaw,\n })\n\n throw error\n}\n\nasync function handleNonStreamingUpstreamResult(params: {\n c: Context\n store: Store\n request: RequestContext\n selection: AccountSelectionOk\n clientModel: string\n premiumRemainingBefore: number | undefined\n premiumUnlimitedBefore: boolean | undefined\n result: ResponsesResult\n}): Promise<Response> {\n const {\n c,\n store,\n request,\n selection,\n clientModel,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n result,\n } = params\n\n const { account, reservation, selectedModel, endpoint, costUnits } = selection\n\n let httpStatus = 200\n const usage: NormalizedUsage = extractResponsesUsageFromResult(result)\n let errorName: string | undefined\n let errorStatus: number | undefined\n let errorMessage: string | undefined\n let upstreamErrorMessageRaw: string | undefined\n\n const finishedAtMs = Date.now()\n\n try {\n debugJsonTail(logger, \"Forwarding native Responses result:\", {\n value: result,\n tailLength: 400,\n })\n return c.json(result)\n } catch (error) {\n const details = await extractErrorObservability(error)\n httpStatus = details.httpStatus\n\n errorName = details.errorName\n errorStatus = details.errorStatus\n errorMessage = details.errorMessage\n upstreamErrorMessageRaw = details.upstreamErrorMessageRaw\n\n throw error\n } finally {\n await accountsManager.finalizeQuota(account, reservation)\n\n const premiumRemainingAfter = account.premiumRemaining\n const premiumUnlimitedAfter = account.unlimited\n\n insertRequestLog(store, request, {\n finishedAtMs,\n durationMs: finishedAtMs - request.startedAtMs,\n upstreamEndpoint: endpoint,\n stream: false,\n accountId: account.id,\n accountType: account.accountType,\n costUnits,\n clientModel,\n upstreamModel: selectedModel.id,\n ...usage,\n premiumRemainingBefore,\n premiumRemainingAfter,\n premiumRemainingDiff: computeDiff(\n premiumRemainingBefore,\n premiumRemainingAfter,\n ),\n premiumUnlimitedBefore,\n premiumUnlimitedAfter,\n httpStatus,\n errorName,\n errorStatus,\n errorMessage,\n upstreamErrorMessageRaw,\n })\n }\n}\n\nasync function streamResponsesAndLog(params: {\n stream: StreamSseStream\n response: AsyncIterable<unknown>\n store: Store\n request: RequestContext\n selection: AccountSelectionOk\n clientModel: string\n premiumRemainingBefore: number | undefined\n premiumUnlimitedBefore: boolean | undefined\n}): Promise<void> {\n const {\n stream,\n response,\n store,\n request,\n selection,\n clientModel,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n } = params\n\n const { account, reservation, selectedModel, endpoint, costUnits } = selection\n\n const idTracker = createStreamIdTracker()\n let ttfbMs: number | undefined\n let lastUsage: NormalizedUsage = {}\n let errorName: string | undefined\n let errorStatus: number | undefined\n let errorMessage: string | undefined\n let upstreamErrorMessageRaw: string | undefined\n\n try {\n for await (const chunk of response) {\n if (ttfbMs === undefined) {\n ttfbMs = Date.now() - request.startedAtMs\n }\n\n const { id, event, data } = getStreamChunkFields(chunk)\n const processedData = fixStreamIds(data ?? \"\", event, idTracker)\n\n const usage = extractUsageFromChunkData(processedData)\n if (usage) {\n lastUsage = usage\n }\n\n debugJson(logger, \"Responses stream chunk:\", chunk)\n\n await stream.writeSSE({\n id,\n event,\n data: processedData,\n })\n }\n } catch (error) {\n const details = await extractErrorObservability(error)\n errorName = details.errorName\n errorStatus = details.errorStatus\n errorMessage = details.errorMessage\n upstreamErrorMessageRaw = details.upstreamErrorMessageRaw\n\n logger.warn(\"Responses streaming error:\", error)\n\n if (\n details.ownershipMismatch\n && request.affinityHit\n && request.affinityCacheKey\n ) {\n accountsManager.invalidateAffinity(request.affinityCacheKey)\n }\n\n if (shouldMarkAccountFailed(details)) {\n accountsManager.markAccountFailed(account.id, \"Unauthorized (401)\")\n }\n\n await writeResponsesStreamError(stream, getUserVisibleErrorMessage(details))\n } finally {\n const finishedAtMs = Date.now()\n\n await accountsManager.finalizeQuota(account, reservation)\n\n const premiumRemainingAfter = account.premiumRemaining\n const premiumUnlimitedAfter = account.unlimited\n\n insertRequestLog(store, request, {\n finishedAtMs,\n durationMs: finishedAtMs - request.startedAtMs,\n ttfbMs,\n upstreamEndpoint: endpoint,\n stream: true,\n accountId: account.id,\n accountType: account.accountType,\n costUnits,\n clientModel,\n upstreamModel: selectedModel.id,\n ...lastUsage,\n premiumRemainingBefore,\n premiumRemainingAfter,\n premiumRemainingDiff: computeDiff(\n premiumRemainingBefore,\n premiumRemainingAfter,\n ),\n premiumUnlimitedBefore,\n premiumUnlimitedAfter,\n httpStatus: errorStatus ?? (errorName ? 500 : 200),\n errorName,\n errorStatus,\n errorMessage,\n upstreamErrorMessageRaw,\n })\n }\n}\n\nasync function handleNonStreamingResponses(params: {\n c: Context\n store: Store\n request: RequestContext\n payload: ResponsesPayload\n selection: AccountSelectionOk\n clientModel: string\n accountCtx: Parameters<typeof createResponses>[2]\n vision: boolean\n initiator: \"agent\" | \"user\"\n premiumRemainingBefore: number | undefined\n premiumUnlimitedBefore: boolean | undefined\n transport: ResponsesTransport\n bridgeId: string | undefined\n}): Promise<Response> {\n const {\n c,\n store,\n request,\n payload,\n selection,\n clientModel,\n accountCtx,\n vision,\n initiator,\n premiumRemainingBefore,\n premiumUnlimitedBefore,\n transport,\n bridgeId,\n } = params\n const { account, reservation, selectedModel, endpoint, costUnits } = selection\n let usage: NormalizedUsage = {}\n let errorState: ObservedErrorState = { httpStatus: 200 }\n let finishedAtMs: number | undefined\n try {\n const response = await createResponses(\n payload,\n {\n vision,\n initiator,\n upstreamRequestId: request.upstreamRequestId,\n sessionId: request.upstreamSessionId,\n requestId: request.requestId,\n transport,\n bridgeId,\n },\n accountCtx,\n )\n if (isAsyncIterable(response)) {\n throw new Error(\"Upstream returned a stream unexpectedly\")\n }\n selection.confirmAffinity?.()\n finishedAtMs = Date.now()\n const result = response\n usage = extractResponsesUsageFromResult(result)\n debugJsonTail(logger, \"Forwarding native Responses result:\", {\n value: result,\n tailLength: 400,\n })\n return c.json(result)\n } catch (error) {\n finishedAtMs = Date.now()\n errorState = await observeRequestError(account.id, error, {\n affinityHit: request.affinityHit,\n affinityCacheKey: request.affinityCacheKey,\n })\n throw error\n } finally {\n const finishedAtMsFinal = finishedAtMs ?? Date.now()\n\n await accountsManager.finalizeQuota(account, reservation)\n\n const premiumRemainingAfter = account.premiumRemaining\n const premiumUnlimitedAfter = account.unlimited\n\n insertRequestLog(store, request, {\n finishedAtMs: finishedAtMsFinal,\n durationMs: finishedAtMsFinal - request.startedAtMs,\n upstreamEndpoint: endpoint,\n stream: false,\n accountId: account.id,\n accountType: account.accountType,\n costUnits,\n clientModel,\n upstreamModel: selectedModel.id,\n ...usage,\n premiumRemainingBefore,\n premiumRemainingAfter,\n premiumRemainingDiff: computeDiff(\n premiumRemainingBefore,\n premiumRemainingAfter,\n ),\n premiumUnlimitedBefore,\n premiumUnlimitedAfter,\n httpStatus: errorState.httpStatus,\n errorName: errorState.errorName,\n errorStatus: errorState.errorStatus,\n errorMessage: errorState.errorMessage,\n upstreamErrorMessageRaw: errorState.upstreamErrorMessageRaw,\n })\n }\n}\n\nconst COPILOT_UNSUPPORTED_TOOL_TYPES = new Set([\"image_generation\"])\n\nexport const removeUnsupportedTools = (payload: ResponsesPayload): void => {\n if (!Array.isArray(payload.tools) || payload.tools.length === 0) return\n\n const dropped: Array<string> = []\n payload.tools = payload.tools.filter((t) => {\n const type = t.type as string\n if (COPILOT_UNSUPPORTED_TOOL_TYPES.has(type)) {\n dropped.push(type)\n return false\n }\n return true\n })\n if (dropped.length > 0) {\n logger.debug(\"Removed unsupported tools:\", dropped)\n }\n}\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\n\nimport { handleResponses } from \"./handler\"\n\nexport const responsesRoutes = new Hono()\n\nresponsesRoutes.post(\"/\", async (c) => {\n try {\n return await handleResponses(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import { Hono } from \"hono\"\n\nimport { state } from \"~/lib/state\"\n\nexport const tokenRoute = new Hono()\n\ntokenRoute.get(\"/\", (c) => {\n try {\n return c.json({\n token: state.copilotToken,\n })\n } catch (error) {\n console.error(\"Error fetching token:\", error)\n return c.json({ error: \"Failed to fetch token\", token: null }, 500)\n }\n})\n","import { Hono } from \"hono\"\n\nimport { accountsManager } from \"~/lib/accounts-manager\"\nimport { getCopilotUsage } from \"~/services/github/get-copilot-usage\"\n\nexport const usageRoute = new Hono()\n\nusageRoute.get(\"/\", (c) => {\n try {\n const accountStatuses = accountsManager.getAccountStatus()\n return c.json({\n accounts: accountStatuses,\n })\n } catch (error) {\n console.error(\"Error fetching account status:\", error)\n return c.json({ error: \"Failed to fetch account status\" }, 500)\n }\n})\n\n/**\n * Get detailed usage information for a specific account by index.\n * Index 0 is the temporary account (if exists), otherwise the first registered account.\n */\nusageRoute.get(\"/:accountIndex\", async (c) => {\n try {\n const indexParam = c.req.param(\"accountIndex\")\n const index = Number.parseInt(indexParam, 10)\n\n if (Number.isNaN(index) || index < 0) {\n return c.json({ error: \"Invalid account index\" }, 400)\n }\n\n const accountContext = accountsManager.getAccountContextByIndex(index)\n\n if (!accountContext) {\n const accountCount = accountsManager.getAccountCount()\n return c.json(\n {\n error: `Account index ${index} not found`,\n availableIndices: accountCount > 0 ? `0-${accountCount - 1}` : \"none\",\n },\n 404,\n )\n }\n\n const usage = await getCopilotUsage(accountContext)\n\n return c.json(usage)\n } catch (error) {\n console.error(\"Error fetching account usage:\", error)\n return c.json({ error: \"Failed to fetch account usage\" }, 500)\n }\n})\n","import { Hono } from \"hono\"\nimport { cors } from \"hono/cors\"\nimport { logger } from \"hono/logger\"\n\nimport { createAuthMiddleware } from \"~/lib/request-auth\"\nimport { traceIdMiddleware } from \"~/lib/trace\"\nimport {\n DEFAULT_MCP_HTTP_PATH,\n isMcpHttpEnabledFromEnv,\n} from \"~/mcp-http-config\"\nimport { handleStreamableHttpMcpRequest, mcpHttpCorsOptions } from \"~/mcp-http\"\n\nimport { adminApiRoutes } from \"./routes/admin-api/route\"\nimport { adminRoutes } from \"./routes/admin/route\"\nimport { completionRoutes } from \"./routes/chat-completions/route\"\nimport { embeddingRoutes } from \"./routes/embeddings/route\"\nimport { messageRoutes } from \"./routes/messages/route\"\nimport { modelRoutes } from \"./routes/models/route\"\nimport { providerMessageRoutes } from \"./routes/provider/messages/route\"\nimport { providerModelRoutes } from \"./routes/provider/models/route\"\nimport { responsesRoutes } from \"./routes/responses/route\"\nimport { tokenRoute } from \"./routes/token/route\"\nimport { usageRoute } from \"./routes/usage/route\"\n\nexport interface CreateServerOptions {\n enableMcpHttp?: boolean\n}\n\nexport function createServer(options: CreateServerOptions = {}): Hono {\n const app = new Hono()\n const enableMcpHttp = options.enableMcpHttp ?? isMcpHttpEnabledFromEnv()\n\n app.use(traceIdMiddleware)\n app.use(logger())\n\n if (enableMcpHttp) {\n app.use(DEFAULT_MCP_HTTP_PATH, cors(mcpHttpCorsOptions))\n app.all(DEFAULT_MCP_HTTP_PATH, (c) =>\n handleStreamableHttpMcpRequest(c.req.raw),\n )\n } else {\n app.all(DEFAULT_MCP_HTTP_PATH, (c) =>\n c.json(\n {\n error: {\n type: \"mcp_http_disabled\",\n message:\n \"MCP Streamable HTTP is disabled. Start with --enable-mcp-http to expose /mcp.\",\n },\n },\n 404,\n ),\n )\n }\n\n app.use(cors())\n app.use(\n \"*\",\n createAuthMiddleware({\n allowUnauthenticatedPaths: [\"/\", DEFAULT_MCP_HTTP_PATH],\n allowUnauthenticatedPathPrefixes: [\"/admin\", \"/api/admin\"],\n }),\n )\n\n app.get(\"/\", (c) => c.text(\"Server running\"))\n\n app.route(\"/chat/completions\", completionRoutes)\n app.route(\"/models\", modelRoutes)\n app.route(\"/embeddings\", embeddingRoutes)\n app.route(\"/usage\", usageRoute)\n app.route(\"/token\", tokenRoute)\n app.route(\"/responses\", responsesRoutes)\n\n app.route(\"/admin\", adminRoutes)\n app.route(\"/api/admin\", adminApiRoutes)\n\n app.route(\"/v1/chat/completions\", completionRoutes)\n app.route(\"/v1/models\", modelRoutes)\n app.route(\"/v1/embeddings\", embeddingRoutes)\n app.route(\"/v1/responses\", responsesRoutes)\n\n app.route(\"/v1/messages\", messageRoutes)\n\n app.route(\"/:provider/v1/messages\", providerMessageRoutes)\n app.route(\"/:provider/v1/models\", providerModelRoutes)\n\n return app\n}\n\nexport const server = createServer()\n"],"mappings":"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"}
|