openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
77 lines (76 loc) • 3.1 kB
JavaScript
import { m as readProviderJsonResponse } from "./provider-http-errors-U-nhuk_f.js";
import "./provider-http-k9RMI7iG.js";
import { i as resolveGithubCopilotDomain } from "./domain-Bbe8oFEv.js";
import { t as CopilotRuntimeAuthError } from "./runtime-auth-error-CQZde1c0.js";
//#region extensions/github-copilot/runtime-auth.ts
const DEFAULT_COPILOT_API_BASE_URL = "https://api.individual.githubcopilot.com";
const COPILOT_RUNTIME_AUTH_TIMEOUT_MS = 3e4;
function copilotUserUrl(domain) {
return `https://api.${domain}/copilot_internal/user`;
}
function copilotApiBaseFallback(domain) {
return domain === "github.com" ? DEFAULT_COPILOT_API_BASE_URL : `https://copilot-api.${domain}`;
}
function isTrustedCopilotApiHost(host, domain) {
if (host === "copilot-proxy.githubusercontent.com" || host.endsWith(".githubcopilot.com")) return true;
return domain !== "github.com" && (host === domain || host.endsWith(`.${domain}`));
}
function parseCopilotApiBaseUrl(value, domain) {
if (!value || typeof value !== "object") throw new Error("Unexpected response from GitHub Copilot user endpoint");
const endpoints = value.endpoints;
const api = endpoints && typeof endpoints === "object" ? endpoints.api : void 0;
if (api === void 0 || api === null || api === "") return copilotApiBaseFallback(domain);
if (typeof api !== "string" || !api.trim()) throw new Error("GitHub Copilot user response has an invalid endpoints.api URL");
let url;
try {
url = new URL(api);
} catch {
throw new Error("GitHub Copilot user response has an invalid endpoints.api URL");
}
const host = url.hostname.toLowerCase();
if (url.protocol !== "https:" || url.username || url.password || url.search || url.hash || !isTrustedCopilotApiHost(host, domain)) throw new Error("GitHub Copilot user response has an untrusted endpoints.api URL");
return url.href.replace(/\/+$/, "");
}
async function resolveCopilotRuntimeAuth(params) {
const env = params.env ?? process.env;
const domain = resolveGithubCopilotDomain({
env,
explicit: params.githubDomain,
config: params.config
});
const userUrl = copilotUserUrl(domain);
const fetchImpl = params.fetchImpl ?? fetch;
const signal = AbortSignal.timeout(COPILOT_RUNTIME_AUTH_TIMEOUT_MS);
try {
const response = await fetchImpl(userUrl, {
method: "GET",
headers: {
Accept: "application/json",
Authorization: `Bearer ${params.githubToken}`
},
signal
});
if (!response.ok) {
if (!response.bodyUsed) response.body?.cancel().catch(() => void 0);
throw new CopilotRuntimeAuthError({
reason: "http_error",
status: response.status
});
}
const baseUrl = parseCopilotApiBaseUrl(await readProviderJsonResponse(response, "github-copilot.user"), domain);
return {
apiKey: params.githubToken,
source: `validated:${userUrl}`,
baseUrl
};
} catch (error) {
if (signal.aborted) throw new CopilotRuntimeAuthError({
reason: "timeout",
timeoutMs: COPILOT_RUNTIME_AUTH_TIMEOUT_MS,
cause: error
});
throw error;
}
}
//#endregion
export { resolveCopilotRuntimeAuth as n, DEFAULT_COPILOT_API_BASE_URL as t };