@jeffreycao/copilot-api 2.7.42 → 2.7.43
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/README.md +5 -2
- package/README.zh-CN.md +5 -2
- package/dist/{auth-mWM5qL2k.js → auth-B9pYwLYA.js} +4 -4
- package/dist/{auth-mWM5qL2k.js.map → auth-B9pYwLYA.js.map} +1 -1
- package/dist/auth-dswtyrvJ.js +1 -0
- package/dist/{config-iQblHCkd.js → config-BvACNGIp.js} +7 -3
- package/dist/config-BvACNGIp.js.map +1 -0
- package/dist/{config-store-BsluQttR.js → config-store-BLr5xjym.js} +10 -3
- package/dist/config-store-BLr5xjym.js.map +1 -0
- package/dist/{copilot-runtime-CyB0L4lt.js → copilot-runtime-DvmA6ALD.js} +3 -3
- package/dist/{copilot-runtime-CyB0L4lt.js.map → copilot-runtime-DvmA6ALD.js.map} +1 -1
- package/dist/{debug-B-XA6AD4.js → debug-C_uR3s4n.js} +3 -3
- package/dist/{debug-B-XA6AD4.js.map → debug-C_uR3s4n.js.map} +1 -1
- package/dist/main.js +4 -4
- package/dist/{provider-BMPS2mij.js → provider-_0MixRky.js} +2 -2
- package/dist/{provider-BMPS2mij.js.map → provider-_0MixRky.js.map} +1 -1
- package/dist/{provider-management-vyEQj9RR.js → provider-management-C8AWr-Gk.js} +2 -2
- package/dist/{provider-management-vyEQj9RR.js.map → provider-management-C8AWr-Gk.js.map} +1 -1
- package/dist/{server-BCdcNCtc.js → server-Bz8hGP4q.js} +18 -8
- package/dist/server-Bz8hGP4q.js.map +1 -0
- package/dist/{start-DEWKs2S3.js → start-BBEryu3z.js} +7 -7
- package/dist/{start-DEWKs2S3.js.map → start-BBEryu3z.js.map} +1 -1
- package/dist/{token-D_b2AmEW.js → token-D3nRiw9B.js} +3 -3
- package/dist/{token-D_b2AmEW.js.map → token-D3nRiw9B.js.map} +1 -1
- package/package.json +1 -1
- package/dist/auth-IX3bOao0.js +0 -1
- package/dist/config-iQblHCkd.js.map +0 -1
- package/dist/config-store-BsluQttR.js.map +0 -1
- package/dist/server-BCdcNCtc.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-store-BLr5xjym.js","names":["fs"],"sources":["../src/lib/atomic-file.ts","../src/lib/error.ts","../src/lib/state.ts","../src/lib/github-copilot-provider.ts","../src/lib/paths.ts","../src/lib/config-store.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\"\nimport fs from \"node:fs\"\nimport path from \"node:path\"\n\nconst TEMP_FILE_RANDOM_BYTES = 8\n\n// The file-level fsync persists the contents, but the rename only updates the\n// parent directory entry, which needs its own fsync to survive a crash or\n// power loss. Best-effort: the rename has already taken effect, so a failure\n// here only weakens crash durability and must not fail the write. Directory\n// fsync is not supported on Windows (opening a directory handle fails there).\nconst fsyncDirectory = (directory: string): void => {\n if (process.platform === \"win32\") {\n return\n }\n\n let directoryFd: number | undefined\n try {\n directoryFd = fs.openSync(directory, \"r\")\n fs.fsyncSync(directoryFd)\n } catch (error) {\n console.warn(`Failed to fsync directory: ${directory}`, error)\n } finally {\n if (directoryFd !== undefined) {\n try {\n fs.closeSync(directoryFd)\n } catch {\n // Preserve the fsync warning.\n }\n }\n }\n}\n\nexport function writeFileAtomically(filePath: string, content: string): void {\n const directory = path.dirname(filePath)\n const tempPath = path.join(\n directory,\n `.${path.basename(filePath)}.${process.pid}.${randomBytes(TEMP_FILE_RANDOM_BYTES).toString(\"hex\")}.tmp`,\n )\n\n fs.mkdirSync(directory, { recursive: true })\n\n let fileDescriptor: number | undefined\n let tempFileCreated = false\n try {\n fileDescriptor = fs.openSync(tempPath, \"wx\", 0o600)\n tempFileCreated = true\n fs.writeFileSync(fileDescriptor, content, \"utf8\")\n fs.fsyncSync(fileDescriptor)\n fs.closeSync(fileDescriptor)\n fileDescriptor = undefined\n fs.renameSync(tempPath, filePath)\n tempFileCreated = false\n fsyncDirectory(directory)\n } catch (error) {\n if (fileDescriptor !== undefined) {\n try {\n fs.closeSync(fileDescriptor)\n } catch {\n // Preserve the original write error.\n }\n }\n\n if (tempFileCreated) {\n try {\n fs.rmSync(tempPath, { force: true })\n } catch {\n // Preserve the original write error.\n }\n }\n\n throw error\n }\n}\n","import type { Context } from \"hono\"\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\"\n\nimport consola from \"consola\"\n\nexport class HTTPError extends Error {\n response: Response\n\n constructor(message: string, response: Response) {\n super(message)\n this.response = response\n }\n}\n\nexport class UpstreamHeadersTimeoutError extends Error {\n readonly timeoutMs: number\n\n constructor(timeoutMs: number) {\n super(`Upstream did not return headers within ${timeoutMs}ms`)\n this.name = \"UpstreamHeadersTimeoutError\"\n this.timeoutMs = timeoutMs\n }\n}\n\nexport class UpstreamStreamInactivityTimeoutError extends Error {\n readonly timeoutMs: number\n\n constructor(timeoutMs: number) {\n super(`Upstream stream was inactive for ${timeoutMs}ms`)\n this.name = \"UpstreamStreamInactivityTimeoutError\"\n this.timeoutMs = timeoutMs\n }\n}\n\nexport async function forwardError(\n c: Context,\n error: unknown,\n): Promise<Response> {\n if (\n error instanceof UpstreamHeadersTimeoutError\n || error instanceof UpstreamStreamInactivityTimeoutError\n ) {\n consola.error(\"Error occurred:\", error)\n return c.json(\n {\n error: {\n message: error.message,\n type: \"upstream_timeout\",\n },\n },\n 504,\n )\n }\n\n if (c.req.raw.signal.aborted || isAbortError(error)) {\n return new Response(null, {\n status: 499,\n statusText: \"Client Closed Request\",\n })\n }\n\n consola.error(\"Error occurred:\", error)\n\n if (error instanceof HTTPError) {\n for (const [name, value] of error.response.headers) {\n const lowerName = name.toLowerCase()\n if (\n lowerName === \"retry-after\"\n || lowerName === \"x-request-id\"\n || lowerName === \"x-oai-request-id\"\n || (error.response.status === 429 && lowerName.startsWith(\"x-\"))\n ) {\n c.header(name, value)\n }\n }\n\n const errorText = await error.response.text()\n let errorJson: unknown\n try {\n errorJson = JSON.parse(errorText)\n } catch {\n errorJson = errorText\n }\n consola.error(\"HTTP error:\", errorJson)\n if (isUpstreamErrorResponse(errorJson)) {\n return c.json(errorJson, error.response.status as ContentfulStatusCode)\n }\n return c.json(\n {\n error: {\n message: errorText,\n type: \"error\",\n },\n },\n error.response.status as ContentfulStatusCode,\n )\n }\n\n return c.json(\n {\n error: {\n message: (error as Error).message,\n type: \"error\",\n },\n },\n 500,\n )\n}\n\nconst isAbortError = (error: unknown): boolean =>\n error instanceof Error && error.name === \"AbortError\"\n\ntype UpstreamErrorResponse = Record<string, unknown> & {\n error: Record<string, unknown>\n}\n\nconst isUpstreamErrorResponse = (\n value: unknown,\n): value is UpstreamErrorResponse => {\n if (typeof value !== \"object\" || value === null || !(\"error\" in value)) {\n return false\n }\n const error = value.error\n return typeof error === \"object\" && error !== null && !Array.isArray(error)\n}\n","import { randomUUID } from \"node:crypto\"\n\nimport type { ModelsResponse } from \"~/lib/types/models\"\n\nexport interface State {\n githubToken?: string\n githubTokenSource?: \"cli\" | \"env\" | \"file\"\n userName?: string\n copilotToken?: string\n codexAccessToken?: string\n codexRefreshToken?: string\n codexExpiresAt?: number\n codexAccountId?: string\n\n accountType: string\n models?: ModelsResponse\n vsCodeVersion?: string\n\n macMachineId?: string\n vsCodeSessionId?: string\n vsCodeDeviceId: string\n\n showToken: boolean\n\n verbose: boolean\n\n copilotApiUrl?: string\n tokenBasedBilling?: boolean\n}\n\nexport const state: State = {\n accountType: \"individual\",\n showToken: false,\n verbose: false,\n vsCodeDeviceId: randomUUID(),\n}\n","import { getConfig, type AppConfig } from \"./config-store\"\nimport { HTTPError } from \"./error\"\nimport { state, type State } from \"./state\"\n\nexport const GITHUB_COPILOT_PROVIDER = \"github-copilot\"\n\n// Missing configuration preserves the legacy builtin Copilot behavior.\nexport function isGitHubCopilotEnabled(\n config: AppConfig = getConfig(),\n): boolean {\n return config.providers?.[GITHUB_COPILOT_PROVIDER]?.enabled !== false\n}\n\n// Provider-only mode may leave Copilot enabled without loading its credentials.\nexport function isGitHubCopilotAvailable(\n config: AppConfig = getConfig(),\n runtime: Pick<State, \"githubToken\" | \"copilotToken\"> = state,\n): boolean {\n return (\n isGitHubCopilotEnabled(config)\n && Boolean(runtime.githubToken && runtime.copilotToken)\n )\n}\n\nexport function assertGitHubCopilotEnabled(): void {\n if (!isGitHubCopilotEnabled()) {\n throw new HTTPError(\n \"GitHub Copilot provider is disabled\",\n Response.json(\n {\n error: {\n message: \"GitHub Copilot provider is disabled\",\n type: \"provider_disabled\",\n },\n },\n { status: 403 },\n ),\n )\n }\n}\n","import fs from \"node:fs/promises\"\nimport os from \"node:os\"\nimport path from \"node:path\"\n\nconst AUTH_APP = process.env.COPILOT_API_OAUTH_APP?.trim() || \"\"\nconst ENTERPRISE_PREFIX = process.env.COPILOT_API_ENTERPRISE_URL ? \"ent_\" : \"\"\n\nconst DEFAULT_DIR = path.join(os.homedir(), \".local\", \"share\", \"copilot-api\")\nconst APP_DIR = process.env.COPILOT_API_HOME || DEFAULT_DIR\n\nconst GITHUB_TOKEN_PATH = path.join(\n APP_DIR,\n AUTH_APP,\n ENTERPRISE_PREFIX + \"github_token\",\n)\nconst CODEX_CREDENTIAL_PATH = path.join(APP_DIR, \"codex_credentials.json\")\nconst XAI_CREDENTIAL_PATH = path.join(APP_DIR, \"xai_credentials.json\")\nconst CONFIG_PATH = path.join(APP_DIR, \"config.json\")\n\nexport const PATHS = {\n APP_DIR,\n GITHUB_TOKEN_PATH,\n CODEX_CREDENTIAL_PATH,\n XAI_CREDENTIAL_PATH,\n CONFIG_PATH,\n}\n\nexport async function ensurePaths(): Promise<void> {\n await fs.mkdir(path.join(PATHS.APP_DIR, AUTH_APP), { recursive: true })\n await ensureFile(PATHS.GITHUB_TOKEN_PATH)\n await ensureFile(PATHS.CONFIG_PATH)\n}\n\nasync function ensureFile(filePath: string): Promise<void> {\n try {\n await fs.access(filePath, fs.constants.W_OK)\n } catch {\n await fs.writeFile(filePath, \"\")\n await fs.chmod(filePath, 0o600)\n }\n}\n","import consola from \"consola\"\nimport { randomBytes } from \"node:crypto\"\nimport fs from \"node:fs\"\n\nimport type { TokenUsagePricingConfig } from \"~/lib/token-usage/pricing\"\n\nimport { writeFileAtomically } from \"./atomic-file\"\nimport { isGitHubCopilotAvailable } from \"./github-copilot-provider\"\nimport { PATHS } from \"./paths\"\n\nexport interface AppConfig {\n auth?: {\n apiKeys?: Array<string>\n adminApiKey?: string\n }\n providers?: Record<string, ProviderConfig>\n modelMappings?: Record<string, string>\n extraPrompts?: Record<string, string>\n smallModels?: SmallModelsConfig\n contextManagement?: ContextManagementConfig\n opencodeModelContextWindow?: number\n modelResponsesApiCompactThresholds?: Record<string, number>\n modelReasoningEfforts?: Record<\n string,\n \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\"\n >\n useMessagesApi?: boolean\n useResponsesApiWebSocket?: boolean\n // Copilot model IDs that must not request output.encrypted_content.\n noEncryptedOutputModels?: Array<string>\n upstreamTransport?: UpstreamTransportConfig\n anthropicApiKey?: string\n useResponsesApiWebSearch?: boolean\n alphaSearchCodexPriority?: boolean\n alphaSearchModel?: string\n // Copilot rejects Anthropic's web_search server tool on /v1/messages, so a\n // Claude request that only asks for web search is switched to this model.\n // A `provider/model` alias is passed straight through to that provider's\n // (websearch-capable) message API, while a plain GPT model runs the search\n // via /responses. Leave unset to disable (the tool is then stripped).\n // Mixing web_search with other tools is not supported.\n messageApiWebSearchModel?: string\n // Top-level image routes stay on the OpenAI/Codex path until these are set\n // to an xai/model alias. Only the xAI Imagine API is supported.\n imageGenerationModel?: string\n imageEditModel?: string\n // Model used for Claude Code background security-monitor requests on\n // /v1/messages and provider message APIs: requests without tools, with\n // `stop_sequences: [\"</block>\"]` and a system block starting with\n // \"You are a security monitor for autonomous AI coding agents.\".\n // A `provider/model` alias is forwarded to that provider's message API on\n // the top-level route. Provider message routes use the configured value on\n // their current provider. Defaults to codex-auto-review when Codex is\n // enabled, otherwise gpt-6-luna when GitHub Copilot is enabled and both its\n // GitHub and Copilot tokens are loaded. An explicit empty value disables\n // the override.\n claudeAutoModel?: string\n claudeTokenMultiplier?: number\n}\n\nexport interface SmallModelsConfig {\n codex?: string\n copilot?: string\n [providerName: string]: string | undefined\n}\n\nexport interface ContextManagementConfig {\n messages?: boolean\n responses?: boolean\n}\n\nexport interface UpstreamTransportConfig {\n headersTimeoutMs?: number\n streamInactivityTimeoutMs?: number\n websocketMaxBufferedBytes?: number\n websocketMaxBufferedMessages?: number\n websocketOpenTimeoutMs?: number\n websocketPoolIdleTimeoutMs?: number\n}\n\nexport const defaultUpstreamTransportConfig = {\n headersTimeoutMs: 5 * 60 * 1000,\n streamInactivityTimeoutMs: 5 * 60 * 1000,\n websocketMaxBufferedBytes: 8 * 1024 * 1024,\n websocketMaxBufferedMessages: 1024,\n websocketOpenTimeoutMs: 30_000,\n websocketPoolIdleTimeoutMs: 60_000,\n} satisfies Required<UpstreamTransportConfig>\n\nexport interface ModelConfig {\n temperature?: number\n topP?: number\n topK?: number\n extraBody?: Record<string, unknown>\n contextCache?: boolean\n contextWindow?: number\n maxOutputTokens?: number\n inputModalities?: Array<\"text\" | \"image\">\n reasoningEfforts?: Array<CodexReasoningEffort>\n defaultReasoningEffort?: CodexReasoningEffort\n pricing?: TokenUsagePricingConfig\n supportPdf?: boolean\n toolContentSupportType?: Array<ToolContentSupportType>\n type?: ProviderType\n // Message field used to carry assistant thinking text when forwarding\n // requests upstream; defaults to \"reasoning_content\"\n reasoningField?: ModelReasoningField\n}\n\nexport type ModelReasoningField = \"reasoning\" | \"reasoning_content\"\n\nexport type CodexReasoningEffort =\n | \"none\"\n | \"minimal\"\n | \"low\"\n | \"medium\"\n | \"high\"\n | \"xhigh\"\n | \"max\"\n | \"ultra\"\n\nexport type ProviderAuthType =\n | \"authorization\"\n | \"azure-entra\"\n | \"oauth2\"\n | \"x-api-key\"\n | \"x-goog-api-key\"\nexport const SUPPORTED_PROVIDER_TYPES = [\n \"anthropic\",\n \"openai-compatible\",\n \"openai-responses\",\n \"google\",\n] as const\nexport type ProviderType = (typeof SUPPORTED_PROVIDER_TYPES)[number]\nexport type ToolContentSupportType = \"array\" | \"image\" | \"pdf\"\n\nexport interface ProviderConfig {\n type?: string\n enabled?: boolean\n baseUrl?: string\n modelsDevProviderId?: string\n apiKey?: string\n authType?: ProviderAuthType\n accountId?: string\n pricingCurrency?: string\n models?: Record<string, ModelConfig>\n agentsModels?: Array<string>\n}\n\nconst modelResponsesApiCompactThresholds = {\n \"gpt-5.4\": 272_000 * 0.8,\n \"gpt-5.5\": 272_000 * 0.8,\n}\n\nexport const defaultContextManagement = {\n messages: true,\n responses: false,\n} satisfies Required<ContextManagementConfig>\n\nexport const defaultOpencodeModelContextWindow = 400_000\n\nexport const defaultConfig: AppConfig = {\n auth: {\n apiKeys: [],\n },\n providers: {},\n modelMappings: {\n \"codex-auto-review\": \"codex/codex-auto-review\",\n \"gpt-reserve\": \"codex/gpt-reserve\",\n },\n smallModels: {\n codex: \"gpt-6-luna\",\n copilot: \"gpt-6-luna\",\n },\n contextManagement: defaultContextManagement,\n opencodeModelContextWindow: defaultOpencodeModelContextWindow,\n modelResponsesApiCompactThresholds,\n useMessagesApi: true,\n useResponsesApiWebSocket: true,\n noEncryptedOutputModels: [],\n upstreamTransport: defaultUpstreamTransportConfig,\n useResponsesApiWebSearch: true,\n alphaSearchCodexPriority: true,\n alphaSearchModel: \"gpt-6-luna\",\n messageApiWebSearchModel: \"gpt-6-luna\",\n}\n\nlet cachedConfig: AppConfig | null = null\n\nfunction normalizeAdminApiKey(adminApiKey: unknown): string | null {\n if (typeof adminApiKey !== \"string\") {\n if (adminApiKey !== undefined) {\n consola.warn(\n \"Invalid auth.adminApiKey config. Expected a non-empty string.\",\n )\n }\n return null\n }\n\n const normalizedAdminApiKey = adminApiKey.trim()\n if (!normalizedAdminApiKey) {\n consola.warn(\n \"Invalid auth.adminApiKey config. Expected a non-empty string.\",\n )\n return null\n }\n\n return normalizedAdminApiKey\n}\n\nfunction generateAdminApiKey(): string {\n return randomBytes(32).toString(\"hex\")\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error\n}\n\nfunction ensureConfigFile(): void {\n try {\n fs.accessSync(PATHS.CONFIG_PATH, fs.constants.F_OK)\n } catch (error) {\n if (!isNodeError(error) || error.code !== \"ENOENT\") {\n throw error\n }\n\n writeFileAtomically(\n PATHS.CONFIG_PATH,\n `${JSON.stringify(defaultConfig, null, 2)}\\n`,\n )\n }\n}\n\nfunction readConfigFromDisk(): AppConfig {\n ensureConfigFile()\n const raw = fs.readFileSync(PATHS.CONFIG_PATH, \"utf8\")\n if (!raw.trim()) {\n writeFileAtomically(\n PATHS.CONFIG_PATH,\n `${JSON.stringify(defaultConfig, null, 2)}\\n`,\n )\n return defaultConfig\n }\n\n try {\n return JSON.parse(raw) as AppConfig\n } catch (error) {\n // Fail closed: falling back to the default config here would let the\n // startup merge overwrite the corrupt file (discarding providers, API\n // keys, and model mappings) and, because the default has no apiKeys,\n // silently disable API key authentication on normal routes.\n const message = `Config file is not valid JSON: ${PATHS.CONFIG_PATH}. Refusing to start with the default config. Fix the JSON syntax or delete the file to regenerate a fresh config.`\n consola.error(message, error)\n throw new Error(message, { cause: error })\n }\n}\n\nexport function readEditableConfigFromDisk(): AppConfig {\n try {\n const raw = fs.readFileSync(PATHS.CONFIG_PATH, \"utf8\")\n if (!raw.trim()) {\n return {}\n }\n return migrateProviderAgentModels(JSON.parse(raw) as AppConfig).mergedConfig\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return {}\n }\n if (error instanceof SyntaxError) {\n throw new Error(`Config file is not valid JSON: ${PATHS.CONFIG_PATH}`)\n }\n throw error\n }\n}\n\nexport function writeConfigToDisk(config: AppConfig): void {\n const { mergedConfig } = migrateProviderAgentModels(config)\n writeFileAtomically(\n PATHS.CONFIG_PATH,\n `${JSON.stringify(mergedConfig, null, 2)}\\n`,\n )\n}\n\nexport function setConfiguredApiKeys(apiKeys: Array<string>): Array<string> {\n const normalizedKeys = apiKeys\n .map((key) => key.trim())\n .filter((key) => key.length > 0)\n const uniqueKeys = [...new Set(normalizedKeys)]\n\n const editableConfig = readEditableConfigFromDisk()\n writeConfigToDisk({\n ...editableConfig,\n auth: {\n ...editableConfig.auth,\n apiKeys: uniqueKeys,\n },\n })\n reloadConfig()\n return [...uniqueKeys]\n}\n\nfunction mergeDefaultConfig(inputConfig: AppConfig): {\n mergedConfig: AppConfig\n changed: boolean\n} {\n const { mergedConfig: config, changed: agentModelsMigrated } =\n migrateProviderAgentModels(inputConfig)\n const modelMappings = config.modelMappings ?? {}\n const defaultModelMappings = defaultConfig.modelMappings ?? {}\n const extraPrompts = config.extraPrompts ?? {}\n const defaultExtraPrompts = defaultConfig.extraPrompts ?? {}\n const responsesApiCompactThresholds =\n config.modelResponsesApiCompactThresholds ?? {}\n const defaultResponsesApiCompactThresholds =\n defaultConfig.modelResponsesApiCompactThresholds ?? {}\n const modelReasoningEfforts = config.modelReasoningEfforts ?? {}\n const defaultModelReasoningEfforts = defaultConfig.modelReasoningEfforts ?? {}\n const contextManagement = normalizeContextManagementConfig(\n config.contextManagement,\n )\n const opencodeModelContextWindow = positiveIntegerOrDefault(\n config.opencodeModelContextWindow,\n defaultOpencodeModelContextWindow,\n )\n const {\n changed: upstreamTransportMigrated,\n migrated: migratedUpstreamTransport,\n } = migrateUpstreamTransportConfig(config)\n\n const upstreamTransport = normalizeUpstreamTransportConfig(\n migratedUpstreamTransport,\n )\n const defaultContextManagementConfig = defaultConfig.contextManagement ?? {}\n\n const missingModelMappings = Object.keys(defaultModelMappings).filter(\n (model) => !Object.hasOwn(modelMappings, model),\n )\n const missingExtraPromptModels = Object.keys(defaultExtraPrompts).filter(\n (model) => !Object.hasOwn(extraPrompts, model),\n )\n\n const missingReasoningEffortModels = Object.keys(\n defaultModelReasoningEfforts,\n ).filter((model) => !Object.hasOwn(modelReasoningEfforts, model))\n const missingResponsesApiCompactThresholdModels = Object.keys(\n defaultResponsesApiCompactThresholds,\n ).filter((model) => !Object.hasOwn(responsesApiCompactThresholds, model))\n const missingContextManagementKeys = Object.keys(\n defaultContextManagementConfig,\n ).filter((key) => !Object.hasOwn(contextManagement, key))\n\n const hasModelMappingChanges = missingModelMappings.length > 0\n const hasExtraPromptChanges = missingExtraPromptModels.length > 0\n const hasReasoningEffortChanges = missingReasoningEffortModels.length > 0\n const hasResponsesApiCompactThresholdChanges =\n missingResponsesApiCompactThresholdModels.length > 0\n const hasContextManagementChanges = missingContextManagementKeys.length > 0\n const hasOpencodeModelContextWindowChanges =\n config.opencodeModelContextWindow !== opencodeModelContextWindow\n const hasUpstreamTransportChanges = Object.entries(upstreamTransport).some(\n ([key, value]) =>\n migratedUpstreamTransport[key as keyof UpstreamTransportConfig] !== value,\n )\n\n if (\n !hasModelMappingChanges\n && !hasExtraPromptChanges\n && !hasReasoningEffortChanges\n && !hasResponsesApiCompactThresholdChanges\n && !hasContextManagementChanges\n && !hasOpencodeModelContextWindowChanges\n && !hasUpstreamTransportChanges\n && !upstreamTransportMigrated\n && !agentModelsMigrated\n ) {\n return { mergedConfig: config, changed: false }\n }\n\n // The deprecated responsesTransport key is dropped once it is migrated.\n const { responsesTransport: _legacyResponsesTransport, ...persistedConfig } =\n config as LegacyAppConfig\n\n return {\n mergedConfig: {\n ...persistedConfig,\n modelMappings: {\n ...defaultModelMappings,\n ...modelMappings,\n },\n contextManagement: {\n ...((\n config.contextManagement\n && typeof config.contextManagement === \"object\"\n && !Array.isArray(config.contextManagement)\n ) ?\n config.contextManagement\n : {}),\n ...defaultContextManagementConfig,\n ...contextManagement,\n },\n opencodeModelContextWindow,\n extraPrompts: {\n ...defaultExtraPrompts,\n ...extraPrompts,\n },\n modelResponsesApiCompactThresholds: {\n ...defaultResponsesApiCompactThresholds,\n ...responsesApiCompactThresholds,\n },\n modelReasoningEfforts: {\n ...defaultModelReasoningEfforts,\n ...modelReasoningEfforts,\n },\n upstreamTransport: {\n ...migratedUpstreamTransport,\n ...upstreamTransport,\n },\n },\n changed: true,\n }\n}\n\nfunction migrateProviderAgentModels(config: AppConfig): {\n mergedConfig: AppConfig\n changed: boolean\n} {\n let migratedProviders: AppConfig[\"providers\"]\n for (const [name, provider] of Object.entries(config.providers ?? {})) {\n if (!Object.hasOwn(provider, \"codexModels\")) continue\n const { codexModels, ...currentProvider } = provider as ProviderConfig & {\n codexModels?: Array<string>\n }\n migratedProviders ??= { ...config.providers }\n migratedProviders[name] = { agentsModels: codexModels, ...currentProvider }\n }\n return migratedProviders ?\n {\n mergedConfig: { ...config, providers: migratedProviders },\n changed: true,\n }\n : { mergedConfig: config, changed: false }\n}\n\nfunction normalizeContextManagementConfig(\n value: ContextManagementConfig | undefined,\n): ContextManagementConfig {\n if (!value || typeof value !== \"object\") {\n return {}\n }\n\n return {\n ...(typeof value.messages === \"boolean\" ?\n { messages: value.messages }\n : {}),\n ...(typeof value.responses === \"boolean\" ?\n { responses: value.responses }\n : {}),\n }\n}\n\nfunction migrateRetiredRoleModels(config: AppConfig): {\n mergedConfig: AppConfig\n changed: boolean\n} {\n const mergedConfig = { ...config }\n let changed = false\n\n for (const key of [\n \"alphaSearchModel\",\n \"messageApiWebSearchModel\",\n \"claudeAutoModel\",\n ] as const) {\n if (mergedConfig[key] === \"gpt-5-mini\") {\n mergedConfig[key] = \"gpt-6-luna\"\n changed = true\n }\n }\n\n return { mergedConfig, changed }\n}\n\n// responsesTransport was renamed to upstreamTransport, and headersTimeoutMsV2\n// to headersTimeoutMs, when this block started applying to every upstream HTTP\n// transport. Legacy configs are migrated once during the startup merge and the\n// old keys are dropped from disk.\ninterface LegacyAppConfig extends AppConfig {\n responsesTransport?: LegacyUpstreamTransportConfig\n}\n\ninterface LegacyUpstreamTransportConfig extends UpstreamTransportConfig {\n headersTimeoutMsV2?: number\n}\n\nconst migrateUpstreamTransportConfig = (\n config: AppConfig,\n): { changed: boolean; migrated: UpstreamTransportConfig } => {\n const legacyBlock = (config as LegacyAppConfig).responsesTransport\n const { headersTimeoutMsV2, ...migrated } = (config.upstreamTransport\n ?? legacyBlock\n ?? {}) as LegacyUpstreamTransportConfig\n\n const hasLegacyBlock = legacyBlock !== undefined\n const hasLegacyHeadersTimeout = headersTimeoutMsV2 !== undefined\n if (!hasLegacyBlock && !hasLegacyHeadersTimeout) {\n return { changed: false, migrated }\n }\n\n consola.info(\n \"Migrating deprecated transport config: responsesTransport -> upstreamTransport, headersTimeoutMsV2 -> headersTimeoutMs\",\n )\n\n return {\n changed: true,\n migrated:\n migrated.headersTimeoutMs === undefined && hasLegacyHeadersTimeout ?\n { ...migrated, headersTimeoutMs: headersTimeoutMsV2 }\n : migrated,\n }\n}\n\nfunction ensureAdminApiKey(config: AppConfig): {\n mergedConfig: AppConfig\n changed: boolean\n} {\n const normalizedAdminApiKey = normalizeAdminApiKey(config.auth?.adminApiKey)\n if (normalizedAdminApiKey) {\n if (config.auth?.adminApiKey === normalizedAdminApiKey) {\n return { mergedConfig: config, changed: false }\n }\n\n return {\n mergedConfig: {\n ...config,\n auth: {\n ...config.auth,\n adminApiKey: normalizedAdminApiKey,\n },\n },\n changed: true,\n }\n }\n\n const editableConfig = readEditableConfigFromDisk()\n const { mergedConfig } = mergeDefaultConfig({\n ...editableConfig,\n auth: {\n ...editableConfig.auth,\n adminApiKey: generateAdminApiKey(),\n },\n })\n\n return { mergedConfig, changed: true }\n}\n\nexport function mergeConfigWithDefaults(): AppConfig {\n const config = readConfigFromDisk()\n const { mergedConfig, changed } = mergeDefaultConfig(config)\n const {\n mergedConfig: mergedConfigWithAdminApiKey,\n changed: adminApiKeyChanged,\n } = ensureAdminApiKey(mergedConfig)\n // Admin key setup may reread the file, so migrate models after it completes.\n const { mergedConfig: migratedConfig, changed: modelsMigrated } =\n migrateRetiredRoleModels(mergedConfigWithAdminApiKey)\n const shouldPersistConfig = changed || adminApiKeyChanged || modelsMigrated\n\n if (modelsMigrated) {\n consola.info(\"Migrating retired role models: gpt-5-mini -> gpt-6-luna\")\n }\n\n if (shouldPersistConfig) {\n try {\n writeConfigToDisk(migratedConfig)\n } catch (writeError) {\n if (adminApiKeyChanged) {\n throw writeError\n }\n\n consola.warn(\n \"Failed to write merged default config to config file\",\n writeError,\n )\n }\n }\n\n cachedConfig = migratedConfig\n return migratedConfig\n}\n\nexport function getConfig(): AppConfig {\n cachedConfig ??= mergeDefaultConfig(readConfigFromDisk()).mergedConfig\n return cachedConfig\n}\n\n// Refresh this process on its next read without rewriting defaults to disk.\nexport function invalidateConfigCache(): void {\n cachedConfig = null\n}\n\nexport function reloadConfig(): AppConfig {\n return mergeConfigWithDefaults()\n}\n\nexport function isMessagesApiEnabled(): boolean {\n const config = getConfig()\n return config.useMessagesApi ?? true\n}\n\nexport function isResponsesApiWebSocketEnabled(): boolean {\n const config = getConfig()\n return config.useResponsesApiWebSocket ?? true\n}\n\nexport function getOpencodeModelContextWindow(): number {\n return positiveIntegerOrDefault(\n getConfig().opencodeModelContextWindow,\n defaultOpencodeModelContextWindow,\n )\n}\n\n// Applies to every upstream HTTP transport (Copilot Chat Completions and\n// Messages, Codex Responses, and provider-forwarded requests), not only the\n// Responses API.\nexport function getUpstreamTransportConfig(): Required<UpstreamTransportConfig> {\n return normalizeUpstreamTransportConfig(getConfig().upstreamTransport)\n}\n\nexport const normalizeUpstreamTransportConfig = (\n configured: UpstreamTransportConfig | undefined,\n): Required<UpstreamTransportConfig> => ({\n headersTimeoutMs: positiveIntegerOrDefault(\n configured?.headersTimeoutMs,\n defaultUpstreamTransportConfig.headersTimeoutMs,\n ),\n streamInactivityTimeoutMs: positiveIntegerOrDefault(\n configured?.streamInactivityTimeoutMs,\n defaultUpstreamTransportConfig.streamInactivityTimeoutMs,\n ),\n websocketMaxBufferedBytes: positiveIntegerOrDefault(\n configured?.websocketMaxBufferedBytes,\n defaultUpstreamTransportConfig.websocketMaxBufferedBytes,\n ),\n websocketMaxBufferedMessages: positiveIntegerOrDefault(\n configured?.websocketMaxBufferedMessages,\n defaultUpstreamTransportConfig.websocketMaxBufferedMessages,\n ),\n websocketOpenTimeoutMs: positiveIntegerOrDefault(\n configured?.websocketOpenTimeoutMs,\n defaultUpstreamTransportConfig.websocketOpenTimeoutMs,\n ),\n websocketPoolIdleTimeoutMs: positiveIntegerOrDefault(\n configured?.websocketPoolIdleTimeoutMs,\n defaultUpstreamTransportConfig.websocketPoolIdleTimeoutMs,\n ),\n})\n\nconst positiveIntegerOrDefault = (value: unknown, fallback: number): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return fallback\n\n const normalized = Math.floor(value)\n return normalized > 0 ? normalized : fallback\n}\n\nexport function getAnthropicApiKey(): string | undefined {\n const config = getConfig()\n return config.anthropicApiKey ?? process.env.ANTHROPIC_API_KEY ?? undefined\n}\n\nexport function isResponsesApiWebSearchEnabled(): boolean {\n const config = getConfig()\n return config.useResponsesApiWebSearch ?? true\n}\n\nexport function isAlphaSearchCodexPriorityEnabled(): boolean {\n const config = getConfig()\n return config.alphaSearchCodexPriority ?? true\n}\n\nexport function getAlphaSearchModel(): string | undefined {\n const model = getConfig().alphaSearchModel ?? \"gpt-6-luna\"\n return model.trim() || undefined\n}\n\nexport function getMessageApiWebSearchModel(): string | undefined {\n const config = getConfig()\n const model = config.messageApiWebSearchModel ?? \"gpt-6-luna\"\n return model && model.trim().length > 0 ? model : undefined\n}\n\nexport function getClaudeAutoModel(\n useDefault: boolean = false,\n): string | undefined {\n const config = getConfig()\n const model = config.claudeAutoModel\n if (model !== undefined) {\n return model && model.trim().length > 0 ? model.trim() : undefined\n }\n\n if (!useDefault) {\n return undefined\n }\n\n const codexProvider = config.providers?.codex\n if (codexProvider && codexProvider.enabled !== false) {\n return \"codex-auto-review\"\n }\n\n return isGitHubCopilotAvailable(config) ? \"gpt-6-luna\" : undefined\n}\n\nexport function getClaudeTokenMultiplier(): number {\n const config = getConfig()\n return config.claudeTokenMultiplier ?? 1.15\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { D as state, O as HTTPError } from "./config-store-
|
|
2
|
-
import { S as copilotBaseUrl, c as setupCopilotToken, r as logUser, w as copilotModelsHeaders } from "./token-
|
|
1
|
+
import { D as state, O as HTTPError } from "./config-store-BLr5xjym.js";
|
|
2
|
+
import { S as copilotBaseUrl, c as setupCopilotToken, r as logUser, w as copilotModelsHeaders } from "./token-D3nRiw9B.js";
|
|
3
3
|
import consola from "consola";
|
|
4
4
|
import { createHash, randomUUID } from "node:crypto";
|
|
5
5
|
import path from "node:path";
|
|
@@ -361,4 +361,4 @@ async function setupCopilotRuntime(githubToken) {
|
|
|
361
361
|
}
|
|
362
362
|
export { registerProcessCleanup as i, stopModelsRefreshLoop as n, EventBus as r, setupCopilotRuntime as t };
|
|
363
363
|
|
|
364
|
-
//# sourceMappingURL=copilot-runtime-
|
|
364
|
+
//# sourceMappingURL=copilot-runtime-DvmA6ALD.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copilot-runtime-CyB0L4lt.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.140.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-DvmA6ALD.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.140.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-
|
|
2
|
-
import { i as listEnabledProviders, n as getRawProviderConfig } from "./config-
|
|
1
|
+
import { S as PATHS } from "./config-store-BLr5xjym.js";
|
|
2
|
+
import { i as listEnabledProviders, n as getRawProviderConfig } from "./config-BvACNGIp.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-
|
|
92
|
+
//# sourceMappingURL=debug-C_uR3s4n.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug-
|
|
1
|
+
{"version":3,"file":"debug-C_uR3s4n.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-
|
|
31
|
-
const { debug } = await import("./debug-
|
|
30
|
+
const { auth } = await import("./auth-dswtyrvJ.js");
|
|
31
|
+
const { debug } = await import("./debug-C_uR3s4n.js");
|
|
32
32
|
const { mcp } = await import("./mcp-DJE9135Q.js");
|
|
33
|
-
const { start } = await import("./start-
|
|
34
|
-
const { provider } = await import("./provider-
|
|
33
|
+
const { start } = await import("./start-BBEryu3z.js");
|
|
34
|
+
const { provider } = await import("./provider-_0MixRky.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-
|
|
1
|
+
import { r as saveProviderManagementConfig } from "./provider-management-C8AWr-Gk.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-
|
|
35
|
+
//# sourceMappingURL=provider-_0MixRky.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-
|
|
1
|
+
{"version":3,"file":"provider-_0MixRky.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-
|
|
1
|
+
import { S as PATHS, f as invalidateConfigCache, v as readEditableConfigFromDisk, w as GITHUB_COPILOT_PROVIDER, x as writeConfigToDisk } from "./config-store-BLr5xjym.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-
|
|
59
|
+
//# sourceMappingURL=provider-management-C8AWr-Gk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-management-
|
|
1
|
+
{"version":3,"file":"provider-management-C8AWr-Gk.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,9 +1,9 @@
|
|
|
1
|
-
import { D as state, E as isGitHubCopilotEnabled, O as HTTPError, S as PATHS, a as getAnthropicApiKey, c as getConfig, d as getUpstreamTransportConfig, g as isResponsesApiWebSocketEnabled, h as isResponsesApiWebSearchEnabled, i as getAlphaSearchModel, j as forwardError, l as getMessageApiWebSearchModel, m as isMessagesApiEnabled, o as getClaudeAutoModel, p as isAlphaSearchCodexPriorityEnabled, s as getClaudeTokenMultiplier, u as getOpencodeModelContextWindow, w as GITHUB_COPILOT_PROVIDER, y as reloadConfig } from "./config-store-
|
|
2
|
-
import { A as
|
|
3
|
-
import { $ as buildCodexRequestHeaders, B as getXaiAccessToken, C as copilotHeaders, D as prepareForCompact, E as isOpencodeOauthApp, F as compactTextOnlyGuard, I as createAuthMiddleware, J as readGitHubTokenFromEnv, L as getConfiguredAdminApiKeys, M as compactMessageSections, O as prepareInteractionHeaders, P as compactSystemPromptStarts, Q as CODEX_API_BASE_URL, S as copilotBaseUrl, T as copilotWebSocketHeaders, U as readXaiCredentials, Y as XAI_API_BASE_URL, _ as isAsyncIterable, at as fetchUpstreamWithLifecycle, b as parseUserIdMetadata, ct as encodePoolKeyPart, d as generateRequestIdFromPayload, dt as createWebSocketUrl, et as forwardCodexResponses, f as getPromptCacheKey, g as getUUID, h as getSessionAffinityFromHeaders, it as setPluginRequestActualModel, j as compactAutoContinuePromptStarts, k as prepareMessageProxyHeaders, lt as getResponsesStreamTerminalDisposition, m as getRootSessionIdFromHeaders, n as invalidateCodexRuntime, nt as requestContext, ot as createResponsesHttpEventStream, p as getRootSessionId, pt as stripInternalRequestHeaders, q as readGitHubToken, rt as resolveTraceId$1, s as setupCodexToken, st as createResponsesSafeStream, tt as generateTraceId, u as stopCopilotRefreshLoop, ut as createPooledWebSocketStream, v as isNullish, x as getCopilotUsage, y as isResponsesStream } from "./token-
|
|
1
|
+
import { D as state, E as isGitHubCopilotEnabled, O as HTTPError, S as PATHS, a as getAnthropicApiKey, c as getConfig, d as getUpstreamTransportConfig, g as isResponsesApiWebSocketEnabled, h as isResponsesApiWebSearchEnabled, i as getAlphaSearchModel, j as forwardError, l as getMessageApiWebSearchModel, m as isMessagesApiEnabled, o as getClaudeAutoModel, p as isAlphaSearchCodexPriorityEnabled, s as getClaudeTokenMultiplier, u as getOpencodeModelContextWindow, w as GITHUB_COPILOT_PROVIDER, y as reloadConfig } from "./config-store-BLr5xjym.js";
|
|
2
|
+
import { A as isOutputEncryptedContentDisabled, C as getModelResponsesApiCompactThreshold$1, D as isContextManagementEnabledForMessages, E as getSmallModelForProvider, M as setModelMappings, O as isContextManagementEnabledForResponses, S as getModelMappings, T as getSmallModel, _ as getModelsDevModelMaxOutputTokens, a as normalizeProviderBaseUrl, d as isProviderModelVisible, f as resolveProviderModelsDevId, g as getModelsDevModel, h as getBuiltinProviderModelRecords, i as listEnabledProviders, j as resolveMappedModel, k as isGpt56OrAbove, l as getLocalProviderModelRecords, m as builtinProviderModelRegistry, n as getRawProviderConfig, o as resolveEffectiveProviderType, p as usesModelsDevModelCatalog, s as resolveProviderConfigForModel, t as getProviderConfig, u as getProviderModelConfig, v as getModelsDevModelPricing, w as getReasoningEffortForModel, x as getExtraPromptForModel } from "./config-BvACNGIp.js";
|
|
3
|
+
import { $ as buildCodexRequestHeaders, B as getXaiAccessToken, C as copilotHeaders, D as prepareForCompact, E as isOpencodeOauthApp, F as compactTextOnlyGuard, I as createAuthMiddleware, J as readGitHubTokenFromEnv, L as getConfiguredAdminApiKeys, M as compactMessageSections, O as prepareInteractionHeaders, P as compactSystemPromptStarts, Q as CODEX_API_BASE_URL, S as copilotBaseUrl, T as copilotWebSocketHeaders, U as readXaiCredentials, Y as XAI_API_BASE_URL, _ as isAsyncIterable, at as fetchUpstreamWithLifecycle, b as parseUserIdMetadata, ct as encodePoolKeyPart, d as generateRequestIdFromPayload, dt as createWebSocketUrl, et as forwardCodexResponses, f as getPromptCacheKey, g as getUUID, h as getSessionAffinityFromHeaders, it as setPluginRequestActualModel, j as compactAutoContinuePromptStarts, k as prepareMessageProxyHeaders, lt as getResponsesStreamTerminalDisposition, m as getRootSessionIdFromHeaders, n as invalidateCodexRuntime, nt as requestContext, ot as createResponsesHttpEventStream, p as getRootSessionId, pt as stripInternalRequestHeaders, q as readGitHubToken, rt as resolveTraceId$1, s as setupCodexToken, st as createResponsesSafeStream, tt as generateTraceId, u as stopCopilotRefreshLoop, ut as createPooledWebSocketStream, v as isNullish, x as getCopilotUsage, y as isResponsesStream } from "./token-D3nRiw9B.js";
|
|
4
4
|
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-DzipwtCX.js";
|
|
5
|
-
import { n as isProviderAgentModelVisible, t as getProviderAgentModels } from "./provider-management-
|
|
6
|
-
import { i as registerProcessCleanup, n as stopModelsRefreshLoop, r as EventBus, t as setupCopilotRuntime } from "./copilot-runtime-
|
|
5
|
+
import { n as isProviderAgentModelVisible, t as getProviderAgentModels } from "./provider-management-C8AWr-Gk.js";
|
|
6
|
+
import { i as registerProcessCleanup, n as stopModelsRefreshLoop, r as EventBus, t as setupCopilotRuntime } from "./copilot-runtime-DvmA6ALD.js";
|
|
7
7
|
import consola from "consola";
|
|
8
8
|
import { createHash, randomUUID } from "node:crypto";
|
|
9
9
|
import fs, { readFileSync } from "node:fs";
|
|
@@ -1963,18 +1963,27 @@ const createResponses = async (payload, { vision, initiator, subagentMarker, req
|
|
|
1963
1963
|
prepareInteractionHeaders(sessionId, Boolean(subagentMarker), headers);
|
|
1964
1964
|
prepareForCompact(headers, compactType);
|
|
1965
1965
|
payload.service_tier = void 0;
|
|
1966
|
+
const upstreamPayload = omitUnsupportedCopilotInclude(payload);
|
|
1966
1967
|
consola.log(`<-- model: ${payload.model}`);
|
|
1967
1968
|
const effectiveTransport = compactType === 1 ? "http" : transport;
|
|
1968
1969
|
setPluginRequestActualModel(payload.model);
|
|
1969
1970
|
if (payload.stream === true && effectiveTransport === "websocket") {
|
|
1970
1971
|
clientSignal?.throwIfAborted();
|
|
1971
|
-
const websocketRequest = prepareResponsesWebSocketRequest(
|
|
1972
|
+
const websocketRequest = prepareResponsesWebSocketRequest(upstreamPayload, headers, {
|
|
1972
1973
|
requestId,
|
|
1973
1974
|
subagentMarker
|
|
1974
1975
|
});
|
|
1975
1976
|
return createPooledResponsesWebSocketStream(websocketRequest, clientSignal);
|
|
1976
1977
|
}
|
|
1977
|
-
return await createHttpResponses(
|
|
1978
|
+
return await createHttpResponses(upstreamPayload, headers, clientSignal);
|
|
1979
|
+
};
|
|
1980
|
+
const omitUnsupportedCopilotInclude = (payload) => {
|
|
1981
|
+
if (!payload.include?.includes("output.encrypted_content") || !isOutputEncryptedContentDisabled(payload.model)) return payload;
|
|
1982
|
+
const include = payload.include.filter((item) => item !== "output.encrypted_content");
|
|
1983
|
+
const upstreamPayload = { ...payload };
|
|
1984
|
+
if (include.length === 0) delete upstreamPayload.include;
|
|
1985
|
+
else upstreamPayload.include = include;
|
|
1986
|
+
return upstreamPayload;
|
|
1978
1987
|
};
|
|
1979
1988
|
const createHttpResponses = async (payload, headers, clientSignal) => {
|
|
1980
1989
|
const transportConfig = getUpstreamTransportConfig();
|
|
@@ -12351,6 +12360,7 @@ function createSyntheticCodexModel(candidate, template, priority) {
|
|
|
12351
12360
|
web_search_tool_type: "text_and_image",
|
|
12352
12361
|
supports_search_tool: false,
|
|
12353
12362
|
use_responses_lite: true,
|
|
12363
|
+
supports_reasoning_effort_updates: false,
|
|
12354
12364
|
tool_mode: "code_mode_only",
|
|
12355
12365
|
multi_agent_version: "v2",
|
|
12356
12366
|
multi_agent_reasoning_effort: null,
|
|
@@ -14613,4 +14623,4 @@ function createServer(options = {}) {
|
|
|
14613
14623
|
createServer();
|
|
14614
14624
|
export { createServer };
|
|
14615
14625
|
|
|
14616
|
-
//# sourceMappingURL=server-
|
|
14626
|
+
//# sourceMappingURL=server-Bz8hGP4q.js.map
|