@jeffreycao/copilot-api 2.8.3 → 2.8.4

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.
Files changed (26) hide show
  1. package/dist/{auth-b8dJfIDO.js → auth-BTHQn38N.js} +4 -4
  2. package/dist/{auth-b8dJfIDO.js.map → auth-BTHQn38N.js.map} +1 -1
  3. package/dist/auth-D7DnNvEO.js +1 -0
  4. package/dist/{config-B55PwJzQ.js → config-BRBygEXH.js} +2 -2
  5. package/dist/{config-B55PwJzQ.js.map → config-BRBygEXH.js.map} +1 -1
  6. package/dist/{config-store-DFcv4AY0.js → config-store-SwGZOmmG.js} +2 -1
  7. package/dist/config-store-SwGZOmmG.js.map +1 -0
  8. package/dist/{copilot-runtime-DNKNavLK.js → copilot-runtime-D--d2K7y.js} +3 -3
  9. package/dist/{copilot-runtime-DNKNavLK.js.map → copilot-runtime-D--d2K7y.js.map} +1 -1
  10. package/dist/{debug-1bQIZTcG.js → debug-8a37y6YE.js} +3 -3
  11. package/dist/{debug-1bQIZTcG.js.map → debug-8a37y6YE.js.map} +1 -1
  12. package/dist/main.js +4 -4
  13. package/dist/{provider-B8UJ434o.js → provider-CqQ4brtz.js} +2 -2
  14. package/dist/{provider-B8UJ434o.js.map → provider-CqQ4brtz.js.map} +1 -1
  15. package/dist/{provider-management-C6ZgkTJ7.js → provider-management-BDXwU7oJ.js} +2 -2
  16. package/dist/{provider-management-C6ZgkTJ7.js.map → provider-management-BDXwU7oJ.js.map} +1 -1
  17. package/dist/{server-Cw9qn5Gt.js → server-De8OQQe6.js} +1205 -1402
  18. package/dist/server-De8OQQe6.js.map +1 -0
  19. package/dist/{start-CPoEuVzr.js → start-vkJBrxcJ.js} +7 -7
  20. package/dist/{start-CPoEuVzr.js.map → start-vkJBrxcJ.js.map} +1 -1
  21. package/dist/{token-DFlvOMh2.js → token-CMboJXYu.js} +3 -3
  22. package/dist/{token-DFlvOMh2.js.map → token-CMboJXYu.js.map} +1 -1
  23. package/package.json +1 -1
  24. package/dist/auth-BFV7bzJo.js +0 -1
  25. package/dist/config-store-DFcv4AY0.js.map +0 -1
  26. package/dist/server-Cw9qn5Gt.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"copilot-runtime-DNKNavLK.js","names":["getCopilotModels"],"sources":["../src/lib/process-cleanup.ts","../src/lib/event-bus.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":["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","export type EventBusHandler<Event> = (event: Event) => void\n\nexport class EventBus<Events extends object> {\n private readonly handlers = new Map<\n keyof Events,\n Set<EventBusHandler<Events[keyof Events]>>\n >()\n\n publish<Name extends keyof Events>(name: Name, event: Events[Name]): void {\n const handlers = this.handlers.get(name)\n if (!handlers) {\n return\n }\n\n for (const handler of Array.from(handlers)) {\n handler(event)\n }\n }\n\n subscribe<Name extends keyof Events>(\n name: Name,\n handler: EventBusHandler<Events[Name]>,\n ): () => void {\n let handlers = this.handlers.get(name)\n if (!handlers) {\n handlers = new Set<EventBusHandler<Events[keyof Events]>>()\n this.handlers.set(name, handlers)\n }\n\n const registeredHandler = handler as EventBusHandler<Events[keyof Events]>\n handlers.add(registeredHandler)\n\n return () => {\n handlers.delete(registeredHandler)\n if (handlers.size === 0) {\n this.handlers.delete(name)\n }\n }\n }\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.144.0\"\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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"}
1
+ {"version":3,"file":"copilot-runtime-D--d2K7y.js","names":["getCopilotModels"],"sources":["../src/lib/process-cleanup.ts","../src/lib/event-bus.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":["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","export type EventBusHandler<Event> = (event: Event) => void\n\nexport class EventBus<Events extends object> {\n private readonly handlers = new Map<\n keyof Events,\n Set<EventBusHandler<Events[keyof Events]>>\n >()\n\n publish<Name extends keyof Events>(name: Name, event: Events[Name]): void {\n const handlers = this.handlers.get(name)\n if (!handlers) {\n return\n }\n\n for (const handler of Array.from(handlers)) {\n handler(event)\n }\n }\n\n subscribe<Name extends keyof Events>(\n name: Name,\n handler: EventBusHandler<Events[Name]>,\n ): () => void {\n let handlers = this.handlers.get(name)\n if (!handlers) {\n handlers = new Set<EventBusHandler<Events[keyof Events]>>()\n this.handlers.set(name, handlers)\n }\n\n const registeredHandler = handler as EventBusHandler<Events[keyof Events]>\n handlers.add(registeredHandler)\n\n return () => {\n handlers.delete(registeredHandler)\n if (handlers.size === 0) {\n this.handlers.delete(name)\n }\n }\n }\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.144.0\"\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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"}
@@ -1,5 +1,5 @@
1
- import { S as PATHS } from "./config-store-DFcv4AY0.js";
2
- import { i as listEnabledProviders, n as getRawProviderConfig } from "./config-B55PwJzQ.js";
1
+ import { S as PATHS } from "./config-store-SwGZOmmG.js";
2
+ import { i as listEnabledProviders, n as getRawProviderConfig } from "./config-BRBygEXH.js";
3
3
  import { defineCommand } from "citty";
4
4
  import consola from "consola";
5
5
  import fs from "node:fs/promises";
@@ -89,4 +89,4 @@ const debug = defineCommand({
89
89
  });
90
90
  export { debug };
91
91
 
92
- //# sourceMappingURL=debug-1bQIZTcG.js.map
92
+ //# sourceMappingURL=debug-8a37y6YE.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"debug-1bQIZTcG.js","names":[],"sources":["../src/debug.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport consola from \"consola\"\nimport fs from \"node:fs/promises\"\nimport os from \"node:os\"\nimport { fileURLToPath } from \"node:url\"\n\nimport { getRawProviderConfig, listEnabledProviders } from \"./lib/config\"\nimport { PATHS } from \"./lib/paths\"\n\ninterface DebugInfo {\n providers: {\n codexConfigured: boolean\n enabled: Array<string>\n }\n version: string\n runtime: {\n name: string\n version: string\n platform: string\n arch: string\n }\n paths: {\n APP_DIR: string\n CONFIG_PATH: string\n GITHUB_TOKEN_PATH: string\n }\n tokenExists: boolean\n}\n\ninterface RunDebugOptions {\n json: boolean\n}\n\nasync function getPackageVersion(): Promise<string> {\n try {\n const packageJsonPath = fileURLToPath(\n new URL(\"../package.json\", import.meta.url),\n )\n // @ts-expect-error https://github.com/sindresorhus/eslint-plugin-unicorn/blob/v59.0.1/docs/rules/prefer-json-parse-buffer.md\n // JSON.parse() can actually parse buffers\n const packageJson = JSON.parse(await fs.readFile(packageJsonPath)) as {\n version: string\n }\n return packageJson.version\n } catch {\n return \"unknown\"\n }\n}\n\nfunction getRuntimeInfo() {\n const isBun = typeof Bun !== \"undefined\"\n\n return {\n name: isBun ? \"bun\" : \"node\",\n version: isBun ? Bun.version : process.version.slice(1),\n platform: os.platform(),\n arch: os.arch(),\n }\n}\n\nasync function checkFileExists(filePath: string): Promise<boolean> {\n try {\n const stats = await fs.stat(filePath)\n if (!stats.isFile()) return false\n\n const content = await fs.readFile(filePath, \"utf8\")\n return content.trim().length > 0\n } catch {\n return false\n }\n}\n\nasync function getDebugInfo(): Promise<DebugInfo> {\n const [version, tokenExists] = await Promise.all([\n getPackageVersion(),\n checkFileExists(PATHS.GITHUB_TOKEN_PATH),\n ])\n\n return {\n providers: {\n codexConfigured: getRawProviderConfig(\"codex\") !== null,\n enabled: listEnabledProviders(),\n },\n version,\n runtime: getRuntimeInfo(),\n paths: {\n APP_DIR: PATHS.APP_DIR,\n CONFIG_PATH: PATHS.CONFIG_PATH,\n GITHUB_TOKEN_PATH: PATHS.GITHUB_TOKEN_PATH,\n },\n tokenExists,\n }\n}\n\nfunction printDebugInfoPlain(info: DebugInfo): void {\n consola.info(`copilot-api debug\n\nVersion: ${info.version}\nRuntime: ${info.runtime.name} ${info.runtime.version} (${info.runtime.platform} ${info.runtime.arch})\n\nProviders:\n- enabled: ${info.providers.enabled.join(\", \") || \"none\"}\n- codex configured: ${info.providers.codexConfigured ? \"Yes\" : \"No\"}\n\nPaths:\n- APP_DIR: ${info.paths.APP_DIR}\n- CONFIG_PATH: ${info.paths.CONFIG_PATH}\n- GITHUB_TOKEN_PATH: ${info.paths.GITHUB_TOKEN_PATH}\n\nGitHub token exists: ${info.tokenExists ? \"Yes\" : \"No\"}`)\n}\n\nfunction printDebugInfoJson(info: DebugInfo): void {\n console.log(JSON.stringify(info, null, 2))\n}\n\nexport async function runDebug(options: RunDebugOptions): Promise<void> {\n const debugInfo = await getDebugInfo()\n\n if (options.json) {\n printDebugInfoJson(debugInfo)\n } else {\n printDebugInfoPlain(debugInfo)\n }\n}\n\nexport const debug = defineCommand({\n meta: {\n name: \"debug\",\n description: \"Print debug information about the application\",\n },\n args: {\n json: {\n type: \"boolean\",\n default: false,\n description: \"Output debug information as JSON\",\n },\n },\n run({ args }) {\n return runDebug({\n json: args.json,\n })\n },\n})\n"],"mappings":";;;;;;;;AAmCA,eAAe,oBAAqC;CAClD,IAAI;EACF,MAAM,kBAAkB,cACtB,IAAI,IAAI,mBAAmB,YAAY,GAAG,CAC5C;EAMA,OAHoB,KAAK,MAAM,MAAM,GAAG,SAAS,eAAe,CAG/C,CAAC,CAAC;CACrB,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,iBAAiB;CACxB,MAAM,QAAQ,OAAO,QAAQ;CAE7B,OAAO;EACL,MAAM,QAAQ,QAAQ;EACtB,SAAS,QAAQ,IAAI,UAAU,QAAQ,QAAQ,MAAM,CAAC;EACtD,UAAU,GAAG,SAAS;EACtB,MAAM,GAAG,KAAK;CAChB;AACF;AAEA,eAAe,gBAAgB,UAAoC;CACjE,IAAI;EAEF,IAAI,EAAC,MADe,GAAG,KAAK,QAAQ,EAAA,CACzB,OAAO,GAAG,OAAO;EAG5B,QAAO,MADe,GAAG,SAAS,UAAU,MAAM,EAAA,CACnC,KAAK,CAAC,CAAC,SAAS;CACjC,QAAQ;EACN,OAAO;CACT;AACF;AAEA,eAAe,eAAmC;CAChD,MAAM,CAAC,SAAS,eAAe,MAAM,QAAQ,IAAI,CAC/C,kBAAkB,GAClB,gBAAgB,MAAM,iBAAiB,CACzC,CAAC;CAED,OAAO;EACL,WAAW;GACT,iBAAiB,qBAAqB,OAAO,MAAM;GACnD,SAAS,qBAAqB;EAChC;EACA;EACA,SAAS,eAAe;EACxB,OAAO;GACL,SAAS,MAAM;GACf,aAAa,MAAM;GACnB,mBAAmB,MAAM;EAC3B;EACA;CACF;AACF;AAEA,SAAS,oBAAoB,MAAuB;CAClD,QAAQ,KAAK;;WAEJ,KAAK,QAAQ;WACb,KAAK,QAAQ,KAAK,GAAG,KAAK,QAAQ,QAAQ,IAAI,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,KAAK;;;aAGvF,KAAK,UAAU,QAAQ,KAAK,IAAI,KAAK,OAAO;sBACnC,KAAK,UAAU,kBAAkB,QAAQ,KAAK;;;aAGvD,KAAK,MAAM,QAAQ;iBACf,KAAK,MAAM,YAAY;uBACjB,KAAK,MAAM,kBAAkB;;uBAE7B,KAAK,cAAc,QAAQ,MAAM;AACxD;AAEA,SAAS,mBAAmB,MAAuB;CACjD,QAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC3C;AAEA,eAAsB,SAAS,SAAyC;CACtE,MAAM,YAAY,MAAM,aAAa;CAErC,IAAI,QAAQ,MACV,mBAAmB,SAAS;MAE5B,oBAAoB,SAAS;AAEjC;AAEA,MAAa,QAAQ,cAAc;CACjC,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM,EACJ,MAAM;EACJ,MAAM;EACN,SAAS;EACT,aAAa;CACf,EACF;CACA,IAAI,EAAE,QAAQ;EACZ,OAAO,SAAS,EACd,MAAM,KAAK,KACb,CAAC;CACH;AACF,CAAC"}
1
+ {"version":3,"file":"debug-8a37y6YE.js","names":[],"sources":["../src/debug.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport consola from \"consola\"\nimport fs from \"node:fs/promises\"\nimport os from \"node:os\"\nimport { fileURLToPath } from \"node:url\"\n\nimport { getRawProviderConfig, listEnabledProviders } from \"./lib/config\"\nimport { PATHS } from \"./lib/paths\"\n\ninterface DebugInfo {\n providers: {\n codexConfigured: boolean\n enabled: Array<string>\n }\n version: string\n runtime: {\n name: string\n version: string\n platform: string\n arch: string\n }\n paths: {\n APP_DIR: string\n CONFIG_PATH: string\n GITHUB_TOKEN_PATH: string\n }\n tokenExists: boolean\n}\n\ninterface RunDebugOptions {\n json: boolean\n}\n\nasync function getPackageVersion(): Promise<string> {\n try {\n const packageJsonPath = fileURLToPath(\n new URL(\"../package.json\", import.meta.url),\n )\n // @ts-expect-error https://github.com/sindresorhus/eslint-plugin-unicorn/blob/v59.0.1/docs/rules/prefer-json-parse-buffer.md\n // JSON.parse() can actually parse buffers\n const packageJson = JSON.parse(await fs.readFile(packageJsonPath)) as {\n version: string\n }\n return packageJson.version\n } catch {\n return \"unknown\"\n }\n}\n\nfunction getRuntimeInfo() {\n const isBun = typeof Bun !== \"undefined\"\n\n return {\n name: isBun ? \"bun\" : \"node\",\n version: isBun ? Bun.version : process.version.slice(1),\n platform: os.platform(),\n arch: os.arch(),\n }\n}\n\nasync function checkFileExists(filePath: string): Promise<boolean> {\n try {\n const stats = await fs.stat(filePath)\n if (!stats.isFile()) return false\n\n const content = await fs.readFile(filePath, \"utf8\")\n return content.trim().length > 0\n } catch {\n return false\n }\n}\n\nasync function getDebugInfo(): Promise<DebugInfo> {\n const [version, tokenExists] = await Promise.all([\n getPackageVersion(),\n checkFileExists(PATHS.GITHUB_TOKEN_PATH),\n ])\n\n return {\n providers: {\n codexConfigured: getRawProviderConfig(\"codex\") !== null,\n enabled: listEnabledProviders(),\n },\n version,\n runtime: getRuntimeInfo(),\n paths: {\n APP_DIR: PATHS.APP_DIR,\n CONFIG_PATH: PATHS.CONFIG_PATH,\n GITHUB_TOKEN_PATH: PATHS.GITHUB_TOKEN_PATH,\n },\n tokenExists,\n }\n}\n\nfunction printDebugInfoPlain(info: DebugInfo): void {\n consola.info(`copilot-api debug\n\nVersion: ${info.version}\nRuntime: ${info.runtime.name} ${info.runtime.version} (${info.runtime.platform} ${info.runtime.arch})\n\nProviders:\n- enabled: ${info.providers.enabled.join(\", \") || \"none\"}\n- codex configured: ${info.providers.codexConfigured ? \"Yes\" : \"No\"}\n\nPaths:\n- APP_DIR: ${info.paths.APP_DIR}\n- CONFIG_PATH: ${info.paths.CONFIG_PATH}\n- GITHUB_TOKEN_PATH: ${info.paths.GITHUB_TOKEN_PATH}\n\nGitHub token exists: ${info.tokenExists ? \"Yes\" : \"No\"}`)\n}\n\nfunction printDebugInfoJson(info: DebugInfo): void {\n console.log(JSON.stringify(info, null, 2))\n}\n\nexport async function runDebug(options: RunDebugOptions): Promise<void> {\n const debugInfo = await getDebugInfo()\n\n if (options.json) {\n printDebugInfoJson(debugInfo)\n } else {\n printDebugInfoPlain(debugInfo)\n }\n}\n\nexport const debug = defineCommand({\n meta: {\n name: \"debug\",\n description: \"Print debug information about the application\",\n },\n args: {\n json: {\n type: \"boolean\",\n default: false,\n description: \"Output debug information as JSON\",\n },\n },\n run({ args }) {\n return runDebug({\n json: args.json,\n })\n },\n})\n"],"mappings":";;;;;;;;AAmCA,eAAe,oBAAqC;CAClD,IAAI;EACF,MAAM,kBAAkB,cACtB,IAAI,IAAI,mBAAmB,YAAY,GAAG,CAC5C;EAMA,OAHoB,KAAK,MAAM,MAAM,GAAG,SAAS,eAAe,CAG/C,CAAC,CAAC;CACrB,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,iBAAiB;CACxB,MAAM,QAAQ,OAAO,QAAQ;CAE7B,OAAO;EACL,MAAM,QAAQ,QAAQ;EACtB,SAAS,QAAQ,IAAI,UAAU,QAAQ,QAAQ,MAAM,CAAC;EACtD,UAAU,GAAG,SAAS;EACtB,MAAM,GAAG,KAAK;CAChB;AACF;AAEA,eAAe,gBAAgB,UAAoC;CACjE,IAAI;EAEF,IAAI,EAAC,MADe,GAAG,KAAK,QAAQ,EAAA,CACzB,OAAO,GAAG,OAAO;EAG5B,QAAO,MADe,GAAG,SAAS,UAAU,MAAM,EAAA,CACnC,KAAK,CAAC,CAAC,SAAS;CACjC,QAAQ;EACN,OAAO;CACT;AACF;AAEA,eAAe,eAAmC;CAChD,MAAM,CAAC,SAAS,eAAe,MAAM,QAAQ,IAAI,CAC/C,kBAAkB,GAClB,gBAAgB,MAAM,iBAAiB,CACzC,CAAC;CAED,OAAO;EACL,WAAW;GACT,iBAAiB,qBAAqB,OAAO,MAAM;GACnD,SAAS,qBAAqB;EAChC;EACA;EACA,SAAS,eAAe;EACxB,OAAO;GACL,SAAS,MAAM;GACf,aAAa,MAAM;GACnB,mBAAmB,MAAM;EAC3B;EACA;CACF;AACF;AAEA,SAAS,oBAAoB,MAAuB;CAClD,QAAQ,KAAK;;WAEJ,KAAK,QAAQ;WACb,KAAK,QAAQ,KAAK,GAAG,KAAK,QAAQ,QAAQ,IAAI,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,KAAK;;;aAGvF,KAAK,UAAU,QAAQ,KAAK,IAAI,KAAK,OAAO;sBACnC,KAAK,UAAU,kBAAkB,QAAQ,KAAK;;;aAGvD,KAAK,MAAM,QAAQ;iBACf,KAAK,MAAM,YAAY;uBACjB,KAAK,MAAM,kBAAkB;;uBAE7B,KAAK,cAAc,QAAQ,MAAM;AACxD;AAEA,SAAS,mBAAmB,MAAuB;CACjD,QAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC3C;AAEA,eAAsB,SAAS,SAAyC;CACtE,MAAM,YAAY,MAAM,aAAa;CAErC,IAAI,QAAQ,MACV,mBAAmB,SAAS;MAE5B,oBAAoB,SAAS;AAEjC;AAEA,MAAa,QAAQ,cAAc;CACjC,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM,EACJ,MAAM;EACJ,MAAM;EACN,SAAS;EACT,aAAa;CACf,EACF;CACA,IAAI,EAAE,QAAQ;EACZ,OAAO,SAAS,EACd,MAAM,KAAK,KACb,CAAC;CACH;AACF,CAAC"}
package/dist/main.js CHANGED
@@ -27,11 +27,11 @@ 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-ByE9Ctv0.js");
29
29
  bindElectronFetch();
30
- const { auth } = await import("./auth-BFV7bzJo.js");
31
- const { debug } = await import("./debug-1bQIZTcG.js");
30
+ const { auth } = await import("./auth-D7DnNvEO.js");
31
+ const { debug } = await import("./debug-8a37y6YE.js");
32
32
  const { mcp } = await import("./mcp-DJE9135Q.js");
33
- const { start } = await import("./start-CPoEuVzr.js");
34
- const { provider } = await import("./provider-B8UJ434o.js");
33
+ const { start } = await import("./start-vkJBrxcJ.js");
34
+ const { provider } = await import("./provider-CqQ4brtz.js");
35
35
  await runMain(defineCommand({
36
36
  meta: {
37
37
  name: "copilot-api",
@@ -1,4 +1,4 @@
1
- import { r as saveProviderManagementConfig } from "./provider-management-C6ZgkTJ7.js";
1
+ import { r as saveProviderManagementConfig } from "./provider-management-BDXwU7oJ.js";
2
2
  import { defineCommand } from "citty";
3
3
  // src/provider.ts
4
4
  function providerStateCommand(enabled) {
@@ -32,4 +32,4 @@ const provider = defineCommand({
32
32
  });
33
33
  export { provider };
34
34
 
35
- //# sourceMappingURL=provider-B8UJ434o.js.map
35
+ //# sourceMappingURL=provider-CqQ4brtz.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider-B8UJ434o.js","names":[],"sources":["../src/provider.ts"],"sourcesContent":["import { defineCommand } from \"citty\"\n\nimport { saveProviderManagementConfig } from \"./lib/provider-management\"\n\nfunction providerStateCommand(enabled: boolean) {\n return defineCommand({\n meta: {\n description: `${enabled ? \"Enable\" : \"Disable\"} a configured provider`,\n },\n args: {\n name: {\n type: \"positional\",\n required: true,\n description: \"Provider name\",\n },\n },\n run({ args }) {\n try {\n saveProviderManagementConfig({\n providers: { [args.name]: { enabled } },\n })\n process.stdout.write(\n `Provider '${args.name}' ${enabled ? \"enabled\" : \"disabled\"}. Restart the running server to apply the change.\\n`,\n )\n } catch (error) {\n process.stderr.write(\n `${error instanceof Error ? error.message : String(error)}\\n`,\n )\n process.exitCode = 1\n }\n },\n })\n}\n\nexport const provider = defineCommand({\n meta: { name: \"provider\", description: \"Manage configured providers\" },\n subCommands: {\n enable: providerStateCommand(true),\n disable: providerStateCommand(false),\n },\n})\n"],"mappings":";;;AAIA,SAAS,qBAAqB,SAAkB;CAC9C,OAAO,cAAc;EACnB,MAAM,EACJ,aAAa,GAAG,UAAU,WAAW,UAAU,wBACjD;EACA,MAAM,EACJ,MAAM;GACJ,MAAM;GACN,UAAU;GACV,aAAa;EACf,EACF;EACA,IAAI,EAAE,QAAQ;GACZ,IAAI;IACF,6BAA6B,EAC3B,WAAW,GAAG,KAAK,OAAO,EAAE,QAAQ,EAAE,EACxC,CAAC;IACD,QAAQ,OAAO,MACb,aAAa,KAAK,KAAK,IAAI,UAAU,YAAY,WAAW,oDAC9D;GACF,SAAS,OAAO;IACd,QAAQ,OAAO,MACb,GAAG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAC5D;IACA,QAAQ,WAAW;GACrB;EACF;CACF,CAAC;AACH;AAEA,MAAa,WAAW,cAAc;CACpC,MAAM;EAAE,MAAM;EAAY,aAAa;CAA8B;CACrE,aAAa;EACX,QAAQ,qBAAqB,IAAI;EACjC,SAAS,qBAAqB,KAAK;CACrC;AACF,CAAC"}
1
+ {"version":3,"file":"provider-CqQ4brtz.js","names":[],"sources":["../src/provider.ts"],"sourcesContent":["import { defineCommand } from \"citty\"\n\nimport { saveProviderManagementConfig } from \"./lib/provider-management\"\n\nfunction providerStateCommand(enabled: boolean) {\n return defineCommand({\n meta: {\n description: `${enabled ? \"Enable\" : \"Disable\"} a configured provider`,\n },\n args: {\n name: {\n type: \"positional\",\n required: true,\n description: \"Provider name\",\n },\n },\n run({ args }) {\n try {\n saveProviderManagementConfig({\n providers: { [args.name]: { enabled } },\n })\n process.stdout.write(\n `Provider '${args.name}' ${enabled ? \"enabled\" : \"disabled\"}. Restart the running server to apply the change.\\n`,\n )\n } catch (error) {\n process.stderr.write(\n `${error instanceof Error ? error.message : String(error)}\\n`,\n )\n process.exitCode = 1\n }\n },\n })\n}\n\nexport const provider = defineCommand({\n meta: { name: \"provider\", description: \"Manage configured providers\" },\n subCommands: {\n enable: providerStateCommand(true),\n disable: providerStateCommand(false),\n },\n})\n"],"mappings":";;;AAIA,SAAS,qBAAqB,SAAkB;CAC9C,OAAO,cAAc;EACnB,MAAM,EACJ,aAAa,GAAG,UAAU,WAAW,UAAU,wBACjD;EACA,MAAM,EACJ,MAAM;GACJ,MAAM;GACN,UAAU;GACV,aAAa;EACf,EACF;EACA,IAAI,EAAE,QAAQ;GACZ,IAAI;IACF,6BAA6B,EAC3B,WAAW,GAAG,KAAK,OAAO,EAAE,QAAQ,EAAE,EACxC,CAAC;IACD,QAAQ,OAAO,MACb,aAAa,KAAK,KAAK,IAAI,UAAU,YAAY,WAAW,oDAC9D;GACF,SAAS,OAAO;IACd,QAAQ,OAAO,MACb,GAAG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAC5D;IACA,QAAQ,WAAW;GACrB;EACF;CACF,CAAC;AACH;AAEA,MAAa,WAAW,cAAc;CACpC,MAAM;EAAE,MAAM;EAAY,aAAa;CAA8B;CACrE,aAAa;EACX,QAAQ,qBAAqB,IAAI;EACjC,SAAS,qBAAqB,KAAK;CACrC;AACF,CAAC"}
@@ -1,4 +1,4 @@
1
- import { S as PATHS, f as invalidateConfigCache, v as readEditableConfigFromDisk, w as GITHUB_COPILOT_PROVIDER, x as writeConfigToDisk } from "./config-store-DFcv4AY0.js";
1
+ import { S as PATHS, f as invalidateConfigCache, v as readEditableConfigFromDisk, w as GITHUB_COPILOT_PROVIDER, x as writeConfigToDisk } from "./config-store-SwGZOmmG.js";
2
2
  import { z } from "zod";
3
3
  // src/lib/provider-management.ts
4
4
  const updateSchema = z.object({ providers: z.record(z.string(), z.object({
@@ -56,4 +56,4 @@ function saveProviderManagementConfig(input) {
56
56
  }
57
57
  export { isProviderAgentModelVisible as n, saveProviderManagementConfig as r, getProviderAgentModels as t };
58
58
 
59
- //# sourceMappingURL=provider-management-C6ZgkTJ7.js.map
59
+ //# sourceMappingURL=provider-management-BDXwU7oJ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider-management-C6ZgkTJ7.js","names":[],"sources":["../src/lib/provider-management.ts"],"sourcesContent":["import { z } from \"zod\"\n\nimport { GITHUB_COPILOT_PROVIDER } from \"./github-copilot-provider\"\n\nimport {\n invalidateConfigCache,\n readEditableConfigFromDisk,\n writeConfigToDisk,\n type AppConfig,\n type ProviderConfig,\n} from \"./config-store\"\nimport { PATHS } from \"./paths\"\nimport type { ProviderManagementConfig } from \"./types/provider-management\"\nexport type {\n ProviderManagementConfig,\n ProviderManagementUpdate,\n} from \"./types/provider-management\"\n\nconst updateSchema = z\n .object({\n providers: z\n .record(\n z.string(),\n z\n .object({\n enabled: z.boolean().optional(),\n agentsModels: z\n .array(z.string().trim().min(1))\n .nullable()\n .optional(),\n })\n .strict(),\n )\n .optional(),\n })\n .strict()\n\nexport function getProviderAgentModels(\n provider: ProviderConfig | null | undefined,\n): Array<string> | undefined {\n const models = provider?.agentsModels\n if (!Array.isArray(models) || !models.every((id) => typeof id === \"string\")) {\n return undefined\n }\n return [...new Set(models.map((id) => id.trim()).filter(Boolean))]\n}\n\nexport function isProviderAgentModelVisible(\n provider: ProviderConfig | null | undefined,\n modelId: string,\n): boolean {\n if (provider?.enabled === false) return false\n const models = getProviderAgentModels(provider)\n return models === undefined || models.includes(modelId)\n}\n\nexport function getProviderManagementConfig(\n config: AppConfig = readEditableConfigFromDisk(),\n): ProviderManagementConfig {\n const providers: NonNullable<AppConfig[\"providers\"]> = {\n [GITHUB_COPILOT_PROVIDER]: {},\n ...config.providers,\n }\n return {\n configPath: PATHS.CONFIG_PATH,\n providers: Object.entries(providers)\n .filter(([name]) => name !== \"copilot\")\n .map(([name, provider]) => ({\n name,\n type:\n name === GITHUB_COPILOT_PROVIDER ? \"github-copilot\" : (\n (provider.type ?? \"anthropic\")\n ),\n enabled: provider.enabled !== false,\n agentsModels: getProviderAgentModels(provider),\n })),\n }\n}\n\nexport function applyProviderManagementUpdate(\n config: AppConfig,\n input: unknown,\n): AppConfig {\n const parsed = updateSchema.safeParse(input)\n if (!parsed.success) {\n throw new Error(\n parsed.error.issues[0]?.message ?? \"Invalid provider update\",\n )\n }\n const { providers: updates } = parsed.data\n const providers = { ...config.providers }\n for (const [name, update] of Object.entries(updates ?? {})) {\n if (\n name === \"copilot\"\n || (name !== GITHUB_COPILOT_PROVIDER && !Object.hasOwn(providers, name))\n ) {\n throw new Error(`Provider '${name}' is not configured`)\n }\n const provider = { ...providers[name] }\n if (update.enabled !== undefined) provider.enabled = update.enabled\n if (update.agentsModels === null) {\n delete provider.agentsModels\n } else if (update.agentsModels !== undefined) {\n provider.agentsModels = [...new Set(update.agentsModels)]\n }\n providers[name] = provider\n }\n return {\n ...config,\n ...(updates !== undefined ? { providers } : {}),\n }\n}\n\nexport function saveProviderManagementConfig(\n input: unknown,\n): ProviderManagementConfig {\n const updated = applyProviderManagementUpdate(\n readEditableConfigFromDisk(),\n input,\n )\n writeConfigToDisk(updated)\n invalidateConfigCache()\n return getProviderManagementConfig(updated)\n}\n"],"mappings":";;;AAkBA,MAAM,eAAe,EAClB,OAAO,EACN,WAAW,EACR,OACC,EAAE,OAAO,GACT,EACG,OAAO;CACN,SAAS,EAAE,QAAQ,CAAC,CAAC,SAAS;CAC9B,cAAc,EACX,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC/B,SAAS,CAAC,CACV,SAAS;AACd,CAAC,CAAC,CACD,OAAO,CACZ,CAAC,CACA,SAAS,EACd,CAAC,CAAC,CACD,OAAO;AAEV,SAAgB,uBACd,UAC2B;CAC3B,MAAM,SAAS,UAAU;CACzB,IAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,QAAQ,GACxE;CAEF,OAAO,CAAC,GAAG,IAAI,IAAI,OAAO,KAAK,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC;AACnE;AAEA,SAAgB,4BACd,UACA,SACS;CACT,IAAI,UAAU,YAAY,OAAO,OAAO;CACxC,MAAM,SAAS,uBAAuB,QAAQ;CAC9C,OAAO,WAAW,KAAA,KAAa,OAAO,SAAS,OAAO;AACxD;AAEA,SAAgB,4BACd,SAAoB,2BAA2B,GACrB;CAC1B,MAAM,YAAiD;GACpD,0BAA0B,CAAC;EAC5B,GAAG,OAAO;CACZ;CACA,OAAO;EACL,YAAY,MAAM;EAClB,WAAW,OAAO,QAAQ,SAAS,CAAC,CACjC,QAAQ,CAAC,UAAU,SAAS,SAAS,CAAC,CACtC,KAAK,CAAC,MAAM,eAAe;GAC1B;GACA,MACE,SAAA,mBAAmC,mBAChC,SAAS,QAAQ;GAEtB,SAAS,SAAS,YAAY;GAC9B,cAAc,uBAAuB,QAAQ;EAC/C,EAAE;CACN;AACF;AAEA,SAAgB,8BACd,QACA,OACW;CACX,MAAM,SAAS,aAAa,UAAU,KAAK;CAC3C,IAAI,CAAC,OAAO,SACV,MAAM,IAAI,MACR,OAAO,MAAM,OAAO,EAAE,EAAE,WAAW,yBACrC;CAEF,MAAM,EAAE,WAAW,YAAY,OAAO;CACtC,MAAM,YAAY,EAAE,GAAG,OAAO,UAAU;CACxC,KAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,WAAW,CAAC,CAAC,GAAG;EAC1D,IACE,SAAS,aACL,SAAA,oBAAoC,CAAC,OAAO,OAAO,WAAW,IAAI,GAEtE,MAAM,IAAI,MAAM,aAAa,KAAK,oBAAoB;EAExD,MAAM,WAAW,EAAE,GAAG,UAAU,MAAM;EACtC,IAAI,OAAO,YAAY,KAAA,GAAW,SAAS,UAAU,OAAO;EAC5D,IAAI,OAAO,iBAAiB,MAC1B,OAAO,SAAS;OACX,IAAI,OAAO,iBAAiB,KAAA,GACjC,SAAS,eAAe,CAAC,GAAG,IAAI,IAAI,OAAO,YAAY,CAAC;EAE1D,UAAU,QAAQ;CACpB;CACA,OAAO;EACL,GAAG;EACH,GAAI,YAAY,KAAA,IAAY,EAAE,UAAU,IAAI,CAAC;CAC/C;AACF;AAEA,SAAgB,6BACd,OAC0B;CAC1B,MAAM,UAAU,8BACd,2BAA2B,GAC3B,KACF;CACA,kBAAkB,OAAO;CACzB,sBAAsB;CACtB,OAAO,4BAA4B,OAAO;AAC5C"}
1
+ {"version":3,"file":"provider-management-BDXwU7oJ.js","names":[],"sources":["../src/lib/provider-management.ts"],"sourcesContent":["import { z } from \"zod\"\n\nimport { GITHUB_COPILOT_PROVIDER } from \"./github-copilot-provider\"\n\nimport {\n invalidateConfigCache,\n readEditableConfigFromDisk,\n writeConfigToDisk,\n type AppConfig,\n type ProviderConfig,\n} from \"./config-store\"\nimport { PATHS } from \"./paths\"\nimport type { ProviderManagementConfig } from \"./types/provider-management\"\nexport type {\n ProviderManagementConfig,\n ProviderManagementUpdate,\n} from \"./types/provider-management\"\n\nconst updateSchema = z\n .object({\n providers: z\n .record(\n z.string(),\n z\n .object({\n enabled: z.boolean().optional(),\n agentsModels: z\n .array(z.string().trim().min(1))\n .nullable()\n .optional(),\n })\n .strict(),\n )\n .optional(),\n })\n .strict()\n\nexport function getProviderAgentModels(\n provider: ProviderConfig | null | undefined,\n): Array<string> | undefined {\n const models = provider?.agentsModels\n if (!Array.isArray(models) || !models.every((id) => typeof id === \"string\")) {\n return undefined\n }\n return [...new Set(models.map((id) => id.trim()).filter(Boolean))]\n}\n\nexport function isProviderAgentModelVisible(\n provider: ProviderConfig | null | undefined,\n modelId: string,\n): boolean {\n if (provider?.enabled === false) return false\n const models = getProviderAgentModels(provider)\n return models === undefined || models.includes(modelId)\n}\n\nexport function getProviderManagementConfig(\n config: AppConfig = readEditableConfigFromDisk(),\n): ProviderManagementConfig {\n const providers: NonNullable<AppConfig[\"providers\"]> = {\n [GITHUB_COPILOT_PROVIDER]: {},\n ...config.providers,\n }\n return {\n configPath: PATHS.CONFIG_PATH,\n providers: Object.entries(providers)\n .filter(([name]) => name !== \"copilot\")\n .map(([name, provider]) => ({\n name,\n type:\n name === GITHUB_COPILOT_PROVIDER ? \"github-copilot\" : (\n (provider.type ?? \"anthropic\")\n ),\n enabled: provider.enabled !== false,\n agentsModels: getProviderAgentModels(provider),\n })),\n }\n}\n\nexport function applyProviderManagementUpdate(\n config: AppConfig,\n input: unknown,\n): AppConfig {\n const parsed = updateSchema.safeParse(input)\n if (!parsed.success) {\n throw new Error(\n parsed.error.issues[0]?.message ?? \"Invalid provider update\",\n )\n }\n const { providers: updates } = parsed.data\n const providers = { ...config.providers }\n for (const [name, update] of Object.entries(updates ?? {})) {\n if (\n name === \"copilot\"\n || (name !== GITHUB_COPILOT_PROVIDER && !Object.hasOwn(providers, name))\n ) {\n throw new Error(`Provider '${name}' is not configured`)\n }\n const provider = { ...providers[name] }\n if (update.enabled !== undefined) provider.enabled = update.enabled\n if (update.agentsModels === null) {\n delete provider.agentsModels\n } else if (update.agentsModels !== undefined) {\n provider.agentsModels = [...new Set(update.agentsModels)]\n }\n providers[name] = provider\n }\n return {\n ...config,\n ...(updates !== undefined ? { providers } : {}),\n }\n}\n\nexport function saveProviderManagementConfig(\n input: unknown,\n): ProviderManagementConfig {\n const updated = applyProviderManagementUpdate(\n readEditableConfigFromDisk(),\n input,\n )\n writeConfigToDisk(updated)\n invalidateConfigCache()\n return getProviderManagementConfig(updated)\n}\n"],"mappings":";;;AAkBA,MAAM,eAAe,EAClB,OAAO,EACN,WAAW,EACR,OACC,EAAE,OAAO,GACT,EACG,OAAO;CACN,SAAS,EAAE,QAAQ,CAAC,CAAC,SAAS;CAC9B,cAAc,EACX,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC/B,SAAS,CAAC,CACV,SAAS;AACd,CAAC,CAAC,CACD,OAAO,CACZ,CAAC,CACA,SAAS,EACd,CAAC,CAAC,CACD,OAAO;AAEV,SAAgB,uBACd,UAC2B;CAC3B,MAAM,SAAS,UAAU;CACzB,IAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,QAAQ,GACxE;CAEF,OAAO,CAAC,GAAG,IAAI,IAAI,OAAO,KAAK,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC;AACnE;AAEA,SAAgB,4BACd,UACA,SACS;CACT,IAAI,UAAU,YAAY,OAAO,OAAO;CACxC,MAAM,SAAS,uBAAuB,QAAQ;CAC9C,OAAO,WAAW,KAAA,KAAa,OAAO,SAAS,OAAO;AACxD;AAEA,SAAgB,4BACd,SAAoB,2BAA2B,GACrB;CAC1B,MAAM,YAAiD;GACpD,0BAA0B,CAAC;EAC5B,GAAG,OAAO;CACZ;CACA,OAAO;EACL,YAAY,MAAM;EAClB,WAAW,OAAO,QAAQ,SAAS,CAAC,CACjC,QAAQ,CAAC,UAAU,SAAS,SAAS,CAAC,CACtC,KAAK,CAAC,MAAM,eAAe;GAC1B;GACA,MACE,SAAA,mBAAmC,mBAChC,SAAS,QAAQ;GAEtB,SAAS,SAAS,YAAY;GAC9B,cAAc,uBAAuB,QAAQ;EAC/C,EAAE;CACN;AACF;AAEA,SAAgB,8BACd,QACA,OACW;CACX,MAAM,SAAS,aAAa,UAAU,KAAK;CAC3C,IAAI,CAAC,OAAO,SACV,MAAM,IAAI,MACR,OAAO,MAAM,OAAO,EAAE,EAAE,WAAW,yBACrC;CAEF,MAAM,EAAE,WAAW,YAAY,OAAO;CACtC,MAAM,YAAY,EAAE,GAAG,OAAO,UAAU;CACxC,KAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,WAAW,CAAC,CAAC,GAAG;EAC1D,IACE,SAAS,aACL,SAAA,oBAAoC,CAAC,OAAO,OAAO,WAAW,IAAI,GAEtE,MAAM,IAAI,MAAM,aAAa,KAAK,oBAAoB;EAExD,MAAM,WAAW,EAAE,GAAG,UAAU,MAAM;EACtC,IAAI,OAAO,YAAY,KAAA,GAAW,SAAS,UAAU,OAAO;EAC5D,IAAI,OAAO,iBAAiB,MAC1B,OAAO,SAAS;OACX,IAAI,OAAO,iBAAiB,KAAA,GACjC,SAAS,eAAe,CAAC,GAAG,IAAI,IAAI,OAAO,YAAY,CAAC;EAE1D,UAAU,QAAQ;CACpB;CACA,OAAO;EACL,GAAG;EACH,GAAI,YAAY,KAAA,IAAY,EAAE,UAAU,IAAI,CAAC;CAC/C;AACF;AAEA,SAAgB,6BACd,OAC0B;CAC1B,MAAM,UAAU,8BACd,2BAA2B,GAC3B,KACF;CACA,kBAAkB,OAAO;CACzB,sBAAsB;CACtB,OAAO,4BAA4B,OAAO;AAC5C"}