@jeffreycao/copilot-api 1.10.5 → 1.10.7

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.
@@ -124,7 +124,7 @@ async function runServer(options) {
124
124
  }
125
125
  }
126
126
  consola.box(`🌐 Usage Viewer: ${serverUrl}/usage-viewer?endpoint=${serverUrl}/usage`);
127
- const { server } = await import("./server-DsfYz_GE.js");
127
+ const { server } = await import("./server-S8A-8fWL.js");
128
128
  serve({
129
129
  fetch: server.fetch,
130
130
  port: options.port,
@@ -213,4 +213,4 @@ const start = defineCommand({
213
213
  //#endregion
214
214
  export { start };
215
215
 
216
- //# sourceMappingURL=start-BkG22v1Z.js.map
216
+ //# sourceMappingURL=start-D5EioAT0.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"start-BkG22v1Z.js","names":[],"sources":["../src/lib/shell.ts","../src/start.ts"],"sourcesContent":["import { execSync } from \"node:child_process\"\nimport process from \"node:process\"\n\ntype ShellName = \"bash\" | \"zsh\" | \"fish\" | \"powershell\" | \"cmd\" | \"sh\"\ntype EnvVars = Record<string, string | undefined>\n\nfunction getShell(): ShellName {\n const { platform, ppid, env } = process\n\n if (platform === \"win32\") {\n try {\n const command = `wmic process get ParentProcessId,Name | findstr \"${ppid}\"`\n const parentProcess = execSync(command, { stdio: \"pipe\" }).toString()\n\n if (parentProcess.toLowerCase().includes(\"powershell.exe\")) {\n return \"powershell\"\n }\n } catch {\n return \"cmd\"\n }\n\n return \"cmd\"\n } else {\n const shellPath = env.SHELL\n if (shellPath) {\n if (shellPath.endsWith(\"zsh\")) return \"zsh\"\n if (shellPath.endsWith(\"fish\")) return \"fish\"\n if (shellPath.endsWith(\"bash\")) return \"bash\"\n }\n\n return \"sh\"\n }\n}\n\n/**\n * Generates a copy-pasteable script to set multiple environment variables\n * and run a subsequent command.\n * @param {EnvVars} envVars - An object of environment variables to set.\n * @param {string} commandToRun - The command to run after setting the variables.\n * @returns {string} The formatted script string.\n */\nexport function generateEnvScript(\n envVars: EnvVars,\n commandToRun: string = \"\",\n): string {\n const shell = getShell()\n const filteredEnvVars = Object.entries(envVars).filter(\n ([, value]) => value !== undefined,\n ) as Array<[string, string]>\n\n let commandBlock: string\n\n switch (shell) {\n case \"powershell\": {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `$env:${key} = ${value}`)\n .join(\"; \")\n break\n }\n case \"cmd\": {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `set ${key}=${value}`)\n .join(\" & \")\n break\n }\n case \"fish\": {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `set -gx ${key} ${value}`)\n .join(\"; \")\n break\n }\n default: {\n // bash, zsh, sh\n const assignments = filteredEnvVars\n .map(([key, value]) => `${key}=${value}`)\n .join(\" \")\n commandBlock = filteredEnvVars.length > 0 ? `export ${assignments}` : \"\"\n break\n }\n }\n\n if (commandBlock && commandToRun) {\n const separator = shell === \"cmd\" ? \" & \" : \" && \"\n return `${commandBlock}${separator}${commandToRun}`\n }\n\n return commandBlock || commandToRun\n}\n","#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport clipboard from \"clipboardy\"\nimport consola from \"consola\"\nimport { serve, type ServerHandler } from \"srvx\"\nimport invariant from \"tiny-invariant\"\n\nimport { mergeConfigWithDefaults } from \"./lib/config\"\nimport { initOpencodeVersion } from \"./lib/opencode\"\nimport { ensurePaths } from \"./lib/paths\"\nimport { initProxyFromEnv } from \"./lib/proxy\"\nimport { generateEnvScript } from \"./lib/shell\"\nimport { state } from \"./lib/state\"\nimport { logUser, setupCopilotToken, setupGitHubToken } from \"./lib/token\"\nimport {\n cacheMacMachineId,\n cacheModels,\n cacheVSCodeVersion,\n cacheVsCodeSessionId,\n cacheVsCodeDeviceId,\n} from \"./lib/utils\"\n\ninterface RunServerOptions {\n port: number\n verbose: boolean\n accountType: string\n manual: boolean\n rateLimit?: number\n rateLimitWait: boolean\n githubToken?: string\n claudeCode: boolean\n showToken: boolean\n proxyEnv: boolean\n}\n\nexport async function runServer(options: RunServerOptions): Promise<void> {\n // Work around unjs/consola#357 until a release includes PR #359.\n consola.options.throttle = 0\n\n // Ensure config is merged with defaults at startup\n mergeConfigWithDefaults()\n\n await initOpencodeVersion()\n\n if (options.proxyEnv) {\n initProxyFromEnv()\n }\n\n state.verbose = options.verbose\n if (options.verbose) {\n consola.level = 5\n consola.info(\"Verbose logging enabled\")\n }\n\n state.accountType = options.accountType\n if (options.accountType !== \"individual\") {\n consola.info(`Using ${options.accountType} plan GitHub account`)\n }\n\n state.manualApprove = options.manual\n state.rateLimitSeconds = options.rateLimit\n state.rateLimitWait = options.rateLimitWait\n state.showToken = options.showToken\n\n await ensurePaths()\n await cacheVSCodeVersion()\n cacheMacMachineId()\n cacheVsCodeSessionId()\n await cacheVsCodeDeviceId()\n\n if (options.githubToken) {\n state.githubToken = options.githubToken\n consola.info(\"Using provided GitHub token\")\n await logUser()\n } else {\n await setupGitHubToken()\n }\n\n await setupCopilotToken()\n await cacheModels()\n\n consola.info(\n `Available models: \\n${state.models?.data.map((model) => `- ${model.id}`).join(\"\\n\")}`,\n )\n\n const serverUrl = `http://localhost:${options.port}`\n\n if (options.claudeCode) {\n consola.log(\n \"\\n💡 Tip: The --claude-code flag simply generates a clipboard command for launching Claude Code. \\n\"\n + \"All models remain fully accessible without this flag, just configure the model ID directly in your settings.json file.\",\n )\n\n invariant(state.models, \"Models should be loaded by now\")\n\n const selectedModel = await consola.prompt(\n \"Select a model to use with Claude Code\",\n {\n type: \"select\",\n options: state.models.data.map((model) => model.id),\n },\n )\n\n const selectedSmallModel = await consola.prompt(\n \"Select a small model to use with Claude Code\",\n {\n type: \"select\",\n options: state.models.data.map((model) => model.id),\n },\n )\n\n const command = generateEnvScript(\n {\n ANTHROPIC_BASE_URL: serverUrl,\n ANTHROPIC_AUTH_TOKEN: \"dummy\",\n ANTHROPIC_MODEL: selectedModel,\n ANTHROPIC_DEFAULT_SONNET_MODEL: selectedModel,\n ANTHROPIC_DEFAULT_HAIKU_MODEL: selectedSmallModel,\n DISABLE_NON_ESSENTIAL_MODEL_CALLS: \"1\",\n CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: \"1\",\n CLAUDE_CODE_ATTRIBUTION_HEADER: \"0\",\n CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION: \"false\",\n CLAUDE_CODE_DISABLE_TERMINAL_TITLE: \"true\",\n CLAUDE_CODE_ENABLE_AWAY_SUMMARY: \"0\",\n CLAUDE_PLUGIN_ENABLE_QUESTION_RULES: \"true\",\n },\n \"claude\",\n )\n\n try {\n clipboard.writeSync(command)\n consola.success(\"Copied Claude Code command to clipboard!\")\n } catch {\n consola.warn(\n \"Failed to copy to clipboard. Here is the Claude Code command:\",\n )\n consola.log(command)\n }\n }\n\n consola.box(\n `🌐 Usage Viewer: ${serverUrl}/usage-viewer?endpoint=${serverUrl}/usage`,\n )\n\n const { server } = await import(\"./server\")\n\n serve({\n fetch: server.fetch as ServerHandler,\n port: options.port,\n bun: {\n idleTimeout: 0,\n },\n })\n}\n\nexport const start = defineCommand({\n meta: {\n name: \"start\",\n description: \"Start the Copilot API server\",\n },\n args: {\n port: {\n alias: \"p\",\n type: \"string\",\n default: \"4141\",\n description: \"Port to listen on\",\n },\n verbose: {\n alias: \"v\",\n type: \"boolean\",\n default: false,\n description: \"Enable verbose logging\",\n },\n \"account-type\": {\n alias: \"a\",\n type: \"string\",\n default: \"individual\",\n description: \"Account type to use (individual, business, enterprise)\",\n },\n manual: {\n type: \"boolean\",\n default: false,\n description: \"Enable manual request approval\",\n },\n \"rate-limit\": {\n alias: \"r\",\n type: \"string\",\n description: \"Rate limit in seconds between requests\",\n },\n wait: {\n alias: \"w\",\n type: \"boolean\",\n default: false,\n description:\n \"Wait instead of error when rate limit is hit. Has no effect if rate limit is not set\",\n },\n \"github-token\": {\n alias: \"g\",\n type: \"string\",\n description:\n \"Provide GitHub token directly (must be generated using the `auth` subcommand)\",\n },\n \"claude-code\": {\n alias: \"c\",\n type: \"boolean\",\n default: false,\n description:\n \"Generate a command to launch Claude Code with Copilot API config\",\n },\n \"show-token\": {\n type: \"boolean\",\n default: false,\n description: \"Show GitHub and Copilot tokens on fetch and refresh\",\n },\n \"proxy-env\": {\n type: \"boolean\",\n default: false,\n description: \"Initialize proxy from environment variables\",\n },\n },\n run({ args }) {\n const rateLimitRaw = args[\"rate-limit\"]\n const rateLimit =\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n rateLimitRaw === undefined ? undefined : Number.parseInt(rateLimitRaw, 10)\n\n return runServer({\n port: Number.parseInt(args.port, 10),\n verbose: args.verbose,\n accountType: args[\"account-type\"],\n manual: args.manual,\n rateLimit,\n rateLimitWait: args.wait,\n githubToken: args[\"github-token\"],\n claudeCode: args[\"claude-code\"],\n showToken: args[\"show-token\"],\n proxyEnv: args[\"proxy-env\"],\n })\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"start-D5EioAT0.js","names":[],"sources":["../src/lib/shell.ts","../src/start.ts"],"sourcesContent":["import { execSync } from \"node:child_process\"\nimport process from \"node:process\"\n\ntype ShellName = \"bash\" | \"zsh\" | \"fish\" | \"powershell\" | \"cmd\" | \"sh\"\ntype EnvVars = Record<string, string | undefined>\n\nfunction getShell(): ShellName {\n const { platform, ppid, env } = process\n\n if (platform === \"win32\") {\n try {\n const command = `wmic process get ParentProcessId,Name | findstr \"${ppid}\"`\n const parentProcess = execSync(command, { stdio: \"pipe\" }).toString()\n\n if (parentProcess.toLowerCase().includes(\"powershell.exe\")) {\n return \"powershell\"\n }\n } catch {\n return \"cmd\"\n }\n\n return \"cmd\"\n } else {\n const shellPath = env.SHELL\n if (shellPath) {\n if (shellPath.endsWith(\"zsh\")) return \"zsh\"\n if (shellPath.endsWith(\"fish\")) return \"fish\"\n if (shellPath.endsWith(\"bash\")) return \"bash\"\n }\n\n return \"sh\"\n }\n}\n\n/**\n * Generates a copy-pasteable script to set multiple environment variables\n * and run a subsequent command.\n * @param {EnvVars} envVars - An object of environment variables to set.\n * @param {string} commandToRun - The command to run after setting the variables.\n * @returns {string} The formatted script string.\n */\nexport function generateEnvScript(\n envVars: EnvVars,\n commandToRun: string = \"\",\n): string {\n const shell = getShell()\n const filteredEnvVars = Object.entries(envVars).filter(\n ([, value]) => value !== undefined,\n ) as Array<[string, string]>\n\n let commandBlock: string\n\n switch (shell) {\n case \"powershell\": {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `$env:${key} = ${value}`)\n .join(\"; \")\n break\n }\n case \"cmd\": {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `set ${key}=${value}`)\n .join(\" & \")\n break\n }\n case \"fish\": {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `set -gx ${key} ${value}`)\n .join(\"; \")\n break\n }\n default: {\n // bash, zsh, sh\n const assignments = filteredEnvVars\n .map(([key, value]) => `${key}=${value}`)\n .join(\" \")\n commandBlock = filteredEnvVars.length > 0 ? `export ${assignments}` : \"\"\n break\n }\n }\n\n if (commandBlock && commandToRun) {\n const separator = shell === \"cmd\" ? \" & \" : \" && \"\n return `${commandBlock}${separator}${commandToRun}`\n }\n\n return commandBlock || commandToRun\n}\n","#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport clipboard from \"clipboardy\"\nimport consola from \"consola\"\nimport { serve, type ServerHandler } from \"srvx\"\nimport invariant from \"tiny-invariant\"\n\nimport { mergeConfigWithDefaults } from \"./lib/config\"\nimport { initOpencodeVersion } from \"./lib/opencode\"\nimport { ensurePaths } from \"./lib/paths\"\nimport { initProxyFromEnv } from \"./lib/proxy\"\nimport { generateEnvScript } from \"./lib/shell\"\nimport { state } from \"./lib/state\"\nimport { logUser, setupCopilotToken, setupGitHubToken } from \"./lib/token\"\nimport {\n cacheMacMachineId,\n cacheModels,\n cacheVSCodeVersion,\n cacheVsCodeSessionId,\n cacheVsCodeDeviceId,\n} from \"./lib/utils\"\n\ninterface RunServerOptions {\n port: number\n verbose: boolean\n accountType: string\n manual: boolean\n rateLimit?: number\n rateLimitWait: boolean\n githubToken?: string\n claudeCode: boolean\n showToken: boolean\n proxyEnv: boolean\n}\n\nexport async function runServer(options: RunServerOptions): Promise<void> {\n // Work around unjs/consola#357 until a release includes PR #359.\n consola.options.throttle = 0\n\n // Ensure config is merged with defaults at startup\n mergeConfigWithDefaults()\n\n await initOpencodeVersion()\n\n if (options.proxyEnv) {\n initProxyFromEnv()\n }\n\n state.verbose = options.verbose\n if (options.verbose) {\n consola.level = 5\n consola.info(\"Verbose logging enabled\")\n }\n\n state.accountType = options.accountType\n if (options.accountType !== \"individual\") {\n consola.info(`Using ${options.accountType} plan GitHub account`)\n }\n\n state.manualApprove = options.manual\n state.rateLimitSeconds = options.rateLimit\n state.rateLimitWait = options.rateLimitWait\n state.showToken = options.showToken\n\n await ensurePaths()\n await cacheVSCodeVersion()\n cacheMacMachineId()\n cacheVsCodeSessionId()\n await cacheVsCodeDeviceId()\n\n if (options.githubToken) {\n state.githubToken = options.githubToken\n consola.info(\"Using provided GitHub token\")\n await logUser()\n } else {\n await setupGitHubToken()\n }\n\n await setupCopilotToken()\n await cacheModels()\n\n consola.info(\n `Available models: \\n${state.models?.data.map((model) => `- ${model.id}`).join(\"\\n\")}`,\n )\n\n const serverUrl = `http://localhost:${options.port}`\n\n if (options.claudeCode) {\n consola.log(\n \"\\n💡 Tip: The --claude-code flag simply generates a clipboard command for launching Claude Code. \\n\"\n + \"All models remain fully accessible without this flag, just configure the model ID directly in your settings.json file.\",\n )\n\n invariant(state.models, \"Models should be loaded by now\")\n\n const selectedModel = await consola.prompt(\n \"Select a model to use with Claude Code\",\n {\n type: \"select\",\n options: state.models.data.map((model) => model.id),\n },\n )\n\n const selectedSmallModel = await consola.prompt(\n \"Select a small model to use with Claude Code\",\n {\n type: \"select\",\n options: state.models.data.map((model) => model.id),\n },\n )\n\n const command = generateEnvScript(\n {\n ANTHROPIC_BASE_URL: serverUrl,\n ANTHROPIC_AUTH_TOKEN: \"dummy\",\n ANTHROPIC_MODEL: selectedModel,\n ANTHROPIC_DEFAULT_SONNET_MODEL: selectedModel,\n ANTHROPIC_DEFAULT_HAIKU_MODEL: selectedSmallModel,\n DISABLE_NON_ESSENTIAL_MODEL_CALLS: \"1\",\n CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: \"1\",\n CLAUDE_CODE_ATTRIBUTION_HEADER: \"0\",\n CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION: \"false\",\n CLAUDE_CODE_DISABLE_TERMINAL_TITLE: \"true\",\n CLAUDE_CODE_ENABLE_AWAY_SUMMARY: \"0\",\n CLAUDE_PLUGIN_ENABLE_QUESTION_RULES: \"true\",\n },\n \"claude\",\n )\n\n try {\n clipboard.writeSync(command)\n consola.success(\"Copied Claude Code command to clipboard!\")\n } catch {\n consola.warn(\n \"Failed to copy to clipboard. Here is the Claude Code command:\",\n )\n consola.log(command)\n }\n }\n\n consola.box(\n `🌐 Usage Viewer: ${serverUrl}/usage-viewer?endpoint=${serverUrl}/usage`,\n )\n\n const { server } = await import(\"./server\")\n\n serve({\n fetch: server.fetch as ServerHandler,\n port: options.port,\n bun: {\n idleTimeout: 0,\n },\n })\n}\n\nexport const start = defineCommand({\n meta: {\n name: \"start\",\n description: \"Start the Copilot API server\",\n },\n args: {\n port: {\n alias: \"p\",\n type: \"string\",\n default: \"4141\",\n description: \"Port to listen on\",\n },\n verbose: {\n alias: \"v\",\n type: \"boolean\",\n default: false,\n description: \"Enable verbose logging\",\n },\n \"account-type\": {\n alias: \"a\",\n type: \"string\",\n default: \"individual\",\n description: \"Account type to use (individual, business, enterprise)\",\n },\n manual: {\n type: \"boolean\",\n default: false,\n description: \"Enable manual request approval\",\n },\n \"rate-limit\": {\n alias: \"r\",\n type: \"string\",\n description: \"Rate limit in seconds between requests\",\n },\n wait: {\n alias: \"w\",\n type: \"boolean\",\n default: false,\n description:\n \"Wait instead of error when rate limit is hit. Has no effect if rate limit is not set\",\n },\n \"github-token\": {\n alias: \"g\",\n type: \"string\",\n description:\n \"Provide GitHub token directly (must be generated using the `auth` subcommand)\",\n },\n \"claude-code\": {\n alias: \"c\",\n type: \"boolean\",\n default: false,\n description:\n \"Generate a command to launch Claude Code with Copilot API config\",\n },\n \"show-token\": {\n type: \"boolean\",\n default: false,\n description: \"Show GitHub and Copilot tokens on fetch and refresh\",\n },\n \"proxy-env\": {\n type: \"boolean\",\n default: false,\n description: \"Initialize proxy from environment variables\",\n },\n },\n run({ args }) {\n const rateLimitRaw = args[\"rate-limit\"]\n const rateLimit =\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n rateLimitRaw === undefined ? undefined : Number.parseInt(rateLimitRaw, 10)\n\n return runServer({\n port: Number.parseInt(args.port, 10),\n verbose: args.verbose,\n accountType: args[\"account-type\"],\n manual: args.manual,\n rateLimit,\n rateLimitWait: args.wait,\n githubToken: args[\"github-token\"],\n claudeCode: args[\"claude-code\"],\n showToken: args[\"show-token\"],\n proxyEnv: args[\"proxy-env\"],\n })\n },\n})\n"],"mappings":";;;;;;;;;;;;AAMA,SAAS,WAAsB;CAC7B,MAAM,EAAE,UAAU,MAAM,QAAQ;CAEhC,IAAI,aAAa,SAAS;EACxB,IAAI;GAIF,IAFsB,SAAS,oDADqC,KAAK,IACjC,EAAE,OAAO,QAAQ,CAAC,CAAC,UAE1C,CAAC,aAAa,CAAC,SAAS,iBAAiB,EACxD,OAAO;UAEH;GACN,OAAO;;EAGT,OAAO;QACF;EACL,MAAM,YAAY,IAAI;EACtB,IAAI,WAAW;GACb,IAAI,UAAU,SAAS,MAAM,EAAE,OAAO;GACtC,IAAI,UAAU,SAAS,OAAO,EAAE,OAAO;GACvC,IAAI,UAAU,SAAS,OAAO,EAAE,OAAO;;EAGzC,OAAO;;;;;;;;;;AAWX,SAAgB,kBACd,SACA,eAAuB,IACf;CACR,MAAM,QAAQ,UAAU;CACxB,MAAM,kBAAkB,OAAO,QAAQ,QAAQ,CAAC,QAC7C,GAAG,WAAW,UAAU,KAAA,EAC1B;CAED,IAAI;CAEJ,QAAQ,OAAR;EACE,KAAK;GACH,eAAe,gBACZ,KAAK,CAAC,KAAK,WAAW,QAAQ,IAAI,KAAK,QAAQ,CAC/C,KAAK,KAAK;GACb;EAEF,KAAK;GACH,eAAe,gBACZ,KAAK,CAAC,KAAK,WAAW,OAAO,IAAI,GAAG,QAAQ,CAC5C,KAAK,MAAM;GACd;EAEF,KAAK;GACH,eAAe,gBACZ,KAAK,CAAC,KAAK,WAAW,WAAW,IAAI,GAAG,QAAQ,CAChD,KAAK,KAAK;GACb;EAEF,SAAS;GAEP,MAAM,cAAc,gBACjB,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,GAAG,QAAQ,CACxC,KAAK,IAAI;GACZ,eAAe,gBAAgB,SAAS,IAAI,UAAU,gBAAgB;GACtE;;;CAIJ,IAAI,gBAAgB,cAElB,OAAO,GAAG,eADQ,UAAU,QAAQ,QAAQ,SACP;CAGvC,OAAO,gBAAgB;;;;AClDzB,eAAsB,UAAU,SAA0C;CAExE,QAAQ,QAAQ,WAAW;CAG3B,yBAAyB;CAEzB,MAAM,qBAAqB;CAE3B,IAAI,QAAQ,UACV,kBAAkB;CAGpB,MAAM,UAAU,QAAQ;CACxB,IAAI,QAAQ,SAAS;EACnB,QAAQ,QAAQ;EAChB,QAAQ,KAAK,0BAA0B;;CAGzC,MAAM,cAAc,QAAQ;CAC5B,IAAI,QAAQ,gBAAgB,cAC1B,QAAQ,KAAK,SAAS,QAAQ,YAAY,sBAAsB;CAGlE,MAAM,gBAAgB,QAAQ;CAC9B,MAAM,mBAAmB,QAAQ;CACjC,MAAM,gBAAgB,QAAQ;CAC9B,MAAM,YAAY,QAAQ;CAE1B,MAAM,aAAa;CACnB,MAAM,oBAAoB;CAC1B,mBAAmB;CACnB,sBAAsB;CACtB,MAAM,qBAAqB;CAE3B,IAAI,QAAQ,aAAa;EACvB,MAAM,cAAc,QAAQ;EAC5B,QAAQ,KAAK,8BAA8B;EAC3C,MAAM,SAAS;QAEf,MAAM,kBAAkB;CAG1B,MAAM,mBAAmB;CACzB,MAAM,aAAa;CAEnB,QAAQ,KACN,uBAAuB,MAAM,QAAQ,KAAK,KAAK,UAAU,KAAK,MAAM,KAAK,CAAC,KAAK,KAAK,GACrF;CAED,MAAM,YAAY,oBAAoB,QAAQ;CAE9C,IAAI,QAAQ,YAAY;EACtB,QAAQ,IACN,4NAED;EAED,UAAU,MAAM,QAAQ,iCAAiC;EAEzD,MAAM,gBAAgB,MAAM,QAAQ,OAClC,0CACA;GACE,MAAM;GACN,SAAS,MAAM,OAAO,KAAK,KAAK,UAAU,MAAM,GAAG;GACpD,CACF;EAUD,MAAM,UAAU,kBACd;GACE,oBAAoB;GACpB,sBAAsB;GACtB,iBAAiB;GACjB,gCAAgC;GAChC,+BAA+B,MAdF,QAAQ,OACvC,gDACA;IACE,MAAM;IACN,SAAS,MAAM,OAAO,KAAK,KAAK,UAAU,MAAM,GAAG;IACpD,CACF;GASG,mCAAmC;GACnC,0CAA0C;GAC1C,gCAAgC;GAChC,sCAAsC;GACtC,oCAAoC;GACpC,iCAAiC;GACjC,qCAAqC;GACtC,EACD,SACD;EAED,IAAI;GACF,UAAU,UAAU,QAAQ;GAC5B,QAAQ,QAAQ,2CAA2C;UACrD;GACN,QAAQ,KACN,gEACD;GACD,QAAQ,IAAI,QAAQ;;;CAIxB,QAAQ,IACN,oBAAoB,UAAU,yBAAyB,UAAU,QAClE;CAED,MAAM,EAAE,WAAW,MAAM,OAAO;CAEhC,MAAM;EACJ,OAAO,OAAO;EACd,MAAM,QAAQ;EACd,KAAK,EACH,aAAa,GACd;EACF,CAAC;;AAGJ,MAAa,QAAQ,cAAc;CACjC,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAAM;EACJ,MAAM;GACJ,OAAO;GACP,MAAM;GACN,SAAS;GACT,aAAa;GACd;EACD,SAAS;GACP,OAAO;GACP,MAAM;GACN,SAAS;GACT,aAAa;GACd;EACD,gBAAgB;GACd,OAAO;GACP,MAAM;GACN,SAAS;GACT,aAAa;GACd;EACD,QAAQ;GACN,MAAM;GACN,SAAS;GACT,aAAa;GACd;EACD,cAAc;GACZ,OAAO;GACP,MAAM;GACN,aAAa;GACd;EACD,MAAM;GACJ,OAAO;GACP,MAAM;GACN,SAAS;GACT,aACE;GACH;EACD,gBAAgB;GACd,OAAO;GACP,MAAM;GACN,aACE;GACH;EACD,eAAe;GACb,OAAO;GACP,MAAM;GACN,SAAS;GACT,aACE;GACH;EACD,cAAc;GACZ,MAAM;GACN,SAAS;GACT,aAAa;GACd;EACD,aAAa;GACX,MAAM;GACN,SAAS;GACT,aAAa;GACd;EACF;CACD,IAAI,EAAE,QAAQ;EACZ,MAAM,eAAe,KAAK;EAC1B,MAAM,YAEJ,iBAAiB,KAAA,IAAY,KAAA,IAAY,OAAO,SAAS,cAAc,GAAG;EAE5E,OAAO,UAAU;GACf,MAAM,OAAO,SAAS,KAAK,MAAM,GAAG;GACpC,SAAS,KAAK;GACd,aAAa,KAAK;GAClB,QAAQ,KAAK;GACb;GACA,eAAe,KAAK;GACpB,aAAa,KAAK;GAClB,YAAY,KAAK;GACjB,WAAW,KAAK;GAChB,UAAU,KAAK;GAChB,CAAC;;CAEL,CAAC"}
@@ -1,6 +1,10 @@
1
1
  //#region src/lib/tool-search.ts
2
2
  const BRIDGE_TOOL_SEARCH_NAME = "mcp__tool_search__search";
3
- const BRIDGE_TOOL_SEARCH_ALIASES = [BRIDGE_TOOL_SEARCH_NAME, "tool_search_search"];
3
+ const BRIDGE_TOOL_SEARCH_ALIASES = [
4
+ BRIDGE_TOOL_SEARCH_NAME,
5
+ "tool_search_search",
6
+ "mcp__plugin_tool-search_tool_search__search"
7
+ ];
4
8
  const MCP_TOOL_SEARCH_SENTINEL_TYPE = "copilot_api_tool_search";
5
9
  const alwaysLoadedToolNameSet = new Set([
6
10
  "Agent",
@@ -107,4 +111,4 @@ const selectDeferredToolsByNames = (names, tools) => {
107
111
  //#endregion
108
112
  export { isDeferredToolName as a, parseMcpToolSearchSentinel as c, shouldEnableResponsesToolSearch as d, isBridgeToolSearchName as i, resolveBridgeToolSearchName as l, createMcpToolSearchSentinel as n, listDeferredToolNames as o, formatToolSearchBridgeArguments as r, normalizeToolSearchBridgeArguments as s, BRIDGE_TOOL_SEARCH_NAME as t, selectDeferredToolsByNames as u };
109
113
 
110
- //# sourceMappingURL=tool-search-CKe6hqnv.js.map
114
+ //# sourceMappingURL=tool-search-D3SN0jX-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-search-D3SN0jX-.js","names":["record"],"sources":["../src/lib/tool-search.ts"],"sourcesContent":["export const BRIDGE_TOOL_SEARCH_NAME = \"mcp__tool_search__search\"\nexport const BRIDGE_TOOL_SEARCH_ALIASES = [\n BRIDGE_TOOL_SEARCH_NAME,\n \"tool_search_search\",\n \"mcp__plugin_tool-search_tool_search__search\",\n] as const\nexport const MCP_TOOL_SEARCH_SENTINEL_TYPE = \"copilot_api_tool_search\"\n\nexport const ALWAYS_LOADED_TOOL_NAMES = [\n \"Agent\",\n \"AskUserQuestion\",\n \"Bash\",\n \"Edit\",\n \"EnterPlanMode\",\n \"ExitPlanMode\",\n \"Glob\",\n \"Grep\",\n \"Read\",\n \"Skill\",\n \"TodoWrite\",\n \"ToolSearch\",\n \"WebFetch\",\n \"Write\",\n \"apply_patch\",\n \"bash\",\n \"glob\",\n \"grep\",\n \"plan_exit\",\n \"question\",\n \"read\",\n \"skill\",\n \"task\",\n \"todowrite\",\n \"webfetch\",\n] as const\n\nconst alwaysLoadedToolNameSet = new Set<string>(ALWAYS_LOADED_TOOL_NAMES)\nconst bridgeToolSearchNameSet = new Set<string>(BRIDGE_TOOL_SEARCH_ALIASES)\n\nexport interface ToolSearchToolLike {\n name: string\n description?: string\n input_schema?: Record<string, unknown>\n defer_loading?: boolean\n}\n\nexport interface McpToolSearchSentinel {\n type: typeof MCP_TOOL_SEARCH_SENTINEL_TYPE\n names: Array<string>\n}\n\nexport const isBridgeToolSearchName = (name: string): boolean =>\n bridgeToolSearchNameSet.has(name)\n\nexport const isAlwaysLoadedToolName = (name: string): boolean =>\n alwaysLoadedToolNameSet.has(name)\n\nexport const isDeferredToolName = (name: string): boolean =>\n !isBridgeToolSearchName(name) && !isAlwaysLoadedToolName(name)\n\nexport const supportsResponsesToolSearchModel = (model: string): boolean => {\n const match = /^gpt-(\\d+)(?:\\.(\\d+))?/iu.exec(model)\n if (!match) {\n return false\n }\n\n const major = Number.parseInt(match[1], 10)\n const minor = match[2] ? Number.parseInt(match[2], 10) : 0\n\n return major > 5 || (major === 5 && minor >= 4)\n}\n\nexport const hasBridgeToolSearchTool = (\n tools: Array<ToolSearchToolLike> | undefined,\n): boolean =>\n Array.isArray(tools)\n && tools.some((tool) => isBridgeToolSearchName(tool.name))\n\nexport const resolveBridgeToolSearchName = (\n tools: Array<ToolSearchToolLike> | undefined,\n): string => {\n if (!Array.isArray(tools)) {\n return BRIDGE_TOOL_SEARCH_NAME\n }\n\n return (\n tools.find((tool) => isBridgeToolSearchName(tool.name))?.name\n ?? BRIDGE_TOOL_SEARCH_NAME\n )\n}\n\nexport const hasDeferredToolCandidate = (\n tools: Array<ToolSearchToolLike> | undefined,\n): boolean =>\n Array.isArray(tools) && tools.some((tool) => isDeferredToolName(tool.name))\n\nexport const shouldEnableResponsesToolSearch = (params: {\n model: string\n tools?: Array<ToolSearchToolLike>\n}): boolean =>\n supportsResponsesToolSearchModel(params.model)\n && hasBridgeToolSearchTool(params.tools)\n && hasDeferredToolCandidate(params.tools)\n\nexport const hasDeferredNamespaceTool = (\n tools: Array<unknown> | null | undefined,\n): boolean =>\n Array.isArray(tools)\n && tools.some((tool) => {\n if (!tool || typeof tool !== \"object\") {\n return false\n }\n\n const record = tool as Record<string, unknown>\n if (record.type !== \"namespace\" || typeof record.name !== \"string\") {\n return false\n }\n\n if (!isDeferredToolName(record.name)) {\n return false\n }\n\n const namespaceTools = record.tools\n return (\n Array.isArray(namespaceTools)\n && namespaceTools.some(\n (entry) =>\n entry\n && typeof entry === \"object\"\n && (entry as Record<string, unknown>).defer_loading === true,\n )\n )\n })\n\nexport const listDeferredToolNames = (\n tools: Array<ToolSearchToolLike>,\n): Array<string> => [\n ...new Set(\n tools\n .filter((tool) => isDeferredToolName(tool.name))\n .map((tool) => tool.name),\n ),\n]\n\nconst extractDeferredToolNamesSource = (\n record: Record<string, unknown>,\n): unknown => record.names ?? record.query ?? record.paths\n\nexport const parseDeferredToolNames = (names: unknown): Array<string> => {\n let rawNames: Array<string> = []\n\n if (typeof names === \"string\") {\n rawNames = names.split(\",\")\n } else if (Array.isArray(names)) {\n rawNames = names.flatMap((name) =>\n typeof name === \"string\" ? name.split(\",\") : [],\n )\n }\n\n return [\n ...new Set(\n rawNames.map((name) => name.trim()).filter((name) => name.length > 0),\n ),\n ]\n}\n\nexport const createMcpToolSearchSentinel = (names: unknown): string =>\n JSON.stringify({\n type: MCP_TOOL_SEARCH_SENTINEL_TYPE,\n names: parseDeferredToolNames(names),\n } satisfies McpToolSearchSentinel)\n\nexport const parseMcpToolSearchSentinel = (\n text: string,\n): McpToolSearchSentinel | null => {\n try {\n const parsed: unknown = JSON.parse(text)\n if (!parsed || typeof parsed !== \"object\") {\n return null\n }\n\n const record = parsed as Record<string, unknown>\n if (record.type !== MCP_TOOL_SEARCH_SENTINEL_TYPE) {\n return null\n }\n\n const names = parseDeferredToolNames(extractDeferredToolNamesSource(record))\n if (names.length === 0) {\n return null\n }\n\n return {\n type: MCP_TOOL_SEARCH_SENTINEL_TYPE,\n names,\n }\n } catch {\n return null\n }\n}\n\nexport const normalizeToolSearchBridgeArguments = (\n argumentsValue: Record<string, unknown> | string,\n): Record<string, unknown> => {\n if (typeof argumentsValue !== \"string\") {\n const names = parseDeferredToolNames(\n extractDeferredToolNamesSource(argumentsValue),\n )\n return names.length > 0 ? { names } : {}\n }\n\n try {\n const parsed: unknown = JSON.parse(argumentsValue)\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const record = parsed as Record<string, unknown>\n const names = parseDeferredToolNames(\n extractDeferredToolNamesSource(record),\n )\n return names.length > 0 ? { names } : {}\n }\n } catch {\n // Treat a raw string as the comma-separated protocol payload.\n }\n\n const names = parseDeferredToolNames(argumentsValue)\n return names.length > 0 ? { names } : {}\n}\n\nexport const formatToolSearchBridgeArguments = (\n argumentsValue: Record<string, unknown> | string,\n): Record<string, unknown> => {\n const normalized = normalizeToolSearchBridgeArguments(argumentsValue)\n const names = normalized.names\n\n if (!Array.isArray(names) || names.length === 0) {\n return {}\n }\n\n return { names: names.join(\",\") }\n}\n\nexport const selectDeferredToolsByNames = (\n names: unknown,\n tools: Array<ToolSearchToolLike>,\n): Array<ToolSearchToolLike> => {\n const requestedNames = parseDeferredToolNames(names)\n if (requestedNames.length === 0) {\n return []\n }\n\n const deferredToolByName = new Map(\n tools\n .filter((tool) => isDeferredToolName(tool.name))\n .map((tool) => [tool.name, tool]),\n )\n\n return requestedNames.flatMap((name) => {\n const tool = deferredToolByName.get(name)\n return tool ? [tool] : []\n })\n}\n\nexport const hasDeferredMcpNamespaceTool = hasDeferredNamespaceTool\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,15 +1,11 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@jeffreycao/copilot-api",
4
- "version": "1.10.5",
4
+ "version": "1.10.7",
5
5
  "description": "OpenAI and Anthropic-compatible gateway for GitHub Copilot or third-party providers.",
6
6
  "keywords": [
7
- "dashboard",
8
- "multi-provider",
9
- "github-copilot",
10
7
  "ai-gateway",
11
- "openai-compatible",
12
- "anthropic-compatible"
8
+ "github-copilot"
13
9
  ],
14
10
  "homepage": "https://github.com/caozhiyuan/copilot-api",
15
11
  "bugs": "https://github.com/caozhiyuan/copilot-api/issues",
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-search-CKe6hqnv.js","names":["record"],"sources":["../src/lib/tool-search.ts"],"sourcesContent":["export const BRIDGE_TOOL_SEARCH_NAME = \"mcp__tool_search__search\"\nexport const BRIDGE_TOOL_SEARCH_ALIASES = [\n BRIDGE_TOOL_SEARCH_NAME,\n \"tool_search_search\",\n] as const\nexport const MCP_TOOL_SEARCH_SENTINEL_TYPE = \"copilot_api_tool_search\"\n\nexport const ALWAYS_LOADED_TOOL_NAMES = [\n \"Agent\",\n \"AskUserQuestion\",\n \"Bash\",\n \"Edit\",\n \"EnterPlanMode\",\n \"ExitPlanMode\",\n \"Glob\",\n \"Grep\",\n \"Read\",\n \"Skill\",\n \"TodoWrite\",\n \"ToolSearch\",\n \"WebFetch\",\n \"Write\",\n \"apply_patch\",\n \"bash\",\n \"glob\",\n \"grep\",\n \"plan_exit\",\n \"question\",\n \"read\",\n \"skill\",\n \"task\",\n \"todowrite\",\n \"webfetch\",\n] as const\n\nconst alwaysLoadedToolNameSet = new Set<string>(ALWAYS_LOADED_TOOL_NAMES)\nconst bridgeToolSearchNameSet = new Set<string>(BRIDGE_TOOL_SEARCH_ALIASES)\n\nexport interface ToolSearchToolLike {\n name: string\n description?: string\n input_schema?: Record<string, unknown>\n defer_loading?: boolean\n}\n\nexport interface McpToolSearchSentinel {\n type: typeof MCP_TOOL_SEARCH_SENTINEL_TYPE\n names: Array<string>\n}\n\nexport const isBridgeToolSearchName = (name: string): boolean =>\n bridgeToolSearchNameSet.has(name)\n\nexport const isAlwaysLoadedToolName = (name: string): boolean =>\n alwaysLoadedToolNameSet.has(name)\n\nexport const isDeferredToolName = (name: string): boolean =>\n !isBridgeToolSearchName(name) && !isAlwaysLoadedToolName(name)\n\nexport const supportsResponsesToolSearchModel = (model: string): boolean => {\n const match = /^gpt-(\\d+)(?:\\.(\\d+))?/iu.exec(model)\n if (!match) {\n return false\n }\n\n const major = Number.parseInt(match[1], 10)\n const minor = match[2] ? Number.parseInt(match[2], 10) : 0\n\n return major > 5 || (major === 5 && minor >= 4)\n}\n\nexport const hasBridgeToolSearchTool = (\n tools: Array<ToolSearchToolLike> | undefined,\n): boolean =>\n Array.isArray(tools)\n && tools.some((tool) => isBridgeToolSearchName(tool.name))\n\nexport const resolveBridgeToolSearchName = (\n tools: Array<ToolSearchToolLike> | undefined,\n): string => {\n if (!Array.isArray(tools)) {\n return BRIDGE_TOOL_SEARCH_NAME\n }\n\n return (\n tools.find((tool) => isBridgeToolSearchName(tool.name))?.name\n ?? BRIDGE_TOOL_SEARCH_NAME\n )\n}\n\nexport const hasDeferredToolCandidate = (\n tools: Array<ToolSearchToolLike> | undefined,\n): boolean =>\n Array.isArray(tools) && tools.some((tool) => isDeferredToolName(tool.name))\n\nexport const shouldEnableResponsesToolSearch = (params: {\n model: string\n tools?: Array<ToolSearchToolLike>\n}): boolean =>\n supportsResponsesToolSearchModel(params.model)\n && hasBridgeToolSearchTool(params.tools)\n && hasDeferredToolCandidate(params.tools)\n\nexport const hasDeferredNamespaceTool = (\n tools: Array<unknown> | null | undefined,\n): boolean =>\n Array.isArray(tools)\n && tools.some((tool) => {\n if (!tool || typeof tool !== \"object\") {\n return false\n }\n\n const record = tool as Record<string, unknown>\n if (record.type !== \"namespace\" || typeof record.name !== \"string\") {\n return false\n }\n\n if (!isDeferredToolName(record.name)) {\n return false\n }\n\n const namespaceTools = record.tools\n return (\n Array.isArray(namespaceTools)\n && namespaceTools.some(\n (entry) =>\n entry\n && typeof entry === \"object\"\n && (entry as Record<string, unknown>).defer_loading === true,\n )\n )\n })\n\nexport const listDeferredToolNames = (\n tools: Array<ToolSearchToolLike>,\n): Array<string> => [\n ...new Set(\n tools\n .filter((tool) => isDeferredToolName(tool.name))\n .map((tool) => tool.name),\n ),\n]\n\nconst extractDeferredToolNamesSource = (\n record: Record<string, unknown>,\n): unknown => record.names ?? record.query ?? record.paths\n\nexport const parseDeferredToolNames = (names: unknown): Array<string> => {\n let rawNames: Array<string> = []\n\n if (typeof names === \"string\") {\n rawNames = names.split(\",\")\n } else if (Array.isArray(names)) {\n rawNames = names.flatMap((name) =>\n typeof name === \"string\" ? name.split(\",\") : [],\n )\n }\n\n return [\n ...new Set(\n rawNames.map((name) => name.trim()).filter((name) => name.length > 0),\n ),\n ]\n}\n\nexport const createMcpToolSearchSentinel = (names: unknown): string =>\n JSON.stringify({\n type: MCP_TOOL_SEARCH_SENTINEL_TYPE,\n names: parseDeferredToolNames(names),\n } satisfies McpToolSearchSentinel)\n\nexport const parseMcpToolSearchSentinel = (\n text: string,\n): McpToolSearchSentinel | null => {\n try {\n const parsed: unknown = JSON.parse(text)\n if (!parsed || typeof parsed !== \"object\") {\n return null\n }\n\n const record = parsed as Record<string, unknown>\n if (record.type !== MCP_TOOL_SEARCH_SENTINEL_TYPE) {\n return null\n }\n\n const names = parseDeferredToolNames(extractDeferredToolNamesSource(record))\n if (names.length === 0) {\n return null\n }\n\n return {\n type: MCP_TOOL_SEARCH_SENTINEL_TYPE,\n names,\n }\n } catch {\n return null\n }\n}\n\nexport const normalizeToolSearchBridgeArguments = (\n argumentsValue: Record<string, unknown> | string,\n): Record<string, unknown> => {\n if (typeof argumentsValue !== \"string\") {\n const names = parseDeferredToolNames(\n extractDeferredToolNamesSource(argumentsValue),\n )\n return names.length > 0 ? { names } : {}\n }\n\n try {\n const parsed: unknown = JSON.parse(argumentsValue)\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const record = parsed as Record<string, unknown>\n const names = parseDeferredToolNames(\n extractDeferredToolNamesSource(record),\n )\n return names.length > 0 ? { names } : {}\n }\n } catch {\n // Treat a raw string as the comma-separated protocol payload.\n }\n\n const names = parseDeferredToolNames(argumentsValue)\n return names.length > 0 ? { names } : {}\n}\n\nexport const formatToolSearchBridgeArguments = (\n argumentsValue: Record<string, unknown> | string,\n): Record<string, unknown> => {\n const normalized = normalizeToolSearchBridgeArguments(argumentsValue)\n const names = normalized.names\n\n if (!Array.isArray(names) || names.length === 0) {\n return {}\n }\n\n return { names: names.join(\",\") }\n}\n\nexport const selectDeferredToolsByNames = (\n names: unknown,\n tools: Array<ToolSearchToolLike>,\n): Array<ToolSearchToolLike> => {\n const requestedNames = parseDeferredToolNames(names)\n if (requestedNames.length === 0) {\n return []\n }\n\n const deferredToolByName = new Map(\n tools\n .filter((tool) => isDeferredToolName(tool.name))\n .map((tool) => [tool.name, tool]),\n )\n\n return requestedNames.flatMap((name) => {\n const tool = deferredToolByName.get(name)\n return tool ? [tool] : []\n })\n}\n\nexport const hasDeferredMcpNamespaceTool = hasDeferredNamespaceTool\n"],"mappings":"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"}