@jeffreycao/copilot-api 2.6.26 → 2.6.29
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/auth-B4LfP6nc.js +2 -0
- package/dist/{auth-BUdtezdW.js → auth-CmKD_Gmp.js} +2 -2
- package/dist/{auth-BUdtezdW.js.map → auth-CmKD_Gmp.js.map} +1 -1
- package/dist/copilot-runtime-B4x9RzsD.js +384 -0
- package/dist/copilot-runtime-B4x9RzsD.js.map +1 -0
- package/dist/main.js +2 -2
- package/dist/{server-JC3AQpcl.js → server-VjfrS2Aw.js} +113 -24
- package/dist/server-VjfrS2Aw.js.map +1 -0
- package/dist/{start-bv97pvAG.js → start-DX3Q5lol.js} +8 -284
- package/dist/start-DX3Q5lol.js.map +1 -0
- package/dist/{token-DgVri1k7.js → token-0pmwyQAu.js} +93 -33
- package/dist/token-0pmwyQAu.js.map +1 -0
- package/package.json +1 -1
- package/dist/auth-BYKwBiQx.js +0 -2
- package/dist/models-CHdnmX1S.js +0 -90
- package/dist/models-CHdnmX1S.js.map +0 -1
- package/dist/server-JC3AQpcl.js.map +0 -1
- package/dist/start-bv97pvAG.js.map +0 -1
- package/dist/token-DgVri1k7.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot-runtime-B4x9RzsD.js","names":["getCopilotModels"],"sources":["../src/lib/models.ts","../src/services/copilot/get-models.ts","../src/services/copilot/models-cache.ts","../src/lib/deviceid.ts","../src/services/get-vscode-version.ts","../src/services/vscode-env.ts","../src/lib/copilot-runtime.ts"],"sourcesContent":["import type { Model } from \"~/lib/types/models\"\n\nimport { state } from \"~/lib/state\"\n\n/**\n * Converts a Copilot upstream model ID to a client-friendly ID that Claude Code\n * and Claude Desktop recognize (dots in version replaced with hyphens).\n * e.g. \"claude-sonnet-4.6\" -> \"claude-sonnet-4-6\"\n * Non-Claude models are returned unchanged.\n */\nexport const toClientModelId = (modelId: string): string => {\n const normalized = normalizeSdkModelId(modelId)\n if (!normalized) return modelId\n const versionHyphenated = normalized.version.replaceAll(\".\", \"-\")\n return `claude-${normalized.family}-${versionHyphenated}`\n}\n\nexport interface NormalizedSdkModelId {\n family: string\n version: string\n}\n\nexport const findEndpointModel = (sdkModelId: string): Model | undefined => {\n const models = state.models?.data ?? []\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 const model = models.find((m) => m.id === modelName)\n if (model) {\n return model\n }\n\n return undefined\n}\n\n/**\n * Finds the latest available model for a given Claude family (e.g. \"opus\",\n * \"sonnet\", \"haiku\") among the models currently cached in `state.models`.\n * \"Latest\" is determined by the highest semantic version parsed from the model\n * ID. Returns `undefined` when no model of that family is available.\n */\nexport const getLatestModelForFamily = (family: string): Model | undefined => {\n const models = state.models?.data ?? []\n\n let best: { model: Model; major: number; minor: number } | undefined\n\n for (const model of models) {\n const normalized = normalizeSdkModelId(model.id)\n if (!normalized || normalized.family !== family) {\n continue\n }\n\n const [majorPart, minorPart = \"0\"] = normalized.version.split(\".\")\n const major = Number.parseInt(majorPart, 10)\n const minor = Number.parseInt(minorPart, 10)\n if (Number.isNaN(major) || Number.isNaN(minor)) {\n continue\n }\n\n if (\n !best\n || major > best.major\n || (major === best.major && minor > best.minor)\n ) {\n best = { model, major, minor }\n }\n }\n\n return best?.model\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\nimport { copilotBaseUrl, copilotModelsHeaders } from \"~/lib/api-config\"\n\nimport { HTTPError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\nimport type { ModelsResponse } from \"~/lib/types/models\"\n\nexport const getModels = async () => {\n consola.info(`Fetching models from ${copilotBaseUrl(state)}/models`)\n const response = await fetch(`${copilotBaseUrl(state)}/models`, {\n headers: copilotModelsHeaders(state),\n })\n\n if (!response.ok) {\n const errorText = await response.clone().text()\n\n consola.error(\"Failed to get models response body\", errorText)\n\n throw new HTTPError(\"Failed to get models\", response)\n }\n\n return (await response.json()) as ModelsResponse\n}\n","import consola from \"consola\"\n\nimport { state } from \"~/lib/state\"\nimport { getModels as getCopilotModels } from \"~/services/copilot/get-models\"\n\n// Periodically refresh models so long-running daemons pick up new SKUs.\nconst MODELS_REFRESH_BASE_MS = 30 * 60 * 1000\nlet modelsRefreshTimer: ReturnType<typeof setTimeout> | null = null\n// This loop runs on a plain timer that no AbortController owns, so stopping it\n// cannot cancel a response that is already on the wire. The generation lets a\n// stopped loop neither write state.models nor schedule itself again.\nlet refreshGeneration = 0\n\nconst cancelModelsRefreshTimer = () => {\n if (modelsRefreshTimer) {\n clearTimeout(modelsRefreshTimer)\n modelsRefreshTimer = null\n }\n}\n\nexport const stopModelsRefreshLoop = () => {\n // Bump before cancelling so a refresh already awaiting its response sees a\n // different generation and drops both its result and its next tick.\n refreshGeneration++\n cancelModelsRefreshTimer()\n}\n\ntype ModelsFetcher = typeof getCopilotModels\n\nconst refreshModels = async (fetcher: ModelsFetcher, generation: number) => {\n const prevIds = new Set(state.models?.data.map((m) => m.id) ?? [])\n const models = await fetcher()\n if (generation !== refreshGeneration) return\n\n state.models = {\n ...models,\n data: models.data.filter(\n (model) =>\n model.policy?.state !== \"disabled\"\n && (model.model_picker_enabled\n || model.capabilities.type === \"embeddings\"),\n ),\n }\n const nextIds = state.models.data.map((m) => m.id)\n const added = nextIds.filter((id) => !prevIds.has(id))\n if (added.length > 0) {\n consola.info(`Models refresh: ${added.length} new`)\n } else {\n consola.debug(`Models refresh: no changes (${nextIds.length} total)`)\n }\n}\n\nconst scheduleModelsRefresh = (fetcher: ModelsFetcher, intervalMs: number) => {\n const generation = refreshGeneration\n const jitter = Math.floor(Math.random() * (intervalMs / 6))\n const delay = intervalMs + jitter\n consola.debug(\n `Scheduling next models refresh in ${Math.round(delay / 1000)} seconds`,\n )\n\n cancelModelsRefreshTimer()\n modelsRefreshTimer = setTimeout(async () => {\n try {\n await refreshModels(fetcher, generation)\n } catch (error) {\n if (generation === refreshGeneration) {\n consola.warn(\"Failed to refresh models, keeping previous cache.\", error)\n }\n } finally {\n if (generation === refreshGeneration) {\n scheduleModelsRefresh(fetcher, intervalMs)\n }\n }\n }, delay)\n}\n\nexport async function cacheModels(\n fetcher: ModelsFetcher = getCopilotModels,\n intervalMs: number = MODELS_REFRESH_BASE_MS,\n): Promise<void> {\n // A fresh population supersedes whatever the previous loop was doing. This\n // is the path a config reload takes when the GitHub token changes, so a\n // request still in flight for the old account must not join this generation\n // and overwrite state.models once it comes back.\n refreshGeneration++\n const generation = refreshGeneration\n await refreshModels(fetcher, generation)\n if (generation !== refreshGeneration) return\n\n scheduleModelsRefresh(fetcher, intervalMs)\n}\n","import consola from \"consola\"\nimport { randomUUID } from \"node:crypto\"\nimport path from \"node:path\"\n\nconst WINDOWS_DEVICE_ID_KEY = String.raw`\\SOFTWARE\\Microsoft\\DeveloperTools`\nconst WINDOWS_DEVICE_ID_NAME = \"deviceid\"\n\ntype RegistryArch = \"x86\" | \"x64\"\n\ninterface WinregConstructor {\n new (options: {\n hive: string\n key: string\n arch?: RegistryArch\n }): WinregRegistry\n HKCU: string\n REG_SZ: string\n}\n\ninterface WinregRegistry {\n get(\n name: string,\n callback: (error: RegistryError | null, item: RegistryItem | null) => void,\n ): void\n set(\n name: string,\n type: string,\n value: string,\n callback: (error: RegistryError | null) => void,\n ): void\n}\n\ninterface RegistryItem {\n value?: string\n}\n\ninterface RegistryError extends Error {\n code?: number | string\n}\n\nconst windows64Architectures = new Set([\"AMD64\", \"ARM64\", \"IA64\"])\n\nconst getPosixHomeDir = (): string => {\n if (!process.env.HOME) {\n throw new Error(\"Home directory not found\")\n }\n\n return process.env.HOME\n}\n\nconst getDeviceIdFilePath = (): string => {\n let folder: string\n\n switch (process.platform) {\n case \"darwin\": {\n folder = path.posix.join(\n getPosixHomeDir(),\n \"Library\",\n \"Application Support\",\n )\n break\n }\n case \"linux\": {\n folder =\n process.env.XDG_CACHE_HOME\n ?? path.posix.join(getPosixHomeDir(), \".cache\")\n break\n }\n default: {\n throw new Error(\"Unsupported platform\")\n }\n }\n\n return path.posix.join(folder, \"Microsoft\", \"DeveloperTools\", \"deviceid\")\n}\n\nconst isMissingFileError = (error: unknown): error is NodeJS.ErrnoException => {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\"\n}\n\nconst readStoredDeviceIdFile = async (\n filePath: string,\n): Promise<string | undefined> => {\n const { readFile } = await import(\"node:fs/promises\")\n\n try {\n return await readFile(filePath, \"utf8\")\n } catch (error) {\n if (isMissingFileError(error)) {\n return undefined\n }\n\n throw error\n }\n}\n\nconst writeStoredDeviceIdFile = async (\n filePath: string,\n deviceId: string,\n): Promise<void> => {\n const { mkdir, writeFile } = await import(\"node:fs/promises\")\n\n await mkdir(path.posix.dirname(filePath), { recursive: true })\n await writeFile(filePath, deviceId, \"utf8\")\n}\n\nconst getWindowsRegistryArch = (): RegistryArch | undefined => {\n const architecture = (\n process.env.PROCESSOR_ARCHITEW6432 ?? process.env.PROCESSOR_ARCHITECTURE\n )?.toUpperCase()\n\n return architecture && windows64Architectures.has(architecture) ?\n \"x64\"\n : undefined\n}\n\nconst loadWinreg = async (): Promise<WinregConstructor> => {\n const module = await import(\"winreg\")\n const winreg =\n \"default\" in module ? (module.default as unknown) : (module as unknown)\n\n return winreg as WinregConstructor\n}\n\nconst isMissingRegistryError = (error: RegistryError | null): boolean => {\n if (!error) {\n return false\n }\n\n const errorCode = Number(error.code)\n\n return Number.isFinite(errorCode) && errorCode === 1\n}\n\nconst createWindowsRegistry = async (): Promise<{\n registry: WinregRegistry\n regSz: string\n}> => {\n const Winreg = await loadWinreg()\n\n return {\n registry: new Winreg({\n hive: Winreg.HKCU,\n key: WINDOWS_DEVICE_ID_KEY,\n arch: getWindowsRegistryArch(),\n }),\n regSz: Winreg.REG_SZ,\n }\n}\n\nconst readRegistryString = async (\n registry: WinregRegistry,\n name: string,\n): Promise<string | undefined> => {\n return new Promise((resolve, reject) => {\n registry.get(name, (error, item) => {\n if (isMissingRegistryError(error)) {\n resolve(undefined)\n return\n }\n\n if (error) {\n reject(\n error instanceof Error ? error : new Error(\"Unknown registry error\"),\n )\n return\n }\n\n resolve(item?.value)\n })\n })\n}\n\nconst writeRegistryString = async ({\n registry,\n regSz,\n name,\n value,\n}: {\n registry: WinregRegistry\n regSz: string\n name: string\n value: string\n}): Promise<void> => {\n return new Promise((resolve, reject) => {\n registry.set(name, regSz, value, (error) => {\n if (error) {\n reject(\n error instanceof Error ? error : new Error(\"Unknown registry error\"),\n )\n return\n }\n\n resolve()\n })\n })\n}\n\nexport const getStoredVSCodeDeviceId = async (): Promise<\n string | undefined\n> => {\n switch (process.platform) {\n case \"win32\": {\n const { registry } = await createWindowsRegistry()\n\n return readRegistryString(registry, WINDOWS_DEVICE_ID_NAME)\n }\n case \"darwin\":\n case \"linux\": {\n return readStoredDeviceIdFile(getDeviceIdFilePath())\n }\n default: {\n throw new Error(\"Unsupported platform\")\n }\n }\n}\n\nconst setStoredVSCodeDeviceId = async (deviceId: string): Promise<void> => {\n switch (process.platform) {\n case \"win32\": {\n const { registry, regSz } = await createWindowsRegistry()\n\n await writeRegistryString({\n registry,\n regSz,\n name: WINDOWS_DEVICE_ID_NAME,\n value: deviceId,\n })\n return\n }\n case \"darwin\":\n case \"linux\": {\n await writeStoredDeviceIdFile(getDeviceIdFilePath(), deviceId)\n return\n }\n default: {\n throw new Error(\"Unsupported platform\")\n }\n }\n}\n\nconst createVSCodeDeviceId = (): string => randomUUID().toLowerCase()\n\nexport async function getVSCodeDeviceId(): Promise<string> {\n let deviceId: string | undefined\n\n try {\n deviceId = await getStoredVSCodeDeviceId()\n } catch (error) {\n consola.debug(\"Failed to read VSCode device id\", error)\n }\n\n if (deviceId) {\n return deviceId\n }\n\n const newDeviceId = createVSCodeDeviceId()\n\n try {\n await setStoredVSCodeDeviceId(newDeviceId)\n } catch (error) {\n consola.warn(\n \"Failed to persist VSCode device id, using ephemeral id\",\n error,\n )\n }\n\n return newDeviceId\n}\n","const FALLBACK = \"1.139.1\"\n\nexport async function getVSCodeVersion() {\n await Promise.resolve()\n return FALLBACK\n}\n","import consola from \"consola\"\nimport { createHash, randomUUID } from \"node:crypto\"\nimport { networkInterfaces } from \"node:os\"\n\nimport { getVSCodeDeviceId } from \"~/lib/deviceid\"\nimport { state } from \"~/lib/state\"\nimport { getVSCodeVersion } from \"~/services/get-vscode-version\"\n\nexport const cacheVSCodeVersion = async () => {\n const response = await getVSCodeVersion()\n state.vsCodeVersion = response\n\n consola.info(`Using VSCode version: ${response}`)\n}\n\nconst invalidMacAddresses = new Set([\n \"00:00:00:00:00:00\",\n \"ff:ff:ff:ff:ff:ff\",\n \"ac:de:48:00:11:22\",\n])\n\nfunction validateMacAddress(candidate: string): boolean {\n const tempCandidate = candidate.replaceAll(\"-\", \":\").toLowerCase()\n return !invalidMacAddresses.has(tempCandidate)\n}\n\nexport function getMac(): string | null {\n const ifaces = networkInterfaces()\n // eslint-disable-next-line guard-for-in\n for (const name in ifaces) {\n const networkInterface = ifaces[name]\n if (networkInterface) {\n for (const { mac } of networkInterface) {\n if (validateMacAddress(mac)) {\n return mac\n }\n }\n }\n }\n return null\n}\n\nexport const cacheMacMachineId = () => {\n const macAddress = getMac() ?? randomUUID()\n state.macMachineId = createHash(\"sha256\")\n .update(macAddress, \"utf8\")\n .digest(\"hex\")\n consola.debug(`Using machine ID: ${state.macMachineId}`)\n}\n\nexport const cacheVsCodeDeviceId = async () => {\n state.vsCodeDeviceId = await getVSCodeDeviceId()\n consola.debug(`Using VSCode device ID: ${state.vsCodeDeviceId}`)\n}\n\nconst SESSION_REFRESH_BASE_MS = 60 * 60 * 1000\nconst SESSION_REFRESH_JITTER_MS = 20 * 60 * 1000\nlet vsCodeSessionRefreshTimer: ReturnType<typeof setTimeout> | null = null\n\nconst generateSessionId = () => {\n state.vsCodeSessionId = randomUUID() + Date.now().toString()\n consola.debug(`Generated VSCode session ID: ${state.vsCodeSessionId}`)\n}\n\nexport const stopVsCodeSessionRefreshLoop = () => {\n if (vsCodeSessionRefreshTimer) {\n clearTimeout(vsCodeSessionRefreshTimer)\n vsCodeSessionRefreshTimer = null\n }\n}\n\nconst scheduleSessionIdRefresh = () => {\n const randomDelay = Math.floor(Math.random() * SESSION_REFRESH_JITTER_MS)\n const delay = SESSION_REFRESH_BASE_MS + randomDelay\n consola.debug(\n `Scheduling next VSCode session ID refresh in ${Math.round(\n delay / 1000,\n )} seconds`,\n )\n\n stopVsCodeSessionRefreshLoop()\n vsCodeSessionRefreshTimer = setTimeout(() => {\n try {\n generateSessionId()\n } catch (error) {\n consola.error(\"Failed to refresh session ID, rescheduling...\", error)\n } finally {\n scheduleSessionIdRefresh()\n }\n }, delay)\n}\n\nexport const cacheVsCodeSessionId = () => {\n stopVsCodeSessionRefreshLoop()\n generateSessionId()\n scheduleSessionIdRefresh()\n}\n","import { state } from \"~/lib/state\"\nimport { logUser, setupCopilotToken } from \"~/lib/token\"\nimport { cacheModels } from \"~/services/copilot/models-cache\"\nimport {\n cacheMacMachineId,\n cacheVSCodeVersion,\n cacheVsCodeSessionId,\n cacheVsCodeDeviceId,\n} from \"~/services/vscode-env\"\n\nexport async function setupCopilotRuntime(githubToken: string): Promise<void> {\n state.githubToken = githubToken\n await logUser()\n await cacheVSCodeVersion()\n cacheMacMachineId()\n cacheVsCodeSessionId()\n await cacheVsCodeDeviceId()\n await setupCopilotToken()\n await cacheModels()\n}\n"],"mappings":"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"}
|
package/dist/main.js
CHANGED
|
@@ -27,10 +27,10 @@ if (isMcpFastPath(process.argv)) {
|
|
|
27
27
|
if (process.platform === "win32" && process.stdout.isTTY && !process.env.WT_SESSION) process.env.WT_SESSION = "copilot-api";
|
|
28
28
|
const { bindElectronFetch } = await import("./electron-fetch-DsMaRX6v.js");
|
|
29
29
|
bindElectronFetch();
|
|
30
|
-
const { auth } = await import("./auth-
|
|
30
|
+
const { auth } = await import("./auth-B4LfP6nc.js");
|
|
31
31
|
const { debug } = await import("./debug-CcfAczV9.js");
|
|
32
32
|
const { mcp } = await import("./mcp-Byz9h_xz.js");
|
|
33
|
-
const { start } = await import("./start-
|
|
33
|
+
const { start } = await import("./start-DX3Q5lol.js");
|
|
34
34
|
const { provider } = await import("./provider-DktH3jcC.js");
|
|
35
35
|
await runMain(defineCommand({
|
|
36
36
|
meta: {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { a as getAnthropicApiKey, f as isAlphaSearchCodexPriorityEnabled, h as isResponsesApiWebSocketEnabled, i as getAlphaSearchModel, l as getMessageApiWebSearchModel, m as isResponsesApiWebSearchEnabled, o as getClaudeAutoModel, p as isMessagesApiEnabled, s as getClaudeTokenMultiplier, u as getUpstreamTransportConfig, x as PATHS } from "./config-store-CARrUljo.js";
|
|
1
|
+
import { a as getAnthropicApiKey, c as getConfig, f as isAlphaSearchCodexPriorityEnabled, h as isResponsesApiWebSocketEnabled, i as getAlphaSearchModel, l as getMessageApiWebSearchModel, m as isResponsesApiWebSearchEnabled, o as getClaudeAutoModel, p as isMessagesApiEnabled, s as getClaudeTokenMultiplier, u as getUpstreamTransportConfig, v as reloadConfig, x as PATHS } from "./config-store-CARrUljo.js";
|
|
2
2
|
import { C as resolveMappedModel, S as isGpt56OrAbove, _ as getReasoningEffortForModel, b as isContextManagementEnabledForMessages, d as getOpencodeGoModelRecords, g as getModelResponsesApiCompactThreshold$1, h as getModelMappings, i as listEnabledProviders, l as getOpencodeGoModelConfig, m as getExtraPromptForModel, n as getRawProviderConfig, o as resolveEffectiveProviderType, s as resolveProviderConfigForModel, t as getProviderConfig, u as getOpencodeGoModelIds, v as getSmallModel, w as setModelMappings, x as isContextManagementEnabledForResponses, y as getSmallModelForProvider } from "./config-B2OaAnpL.js";
|
|
3
3
|
import { i as HTTPError, r as isGitHubCopilotEnabled, s as forwardError } from "./github-copilot-provider-DlQZgaCT.js";
|
|
4
|
-
import { $ as
|
|
4
|
+
import { $ as state, A as compactAutoContinuePromptStarts, B as CODEX_API_BASE_URL, C as copilotHeaders, D as prepareInteractionHeaders, E as prepareForCompact, F as createAuthMiddleware, G as resolveTraceId$1, H as forwardCodexResponses, I as getConfiguredAdminApiKeys, J as createResponsesSafeStream, K as fetchUpstreamWithLifecycle, N as compactSystemPromptStarts, O as prepareMessageProxyHeaders, P as compactTextOnlyGuard, Q as createWebSocketUrl, S as copilotBaseUrl, T as copilotWebSocketHeaders, U as generateTraceId, V as buildCodexRequestHeaders, W as requestContext, X as getResponsesStreamTerminalDisposition, Y as encodePoolKeyPart, Z as createPooledWebSocketStream, _ as parseUserIdMetadata, b as readGitHubToken, d as generateRequestIdFromPayload, f as getRootSessionId, g as isResponsesStream, h as isNullish, j as compactMessageSections, m as isAsyncIterable, n as invalidateCodexRuntime, p as getUUID, q as createResponsesHttpEventStream, s as setupCodexToken, tt as stripInternalRequestHeaders, u as stopCopilotRefreshLoop, v as getCopilotUsage, x as readGitHubTokenFromEnv } from "./token-0pmwyQAu.js";
|
|
5
5
|
import { a as isDeferredToolName, c as parseMcpToolSearchSentinel, d as shouldEnableResponsesToolSearch, i as isBridgeToolSearchName, l as resolveBridgeToolSearchName, o as listDeferredToolNames, r as formatToolSearchBridgeArguments, s as normalizeToolSearchBridgeArguments, t as BRIDGE_TOOL_SEARCH_NAME, u as selectDeferredToolsByNames } from "./tool-search-BgFcDbNQ.js";
|
|
6
6
|
import { n as isProviderCodexModelVisible, t as getProviderCodexModels } from "./provider-management-z3m7cUkp.js";
|
|
7
|
-
import {
|
|
7
|
+
import { a as normalizeSdkModelId, n as stopModelsRefreshLoop, o as toClientModelId, r as findEndpointModel, t as setupCopilotRuntime } from "./copilot-runtime-B4x9RzsD.js";
|
|
8
8
|
import consola from "consola";
|
|
9
9
|
import { createHash } from "node:crypto";
|
|
10
10
|
import fs, { createWriteStream, readFileSync, rmSync } from "node:fs";
|
|
@@ -1286,11 +1286,18 @@ function getModelSummaries(db, range) {
|
|
|
1286
1286
|
return modelSummaryFromRow(row, costMap.get(model) ?? []);
|
|
1287
1287
|
});
|
|
1288
1288
|
}
|
|
1289
|
-
function getDailyModelSummaries(db,
|
|
1290
|
-
|
|
1289
|
+
function getDailyModelSummaries(db, intervals) {
|
|
1290
|
+
if (intervals.length === 0) return /* @__PURE__ */ new Map();
|
|
1291
|
+
const usageDays = `usage_days(usage_date, day_start_ms, day_end_ms) AS (VALUES ${intervals.map(() => "(?, ?, ?)").join(", ")})`;
|
|
1292
|
+
const dayParams = intervals.flatMap((interval) => [
|
|
1293
|
+
interval.date,
|
|
1294
|
+
interval.startMs,
|
|
1295
|
+
interval.endMs
|
|
1296
|
+
]);
|
|
1291
1297
|
const rows = db.prepare(`
|
|
1298
|
+
WITH ${usageDays}
|
|
1292
1299
|
SELECT
|
|
1293
|
-
|
|
1300
|
+
usage_days.usage_date AS usage_date,
|
|
1294
1301
|
model,
|
|
1295
1302
|
COUNT(*) AS request_count,
|
|
1296
1303
|
COALESCE(SUM(input_tokens), 0) AS input_tokens,
|
|
@@ -1299,25 +1306,29 @@ function getDailyModelSummaries(db, range) {
|
|
|
1299
1306
|
COALESCE(SUM(cache_creation_input_tokens), 0) AS cache_creation_input_tokens,
|
|
1300
1307
|
SUM(total_nano_aiu) AS total_nano_aiu,
|
|
1301
1308
|
COALESCE(SUM(total_tokens), 0) AS total_tokens
|
|
1302
|
-
FROM
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1309
|
+
FROM usage_days
|
|
1310
|
+
JOIN token_usage_events
|
|
1311
|
+
ON created_at_ms >= usage_days.day_start_ms
|
|
1312
|
+
AND created_at_ms < usage_days.day_end_ms
|
|
1313
|
+
GROUP BY usage_days.usage_date, model
|
|
1314
|
+
ORDER BY usage_days.usage_date ASC, total_tokens DESC, model ASC
|
|
1315
|
+
`).all(...dayParams);
|
|
1307
1316
|
const costRows = db.prepare(`
|
|
1317
|
+
WITH ${usageDays}
|
|
1308
1318
|
SELECT
|
|
1309
|
-
|
|
1319
|
+
usage_days.usage_date AS usage_date,
|
|
1310
1320
|
model,
|
|
1311
1321
|
cost_currency,
|
|
1312
1322
|
COALESCE(SUM(total_cost_nanos), 0) AS total_cost_nanos
|
|
1313
|
-
FROM
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
AND
|
|
1323
|
+
FROM usage_days
|
|
1324
|
+
JOIN token_usage_events
|
|
1325
|
+
ON created_at_ms >= usage_days.day_start_ms
|
|
1326
|
+
AND created_at_ms < usage_days.day_end_ms
|
|
1327
|
+
WHERE cost_currency IS NOT NULL
|
|
1317
1328
|
AND total_cost_nanos IS NOT NULL
|
|
1318
|
-
GROUP BY usage_date, model, cost_currency
|
|
1319
|
-
ORDER BY usage_date ASC, model ASC, cost_currency ASC
|
|
1320
|
-
`).all(
|
|
1329
|
+
GROUP BY usage_days.usage_date, model, cost_currency
|
|
1330
|
+
ORDER BY usage_days.usage_date ASC, model ASC, cost_currency ASC
|
|
1331
|
+
`).all(...dayParams);
|
|
1321
1332
|
const costsByDateAndModel = /* @__PURE__ */ new Map();
|
|
1322
1333
|
for (const row of costRows) {
|
|
1323
1334
|
const date = stringFromRow(row, "usage_date");
|
|
@@ -1368,7 +1379,7 @@ async function getTokenUsageDailySummary(period) {
|
|
|
1368
1379
|
const db = await getDb();
|
|
1369
1380
|
const range = getPeriodRangeFromDb(db, period);
|
|
1370
1381
|
const intervals = createDailyIntervals(range);
|
|
1371
|
-
const dailySummaries = getDailyModelSummaries(db,
|
|
1382
|
+
const dailySummaries = getDailyModelSummaries(db, intervals);
|
|
1372
1383
|
return {
|
|
1373
1384
|
byModel: getModelSummaries(db, range),
|
|
1374
1385
|
days: intervals.map((interval) => createDailyBucket(interval, dailySummaries.get(interval.date) ?? [])),
|
|
@@ -3294,9 +3305,66 @@ completionRoutes.post("/", async (c) => {
|
|
|
3294
3305
|
}
|
|
3295
3306
|
});
|
|
3296
3307
|
//#endregion
|
|
3308
|
+
//#region src/lib/config-reload.ts
|
|
3309
|
+
let pendingReload = Promise.resolve();
|
|
3310
|
+
async function applyConfigReload() {
|
|
3311
|
+
const previousConfig = getConfig();
|
|
3312
|
+
const wasCopilotEnabled = isGitHubCopilotEnabled(previousConfig);
|
|
3313
|
+
const config = reloadConfig();
|
|
3314
|
+
invalidateCodexRuntime();
|
|
3315
|
+
if (!isGitHubCopilotEnabled(config)) {
|
|
3316
|
+
consola.debug("Config reload: Copilot is disabled; stopping its refresh loop");
|
|
3317
|
+
stopCopilotRefreshLoop();
|
|
3318
|
+
stopModelsRefreshLoop();
|
|
3319
|
+
return;
|
|
3320
|
+
}
|
|
3321
|
+
const envToken = readGitHubTokenFromEnv();
|
|
3322
|
+
const githubToken = state.githubTokenSource === "cli" ? state.githubToken : envToken ?? await readGitHubToken();
|
|
3323
|
+
if (!githubToken) {
|
|
3324
|
+
consola.debug("Config reload: no GitHub token is available; clearing Copilot credentials");
|
|
3325
|
+
stopCopilotRefreshLoop();
|
|
3326
|
+
stopModelsRefreshLoop();
|
|
3327
|
+
state.githubToken = void 0;
|
|
3328
|
+
state.copilotToken = void 0;
|
|
3329
|
+
state.models = void 0;
|
|
3330
|
+
state.userName = void 0;
|
|
3331
|
+
state.copilotApiUrl = void 0;
|
|
3332
|
+
state.tokenBasedBilling = void 0;
|
|
3333
|
+
return;
|
|
3334
|
+
}
|
|
3335
|
+
if (wasCopilotEnabled && githubToken === state.githubToken && state.copilotToken && state.models) {
|
|
3336
|
+
consola.debug("Config reload: GitHub token unchanged and Copilot runtime ready; keeping current credentials");
|
|
3337
|
+
return;
|
|
3338
|
+
}
|
|
3339
|
+
stopCopilotRefreshLoop();
|
|
3340
|
+
stopModelsRefreshLoop();
|
|
3341
|
+
state.copilotToken = void 0;
|
|
3342
|
+
state.models = void 0;
|
|
3343
|
+
if (state.githubTokenSource !== "cli") state.githubTokenSource = envToken ? "env" : "file";
|
|
3344
|
+
consola.debug(`Config reload: initializing Copilot runtime with the ${state.githubTokenSource} GitHub token`);
|
|
3345
|
+
await setupCopilotRuntime(githubToken);
|
|
3346
|
+
consola.debug("Config reload: Copilot runtime initialized");
|
|
3347
|
+
}
|
|
3348
|
+
function reloadServerConfig() {
|
|
3349
|
+
const reload = pendingReload.then(applyConfigReload);
|
|
3350
|
+
pendingReload = reload.catch(() => {});
|
|
3351
|
+
return reload;
|
|
3352
|
+
}
|
|
3353
|
+
//#endregion
|
|
3297
3354
|
//#region src/routes/admin/config/route.ts
|
|
3298
3355
|
const configRoutes = new Hono();
|
|
3299
3356
|
const modelMappingsRequestSchema = z.object({ modelMappings: z.record(z.string(), z.string()) });
|
|
3357
|
+
configRoutes.post("/reload", async (c) => {
|
|
3358
|
+
try {
|
|
3359
|
+
await reloadServerConfig();
|
|
3360
|
+
return c.json({
|
|
3361
|
+
configPath: PATHS.CONFIG_PATH,
|
|
3362
|
+
reloaded: true
|
|
3363
|
+
});
|
|
3364
|
+
} catch (error) {
|
|
3365
|
+
return await forwardError(c, error);
|
|
3366
|
+
}
|
|
3367
|
+
});
|
|
3300
3368
|
configRoutes.get("/model-mappings", (c) => {
|
|
3301
3369
|
return c.json({
|
|
3302
3370
|
configPath: PATHS.CONFIG_PATH,
|
|
@@ -6484,6 +6552,19 @@ const MESSAGES_TOOL_CALL_TIPS = [
|
|
|
6484
6552
|
"- For long-running commands, keep the returned `session_id` and poll it with `tools.write_stdin` until the command finishes; do not redirect output to a temp file and read it back in a second call.",
|
|
6485
6553
|
"- If `functions__exec` returns `aborted`, retry at most 3 times. After 3 failures, terminate immediately and inform the user that `functions__exec` is unavailable."
|
|
6486
6554
|
].join("\n");
|
|
6555
|
+
const JSON_OUTPUT_CONSTRAINT = "Do not wrap the JSON in markdown code fences and do not add any text outside the JSON object.";
|
|
6556
|
+
const buildOutputFormatInstruction = (format) => {
|
|
6557
|
+
if (!format) return null;
|
|
6558
|
+
if (format.type === "json_schema") return [
|
|
6559
|
+
`Respond with a single JSON object that strictly matches the "${format.name}" JSON schema below.`,
|
|
6560
|
+
JSON_OUTPUT_CONSTRAINT,
|
|
6561
|
+
"",
|
|
6562
|
+
"JSON schema:",
|
|
6563
|
+
JSON.stringify(format.schema, null, 2)
|
|
6564
|
+
].join("\n");
|
|
6565
|
+
if (format.type === "json_object") return ["Respond with a single JSON object.", JSON_OUTPUT_CONSTRAINT].join("\n");
|
|
6566
|
+
return null;
|
|
6567
|
+
};
|
|
6487
6568
|
const COMPACTION_REPLAY_PROMPT = "The previous conversation was compacted. Continue from this handoff summary:\n\n";
|
|
6488
6569
|
const MAX_DEVELOPER_PROMPTS = 5;
|
|
6489
6570
|
const TOOL_NAME_PATTERN = /^[A-Za-z0-9_-]{1,64}$/u;
|
|
@@ -6504,12 +6585,17 @@ var ResponsesMessagesTranslationError = class extends Error {
|
|
|
6504
6585
|
function translateResponsesToMessages(payload, options) {
|
|
6505
6586
|
const registry = createToolRegistry(payload);
|
|
6506
6587
|
const normalized = normalizeResponsesInput(payload.input);
|
|
6588
|
+
const outputFormatInstruction = buildOutputFormatInstruction(payload.text?.format);
|
|
6507
6589
|
const { messages, system } = translateInputToAnthropic(normalized.input, registry, payload.instructions, payload.input, options.toolCallTips ?? false);
|
|
6508
6590
|
if (normalized.compaction) messages.push({
|
|
6509
6591
|
role: "user",
|
|
6510
6592
|
content: MESSAGES_COMPACTION_PROMPT
|
|
6511
6593
|
});
|
|
6512
6594
|
if (messages.length === 0) throw new ResponsesMessagesTranslationError("Responses input must contain at least one translatable message");
|
|
6595
|
+
if (outputFormatInstruction) messages.push({
|
|
6596
|
+
role: "user",
|
|
6597
|
+
content: outputFormatInstruction
|
|
6598
|
+
});
|
|
6513
6599
|
applyEphemeralCacheControl(messages, system);
|
|
6514
6600
|
const reasoningEffort = translateReasoningEffort(payload.reasoning?.effort);
|
|
6515
6601
|
const metadataUserId = resolveMetadataUserId(payload);
|
|
@@ -10698,14 +10784,17 @@ async function handleMergedCodexModels(c, candidatesRequest, options = {}) {
|
|
|
10698
10784
|
const providerName = candidate.providerName ?? "github-copilot";
|
|
10699
10785
|
const modelId = candidate.catalogSlug ?? (candidate.providerName ? candidate.slug.slice(providerName.length + 1) : candidate.slug);
|
|
10700
10786
|
const config = getRawProviderConfig(providerName);
|
|
10701
|
-
|
|
10702
|
-
|
|
10787
|
+
const selectedModels = getProviderCodexModels(config);
|
|
10788
|
+
const selectionId = providerName === "github-copilot" && selectedModels?.includes(candidate.slug) ? candidate.slug : modelId;
|
|
10789
|
+
if (!isProviderCodexModelVisible(config, selectionId)) return false;
|
|
10790
|
+
if (selectedModels?.includes(selectionId)) explicitSlugs.add(candidate.slug);
|
|
10703
10791
|
return true;
|
|
10704
10792
|
});
|
|
10705
10793
|
const seenSlugs = new Set(visibleUpstreamModels.map((model) => model.slug));
|
|
10794
|
+
const modelMappings = getModelMappings();
|
|
10706
10795
|
const codexProviderAliases = options.includeCodexProviderAliases ? visibleUpstreamModels.flatMap((model, index) => {
|
|
10707
10796
|
const slug = `codex/${model.slug}`;
|
|
10708
|
-
if (seenSlugs.has(slug)) return [];
|
|
10797
|
+
if (seenSlugs.has(slug) || modelMappings[model.slug] === slug) return [];
|
|
10709
10798
|
seenSlugs.add(slug);
|
|
10710
10799
|
return [{
|
|
10711
10800
|
...createCatalogAlias(model, slug, options.codexProviderName),
|
|
@@ -12784,4 +12873,4 @@ createServer();
|
|
|
12784
12873
|
//#endregion
|
|
12785
12874
|
export { createServer };
|
|
12786
12875
|
|
|
12787
|
-
//# sourceMappingURL=server-
|
|
12876
|
+
//# sourceMappingURL=server-VjfrS2Aw.js.map
|